リソースの探索候補リストを作成する関数
"ja"や"en"などをキーとして各言語に対応する文字列を格納するMapがあって、そこから指定されたロケールにマッチする文字列を取り出して使う、ということなのだけど、ResourceBundleの取得先特定ってvariantとかも考慮してたよなー。一応その辺と仕様をあわせておこうか、と思って指定されたLocaleに対応する探索候補リストを作成する関数を書いてみました。
- 引数でロケールを渡すと、対応する候補のリストを返却します。
- 優先順位の高いものが先に並びます。
- 順序づけは、ResourceBundleのデフォルトの探索ロジックと同じ。
/** * 探索対象の候補名一覧を取得する。 * {@link ResourceBundle#getBundle(String)}で使用されるデフォルトの候補一覧と * 同じ動作をする。 * * @param locale ロケール * @return 候補名一覧 */ static Collection<String> getCandidates( final Locale locale ) { return new LinkedHashSet<String>() {{ for ( Locale loc : new Locale[] { locale, Locale.getDefault() } ) { String l = loc.getLanguage(); String c = loc.getCountry(); String v = loc.getVariant(); if ( v.length() > 0 ) add( new Locale( l,c,v ).toString() ); if ( c.length() > 0 ) add( new Locale( l,c ).toString() ); add( new Locale( l ).toString() ); } add( Locale.ROOT.toString() ); }}; } ... Locale.setDefault( Locale.ENGLISH ); for ( String candidate : getCandidates( Locale.JAPAN ) ) { System.out.println( candidate ); }
実行結果です。
ja_JP ja en
Mapからの文字列探索時には、返される候補リストの順に探していけばOKですかね。