web-dev-qa-db-ja.com

Javaの文字列表現からロケールを取得する方法は?

LocaleのtoString()メソッドによって返される「プログラム名」から Locale インスタンスを取得するきちんとした方法はありますか?明白でい解決策は、文字列を解析し、それに従って新しいLocaleインスタンスを構築することですが、おそらくそれのためのより良い方法/準備ができている解決策がありますか?

ロケール自体を含むいくつかのロケール固有の設定をSQLデータベースに保存する必要がありますが、シリアル化されたLocaleオブジェクトをそこに配置するのはいでしょう。私はむしろ文字列表現を保存したいのですが、これは非常に詳細に十分であると思われます。

97
Joonas Pulakka

Locale.getLanguage()Locale.getCountry()...を参照してください。この組み合わせを"programatic name"...の代わりにデータベースに保存してください。
ロケールを元に戻す場合は、public Locale(String language, String country)を使用します

サンプルコードは次のとおりです。

// May contain simple syntax error, I don't have Java right now to test..
// but this is a bigger picture for your algo...
public String localeToString(Locale l) {
    return l.getLanguage() + "," + l.getCountry();
}

public Locale stringToLocale(String s) {
    StringTokenizer tempStringTokenizer = new StringTokenizer(s,",");
    if(tempStringTokenizer.hasMoreTokens())
    String l = tempStringTokenizer.nextElement();
    if(tempStringTokenizer.hasMoreTokens())
    String c = tempStringTokenizer.nextElement();
    return new Locale(l,c);
}
32
raj

文字列からロケールを返すメソッドがcommons-langライブラリにあります:LocaleUtils.toLocale(localeAsString)

119
yurilo

Java 7以降、ファクトリメソッドLocale.forLanguageTagおよびインスタンスメソッドLocale.toLanguageTagがあり、 IETF言語タグ を使用しています。

56
nilskp
  1. Javaは、適切な実装で多くのものを提供し、多くの複雑さを回避できます。これはms_MYを返します。

    String key = "ms-MY";
    Locale locale = new Locale.Builder().setLanguageTag(key).build();
    
  2. Apache Commonsには、文字列表現の解析に役立つLocaleUtilsがあります。これはen_USを返します

    String str = "en-US";
    Locale locale =  LocaleUtils.toLocale(str);
    System.out.println(locale.toString());
    
  3. ロケールコンストラクターを使用することもできます。

    // Construct a locale from a language code.(eg: en)
    new Locale(String language)
    // Construct a locale from language and country.(eg: en and US)
    new Locale(String language, String country)
    // Construct a locale from language, country and variant.
    new Locale(String language, String country, String variant)
    

他のメソッドを調べるには、この LocaleUtils とこの Locale を確認してください。

28
VdeX

オプション1:

org.Apache.commons.lang3.LocaleUtils.toLocale("en_US")

オプション2:

Locale.forLanguageTag("en-US")

オプション1は言語と国の間の「アンダースコア」であり、オプション2は「ダッシュ」です。

12
junjun

この答えは少し遅いかもしれませんが、文字列の解析はOPが想定したほどasくないことがわかります。私はそれを非常にシンプルで簡潔に見つけました:

public static Locale fromString(String locale) {
    String parts[] = locale.split("_", -1);
    if (parts.length == 1) return new Locale(parts[0]);
    else if (parts.length == 2
            || (parts.length == 3 && parts[2].startsWith("#")))
        return new Locale(parts[0], parts[1]);
    else return new Locale(parts[0], parts[1], parts[2]);
}

Locale.toString()のドキュメントに記載されているすべての例を使用して(Java 7で)これをテストしました: "en"、 "de_DE"、 "_ GB"、 "en_US_WIN"、 "de__POSIX"、 "zh_CN_ #Hans」、「zh_TW_#Hant-x-Java」、および「th_TH_TH_#u-nu-thai」。

重要な更新:これは、 ドキュメント によると、Java 7+での使用は推奨されません。

特に、toStringの出力を言語、国、およびバリアントフィールドに解析するクライアントは、引き続きこれを実行できます(ただし、これは強く推奨されません)スクリプトまたは拡張機能が存在する場合、バリアントフィールドには追加情報が含まれます。

代わりにLocale.forLanguageTagとLocale.toLanguageTagを使用するか、必要に応じてLocale.Builderを使用します。

12
andy

たくさんの答えがある古い質問ですが、ここにもっと解決策があります:

8
Tauren

プロジェクトでSpringフレームワークを使用している場合は、次も使用できます。

org.springframework.util.StringUtils.parseLocaleString("en_US");

ドキュメント

指定された文字列表現をロケールに解析します

5

これはAndroidで使用できます。私にとってはうまくいきます。

private static final Pattern localeMatcher = Pattern.compile
        ("^([^_]*)(_([^_]*)(_#(.*))?)?$");

public static Locale parseLocale(String value) {
    Matcher matcher = localeMatcher.matcher(value.replace('-', '_'));
    return matcher.find()
            ? TextUtils.isEmpty(matcher.group(5))
                ? TextUtils.isEmpty(matcher.group(3))
                    ? TextUtils.isEmpty(matcher.group(1))
                        ? null
                        : new Locale(matcher.group(1))
                    : new Locale(matcher.group(1), matcher.group(3))
                : new Locale(matcher.group(1), matcher.group(3),
                             matcher.group(5))
            : null;
}
3
Mygod

このための静的valueOfメソッドはないようですが、これは少し驚くべきことです。

Ratherいですが、簡単な方法の1つは、Locale.getAvailableLocales()を反復処理して、toStringの値を自分の値と比較することです。

あまりよくありませんが、文字列の解析は必要ありません。 Mapの文字列をロケールに事前入力し、そのマップでデータベース文字列を検索できます。

3
skaffman

実装したばかりだから:

Groovy/Grailsでは、次のようになります。

def locale = Locale.getAvailableLocales().find { availableLocale ->
      return availableLocale.toString().equals(searchedLocale)
}
1
Martin L.

代わりに、Locale.getISO3Language()getISO3Country()、およびgetVariant()の文字列連結をキーとして保存します。これにより、後でLocale(String language, String country, String variant)コンストラクターを呼び出すことができます。

実際、displayLanguageに依存するということは、ロケールの言語を使用して表示することを意味し、iso言語コードに反して、ロケールに依存します。

例として、enロケールキーは次のように保存できます。

en_EN
en_US

等々 ...

1
Riduidel