我正试图为ext.js引入不同的语言环境翻译。大多数ext.js翻译都只提供所识别的语言(ext-lang-fr.js)。然而,当我查看门户网站以决定包含哪个翻译文件时,它总是会为我提供语言环境的语言/国家/地区。我要支持的语言有限。是否有一个现有的java库封装了用于决定列表中最特定文件的逻辑。
例如,如果我的支持语言文件标识为:{de,en,es,fr,it,pt_pt,zh_CN}如果request.getLocale()以"fr_fr"响应,那么它将以我列表中的特定"fr"响应。如果我传递了一个不在列表中的值,它将使用一些默认值进行响应。
显然,我可以自己解析字符串/编写自己的字符串等,但我想知道是否有一种标准且稳健的方法可以做到这一点?
Marc
如果您使用Java 6或更新版本,就会发现一些问题。显然,他们必须实现这种Locales层次结构才能从属性文件加载字符串。您可以使用ResourceBundle.Control获取区域设置的分层列表:
Control control = Control.getControl(Control.FORMAT_DEFAULT);
List<Locale> locales = control.getCandidateLocales("messages",
Locale.forLanguageTag("zh-HK"));
for (Locale locale : locales) {
System.out.println(locale.toLanguageTag());
}
这将返回(Java 7):
zh-Hant-HK
zh-Hant
zh-HK
zh
und
其中"und"表示"未定义"。它甚至更好,因为你可以实际建立你的文件名:
Control control = Control.getControl(Control.FORMAT_DEFAULT);
List<Locale> locales = control.getCandidateLocales("messages",
Locale.forLanguageTag("pl-PL"));
for (Locale locale : locales) {
String bundleName = control.toBundleName("messages", locale);
System.out.println(bundleName);
String resourceName = control.toResourceName(bundleName, "properties");
System.out.println(resourceName);
}
结果是:
messages_pl_PL
messages_pl_PL.properties
messages_pl
messages_pl.properties
messages
messages.properties
当然,您需要知道是否存在特定的文件,但这个文件应该非常简单。