如何实现LibGDX应用在iOS与RoboVM中的名称本地化?
实现LibGDX项目Android与iOS端共享strings.xml应用名称(支持本地化)
Android端通过Manifest配置android:label="@string/app_name",从strings.xml读取应用名称。要让RoboVM构建的iOS端实现相同逻辑,同时支持本地化,可按以下步骤操作:
1. 通过Gradle同步Android strings.xml到RoboVM配置
单语言同步(基础版)
在iOS模块的build.gradle中添加Gradle任务,自动从Android模块的strings.xml读取app_name值,更新RoboVM配置文件:
task syncAppName { doLast { // 读取Android的strings.xml文件 def androidStringsFile = project(':android').file('src/main/res/values/strings.xml') def xml = new XmlSlurper().parse(androidStringsFile) def appName = xml.string.find { it.@name == 'app_name' }.text() // 更新robovm.properties中的app.name字段 def robovmPropsFile = file('robovm.properties') def props = new Properties() robovmPropsFile.withInputStream { props.load(it) } props.setProperty('app.name', appName) robovmPropsFile.withOutputStream { props.store(it, '从Android strings.xml同步应用名称') } } } // 让RoboVM构建任务依赖同步任务 tasks.named('robovm').configure { dependsOn syncAppName }
多语言本地化(进阶版)
如果需要支持多语言,添加Gradle任务将Android的多语言strings.xml转换为iOS本地化文件:
task generateIosLocalizations { doLast { def androidResDir = project(':android').file('src/main/res') def iosLocalesDir = file('src/main/resources/locales') iosLocalesDir.mkdirs() // 遍历所有Android语言资源目录 androidResDir.eachDirMatch(/values-.+/) { dir -> def langCode = dir.name.replace('values-', '').replace('r', '-') def iosLprojDir = new File(iosLocalesDir, "${langCode}.lproj") iosLprojDir.mkdirs() def xml = new XmlSlurper().parse(new File(dir, 'strings.xml')) def appName = xml.string.find { it.@name == 'app_name' }.text() // 生成iOS本地化的InfoPlist.strings文件 new File(iosLprojDir, 'InfoPlist.strings').text = "\"CFBundleDisplayName\" = \"${appName}\";\n" } // 处理默认语言 def defaultXml = new XmlSlurper().parse(new File(androidResDir, 'values/strings.xml')) def defaultAppName = defaultXml.string.find { it.@name == 'app_name' }.text() def defaultLprojDir = new File(iosLocalesDir, 'en.lproj') defaultLprojDir.mkdirs() new File(defaultLprojDir, 'InfoPlist.strings').text = "\"CFBundleDisplayName\" = \"${defaultAppName}\";\n" } } tasks.named('robovm').configure { dependsOn generateIosLocalizations }
同时修改robovm.xml,引入本地化资源:
<config> <executableName>${app.executable}</executableName> <infoPlist> <!-- 其他配置项 --> <key>CFBundleDisplayName</key> <string>${app.name}</string> <!-- 默认名称,本地化文件会覆盖此值 --> </infoPlist> <resources> <resource>src/main/resources/locales/**</resource> </resources> </config>
2. 验证效果
- 构建并运行Android项目,确认应用名称正确显示。
- 构建并运行iOS项目,检查应用名称与Android端一致;切换系统语言,验证本地化名称是否自动切换。
内容的提问来源于stack exchange,提问作者skymedium
相关产品推荐
相关产品推荐

