You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:50:26