我打算用Java标准的国际化系统与复数的ChoiceFormat类,但后来意识到它不能处理一些语言(例如波兰)的复杂的复数规则。 如果只处理类似于英语的语言,然后似乎有点毫无意义。
有什么选择那里获得正确的复数形式? 什么是使用它们的利弊?
我打算用Java标准的国际化系统与复数的ChoiceFormat类,但后来意识到它不能处理一些语言(例如波兰)的复杂的复数规则。 如果只处理类似于英语的语言,然后似乎有点毫无意义。
有什么选择那里获得正确的复数形式? 什么是使用它们的利弊?
嗯,你已经正确标记的问题,所以我想你知道两件事ICU 。
随着ICU您对的复数形式妥善处理两种选择:
使用哪一个? 就个人而言,我更喜欢直接使用PluralRules,从资源包中选择相应的消息。
ULocale uLocale = ULocale.forLanguageTag("pl-PL");
ResourceBundle resources = ResourceBundle.getBundle( "path.to.messages",
uLocale.toLocale());
PluralRules pluralRules = PluralRules.forLocale(uLocale);
double[] numbers = { 0, 1, 1.5, 2, 2.5, 3, 4, 5, 5.5, 11, 12, 23 };
for (double number : numbers) {
String resourceKey = "some.message.plural_form." + pluralRules.select(number);
String message = "!" + resourceKey + "!";
try {
message = resources.getString(resourceKey);
System.out.println(format(message, uLocale, number));
} catch (MissingResourceException e) { // Log this }
}
当然,你(或翻译)将需要适当的形式添加到属性文件,在这个例子中,让我们说:
some.message.plural_form.one=Znaleziono {0} plik
some.message.plural_form.few=Znaleziono {0} pliki
some.message.plural_form.many=Znaleziono {0} plików
some.message.plural_form.other=Znaleziono {0} pliku
对于其他语言(即阿拉伯语),您也可能需要使用“零”和“两节”关键字,看到CLDR的语言复数规则了解详情。
或者您可以使用PluralFormat来选择有效的形式。 通常的例子表明直接实例化,这完全没有意义在我看来。 这是比较容易与使用ICU的的MessageFormat :
String pattern = "Znaleziono {0,plural,one{# plik}" +
"few{# pliki}" +
"many{# plików}" +
"other{# pliku}}";
MessageFormat fmt = new MessageFormat(pattern, ULocale.forLanguageTag("pl-PL"));
StringBuffer result = new StringBuffer();
FieldPosition zero = new FieldPosition(0);
double[] theNumber = { number };
fmt.format(theNumber, result, zero);
当然,实际上你不会写死个模式字符串,但把像这样的属性文件:
some.message.pattern=Found {0,plural,one{# file}other{# files}}
这种方法唯一的问题是,译者必须意识到占位符格式。 另一个问题,我试着在上面的代码表明的是,MessageFormat中的静态格式()方法(一个是易于使用的)总是格式默认语言环境。 这可能是在Web应用程序,其中默认的语言环境通常意味着服务器的一个现实问题。 因此,我不得不格式化特定区域设置(浮点数,请注意)和代码看起来相当丑陋...
我还是比较喜欢PluralRules方法,这对我来说是更清洁的(虽然它需要使用相同的消息格式样式,仅包裹着的辅助方法)。
ChoiceFormat
,因为这里解释似乎足够的灵活性来应付各种多元化的你可以在它扔。
编辑:作为Dr.Haribo在他的评论中指出,ChoiceFormat是不够的波兰多元化。 但是来自同一博客的随访表明ICU4J来处理更复杂的复数规则