如何识别默认strings.xml文件以匹配服务端JSON默认多语言消息?
解决方案
以下提供两种实现方式,优先推荐第一种资源标记法,准确性更高:
方案1:资源标记法(推荐)
无需判断系统语言,直接通过资源自带的标记识别当前加载的strings.xml类型:
- 首先给每个语言的strings.xml新增专属标识字段:
- 默认
values/strings.xml中添加:<string name="current_xml_lang_tag">default</string> values-en/strings.xml中添加:<string name="current_xml_lang_tag">en</string>- 其余ar、es、de、it、ru对应的strings.xml同理,分别填入对应语言代码即可。
- 默认
- 运行时直接读取标记,匹配服务端JSON即可,示例代码(Kotlin):
// 读取当前加载的strings.xml对应的标识 val currentLangTag = getString(R.string.current_xml_lang_tag) // 假设服务端JSON已解析为对应实体类serverLangData val langContent = serverLangData[0] val showMessage = when(currentLangTag) { "default" -> langContent.default.Message "en" -> langContent.en.Message "ar" -> langContent.ar.Message "es" -> langContent.es.Message "de" -> langContent.de.Message "it" -> langContent.it.Message "ru" -> langContent.ru.Message // 异常情况兜底走默认文案 else -> langContent.default.Message } // 直接使用showMessage展示即可
方案2:系统语言匹配法(无需修改资源文件)
通过当前系统生效的语言和你支持的语言列表做比对,判断是否加载默认资源:
- 先获取当前App生效的语言代码,适配不同系统版本的示例代码:
val currentSysLang = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { resources.configuration.locales[0].language } else { @Suppress("DEPRECATION") resources.configuration.locale.language } // 你已适配的非默认语言列表 val supportLangSet = setOf("en", "ar", "es", "de", "it", "ru") val isLoadDefaultXml = currentSysLang !in supportLangSet
- 匹配JSON逻辑和方案1一致,如果
isLoadDefaultXml为true则取default字段的文案,否则取对应语言代码的字段即可。
注意:如果你的App支持手动切换语言(不跟随系统),只能使用方案1,方案2会受手动切语言逻辑的影响导致判断错误。
内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

