Comment connaître la langue (locale) actuellement Android app utilise pour afficher les textes à l'utilisateur?
Je sais que je peux utiliser Locale.getDefault()
pour obtenir les paramètres régionaux par défaut du système d'exploitation. Mais il peut différer des paramètres régionaux utilisés par l'application pour afficher du texte et d'autres ressources, si ces paramètres régionaux ne sont pas pris en charge par l'application.
J'ai besoin de déterminer la langue (locale) affichée par l'application, ainsi l'application peut transmettre la langue au serveur, afin qu'elle puisse localiser les résultats renvoyés.
Ma propre solution consiste à ajouter à strings.xml
Paire clé-valeur locale=<locale code>
, Ainsi context.getResources().getString(R.string.locale)
renverra le code de paramètres régionaux spécifique aux paramètres régionaux utilisés.
C'est dans la configuration de votre application, vous pouvez donc l'obtenir avec:
getResources().getConfiguration().locale
c'est différent de
Locale.getDefault()
et montre les paramètres régionaux que l'application utilise, qui peuvent être différents.
Cela peut être différent car le développeur peut le changer en mettant à jour la configuration de l'application, vérifiez: Resources.updateConfiguration
Le code suivant fonctionne pour moi:
@TargetApi(Build.VERSION_CODES.M)
private String getCurrentDefaultLocaleStr(Context context) {
Locale locale = context.getResources().getConfiguration().locale;
return locale.getDefault().toString();
}
Remarque: Il y a un léger changement sur la façon dont vous devez obtenir les paramètres régionaux sur Build.VERSION_CODES.N. Pour N et au-dessus, le code devrait ressembler au bloc de code ci-dessous; cependant, je le fais juste pour M et ci-dessous comme dans le bloc de code ci-dessus et il est également compatible pour N et au-dessus.
// Build.VERSION_CODES.N
Locale locale = context.getResources().getConfiguration().getLocales().get(0);
J'ai obtenu ce qui suit sur les langues nationales que je soutiens:
English: en
Traditional Chinese: zh_TW_#Hant
Simplified Chinese: zh_CN_#Hans
Spanish: es_ES
French: fr_FR
Japanese: ja_JP
German: de_DE
Il existe une liste de méthodes qui fournissent les mêmes informations de paramètres régionaux dans différents formats:
locale.getDefault (). getCountry ();
locale.getDefault (). getISO3Language ();
locale.getDefault (). getISO3Country ();
locale.getDefault (). getDisplayCountry ();
locale.getDefault (). getDisplayName ();
locale.getDefault (). getDisplayLanguage ();
locale.getDefault (). getLanguage ();
locale.getDefault (). toString ();
Vous pouvez utiliser le code ci-dessous. Par exemple, les fonctions présentées ci-dessous peuvent être placées dans la classe étendue de la classe 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();
}
}
Et puis partout où dans le code principal, nous pouvons écrire:
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);
}
...
}
Dans votre cas, vous pouvez bientôt utiliser getAppLanguage()
puis vérifier la variable publique APP_LANG
Pour obtenir la langue actuellement utilisée.
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;
}
Utilisez cette méthode.