完全な再利用
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(...) および get FallbackLocale(...) 呼び出しで存在しない baseName を使用し、各候補ロケールを既知のロケールのリストと比較して一致を探します。
これの簡単な例は、次のようになります。
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");
}