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

Android/Jetpack Compose自定义字符串被第三方库翻译问题排查

问题原因及解决办法

原因分析

你遇到的问题核心不是android.nonTransitiveRClass=true的配置问题,而是Android资源合并机制导致的:

  • Android构建时会自动合并所有依赖库(包括androidx.compose.ui)中的同名资源。当系统语言切换到德语、乌克兰语等时,系统会优先加载对应语言目录下的资源。刚好androidx.compose.ui:ui-android:1.5.4库中包含了名为off的多语言字符串资源,所以系统会加载该库的翻译版本,而非你定义的英文。
  • android.nonTransitiveRClass=true只是限制了R类的跨模块引用,不会改变资源合并的规则,因此无法阻止依赖库的同名资源被加载。

解决办法

1. 重命名自定义资源(最推荐)

直接把你的字符串资源名改成独有的名称,比如从off改为custom_off,彻底避免和依赖库的资源重名冲突。修改后引用stringResource(R.string.custom_off)即可。

2. 明确指定资源的包名

在引用资源时,不要直接使用R.string.off,而是带上自己模块的完整包名,强制加载自己模块的资源:

stringResource(id = com.your.module.package.R.string.off)

这样即使依赖库中有同名资源,系统也会优先使用你指定的模块资源。

3. 覆盖依赖库的多语言资源

在自己的模块中添加对应语言的资源目录,定义同名字符串来覆盖依赖库的翻译。比如:

  • 创建res/values-de/strings.xml,添加:
    <string name="off">Off</string>
    
  • 创建res/values-uk/strings.xml,添加:
    <string name="off">Off</string>
    

这种方式会让系统在对应语言环境下加载你定义的内容,适合需要固定显示英文的场景,但需要为每个目标语言单独配置。

4. 排除依赖库的特定语言资源

在模块的build.gradle中配置packagingOptions,排除androidx.compose.ui库中的多语言资源文件:

android {
    packagingOptions {
        // 排除德语、乌克兰语等语言的strings.xml
        exclude 'res/values-de/strings.xml'
        exclude 'res/values-uk/strings.xml'
        // 可根据需要添加其他语言的排除规则
    }
}

注意:这种方式会排除整个语言目录下的所有资源,可能影响依赖库中其他有用的翻译资源,需谨慎使用。

内容的提问来源于stack exchange,提问作者Oliver Metz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:33:15