Bagaimana kita bisa mendapatkan bahasa saat ini dipilih di perangkat Android?
Bagaimana kita bisa mendapatkan bahasa saat ini dipilih di perangkat Android?
Jawaban:
Jika Anda ingin mendapatkan bahasa yang dipilih pada perangkat Anda, ini mungkin membantu Anda:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
untuk mendapatkan kode bahasa yang biasa (mis. "De", "en").
Locale.setDefault("ru")
, dan bahasa dalam pengaturan sistem diatur ke Bahasa Inggris, maka metode Locale.getDefault().getLanguage()
akan mengembalikan "ru" , tetapi tidak "en" . Apakah ada metode lain untuk mendapatkan lokal / bahasa SISTEM nyata? Saya menemukan solusi tidak didokumentasikan di sini , tetapi apakah ada solusi yang lebih elegan?
Locale.getDefault().toString()
yang memberikan string yang sepenuhnya mengidentifikasi lokal, misalnya "en_US".
Saya telah memeriksa metode Lokal di perangkat Android 4.1.2 saya, dan hasilnya:
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()
yang kembali"English"
Apa yang berhasil untuk saya adalah:
Resources.getSystem().getConfiguration().locale;
Resources.getSystem()
mengembalikan objek Sumber Daya global bersama yang menyediakan akses ke hanya sumber daya sistem (tanpa sumber daya aplikasi), dan tidak dikonfigurasikan untuk layar saat ini (tidak dapat menggunakan unit dimensi, tidak berubah berdasarkan orientasi, dll.).
Karena getConfiguration.locale
sekarang telah ditinggalkan, cara yang disukai untuk mendapatkan lokal utama di Android Nougat adalah:
Resources.getSystem().getConfiguration().getLocales().get(0);
Untuk menjamin kompatibilitas dengan versi Android sebelumnya, solusi yang mungkin adalah pemeriksaan sederhana:
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;
}
Memperbarui
Dimulai dengan pustaka dukungan, 26.1.0
Anda tidak perlu memeriksa versi Android karena menawarkan metode yang nyaman kompatibel dengan mundur getLocales()
.
Cukup telepon:
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
adalah cara untuk pergi. Saya telah memperbarui jawaban saya.
Anda dapat 'mengekstrak' bahasa dari lokal saat ini. Anda dapat mengekstrak lokal melalui Java API standar, atau dengan menggunakan Android Context. Misalnya, dua baris di bawah ini setara:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
dengan beberapa lokal lain sebelumnya dan Anda mendapatkan hasil yang berbeda.
Untuk menghemat waktu dan / atau kebingungan yang lain, saya ingin membagikan bahwa saya telah mencoba dua alternatif yang diusulkan oleh Johan Pelgrim di atas dan pada perangkat saya, keduanya setara - terlepas dari apakah lokasi default diubah atau tidak.
Jadi pengaturan default perangkat saya adalah Bahasa Inggris (United Kindom) dan dalam kondisi ini seperti yang diharapkan kedua Strings dalam jawaban Johan memberikan hasil yang sama. Jika saya kemudian mengubah lokal di pengaturan telepon (katakan ke italiano (Italia)) dan menjalankan kembali maka kedua Strings dalam jawaban Johan memberikan lokal sebagai italiano (Italia).
Karena itu saya percaya posting asli Johan benar dan komentar gregm salah.
Anda bisa menggunakan ini
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
ketika "xx" adalah kode bahasa seperti "en", "fr", "sp", "ar" .... dan seterusnya
Seperti yang dijelaskan dalam referensi Lokal cara terbaik untuk mendapatkan bahasa adalah:
Locale.getDefault().getLanguage()
metode ini mengembalikan string dengan id bahasa sesuai dengan standar ISO 639-1
jika level API 24 atau di atas, gunakan yang LocaleList.getDefault().get(0).getLanguage()
lain gunakanLocale.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();
}
}
referensi: https://developer.android.com/guide/topics/resources/multilingual-support
Untuk menambah jawaban Johan Pelgrim
context.getResources().getConfiguration().locale
Locale.getDefault()
adalah setara karena android.text.format.DateFormat
kelas menggunakan keduanya secara bergantian, misalnya
private static String zeroPad(int inValue, int inMinDigits) {
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}
dan
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 ...
}
Anda dapat mencoba mendapatkan lokal dari sumber daya sistem:
PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
Jawaban di atas tidak membedakan antara Cina sederhana dan Cina tradisional.
Locale.getDefault().toString()
bekerja yang mengembalikan "zh_CN", "zh_TW", "en_US" dan lain-lain
Referensi ke: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 adalah LAMA.
Solusi ini berhasil untuk saya. Ini akan mengembalikan Anda bahasa perangkat android (bukan bahasa lokal aplikasi)
String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
Ini akan mengembalikan "en" atau "de" atau "fr" atau apa pun bahasa perangkat Anda.
Anda dapat menggunakan kode ini untuk mengetahui keyboard saat ini
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Ada dua bahasa.
Bahasa default OS:
Locale.getDefault().getDisplayLanguage();
Bahasa Aplikasi saat ini:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
Jika Anda memilih bahasa yang tidak bisa Anda ketikkan Bahasa Yunani ini mungkin membantu.
getDisplayLanguage().toString() = English
getLanguage().toString() = en
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng
Sekarang coba dengan bahasa Yunani
getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
Jika Anda ingin memeriksa bahasa saat ini, gunakan jawaban @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
}
Cara yang benar untuk mendapatkan bahasa perangkat Anda adalah sebagai berikut:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}
Semoga ini bisa membantu.
Locale.getDefault().getDisplayLanguage()
akan memberi Anda Written
nama untuk Bahasa, misalnya,English, Dutch, French
Locale.getDefault().getLanguage()
akan memberimu language code
, misalnya:en, nl, fr
Kedua metode mengembalikan 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()));
Yang lain telah memberikan jawaban yang baik untuk bahasa perangkat,
jika Anda ingin bahasa aplikasi cara termudah untuk melakukannya adalah dengan menambahkan app_lang
kunci ke Andastrings.xml
file , dan tentukan lang untuk masing-masing langs juga.
Dengan begitu, jika bahasa default aplikasi Anda berbeda dari bahasa perangkat, Anda dapat memilih untuk mengirimkannya sebagai parameter untuk layanan Anda.
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";
}
Solusi saya seperti ini
@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);
}
lalu
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.e("Locale", getCurrentLocale().getLanguage());
} else {
Log.e("Locale", getCurrentLocale2().toString());
}
ditampilkan ---> id
di sini adalah kode untuk mendapatkan negara perangkat Kompatibel dengan semua versi Android bahkan oreo.
Solusi: jika pengguna tidak memiliki kartu sim daripada mendapatkan negara ia digunakan selama pengaturan telepon, atau pemilihan bahasa saat ini.
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;
}