Come possiamo selezionare la lingua corrente selezionata nel dispositivo Android?
Come possiamo selezionare la lingua corrente selezionata nel dispositivo Android?
Risposte:
Se vuoi ottenere la lingua selezionata del tuo dispositivo, questo potrebbe aiutarti:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
per ottenere il solito codice lingua (ad esempio "de", "en").
Locale.setDefault("ru")
e la lingua nelle impostazioni di sistema è impostata su inglese, il metodo Locale.getDefault().getLanguage()
restituirà "ru" , ma non "en" . Esiste un altro metodo per ottenere impostazioni / lingua locali per il SISTEMA? Ho trovato una soluzione non documentata qui , ma esiste una soluzione più elegante?
Locale.getDefault().toString()
che dia una stringa che identifica completamente la locale, ad esempio "en_US".
Ho controllato i metodi Locale sul mio dispositivo Android 4.1.2 e i risultati:
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()
che ritorna"English"
Ciò che ha funzionato per me è stato:
Resources.getSystem().getConfiguration().locale;
Resources.getSystem()
restituisce un oggetto Risorse condivise globale che fornisce l'accesso solo alle risorse di sistema (nessuna risorsa dell'applicazione) e non è configurato per la schermata corrente (non può utilizzare le unità di dimensione, non cambia in base all'orientamento, ecc.).
Poiché getConfiguration.locale
ora è stato deprecato, il modo preferito per ottenere la locale principale in Android Nougat è:
Resources.getSystem().getConfiguration().getLocales().get(0);
Per garantire la compatibilità con le precedenti versioni di Android una possibile soluzione sarebbe un semplice controllo:
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;
}
Aggiornare
A partire dalla libreria di supporto 26.1.0
non è necessario controllare la versione di Android in quanto offre un metodo conveniente compatibile con le versioni precedentigetLocales()
.
Chiama semplicemente:
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
è la strada da percorrere. Ho aggiornato la mia risposta.
Puoi "estrarre" la lingua dalla locale corrente. È possibile estrarre le impostazioni internazionali tramite l'API Java standard o utilizzando il contesto Android. Ad esempio, le due righe seguenti sono equivalenti:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
anticipo con altre impostazioni locali e otterrai risultati diversi.
Per risparmiare tempo e / o confusione, volevo condividere che ho provato le due alternative proposte da Johan Pelgrim sopra e sul mio dispositivo sono equivalenti, indipendentemente dal fatto che la posizione predefinita sia cambiata o meno.
Quindi l'impostazione predefinita del mio dispositivo è l'inglese (United Kindom) e in questo stato, come previsto, entrambe le stringhe nella risposta di Johan danno lo stesso risultato. Se poi modifico il locale nelle impostazioni del telefono (diciamo a italiano (Italia)) e rieseguo, entrambe le stringhe nella risposta di Johan danno il locale come italiano (Italia).
Pertanto, ritengo che il post originale di Johan sia corretto e il commento di Gregreg sia errato.
Puoi usare questo
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
quando "xx" è un codice di lingua come "en", "fr", "sp", "ar" .... e così via
Come descritto in Riferimento locale, il modo migliore per ottenere la lingua è:
Locale.getDefault().getLanguage()
questo metodo restituisce una stringa con ID lingua secondo ISO 639-1 standard
se il livello API è 24 o superiore, utilizzare LocaleList.getDefault().get(0).getLanguage()
altro usoLocale.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();
}
}
riferimento: https://developer.android.com/guide/topics/resources/multilingual-support
Da aggiungere alla risposta di Johan Pelgrim
context.getResources().getConfiguration().locale
Locale.getDefault()
sono equivalenti perché la android.text.format.DateFormat
classe usa entrambi in modo intercambiabile, ad es
private static String zeroPad(int inValue, int inMinDigits) {
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}
e
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 ...
}
Puoi provare a ottenere le impostazioni internazionali dalle risorse di sistema:
PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
Le risposte sopra non distinguono tra cinese semplice e cinese tradizionale.
Locale.getDefault().toString()
funziona che restituisce "zh_CN", "zh_TW", "en_US" ed ecc.
Riferimenti a: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 è VECCHIO.
Questa soluzione ha funzionato per me. Questo ti restituirà la lingua del dispositivo Android (non la lingua locale dell'app)
String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
Ciò restituirà "en" o "de" o "fr" o qualunque sia la lingua del dispositivo impostata.
Puoi usare questo codice per scoprire la corrente della tastiera
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Ci sono due lingue
Lingua predefinita del sistema operativo:
Locale.getDefault().getDisplayLanguage();
Lingua corrente di applicazione:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
Se scegli una lingua che non puoi digitare questo greco può essere utile.
getDisplayLanguage().toString() = English
getLanguage().toString() = en
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng
Ora provalo con il greco
getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
Se vuoi controllare una lingua corrente, usa la risposta di @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
}
Il modo corretto di ottenere la lingua del tuo dispositivo è il seguente:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}
Spero che sia d'aiuto.
Locale.getDefault().getDisplayLanguage()
ti darà il Written
nome per la lingua, ad esempio,English, Dutch, French
Locale.getDefault().getLanguage()
ti darà language code
, ad esempio:en, nl, fr
Entrambi i metodi restituiscono 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()));
Gli altri hanno dato buone risposte per la lingua del dispositivo,
se desideri che la lingua dell'app sia il modo più semplice per farlo è aggiungere una app_lang
chiave al tuo strings.xml
file e specificare anche il lang per ciascuno dei lang.
In questo modo, se la lingua predefinita dell'app è diversa dalla lingua del dispositivo, puoi scegliere di inviarlo come parametro per i tuoi servizi.
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";
}
La mia soluzione è così
@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);
}
e poi
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.e("Locale", getCurrentLocale().getLanguage());
} else {
Log.e("Locale", getCurrentLocale2().toString());
}
mostrato ---> en
ecco il codice per ottenere il paese del dispositivo. Compatibile con tutte le versioni di Android anche oreo.
Soluzione: se l'utente non ha una scheda SIM diversa da quella del proprio Paese, viene utilizzato durante l'impostazione del telefono o la selezione della lingua corrente.
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;
}