web-dev-qa-db-ja.com

現在言語(ロケール)を取得する方法Androidアプリが表示しますか?

現在言語(ロケール)を知る方法Androidアプリがユーザーにテキストを表示するために使用しますか?

Locale.getDefault()を使用してデフォルトのOSロケールを取得できることはわかっています。ただし、アプリがこのロケールをサポートしていない場合、テキストやその他のリソースを表示するためにアプリが使用するロケールとは異なる場合があります。


アプリが表示する言語(ロケール)を決定する必要があるため、アプリは言語をサーバーに渡し、返された結果をローカライズできます。

29

私自身の解決策は、_strings.xml_キーと値のペア_locale=<locale code>_に追加することです。したがって、context.getResources().getString(R.string.locale)は、使用されているロケールに固有のロケールコードを返します。

45

それはあなたのアプリの設定にあるので、あなたはそれを得ることができます:

getResources().getConfiguration().locale

これは

Locale.getDefault()

また、アプリが使用するロケールが異なる場合があります。

開発者がアプリの設定を更新することで変更できるため、異なる場合があります。以下を確認してください Resources.updateConfiguration

31
sotcha

次のコードは私のために働きます:

@TargetApi(Build.VERSION_CODES.M)
private String getCurrentDefaultLocaleStr(Context context) {
    Locale locale = context.getResources().getConfiguration().locale;
    return locale.getDefault().toString();
}

注:Build.VERSION_CODES.Nでロケールを取得する方法に若干の変更があります。 N以上の場合、コードは以下のコードブロックのようになります。ただし、上記のコードブロックのようにM以下に対してのみ実行し、N以上に対しても互換性があります。

    // Build.VERSION_CODES.N
    Locale locale = context.getResources().getConfiguration().getLocales().get(0);

私がサポートする各国語については、次のことがわかりました。

English:             en 
Traditional Chinese: zh_TW_#Hant 
Simplified Chinese:  zh_CN_#Hans
Spanish:             es_ES
French:              fr_FR
Japanese:            ja_JP
German:              de_DE

同じロケール情報を異なる形式で提供するメソッドのリストがあります。

locale.getDefault()。getCountry();
locale.getDefault()。getISO3Language();
locale.getDefault()。getISO3Country();
locale.getDefault()。getDisplayCountry();
locale.getDefault()。getDisplayName();
locale.getDefault()。getDisplayLanguage();
locale.getDefault()。getLanguage();
locale.getDefault()。toString();

5
Li Li

以下のコードを使用できます。たとえば、以下に示す関数は、Applicationクラスを拡張したクラス内に配置できます。

_public class MyApplication extends Application {
    ...
    public static String APP_LANG;
    private Context ctx = getBaseContext();
    private Resources res = ctx.getResources();
    public SharedPreferences settingPrefs;
    ...

    public void restoreAppLanguage(){
    /**
    *Use this method to store the app language with other preferences.
    *This makes it possible to use the language set before, at any time, whenever 
    *the app will started.
    */
        settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE);
        String lang = settingPrefs.getString("AppLanguage", "");
        if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){
            Locale myLocale;
            myLocale = new Locale(lang);
            Locale.setDefault(myLocale);
            Configuration config = new Configuration();
            config.locale = myLocale;
            res.updateConfiguration( config, res.getDisplayMetrics() );
        }
    }

    public void storeAppLanguage(int lang) {
    /**
    *Store app language on demand
    */
        settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE);
        Editor ed = settingPrefs.edit();

        Locale myLocale;
        myLocale = new Locale(lang);
        Locale.setDefault(myLocale);
        Configuration config = new Configuration();
        config.locale = myLocale;
        res.updateConfiguration( config, res.getDisplayMetrics() );
        ed.putString("AppLanguage", lang);

        ed.commit();
    }

    public void setAppLanguage(String lang){
    /**
    *Use this method together with getAppLanguage() to set and then restore
    *language, whereever you need, for example, the specifically localized
    *resources.
    */
        Locale myLocale;
        myLocale = new Locale(lang);
        Locale.setDefault(myLocale);
        Configuration config = new Configuration();
        config.locale = myLocale;
        res.updateConfiguration( config, res.getDisplayMetrics() );
    }

    public void getAppLanguage(){
    /**
    *Use this method to obtain the current app language name
    */
        settingPrefs = getSharedPreferences("ConfigData",MODE_PRIVATE);
        String lang = settingPrefs.getString("AppLanguage", "");
        if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){
            APP_LANG = lang;
        }
        else APP_LANG = Locale.getDefault().getLanguage();
    }
}
_

そして、メインコードのどこにでも書くことができます:

_public class MainActivity extends ActionBarActivity {
    ...
    MyApplication app;
    ... 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        app = (MyApplication)getApplicationContext();
        ...
        if(settingPrefs.getAll().isEmpty()){
            //Create language preference if it is not
            app.storeAppLanguage(Locale.getDefault().getLanguage());
        }

        //Restore previously used language
        app.restoreAppLanguage();
        ...
    }
    ...
    void SomethingToDo(){
        String lang = "en"; //"fr", "de", "es", "it", "ru" etc.
        ...
        app.getAppLanguage();
        app.setAppLanguage(lang);
        ...
        //do anything
        ...
        app.setAppLanguage(app.APP_LANG);
    }
    ...
}
_

あなたの場合、まもなくgetAppLanguage()を使用してから、パブリック変数_APP_LANG_をチェックして、現在使用されている言語を取得できます。

1
Sergey V.
 public boolean CheckLocale(Context context, String app_language) {
        Locale myLocale = new Locale(app_language);
        Resources res = context.getResources();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        if(res.getConfiguration().locale==myLocale)
            return true;
        else 

         return false;

    }

この方法を使用します。

0