デバイスの現在の言語を取得する


609

Androidデバイスで現在選択されている言語を取得するにはどうすればよいですか?


10
ここでの回答の大部分は、アプリケーションの言語を取得します。アプリケーションのデフォルトロケールをコードで設定できる場合、正しい答えはSarpeによって与えられた答えです。これにより、デバイスのロケールが得られます。
Victor Ionescu 2015

@VictorIonescuコメントありがとうございます。Sarpeの答えは、デバイスのロケールを取得する正しい答えです。参考にしてください。stackoverflow.com/a/28498119/3762067
Varad Mondkar 2018

回答:


834

デバイスの選択した言語を取得したい場合、これはあなたを助けるかもしれません:

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage()は言語をローカライズします。ISOコードを取得するだけの場合(たとえば、ifステートメントまたはswitchステートメント)、「Locale.getDefault()。getISO3Language();」を使用します。
nuala 2012年

13
getISO3Language()は、deutではなくDeutschland(ドイツ)に対して「deu」のようなものを返します...
Tobias

372
を使用Locale.getDefault().getLanguage();して、通常の言語コード(「de」、「en」など)を取得できます。
muscardinus

35
@DeRagan、これは常にデバイスの言語を提供するわけではなく、アプリのみの言語を提供します。たとえば、私がを呼び出しLocale.setDefault("ru")、システム設定の言語が英語に設定されている場合、メソッドLocale.getDefault().getLanguage()"ru"を返しますが、"en"は返しません。実際のシステムロケール/言語を取得する別の方法はありますか?ここに文書化された解決策は見つかりませんでしたが、よりエレガントな解決策はありますか?
Prizoff

47
Locale.getDefault().toString()は、ロケールを完全に識別する文字列を提供することを好みます(例: "en_US")。
トム・

837

Android 4.1.2デバイスのロケールメソッドとその結果を確認しました。

Locale.getDefault().getLanguage()       ---> en      
Locale.getDefault().getISO3Language()   ---> eng 
Locale.getDefault().getCountry()        ---> US 
Locale.getDefault().getISO3Country()    ---> USA 
Locale.getDefault().getDisplayCountry() ---> United States 
Locale.getDefault().getDisplayName()    ---> English (United States) 
Locale.getDefault().toString()          ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag()     ---> en-US

7
おかげで、可能性のリストが表示されました。「トム」のコメントにあるように、「Locale.getDefault()。toString()」を追加してください。
RenniePet 2014

よくわかりません。DeRaganから回答をコピーしましたか?
ダイエット2015

1
申し訳ありません。そこに追加したのは本当です。ここから来たメモを残しておくべきだった。私は人々が彼らが必要とする答えをより早く見つけられるようにしようとする間違いを犯しました。あなたのものは明らかにより良い答えだからです。しかし、もちろん、あなたがトップに来ることは決してありません。この回答からのものであるというメモを添えてそこに追加しても大丈夫ですか?
Patrick Boos、2015

1
また会いましたね。私はその解決策を好まない。現在、DeRaganの回答は最初に表示され、私の回答は2番目に表示されます。研究者にとって、質問ページの2番目の回答を確認することはそれほど難しくありません。@pinkiが受け入れられた回答を変更した方がよいでしょう。しかし、それは3ヶ月前に最後に見た小指のようです。
トランテ

1
Locale.getDefault().getDisplayLanguage()戻るものもあります"English"
スポーツ

106

私のために働いたのは:

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() システムリソースのみ(アプリケーションリソースなし)へのアクセスを提供し、現在の画面用に構成されていない(寸法単位を使用できない、方向に基づいて変更されないなど)グローバル共有リソースオブジェクトを返します。

getConfiguration.locale現在非推奨となっているため、Android Nougatでプライマリロケールを取得するための推奨される方法は次のとおりです。

Resources.getSystem().getConfiguration().getLocales().get(0);

以前のAndroidバージョンとの互換性を保証するには、考えられる解決策は簡単なチェックです。

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
    //noinspection deprecation
    locale = Resources.getSystem().getConfiguration().locale;
}

更新

サポートライブラリから開始すると26.1.0、Androidのバージョンを確認する必要はありませんgetLocales()。これは、下位互換性のある便利なメソッドを提供するためです。

単に電話する:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());

6
getConfiguration()。localeは現在非推奨です。代わりにgetConfiguration()。getLocales()。get(0)を使用してください
Eliseo Ocampos 2017年

4
これがこの質問に対する正しい答えです。他の答えは、デバイスではなくアプリのローカルになります。
ホフ2017

6
回答が書かれたときにこれが存在していたかどうかはわかりませんが、サポートライブラリにはこれの下位互換バージョンがあり、自分で下位互換性を記述する必要はありません。ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear 2018

@Thorbearが指摘したように、今は新しいサポートライブラリメソッドを使用する方法getLocalesです。回答を更新しました。
Sarpe

これが正解です。その他は、システムではなくアプリケーションの言語を返します。
Chintan Rathod

44

現在のロケールから言語を「抽出」できます。標準のJava APIまたはAndroidコンテキストを使用して、ロケールを抽出できます。たとえば、次の2行は同等です。

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

10
本当じゃない。彼らは違う。最初のものは、ユーザーがロケールを切り替えると変更できます。2つ目は、電話機に事前にインストールされているものです。ユーザーが何をしたとしても変更されることはありません。
集約

16
gregmによるコメントは誤っている可能性があります。airewyreによる回答を参照してください。
jan groth 2012

4
@gregmのコメントが間違っています。自分で試してみると、設定で言語を変更するとLocale.getDefault()が変更されることがわかります。
Patrick Boos 2014年


@gregmのコメントは間違っていますが、彼はまだ正しいです。これらの2行は同じロケールを返す必要はありません。Locale.setDefault()事前に他のロケールで呼び出すだけで、異なる結果が得られます。
arekolek

35

他の時間や混乱を避けるために、上記のJohan Pelgrimが提案した2つの代替案を試してみたことと、デフォルトの場所が変更されているかどうかに関係なく、デバイスでは同等のものを共有したいと思います。

したがって、私のデバイスのデフォルト設定は英語(United Kindom)であり、この状態では予想どおり、ヨハンの回答の両方の文字列は同じ結果になります。次に、電話の設定でロケールを変更して(たとえばitaliano(Italia)に)、再実行すると、ヨハンの答えの両方の文字列でロケールがitaliano(Italia)になります。

したがって、Johanの元の投稿は正しいと思い、gregmのコメントは正しくないと思います。


18

これを使えます

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

「xx」が「en」、「fr」、「sp」、「ar」などの言語コードの場合....など


3
if(Locale.ENGLISH.equals(Locale.getDefault()。getLanguage())){...}
Clement Martino

1
@ClementMartino ENGLISHのような事前定義されたロケールの場合、提案は問題ありませんが、アラビア語のような他のロケールの場合、langコードを使用してそれを解析する必要があります
Simon K. Gerges


8

APIレベルが24以上の場合は、LocaleList.getDefault().get(0).getLanguage() それ以外を使用Locale.getDefault.getLanguage()

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

リファレンス:https : //developer.android.com/guide/topics/resources/multilingual-support


それは2020年に受け入れられる答えになるはずです!
Andrii Kovalchuk

6

ヨハン・ペルグリムの答えに追加するには

context.getResources().getConfiguration().locale
Locale.getDefault()

android.text.format.DateFormatクラスは両方を交換可能に使用するため、同等です。たとえば、

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

そして

public static boolean is24HourFormat(Context context) {
    String value = Settings.System.getString(context.getContentResolver(),
            Settings.System.TIME_12_24);

    if (value == null) {
        Locale locale = context.getResources().getConfiguration().locale;

    // ... snip the rest ...
}

5

システムリソースからロケールを取得することができます。

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

1
これは、構成の一部をオーバーライドした場合の答えです
Takhion

4

上記の回答では、簡体字中国語と繁体字中国語を区別していません。 Locale.getDefault().toString()「zh_CN」、「zh_TW」、「en_US」などを返す作品

参照先:https : //developer.android.com/reference/java/util/Locale.html、ISO 639-1は古い。


4

この解決策は私にとってうまくいきました。これにより、Androidデバイスの言語が返されます(アプリのローカル言語ではありません)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

これは、「en」、「de」、「fr」、またはデバイスの言語が設定されているものを返します。


3

このコードを使用して、現在のキーボードを見つけることができます

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();

3

2つの言語があります。

OSのデフォルト言語:

Locale.getDefault().getDisplayLanguage();

アプリケーションの現在の言語:

getResources().getConfiguration().locale.getDisplayLanguage();//return string

3
それは真実ではありません。アプリのロケールを変更した場合でも、最初にシステム値ではなく変更された値が表示されます
To Kra

3

言語を選択した場合、このギリシャ語を入力できない場合に役立つことがあります。

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

ギリシャ語でお試しください

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell

3

現在の言語を確認したい場合は、@ Sarpe(@Thorbear)の回答を使用してください。

val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())

ユーザーのローカル日付形式を適用する場合は、を使用しますDateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
CoolMind

1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}

2
これが質問に答える理由についていくつかの詳細を追加してください-コードスニペットだけでは読者はソリューションを理解できません
Wand Maker

Locale.getDefault()。getDisplayName()は、デバイスの現在の言語を提供します。デバイスの言語がヒンディー語であるかどうかを確認しています。現在のデバイスの言語がヒンディー語である場合は、ブロックで必要な操作を行います。
Pratibha Sarode

1

デバイスの言語を取得する正しい方法は次のとおりです。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return context.getResources().getConfiguration().getLocales().get(0);
} else {
    return context.getResources().getConfiguration().locale;
}

それが役に立てば幸い。


1
Locale.getDefault().getDisplayLanguage()

Writtenたとえば、言語の名前が表示されます。English, Dutch, French

Locale.getDefault().getLanguage()

あなたを与えるだろうlanguage code例えば、:en, nl, fr

どちらのメソッドも文字列を返します


1
public class LocalUtils {

    private static final String LANGUAGE_CODE_ENGLISH = "en";


    // returns application language eg: en || fa ...
    public static String getAppLanguage() {
        return Locale.getDefault().getLanguage();
    }

    // returns device language eg: en || fa ...
    public static String getDeviceLanguage() {
        return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
    }

    public static boolean isDeviceEnglish() {
        return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }

    public static boolean isAppEnglish() {
        return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }


}

Log.i("AppLanguage: ",     LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ",  LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ",    String.valueOf(LocalUtils.isAppEnglish()));

1

他の人はデバイスの言語に対して良い答えを出しました、

必要に応じてアプリの言語を、それを行うための最も簡単な方法は、追加することでapp_lang、あなたの鍵strings.xmlファイルを、同様にlangsごとにLANGを指定します。

そうすることで、アプリのデフォルト言語がデバイスの言語と異なる場合、サービスのパラメーターとしてそれを送信することを選択できます。


AssetManagerが現在使用している言語を提供するためのフレームワークサポートがないとは思えません。実際、Resources.javaの文字列フォーマットヘルパーはデフォルトのロケール[0]を使用するため、AssetManagerからの文字列がデバイスのデフォルトロケールと一致しないロケールからのものである場合(アプリがサポートしていないため、たとえばリストに)それからバグがあります。
dcow

1
public void GetDefaultLanguage( ) {
    try {
        String langue = Locale.getDefault().toString(); //        ---> en_US
        /*
        Log.i("TAG", Locale.getDefault().getLanguage() ); //       ---> en
        Log.i("TAG", Locale.getDefault().getISO3Language()  ); //  ---> eng
        Log.i("TAG", Locale.getDefault().getCountry()  ); //       ---> US
        Log.i("TAG", Locale.getDefault().getISO3Country()  ); //   ---> USA
        Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
        Log.i("TAG", Locale.getDefault().getDisplayName() ); //    ---> English (United States)
        Log.i("TAG", Locale.getDefault().toString()   ); //        ---> en_US
        Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English 
        */

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            langue = Locale.getDefault().toLanguageTag(); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }else{
            langue = langue.replace("_","-"); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }
    }catch (Exception ex) {
        Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
    }
}

public String getUrlMicrosoftLearn(String langue) {
    return "https://docs.microsoft.com/"+langue+"/learn";
}

単にコードを貼り付けるのではなく、回答にさらに指示を追加できるとよいでしょう。
カロス

0

私の解決策はこのようなものです

@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
    return Resources.getSystem().getConfiguration().locale.getLanguage();
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
    getResources();
    return Resources.getSystem().getConfiguration().getLocales().get(0);
}

その後

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

表示---> en


0

デバイスの国を取得するコードは次のとおりです。Androidのすべてのバージョンと互換性があります。

解決策:ユーザーが国を取得するよりもSIMカードを持っていない場合は、電話のセットアップまたは現在の言語選択中に使用されます。

public static String getDeviceCountry(Context context) {
    String deviceCountryCode = null;

    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(tm != null) {
            deviceCountryCode = tm.getNetworkCountryIso();
        }

    if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
        deviceCountryCode = deviceCountryCode.toUpperCase();
    }
    else {
        deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
    }

  //  Log.d("countryCode","  : " + deviceCountryCode );
    return deviceCountryCode;
}

-3

ヒンディー語を話すインドに住むユーザーのために特定のタスクを実行したい場合は、以下のif条件を使用してください

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.