【问题标题】:Best practices for storing translatable android strings in DB在 DB 中存储可翻译的 android 字符串的最佳实践
【发布时间】:2014-11-23 23:58:19
【问题描述】:

在我的应用程序的一种形式中,我有一个从字符串数组 android 资源填充的微调器,因此可以在 android 应用程序中创建额外的 XML 文件来管理翻译。表单数据通过 API 保存在 mongodb 中,如果相关,我也可以完全控制两者。

应用程序将以 5 种语言启动(以后可能会增加),因此我可以获得相同字符串的 5 个不同“版本”,但我希望在应用程序中以应用程序当时的语言看到这些字符串(独立于存储它的语言)。

如果可能,我想使用原生 android 翻译功能来实现这一点,即在应用程序中发送 5 个 XML 文件,每种语言一个。 我也想让服务器代码尽可能地笨。

到目前为止,我只能考虑在数据库中存储一个索引,然后使用 switch/case 循环,在应用程序视图中呈现数据。我根本不喜欢这样,因为可能的选项必须进行硬编码,任何更改都意味着新的应用版本。

这方面的最佳做法是什么?

【问题讨论】:

  • 不知道您要归档什么。 5 个 xml 中的 5 种语言 - 好的,动态切换语言 - 当然 - 更改区域设置,然后更改配置,更新配置。但是 DB 和它有什么关系呢?
  • 如果你把 db 从方程中去掉,就没有问题了。但是如果我想将表单中的数据存储在数据库中,就会出现问题。如果我的应用程序是英文的,并且微调器中的文本是存储的,当其他人检索它并拥有西班牙语的应用程序时,该文本仍将是英文
  • 哦,所以你想翻译用户输入的内容?像在 xml @string/work => 'work' 和 xml-de @string/work => 'arbeit' 中,以及微调器调整?好吧,这应该没有问题,只需使用 R.string.work 生成您的微调器,语言环境将负责更改。除非用户输入未翻译的内容 - 否则 Android 会退回到默认设置。

标签: android mongodb android-widget persistent-storage


【解决方案1】:

从您的 cmets 中,我了解到您的实际问题是将微调器值存储在数据库中。

正如您在问题中所说,您不应该存储微调器的字符串,而是存储一个表示该值的整数。然后将微调器与 List 一起使用,而不是 List。

没有意义的 int 索引的替代方法是枚举:

public enum SpinnerValues {
    EXAMPLE_1(R.string.example1_string),
    EXAMPLE_2(R.string.example2_string),
    EXAMPLE_3(R.string.example3_string);

    private int mStringResId;

    private SpinnerValues(int stringResourceId) {
        mStringResId = stringResourceId;
    }

    public int getStringResId() {
        return mStringResId;
    }
}

在这种情况下,您的微调器数据将是 List 并且您可以使用序号或枚举的字符串表示形式将枚举存储在数据库中(我会建议使用字符串值以便更改枚举的顺序值不会破坏您的数据库)。

【讨论】:

  • 这解决了以我喜欢的方式保存微调器值的问题。但是,如果这是最好的(或推荐的)方法,这仍然是一个悬而未决的问题。因为这个方法有个根本的缺陷,我问这个问题的时候没有想到:一旦应用在野外发布,如果版本A,添加字符串EXAMPLE_4,仍然使用版本A-1的用户会从API中获取数据但不会有可用的资源翻译。所以这可能意味着翻译最好放在数据库中而不是字符串资源中。
  • 我不同意。在数据库中存储可翻译的字符串意味着您必须以自己的方式处理本地化,而不使用 Android 框架资源。如果您在本地存储数据,则不会发生您提到的用例。如果您在微调器中添加新值,则必须使用新的枚举值重新发布您的应用程序。没有老用户可以在其数据库中拥有它。
  • 如果您按照您的建议从 Web 服务中检索表单数据,可能会有些不同,但您可以放心地假设您的用户在所有设备上都拥有相同版本的应用程序(如果不是,只显示一个默认值)。或者,您可以对 Web API 进行版本控制。
  • 当然,但我将数据存储在 REST 服务上,最常见的用例是一个用户创建信息,而许多用户得到它。这加剧了拥有不同客户端版本的问题。
  • 我不明白,如果微调器值是由用户创建的,你如何翻译它?
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2012-04-10
  • 2015-03-29
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多