Androidはデフォルトではなく現在のロケールを取得します


300

Androidでユーザーの現在のロケールを取得するにはどうすればよいですか?

デフォルトのものを入手できますが、これは現在のものではない可能性がありますか?

基本的に、現在のロケールの2文字の言語コードが必要です。デフォルトではありません。ありませんLocale.current()


default()かなり安全な賭けです、(ドキュメントが言うように)それを処理に使用しないでください。
A--C

@ A--C処理に使用しますか?
CQM 2013年

ええ、ドキュメントが言っていることを見てください:一部のロケールは小数点として「、」と「。」を使用します。桁のグループ化。そのため、parseInt()などは失敗する可能性があります。彼らはまだを使用することを推奨しdefault()ていますが、コードを破壊する可能性のあるものには使用しないでください。
A--C

回答:


487

デフォルトLocaleは、システムプロパティ設定からアプリケーションプロセスの実行時に静的に構築されるため、アプリケーションの起動時Localeにそのデバイスで選択されたものを表します。通常、これで問題ありませんがLocale、アプリケーションプロセスの実行後にユーザーが設定を変更しても、値getDefaultLocale()がすぐに更新されない可能性があります。

アプリケーションで何らかの理由でこのようなイベントをトラップする必要がある場合は、代わりLocaleにリソースConfigurationオブジェクトから利用可能なものを取得してみてください。

Locale current = getResources().getConfiguration().locale;

アプリケーションで必要な場合は、設定の変更後、この値がより速く更新されることがあります。


1
システムで変更したときに、デフォルトのロケールがアプリで変更されていないことを誰かが確認しましたか?私はそれは活動が破壊され、再作成させるものを「構成変更」の一つだと思う
のMichałKを

11
私はそれをテストし、ロケールを変えながら両方を出力しました。結果は、出力は同じです。したがって、Locale.getDefault()はすぐに更新されるため、安全に使用できます。 Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
アレッシオ2016年

58
これはConfigurationクラスで非推奨になりました。このアドバイスの最新のドキュメントを参照してくださいlocale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
。– MrBigglesworth

7
奇妙なgetLocales()。get(0)を避けるために、なぜgetFirstLocale()メソッドを追加しないのですか?
user3290180

1
古いバージョンと新しいバージョンのAPIをサポートする場合はどうなりますか?
イヴァン

179

Android N(APIレベル24)の更新(警告なし):

   Locale getCurrentLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }

6
if-elseを回避するためにサポートライブラリに何かありますか?
フェデリコポンジ

8
ifおよびフォールバックコードを含める場合、@ TargetApi(Build.VERSION_CODES.N)はコードに必要ありません
Patrick Favre

@FedericoPonzi no ResourceCompatには、25.0.1現在のロケールのメソッドがないようです
Patrick Favre

2
ユーザーが複数の言語をインストールしている場合、これは機能しない可能性があります。LocaleList.getDefault().get(0);これは、優先言語でソートされたロケールを返すため、使用する必要があります。
カーリー

21
@FedericoPonzi @ for3st私はこの中を見つけたConfigurationCompatとして、ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
のYuval

63

Androidサポートライブラリを使用している場合ConfigurationCompatは、@ Makaleleのメソッドの代わりに使用して、非推奨の警告を取り除くことができます。

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

またはコトリンで:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

8
コンテキストがない場合は、次のこともできますConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.

@QuentinG。はい。ただし、この場合はアプリケーションコンテキストを使用する方が適切です。
McMath

明確にするために、これはデフォルトのロケールを返しませんが、ユーザーの好みのロケールを返しますか?
Csaba Toth

12

getDefaultのドキュメントから:

ユーザーの優先ロケールを返します。これは、このプロセスではsetDefault(Locale)でオーバーライドされている可能性があります。

また、Localeドキュメントから:

デフォルトのロケールは、ユーザーへのデータの提示を伴うタスクに適しています。

あなたはそれを使うべきだと思われます。


7
この答えは間違っています。デフォルトのロケールを取得しましたが、ユーザーがオンザフライで変更した場合、間違って表示されます。次の答えは正しい
user170317

同意、間違った答え。私の場合、私はgetResources()を使用する必要がない方法を探していました。つまり、コンテキストが必要です。私の問題は、コンテキストのないヘルパークラスでしたが、それを渡す必要があると思います。ロケールを変更し、ビューの文字列、数値形式などを変更できるアプリがある場合は、 Devunwiredの応答を使用する必要があります
1mike12

私のために働きなさい。私はにブレークポイントを設定した場合Locale.setDefault()、それは私が(それまで私がテストした限りの)少なくともアンドロイド5.0に背をデバイスの言語を変更するときに呼び出さの取得
cambunctious

6

上記のすべての回答-機能しません。だから私はここに4と9のアンドロイドで機能する関数を入れます

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}

デバイスレベルでのユーザーの優先言語方向を返す数少ない回答の1つ。LocaleListCompat.getDefault()AndroidXを使用している場合も使用できます。
サム

1

私はこれを使いました:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}

0

公式ドキュメントによると、 ConfigurationCompatはサポートライブラリで非推奨になっています

あなたは使用を検討することができます

LocaleListCompat.getDefault()[0].toLanguageTag() 0番目の位置はユーザーの優先ロケールになります

デフォルトのロケールを0番目の位置に取得するには、 LocaleListCompat.getAdjustedDefault()


はい、ただしandroidx ConfigurationCompatバージョンに置き換えられていません
。developer.android.com/ reference / androidx / core / os /…を

正解です。androidxへの移行のために言及されているだけかもしれません
Rakshit Soni
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.