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

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

听起来你想要一个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 

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

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

  1 year %d years  

所以对于抛光我会:

  1 rok %d lat  

然后我会对我的代码:

 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文件中,我将添加缺少的字符串:

 %d lata 

我的第二个解决方案有英语,西class牙语和其他语言的复数元素,没有太多的复数变化。 然后,对于其他具有此类更改的语言,我将使用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); } 

我不知道这些方式是否是最好的方式,但就目前而言,或者在谷歌做出更好的事情之前,这对我有用。

有一个内置的“复数”支持,没有很好的记录。
这里提到你可以在浏览器源代码中看到它。

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