如何使用 Firebase Remote Config 中的 JSON 数据动态更新 Android 中的 strings.xml 以进行本地化?

问题描述 投票:0回答:2

我正在开发一个需要支持多种语言的 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 开发实践不同。

android string firebase kotlin firebase-remote-config
2个回答
0
投票

当然,您无法在运行时修改资源文件,因为它是在编译时生成的,因此本地化和支持多种语言的最佳方法是为每种语言创建

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


0
投票

要使用 Firebase 在 Android 中处理动态本地化,您可以通过将翻译存储在 Firebase Remote Config 中并在运行时获取它们来绕过修改 strings.xml。这是管理此问题的简化方法:

循序渐进的方法

  1. 将翻译存储在 Firebase Remote Config 中:保留您的翻译 在 Firebase 中采用 JSON 格式。
  2. 创建本地化管理器:开发一个获取并存储这些翻译的单例类。将对 getString(R.string.some_string) 的调用替换为经理的方法,该方法根据用户的区域设置检索正确的翻译。
  3. 获取和使用翻译:在应用启动时或需要时,从 Firebase 加载翻译并相应更新应用的 UI。

本地化管理器示例代码

对象 LocalizationManager { 私有变量翻译:Map=mapOf()

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")

© www.soinside.com 2019 - 2024. All rights reserved.