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
相关产品推荐
相关产品推荐

