2011-12-31 4 views
22

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

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


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

ответ

41

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

+0

Я предполагаю, что это решение должно быть частью вашего вопроса. –

+1

@YaqubAhmad Я пришел к этому решению позже. Но я все еще жду возможного лучшего решения. –

+1

Мне нравится это решение, потому что тогда мне гарантированно получить код локали только в том случае, если используются мои ресурсы перевода. И это единственный раз, когда я хочу этого. В противном случае я мог бы получать даты на одном языке и другие строковые ресурсы на другом языке, если я сделал какую-то ошибку при получении языкового стандарта. – Suragch

32

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

getResources().getConfiguration().locale 

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

Locale.getDefault() 

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

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

+0

В документах для 1-го списка вы указываете «Текущее предпочтение пользователя для локали, соответствующее квалификатору ресурса локали». Если это «текущее предпочтение пользователя», то как оно отличается от второго fn. В любом случае, какая функция класса Locale вызывает один вызов для получения кода локали String (эквивалентно расширению ресурса), который может быть передан на сервер (как в исходном вопросе)? – Tom

+0

В этом ответе указан правильный способ получения «Locale» (первая строка кода). Но неправильно, что есть разница: 'Locale.getDefault()' эквивалентен первому примеру. Если вы хотите получить код языка, вам нужно вызвать 'getLanguage()'. – caw

+6

К сожалению, это не работает, как мне нужно. Если установлен язык системы, например, для Dansk (датский), 'getResources(). GetConfiguration(). Locale' возвращает da_DK, пока отображает английские строки (из' values ​​/ strings.xml'). –

0

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

0
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; 

    } 

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

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

Смежные вопросы