gpt4 book ai didi

正确复数的 Java 国际化 (i18n)

转载 作者:IT老高 更新时间:2023-10-28 21:01:14 25 4
gpt4 key购买 nike

我打算将 Java 的标准 i18n 系统与 ChoiceFormat 类一起用于复数,但后来意识到它不能处理某些语言(例如波兰语)的复杂复数规则。如果它只处理类似于英语的语言,那么它似乎有点没有意义。

有哪些方法可以实现正确的复数形式?使用它们的优缺点是什么?

最佳答案

好吧,您已经正确标记了问题,所以我假设您对 ICU 有所了解。 .

对于 ICU,您有两种正确处理复数形式的选择:

  • PluralRules ,它为您提供给定区域设置的规则
  • 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's language plural rules了解详情。

您也可以使用 PluralFormat 来选择有效的形式。通常的示例显示直接实例化,在我看来这完全没有意义。与 ICU's 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 的静态 format() 方法(易于使用的方法)总是为默认语言环境格式化。这在 Web 应用程序中可能是一个真正的问题,其中默认区域设置通常意味着服务器的区域设置。因此,我必须为特定的语言环境( float ,请注意)进行格式化,并且代码看起来相当丑陋......

我还是更喜欢 PluralRules 方法,它对我来说更简洁(尽管它需要使用相同的消息格式样式,只是用辅助方法包装)。

关于正确复数的 Java 国际化 (i18n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14326653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com