我正在开发一个需要支持多种语言的 Android 应用程序。我正在考虑使用 Firebase Remote Config 通过以 JSON 格式存储翻译来管理本地化,然后在运行时动态更新应用程序的 strings.xml 文件。是否可以使用从 Firebase 获取的数据在运行时直接更新 strings.xml 或类似的资源文件?如果可以的话,如何实现?
此外,如果有人建议我这种方法是否可取,或者是否有更好的做法来使用 Firebase 在 Android 应用程序中处理动态本地化,我将不胜感激。
我尝试过的:
数据类设置:我在 Kotlin 中创建了一个数据类,用于在从 Firebase 远程配置检索到的 JSON 解析本地化字符串后保存这些字符串。 编程本地化:尝试在整个应用程序中以编程方式应用这些解析的字符串,而不是依赖传统的 strings.xml 机制。 期望与现实:
预期:我预计一旦 JSON 数据被解析到数据类中,我就可以使用这些对象根据用户的语言设置使用本地化字符串动态更新 UI。 实际结果:尽管 JSON 已正确解析并且数据类已填充翻译字符串,但我发现没有有效的方法将这些动态翻译无缝集成到应用程序的所有部分。主要问题是,如果不在运行时修改 strings.xml(这是不可能的),我就无法使用 Android 的内置资源系统(R.string)来管理本地化。 面临的问题:
缺乏与 Android 原生资源系统的集成意味着我无法使用 getString(R.string.some_string) 等熟悉的机制来获取和显示翻译后的字符串。这限制了解决方案的可扩展性和可维护性,因为它与标准 Android 开发实践不同。
当然,您无法在运行时修改资源文件,因为它是在编译时生成的,因此本地化和支持多种语言的最佳方法是为每种语言创建
string.xml
文件。
res/values/strings.xml -> for the default resource and fallbacks
res/values-ar/strings.xml -> for the alternative resource like Arabic.
此外,您还可以通过 Android studio 编辑器管理您的翻译,例如:
strings.xml
,你可以找到打开编辑器选项您可以在此处查看此方法的文档:https://developer.android.com/guide/topics/resources/localization#creating-alternatives
要使用 Firebase 在 Android 中处理动态本地化,您可以通过将翻译存储在 Firebase Remote Config 中并在运行时获取它们来绕过修改 strings.xml。这是管理此问题的简化方法:
循序渐进的方法
本地化管理器示例代码
对象 LocalizationManager {
私有变量翻译:Map
fun loadTranslations(jsonString: String) {
translations = Gson().fromJson(jsonString, object : TypeToken<Map<String, String>>() {}.type)
}
fun getString(key: String, default: String = ""): String {
return translations[key] ?: default
}
}
// 用法 LocalizationManager.loadTranslations(firebaseRemoteConfig.getString(“翻译”)) val localizedString = LocalizationManager.getString("hello_key", "Hello")