您如何存储多语言应用程序的首选项?

How do you store preferences on multilanguage apps?

假设我通过其字符串 Top 保存位置设置。 更改应用程序语言后,该字符串变得毫无意义,因为例如在新语言中它将是 Arriba,而那些字符串不相等。

所以我必须存储位置值 1 因为它在不同语言中都是相同的。

但随后偏好的摘要变成了 1,而不是 "Top" 以其他语言翻译成的任何方式。

所以我将代码映射到位置文本 1 -> Top 仅用于摘要显示目的,并单独保留位置代码。

我仍然需要在向用户显示设置的任何地方来回翻译(如果有的话),同时维护数组,其中包含每种语言的每种偏好的代码和映射本身。

好处是我可以通过应用程序的代码使用设置并将其应用到应用程序,而无需事先从其名称映射回来,而且应用程序在显示首选项时将代码转换为它的字符串(使用代码来自 "Settings Activity"。

所以我想知道,你是如何管理它的,这样它才不会变得难以管理,或者在路上回来咬你一口?

我觉得你应该从反面来看问题。现在您专注于按值存储首选项,但让我们从定义表示设置的所有可能值的类型开始,例如:

enum Position
{
  TOP("position_top"),
  BOTTOM("position_bottom"),
  LEFT("position_left")
  ;

  public final String identifier;
  private Position(String identifier) { this->identifier = identifier; }
}

现在您拥有设置的所有可能值,并且关联了一个标识符(如果您愿意,可以直接使用枚举 toString() 值)。

此标识符既可用于首选项中的序列化,也可用于引用 strings.xml 中的本地化资源。

由于根据 documentation 应避免使用枚举,因此我这样做了:

定义了两个数组;一种用于语言字符串,另一种用于 arrays.xml

中的代码
<string-array name="lang">
    <item>Inglés</item>
    <item>Español</item>
</string-array>

<string-array name="langCode">
    <item>EN</item>
    <item>ES</item>
</string-array>

在代码中,我将两个字符串数组加载到数组中并比较代码以获得 key:

的语言
public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
    Preference preference = findPreference(key);
    String arrayLang[] = getResources().getStringArray(R.array.lang);
    String arrayCode[] = getResources().getStringArray(R.array.langCode);
    for (int i = 0; i < arrayCode.length; i++) {
         if (arrayCode[i].contains(key)) {
             preference.setSummary(arrayLang[i]);
         }
    }

所以现在我在每种语言中都保留 langCode 数组,并且只翻译名称。

可能不是最好的方法,但它可以完成工作。