如何在多语言应用程序上存储首选项?

时间:2017-06-03 16:30:13

标签: java android localization preferences

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

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

但是,首选项的摘要变为1,而不是以其他语言翻译成“Top”的任何方式。

所以我将代码映射到位置文本1 - > Top仅用于汇总显示,并保留位置代码。

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

好处是我可以通过代码使用并将设置应用到应用程序,而无需事先将其从名称映射回来,以及应用程序在显示首选项时将代码转换为字符串的事实(使用“来自”的代码)设置活动“为此。”

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

2 个答案:

答案 0 :(得分:0)

我认为你应该从对面看到问题。现在你专注于通过它的值来存储偏好,但是让我们从定义代表设置的所有可能值的类型开始,例如:

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中的本地化资源。

答案 1 :(得分:0)

由于要按照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数组保留在每种语言中,只翻译名称。

可能不是最好的方式,但它可以胜任。