Comment obtenir la langue actuelle sélectionnée sur l'appareil Android?
Comment obtenir la langue actuelle sélectionnée sur l'appareil Android?
Réponses:
Si vous souhaitez obtenir la langue sélectionnée de votre appareil, cela peut vous aider:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
pour obtenir le code de langue habituel (par exemple "de", "en").
Locale.setDefault("ru")
et que la langue dans les paramètres système est définie sur l'anglais, la méthode Locale.getDefault().getLanguage()
renverra "ru" , mais pas "en" . Existe-t-il une autre méthode pour obtenir les vrais paramètres régionaux / langue SYSTEM? Je n'ai pas trouvé de solution documentée ici , mais y a-t-il une solution plus élégante?
Locale.getDefault().toString()
qui donne une chaîne qui identifie complètement les paramètres régionaux, par exemple "en_US".
J'ai vérifié les méthodes locales sur mon appareil Android 4.1.2 et les résultats:
Locale.getDefault().getLanguage() ---> en
Locale.getDefault().getISO3Language() ---> eng
Locale.getDefault().getCountry() ---> US
Locale.getDefault().getISO3Country() ---> USA
Locale.getDefault().getDisplayCountry() ---> United States
Locale.getDefault().getDisplayName() ---> English (United States)
Locale.getDefault().toString() ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag() ---> en-US
Locale.getDefault().getDisplayLanguage()
qui revient"English"
Ce qui a fonctionné pour moi, c'est:
Resources.getSystem().getConfiguration().locale;
Resources.getSystem()
renvoie un objet Resources partagé global qui donne accès uniquement aux ressources système (pas de ressources d'application) et n'est pas configuré pour l'écran actuel (ne peut pas utiliser les unités de dimension, ne change pas en fonction de l'orientation, etc.).
Parce qu'il getConfiguration.locale
est désormais obsolète, le moyen préféré d'obtenir les paramètres régionaux principaux dans Android Nougat est:
Resources.getSystem().getConfiguration().getLocales().get(0);
Pour garantir la compatibilité avec les versions précédentes d'Android, une solution possible serait une simple vérification:
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
//noinspection deprecation
locale = Resources.getSystem().getConfiguration().locale;
}
Mise à jour
À partir de la bibliothèque de support, 26.1.0
vous n'avez pas besoin de vérifier la version Android car elle offre une méthode pratique rétrocompatiblegetLocales()
.
Appelez simplement:
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
est la voie à suivre. J'ai mis à jour ma réponse.
Vous pouvez «extraire» la langue des paramètres régionaux actuels. Vous pouvez extraire les paramètres régionaux via l'API Java standard ou en utilisant le contexte Android. Par exemple, les deux lignes ci-dessous sont équivalentes:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
avec d'autres paramètres régionaux au préalable et vous obtenez des résultats différents.
Pour économiser du temps et / ou de la confusion aux autres, je voulais partager que j'ai essayé les deux alternatives proposées par Johan Pelgrim ci-dessus et sur mon appareil, elles sont équivalentes - que l'emplacement par défaut soit modifié ou non.
Le paramètre par défaut de mon appareil est donc l'anglais (United Kindom) et dans cet état, comme prévu, les deux chaînes de la réponse de Johan donnent le même résultat. Si je change ensuite les paramètres régionaux dans les paramètres du téléphone (disons à italiano (Italia)) et que je réexécute, les deux chaînes de la réponse de Johan donnent les paramètres régionaux comme italiano (Italia).
Par conséquent, je crois que le message original de Johan est correct et que le commentaire de gregm est incorrect.
Vous pouvez utiliser ceci
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
quand "xx" est un code de langue comme "en", "fr", "sp", "ar" .... et ainsi de suite
Comme décrit dans Référence locale, la meilleure façon d'obtenir la langue est:
Locale.getDefault().getLanguage()
cette méthode renvoie une chaîne avec l'ID de langue selon la norme ISO 639-1
si le niveau d'API est supérieur ou égal à 24, utilisez LocaleList.getDefault().get(0).getLanguage()
sinon utilisezLocale.getDefault.getLanguage()
private fun getSystemLocale(): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return LocaleList.getDefault().get(0).getLanguage();
} else {
return Locale.getDefault.getLanguage();
}
}
référence: https://developer.android.com/guide/topics/resources/multilingual-support
Pour ajouter à la réponse de Johan Pelgrim
context.getResources().getConfiguration().locale
Locale.getDefault()
sont équivalents car la android.text.format.DateFormat
classe utilise les deux de manière interchangeable, par exemple
private static String zeroPad(int inValue, int inMinDigits) {
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}
et
public static boolean is24HourFormat(Context context) {
String value = Settings.System.getString(context.getContentResolver(),
Settings.System.TIME_12_24);
if (value == null) {
Locale locale = context.getResources().getConfiguration().locale;
// ... snip the rest ...
}
Vous pouvez essayer d'obtenir des paramètres régionaux à partir des ressources système:
PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
Les réponses ci-dessus ne font pas de distinction entre le chinois simple et le chinois traditionnel.
Locale.getDefault().toString()
travaux qui retournent "zh_CN", "zh_TW", "en_US" et etc.
Références à: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 est OLD.
Cette solution a fonctionné pour moi. Cela vous renverra la langue de l'appareil Android (pas la langue locale de l'application)
String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
Cela renverra "en" ou "de" ou "fr" ou quelle que soit la langue de votre appareil.
Vous pouvez utiliser ce code pour connaître le courant du clavier
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Il existe deux langues.
Langue par défaut du système d'exploitation:
Locale.getDefault().getDisplayLanguage();
Langue actuelle d'application:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
Si vous choisissez une langue que vous ne pouvez pas taper ce grec peut être utile.
getDisplayLanguage().toString() = English
getLanguage().toString() = en
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng
Maintenant, essayez-le avec le grec
getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
Si vous souhaitez vérifier une langue actuelle, utilisez la réponse de @Sarpe (@Thorbear):
val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())
DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
La façon correcte d'obtenir la langue de votre appareil est la suivante:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}
J'espère que cela aide.
Locale.getDefault().getDisplayLanguage()
vous donnera le Written
nom de la langue, par exemple,English, Dutch, French
Locale.getDefault().getLanguage()
vous donnera language code
, par exemple:en, nl, fr
Les deux méthodes renvoient String
public class LocalUtils {
private static final String LANGUAGE_CODE_ENGLISH = "en";
// returns application language eg: en || fa ...
public static String getAppLanguage() {
return Locale.getDefault().getLanguage();
}
// returns device language eg: en || fa ...
public static String getDeviceLanguage() {
return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
}
public static boolean isDeviceEnglish() {
return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
}
public static boolean isAppEnglish() {
return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
}
}
Log.i("AppLanguage: ", LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ", LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ", String.valueOf(LocalUtils.isAppEnglish()));
Les autres ont donné de bonnes réponses pour la langue de l'appareil,
si vous souhaitez que la langue de l' application soit la plus simple, ajoutez une app_lang
clé à votre strings.xml
fichier et spécifiez également la langue pour chacune des langues.
De cette façon, si la langue par défaut de votre application est différente de la langue de l'appareil, vous pouvez choisir de l'envoyer comme paramètre pour vos services.
public void GetDefaultLanguage( ) {
try {
String langue = Locale.getDefault().toString(); // ---> en_US
/*
Log.i("TAG", Locale.getDefault().getLanguage() ); // ---> en
Log.i("TAG", Locale.getDefault().getISO3Language() ); // ---> eng
Log.i("TAG", Locale.getDefault().getCountry() ); // ---> US
Log.i("TAG", Locale.getDefault().getISO3Country() ); // ---> USA
Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
Log.i("TAG", Locale.getDefault().getDisplayName() ); // ---> English (United States)
Log.i("TAG", Locale.getDefault().toString() ); // ---> en_US
Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
langue = Locale.getDefault().toLanguageTag(); // ---> en-US
url_Api = getUrlMicrosoftLearn(langue);
Log.i("TAG", url_Api );
Log.i("TAG", langue );
}else{
langue = langue.replace("_","-"); // ---> en-US
url_Api = getUrlMicrosoftLearn(langue);
Log.i("TAG", url_Api );
Log.i("TAG", langue );
}
}catch (Exception ex) {
Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
}
}
public String getUrlMicrosoftLearn(String langue) {
return "https://docs.microsoft.com/"+langue+"/learn";
}
Ma solution est comme ça
@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
return Resources.getSystem().getConfiguration().locale.getLanguage();
}
@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
getResources();
return Resources.getSystem().getConfiguration().getLocales().get(0);
}
et alors
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.e("Locale", getCurrentLocale().getLanguage());
} else {
Log.e("Locale", getCurrentLocale2().toString());
}
montré ---> en
voici le code pour obtenir le pays de l'appareil. Compatible avec toutes les versions d'Android, même Oreo.
Solution: si l'utilisateur n'a pas de carte SIM que d'obtenir le pays, il est utilisé lors de la configuration du téléphone ou de la sélection de la langue actuelle.
public static String getDeviceCountry(Context context) {
String deviceCountryCode = null;
final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if(tm != null) {
deviceCountryCode = tm.getNetworkCountryIso();
}
if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
deviceCountryCode = deviceCountryCode.toUpperCase();
}
else {
deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
}
// Log.d("countryCode"," : " + deviceCountryCode );
return deviceCountryCode;
}