-->

Java的国际化(i18n)与适当的复数(Java internationalization (i1

2019-08-06 19:55发布

我打算用Java标准的国际化系统与复数的ChoiceFormat类,但后来意识到它不能处理一些语言(例如波兰)的复杂的复数规则。 如果只处理类似于英语的语言,然后似乎有点毫无意义。

有什么选择那里获得正确的复数形式? 什么是使用它们的利弊?

Answer 1:

嗯,你已经正确标记的问题,所以我想你知道两件事ICU 。

随着ICU您对的复数形式妥善处理两种选择:

  • PluralRules ,这给你定Locale的规则
  • PluralFormat ,它采用上述规则,允许格式

使用哪一个? 就个人而言,我更喜欢直接使用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方法,这对我来说是更清洁的(虽然它需要使用相同的消息格式样式,仅包裹着的辅助方法)。



Answer 2:

ChoiceFormat ,因为这里解释似乎足够的灵活性来应付各种多元化的你可以在它扔。

编辑:作为Dr.Haribo在他的评论中指出,ChoiceFormat是不够的波兰多元化。 但是来自同一博客的随访表明ICU4J来处理更复杂的复数规则



文章来源: Java internationalization (i18n) with proper plurals