如何在多语言应用程序中存储首选项?
可以说我通过字符串Top
保存位置设置。 在更改应用程序语言时,该字符串变得毫无意义,因为在新语言中,例如Arriba
,以及那些字符串不相等。如何在多语言应用程序中存储首选项?
所以我要保存的位置值1
,因为这将是相同的跨语言。
但后来偏好汇总成为1
,而不是任何方式“顶”在其他语言翻译成。
因此,我将代码映射到位置文本1
- >Top
仅用于摘要显示目的,并且仅保留位置代码。
我还是要翻译来回到处是设置显示给用户(如果它曾经是),与对每种语言的每个偏好和映射自身的代码维护阵列一起。
好处是我可以通过其代码使用设置并将其应用于应用程序,而无需事先将其从名称映射回来,并且应用程序会在显示首选项时将代码翻译为字符串(使用“设置活动”)。
所以我想知道你是怎么管理这个所以它不会变得难以管理或回来咬你在路上?
由于枚举要避免按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
数组,只能翻译名称。
可能不是最好的方式,但它的工作。
我想你应该从反面看问题。现在你正专注于店由它的价值偏好,但让我们从定义它代表了一个设定的所有可能值的类型,例如启动:
enum Position
{
TOP("position_top"),
BOTTOM("position_bottom"),
LEFT("position_left")
;
public final String identifier;
private Position(String identifier) { this->identifier = identifier; }
}
现在你已经和你相关的所有的设置可能的值一个标识符(如果您愿意,可以直接使用enum toString()
值)。
该标识符可以在喜好两者既用于序列化在strings.xml
指本地化的资源。
不错,不知道它存在(我刚开始使用Java)。从进一步的搜索,我看到我可以把'TOP(“顶部”,1),底部(“底部”,2)'等来回参考,对吧? –
当然,如果你可以使用一个有意义的字符串,那么使用一个数字来序列化一个键/值对是没有意义的。 – Jack
如果只是一个设置,为什么您的密钥会在语言之间发生变化。或者它是应用程序本身显示的字符串?然后它不应该在首选项 – petul
是的,它是反映当前选择的选项的行,在按钮下方在首选项屏幕上选择一个新选项。 –
对于你想达到的目标,我还是有点困惑。您在共享偏好设置中存储了一个关键值对。由于您只使用一种语言进行编程,因此这些应该不是特定于语言的。如果要存储当前选定的索引,请使用英文键并将该索引作为值。该选定条目的文本使用strings.xml文件进行本地化。我可能会误解你.. – petul