如何使用真正的多语言字符串做一个应用程序?

时间:2010-06-28 21:29:35

标签: java android multilingual

为不同语言制作字符串的最佳方法是什么?我有这个问题,我试图显示诸如'月','月','年','年'之类的字符串。目前我正在研究我所熟知的3种语言:西班牙语,英语和波兰语。对于英语和西班牙语,这是直截了当的。但是,例如,在波兰'年'可以成为'lata'(在数字2 - 4之后)或'lat'(在5之后的数字之后)。我正在考虑为此添加一个额外的字符串,并在其他语言中将其设置为空。然而,这让我想到了我不知道的其他语言,这可能会有更多的差异。如果我考虑将来添加更多语言,那么在这种情况下哪个应该是最好的方法?

4 个答案:

答案 0 :(得分:3)

听起来你想要一个ChoiceFormat,或者至少使用一个MessageFormat

public static void main(String... args) {
    String[] formats = { 
        // NOTE - In a real app, you'd fetch the format strings from a language,
        // file, not hard-code them in your program. Obviously.
        "{0,number} {0,choice,0#years|1#year|1<years}", // english
        "{0,number} {0,choice,0#años|1#año|1<años}", // spanish
        "{0,number} {0,choice,1#[fewer than 2]|2#lata|4<lat}", // polish
        "{0,number} år", // swedish - singular and plural forms look the same!
    };
    int[] years = {0, 1, 2, 3, 4, 5, 6};
    for (int year : years) {
        for (String format : formats) {
            System.out.println(MessageFormat.format(format, year));
        }
        System.out.println();
    }
}

在你的程序中,你当然会从你的字符串文件中获取format字符串。

答案 1 :(得分:2)

感谢我的答案,我正在编写2个基于Android的解决方案。我使用的第一个是复数。乍看之下检查Plurals文档/示例,你可以认为有一个数量=“很少”(对于2-4个复数),sources检查仅适用于locale'cs'。对于其他语言环境,只有“一个”和“其他”正在运行。 所以在你的strings.xml文件中:

<plurals name ="years">
    <item quantity="one">1 year</item>
    <item quantity="other"><xliff:g id="number">%d</xliff:g> years</item>
</plurals>

所以,对于抛光,我会:

<plurals name ="years">
    <item quantity="one">1 rok</item>
    <item quantity="other"><xliff:g id="number">%d</xliff:g> lat</item>
</plurals>

然后我会对我的代码:

int n = getYears(...);
if (Locale.getDefault().getLanguage().equalsIgnoreCase("pl") && n >= 2 && n <= 4) {
   return getString(R.string.years_pl, n);
} else {
   return getResources().getQuantityString(R.plurals.years, n, n);
}

在我的strings.xml文件中,我会添加缺少的字符串:

<string name="years_pl"><xliff:g id="number">%d</xliff:g> lata</string>

我的第二个解决方案有英语,西班牙语和其他语言的复数元素,没有太多的复数变化。然后,对于其他具有此类更改的语言,我将使用ChoiceFormat。所以在我的代码中:

...
private static final int LANG_PL = 0;
// add more languages here if needed
...
String formats[] = {
"{0,number} {0,choice,1#" + getString(R.string.year_1) + "|2#" + getString(R.string.years_2_4) +  "|4<" + getString(R.string.years_lots) +"}", // polish
// more to come
};
...
// Here I would add more for certain languages
    if (Locale.getDefault().getLanguage().equalsIgnoreCase("pl")) {
       return MessageFormat.format(formats[LANG_PL], n);
    } else {
       return getResources().getQuantityString(R.plurals.years, n, n);
    }

我不知道这些方式是否是最好的方式,但目前,或者直到谷歌做得更好,这对我有用。

答案 2 :(得分:1)

内置“复数”支持,但没有详细记录 提及here,您可以在Browser sources中看到它。

答案 3 :(得分:0)

请注意,我没有任何特定于Android的经验...但我通常会选择为我支持的每种语言设置单独的视图文件,这样可以比单独的语言更广泛的本地化,你现在也可以拥有如果您知道某些其他语言的文本可能需要更宽的按钮,甚至是不同的图像,那么布局略有改变。