完全重用
要重用 JDK 逻辑,您可以在类路径中为每个已知语言环境(例如 test_fr_CA.properties、test_fr.properties、test_en_US.properties、test_en.properties、test.properties)创建一个属性文件。如果您希望能够与之匹配,请不要忘记根区域设置 (test.properties)。然后只需为有问题的语言环境创建一个资源包并检查它以查看实际使用的语言环境。
ResourceBundle rb = ResourceBundle.getBundle("test", Locale.FRENCH);
System.out.println("Locale used is:"+rb.getLocale().toString());
这些文件可以在测试后动态创建和清理。
高级代码复制,低级重用
您可以复制java.util.ResourceBundle.getBundleImpl(...) 中的高级代码。这基本上是通过在有问题的语言环境上重用java.util.ResourceBundle.Control.getCandidateLocales(...)的候选语言环境列表中寻找匹配项(使用您自己的匹配逻辑,如 equal toString() 表示)。如果没有匹配项,您可以通过重用java.util.ResourceBundle.Control.getFallbackLocale(...)来获得相关语言环境的下一个备用语言环境对于每个后备语言环境,您尝试匹配其候选列表中的语言环境,在循环中重复后备,直到没有后备语言环境。请注意,根区域设置将是每个候选列表中的最后一个候选区域,但除非您已用尽所有后备区域设置,否则应跳过它。
此方法不需要创建文件。您在 getCandidateLocales(...) 中使用不存在的 baseName 并获取 FallbackLocale(...) 调用,并将每个候选语言环境与您的已知语言环境列表进行比较以寻找匹配项。
一个简单的例子如下:
ResourceBundle.Control rbControl = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_PROPERTIES);
Locale localeInQuestion = Locale.CHINA;
List<Locale> knownLocales = Arrays.asList(new Locale[] {Locale.CANADA_FRENCH, Locale.FRENCH, Locale.US, Locale.UK, Locale.ENGLISH, Locale.ROOT});
String nonExistentBaseName = "bogus";
Locale matchingLocale = null;
Boolean reachedRootLocaleMatch = false;
outerloop:
for (Locale targetLocale = localeInQuestion;
targetLocale != null;
targetLocale = rbControl.getFallbackLocale(nonExistentBaseName, targetLocale)) {
List<Locale> candidateLocales = rbControl.getCandidateLocales(nonExistentBaseName, targetLocale);
for (Iterator iterator = candidateLocales.iterator(); iterator.hasNext();) {
Locale currentCandidateLocale = (Locale) iterator.next();
if (knownLocales.contains(currentCandidateLocale)) {
if (currentCandidateLocale.equals(Locale.ROOT)) {
reachedRootLocaleMatch = true;
}
else {
matchingLocale = currentCandidateLocale;
break outerloop;
}
}
}
}
if (matchingLocale == null && reachedRootLocaleMatch) {
matchingLocale = Locale.ROOT;
}
if (matchingLocale != null) {
System.out.println("The matching locale is: "+matchingLocale.toString());
}
else {
System.out.println("There was no matching locale");
}