Ответ 1
Мое собственное решение состоит в том, чтобы добавить к strings.xml
пару ключ-значение locale=<locale code>
, таким образом context.getResources().getString(R.string.locale)
вернет код локали, специфичный для используемой локали.
Как узнать язык (локаль), который в настоящее время используется Android для отображения текстов для пользователя?
Я знаю, что могу использовать Locale.getDefault()
для получения локали ОС по умолчанию. Но он может отличаться от языка, используемого приложением, для отображения текста и других ресурсов, если этот язык не поддерживается приложением.
Мне нужно определить язык (локаль), отображаемый приложением, поэтому приложение может передать язык на сервер, чтобы он мог локализовать возвращенные результаты.
Мое собственное решение состоит в том, чтобы добавить к strings.xml
пару ключ-значение locale=<locale code>
, таким образом context.getResources().getString(R.string.locale)
вернет код локали, специфичный для используемой локали.
Это в вашей конфигурации приложения, поэтому вы можете получить его с помощью:
getResources().getConfiguration().locale
это отличается от
Locale.getDefault()
и показывает Locale, который использует приложение, которое может быть другим.
Это может быть иначе, потому что разработчик может изменить его, обновив конфигурацию приложения, check: Resources.updateConfiguration
Следующий код работает для меня:
@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();
Вы можете использовать приведенный ниже код. Например, приведенные ниже функции могут быть помещены внутри класса, расширенного классом 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
, чтобы узнать, какой язык используется в данный момент.
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;
}
Используйте этот метод.