Подтвердить что ты не робот

Как получить язык (локаль) в настоящее время отображается Android-приложение?

Как узнать язык (локаль), который в настоящее время используется Android для отображения текстов для пользователя?

Я знаю, что могу использовать Locale.getDefault() для получения локали ОС по умолчанию. Но он может отличаться от языка, используемого приложением, для отображения текста и других ресурсов, если этот язык не поддерживается приложением.


Мне нужно определить язык (локаль), отображаемый приложением, поэтому приложение может передать язык на сервер, чтобы он мог локализовать возвращенные результаты.

4b9b3361

Ответ 1

Мое собственное решение состоит в том, чтобы добавить к strings.xml пару ключ-значение locale=<locale code>, таким образом context.getResources().getString(R.string.locale) вернет код локали, специфичный для используемой локали.

Ответ 2

Это в вашей конфигурации приложения, поэтому вы можете получить его с помощью:

getResources().getConfiguration().locale

это отличается от

Locale.getDefault()

и показывает Locale, который использует приложение, которое может быть другим.

Это может быть иначе, потому что разработчик может изменить его, обновив конфигурацию приложения, check: Resources.updateConfiguration

Ответ 3

Следующий код работает для меня:

@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();

Ответ 4

Вы можете использовать приведенный ниже код. Например, приведенные ниже функции могут быть помещены внутри класса, расширенного классом 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, чтобы узнать, какой язык используется в данный момент.

Ответ 5

 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;

    }

Используйте этот метод.