1

ext.jsにさまざまなロケール翻訳を取り入れようとしています。ext.jsの翻訳の大部分には、識別された言語(ext-lang-fr.js)のみが含まれています。ただし、ポータルを見て、含める翻訳ファイルを決定するときに、ポータルは常にロケールの言語/国を提供します。サポートする言語のセットは限られています。リスト内で見つかった最も具体的なファイルを決定するためのロジックをカプセル化する既存のJavaライブラリはありますか。

たとえば、サポートする言語ファイルが次のように識別される場合:{de、en、es、fr、it、pt_PT、zh_CN} if request.getLocale()が'fr_FR'で応答した場合、それは私の特定の'fr'で応答しますリスト。リストにない値を渡した場合、デフォルト値で応答します。

もちろん、文字列を自分で解析したり、自分で書いたりすることはできますが、これを行うための標準的で堅牢な方法があるかどうか疑問に思いました。

マーク

4

1 に答える 1

1

Java 6以降を使用している場合は、何かがあります。明らかに、プロパティファイルから文字列をロードするには、この種のロケール階層を実装する必要がありました。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

もちろん、特定のファイルが存在するかどうかを知る必要がありますが、これはかなり簡単なはずです。

于 2012-09-05T06:42:49.827 に答える