Java I18n用于不支持的语言环境

时间:2011-11-30 08:33:20

标签: java internationalization

Java I18n功能令人惊叹。 支持的locales完美无缺:

Locale ar = new Locale("ar","SA");
System.out.println(ar.getDisplayName(ar));

输出:العربية (السعودية)

但是对于不支持Kazakh语言的语言环境,语言名称显示在Enlish(标准)中的相同语言中,如Java Spec中所述。

Locale locale = new Locale("kk","KZ");
System.out.println(kk.getDisplayLanguage(kk));

输出:Kazakh (Kazakhstan)

我正在尝试解决此问题,最后一个代码必须输出如下:Қазақша (Қазақстан)

有人知道解决方案吗?

任何猜测(或与Java SE开发人员联系的方式,或与谁知道算法的方式)我都会注意到答案;)

谢谢!

3 个答案:

答案 0 :(得分:2)

最明显的解决方案是自己提供翻译,即根据语言和国家/地区属性的值外部化语言环境,并将这些翻译成ListResourceBundle实例。如果这似乎很多工作,它应该...... 值得一试的其他解决方案是使用ICU 它不会直接为您提供Locale显示名称,但您可以根据Locale创建ULocale对象,这可能只是被翻译。
如果ICU技巧不起作用,您可能会被迫通过CLDR语言列表并自行提供翻译。 BTW。塞尔维亚语有完全相同的问题,我不确定他们是否修复了JDK7 ......

答案 1 :(得分:1)

假设您在Windows上运行,则需要在操作系统区域设置中更改区域设置。 请参阅this链接。 (在胜利2000哈萨克斯坦出现,然而,在胜利7它没有出现在名单......)。在linux上,您可以使用localedef utility设置语言环境。

祝你好运!

答案 2 :(得分:0)

由于您的帖子很旧,我认为从 Java JDK 9 开始,您的代码应该可以正常工作。

使用 Java 11 测试的示例:

Locale country = new Locale.Builder().setRegion("KZ").build();
Locale lang = new Locale.Builder().setLanguage("kk").build();
System.out.println(country.getDisplayCountry(lang));

请注意,在 Java 8 中该问题仍然存在(没有翻译)。