Dapatkan bahasa saat ini di perangkat

609

Bagaimana kita bisa mendapatkan bahasa saat ini dipilih di perangkat Android?

Pinki
sumber
10
Mayoritas jawaban di sini mendapatkan bahasa aplikasi. Mengingat Anda dapat mengatur lokal default aplikasi dalam kode, jawaban yang benar adalah jawaban yang diberikan oleh Sarpe - yang memberi Anda lokal perangkat.
Victor Ionescu
@VictorIonescu terima kasih atas komentarnya. Jawaban Sarpe adalah jawaban yang benar untuk mengambil lokal perangkat. Silakan merujuknya. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Jawaban:

834

Jika Anda ingin mendapatkan bahasa yang dipilih pada perangkat Anda, ini mungkin membantu Anda:

Locale.getDefault().getDisplayLanguage();
DeRagan
sumber
73
getDisplayLanguage () akan melokalkan bahasa. Jika Anda tertarik untuk hanya mendapatkan kode ISO (misalnya untuk jika atau beralih pernyataan) gunakan 'Locale.getDefault (). GetISO3Language ();'
nuala
13
getISO3Language () mengembalikan hal-hal seperti "deu" untuk Deutschland (jerman) alih-alih ...
Tobias
372
Anda dapat menggunakan Locale.getDefault().getLanguage();untuk mendapatkan kode bahasa yang biasa (mis. "De", "en").
muscardinus
35
@DeRagan, Ini tidak selalu memberi Anda bahasa untuk perangkat Anda, tetapi hanya untuk aplikasi Anda. Misalnya, jika saya memanggil 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?
Prizoff
47
Saya lebih suka Locale.getDefault().toString()yang memberikan string yang sepenuhnya mengidentifikasi lokal, misalnya "en_US".
Tom
838

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
trante
sumber
7
Terima kasih, senang dengan daftar kemungkinan. Bisakah Anda menambahkan "Locale.getDefault (). ToString ()", seperti yang disarankan dalam komentar oleh "Tom".
RenniePet
Saya bingung. Apakah Anda baru menyalin jawaban dari DeRagan?
pelaku diet
1
Maaf soal itu. Memang benar saya menambahkannya di sana. Aku seharusnya meninggalkan pesan yang datang dari sini. Saya membuat kesalahan dengan mencoba membantu orang menemukan jawaban yang mereka butuhkan lebih cepat. Karena jawaban Anda jelas merupakan jawaban yang lebih baik. Tetapi tentu saja Anda tidak akan pernah mencapai puncak, karena orang tidak melihatnya sesering yang teratas. Apakah boleh jika kita menambahkannya di sana dengan catatan bahwa itu berasal dari jawaban ini?
Patrick Boos
1
Halo lagi. Saya tidak suka solusi itu. Saat ini jawaban DeRagan ditunjukkan di tempat pertama dan saya ditampilkan di tempat kedua. Untuk seorang peneliti, seharusnya tidak terlalu sulit untuk memeriksa jawaban kedua di halaman pertanyaan. Akan lebih baik jika @pinki mengubah jawaban yang diterima. Tapi sepertinya pinki terakhir terlihat 3 bulan lalu.
trante
1
ada juga Locale.getDefault().getDisplayLanguage()yang kembali"English"
olahraga
106

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.localesekarang 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.0Anda tidak perlu memeriksa versi Android karena menawarkan metode yang nyaman kompatibel dengan mundur getLocales().

Cukup telepon:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
Sarpe
sumber
6
getConfiguration (). locale saat ini tidak digunakan lagi, gunakan getConfiguration (). getLocales (). sebaliknya (get)
Eliseo Ocampos
4
Ini adalah jawaban yang benar untuk pertanyaan ini. jawaban lain dapatkan lokal dari aplikasi, bukan perangkat.
hofs
6
Saya tidak tahu apakah ini ada ketika jawabannya ditulis, tetapi perpustakaan dukungan memiliki versi yang kompatibel dengan ini, tidak perlu menulis sendiri kompatibilitas ke belakang. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear
Seperti @Thorbear tunjukkan, sekarang menggunakan metode perpustakaan dukungan baru getLocalesadalah cara untuk pergi. Saya telah memperbarui jawaban saya.
Sarpe
Ini jawaban yang benar. Lainnya mengembalikan bahasa aplikasi bukan sistem.
Chintan Rathod
44

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();
Johan Pelgrim
sumber
10
ini tidak benar. Mereka berbeda. Yang pertama dapat berubah jika pengguna mengganti Lokal. Yang kedua adalah yang sudah diinstal pada telepon. Tidak pernah berubah apa pun yang dilakukan pengguna.
gregm
16
Komentar dari gregm mungkin salah. Lihat jawaban dengan airewyre.
Januari groth
4
Komentar @ gregm salah. Coba saja sendiri dan Anda akan melihat, bahwa Locale.getDefault () akan berubah ketika Anda mengubah bahasa di pengaturan.
Patrick Boos
Seharusnya lihat stackoverflow.com/questions/10657747/…
Wernight
Meskipun komentar @ gregm salah, dia tetap benar bahwa dua baris tidak perlu mengembalikan lokal yang sama. Panggil saja Locale.setDefault()dengan beberapa lokal lain sebelumnya dan Anda mendapatkan hasil yang berbeda.
arekolek
35

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.

airewyre
sumber
18

Anda bisa menggunakan ini

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

ketika "xx" adalah kode bahasa seperti "en", "fr", "sp", "ar" .... dan seterusnya

Simon K. Gerges
sumber
3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino
1
@ClementMartino saran Anda tidak masalah untuk Lokal yang sudah ditentukan sebelumnya seperti Bahasa Inggris, tetapi untuk lokal lain seperti Bahasa Arab, kami harus menguraikannya menggunakan kode lang
Simon K. Gerges
17

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

Opsenas
sumber
8

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

clybe
sumber
Itu harus menjadi jawaban yang dapat diterima pada tahun 2020!
Andrii Kovalchuk
6

Untuk menambah jawaban Johan Pelgrim

context.getResources().getConfiguration().locale
Locale.getDefault()

adalah setara karena android.text.format.DateFormatkelas 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 ...
}
armandino
sumber
5

Anda dapat mencoba mendapatkan lokal dari sumber daya sistem:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
stefan.nsk
sumber
1
Ini adalah jawaban jika Anda mengganti bagian mana pun dari konfigurasi
Takhion
4

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.

Arjun
sumber
3

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();
Ramkailash
sumber
3

Ada dua bahasa.

Bahasa default OS:

Locale.getDefault().getDisplayLanguage();

Bahasa Aplikasi saat ini:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
ayb abboushi
sumber
3
itu tidak benar, jika Anda mengubah lokal di aplikasi Anda bahkan terlebih dahulu memberi Anda nilai yang berubah dan bukan nilai sistem
To Kra
3

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
pengguna462990
sumber
3

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())
CoolMind
sumber
Jika Anda ingin menerapkan format tanggal lokal pengguna, gunakan DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind
1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Pratibha Sarode
sumber
2
Harap tambahkan beberapa detail tentang mengapa ini menjawab pertanyaan - potongan kode saja tidak akan membantu pembaca memahami solusinya
Pembuat Tongkat
Locale.getDefault (). GetDisplayName () memberikan bahasa perangkat Anda saat ini. dan kami sedang memeriksa apakah bahasa Perangkat adalah bahasa Hindi atau tidak .. Jika bahasa Perangkat saat ini adalah bahasa Hindi, maka lakukan apa yang Anda inginkan dalam blokir.
Pratibha Sarode
1

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.

andrea.rinaldi
sumber
1
Locale.getDefault().getDisplayLanguage()

akan memberi Anda Writtennama untuk Bahasa, misalnya,English, Dutch, French

Locale.getDefault().getLanguage()

akan memberimu language code , misalnya:en, nl, fr

Kedua metode mengembalikan String

Shamsul Arefin Sajib
sumber
1
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()));
SR
sumber
1

Yang lain telah memberikan jawaban yang baik untuk bahasa perangkat,

jika Anda ingin bahasa aplikasi cara termudah untuk melakukannya adalah dengan menambahkan app_langkunci 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.

htafoya
sumber
Saya tidak percaya tidak ada dukungan kerangka kerja untuk memberi Anda bahasa yang sedang digunakan AssetManager. Bahkan, format String helper di Resources.java menggunakan lokal default [0] jadi jika string dari AssetManager berasal dari lokal yang tidak cocok dengan lokal default perangkat (karena aplikasi Anda tidak mendukungnya tetapi mendukung misalnya berikutnya) pada daftar) lalu ada bug.
dcow
1
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";
}
Desain Grafritz
sumber
Akan lebih baik jika Anda bisa menambahkan lebih banyak instruksi pada jawabannya, daripada hanya menempelkan kode.
Calos
0

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

biyoalp
sumber
0

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;
}
Abhishek Garg
sumber
-3

Jika Anda ingin melakukan tugas khusus untuk pengguna yang berada di India yang berbicara bahasa Hindi, gunakan kondisi di bawah ini

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Divyaadz
sumber