Cihazdaki geçerli dili al


608

Android cihazında geçerli dili nasıl seçebiliriz?


10
Buradaki cevapların çoğu uygulamanın dilini alır. Uygulamanın varsayılan yerel ayarını kod olarak ayarlayabildiğiniz göz önüne alındığında, doğru cevap Sarpe tarafından verilen yanıttır - bu size cihazın yerel ayarını verir.
Victor Ionescu

@VictorIonescu yorum için teşekkür ederim. Sarpe'nin cevabı, cihazın yerel ayarını almak için doğru cevaptır. Lütfen bakın. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Yanıtlar:


834

Cihazınızın seçili dilini almak istiyorsanız, bu size yardımcı olabilir:

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage () dili yerelleştirecektir. Sadece ISO kodunu almakla ilgileniyorsanız (örn. İf veya switch deyimleri için) 'Locale.getDefault (). GetISO3Language ();'
nuala

13
getISO3Language (), Deutschland (almanya) için deu yerine "deu" gibi şeyler döndürür ...
Tobias

372
Locale.getDefault().getLanguage();Normal dil kodunu almak için kullanabilirsiniz (örn. "De", "en").
muscardinus

35
@DeRagan, Bu her zaman cihazınız için değil, yalnızca uygulamanız için dil verecektir. Örneğin, ararsam Locale.setDefault("ru")ve sistem ayarlarındaki dil İngilizce olarak ayarlanırsa, yöntem "ru"Locale.getDefault().getLanguage() döndürür , ancak "en" döndürmez . Gerçek SYSTEM yerel ayarını / dilini almanın başka bir yöntemi var mı? Burada belgelenmiş bir çözüm bulamadım , ama daha zarif bir çözüm var mı?
Prizoff

47
Locale.getDefault().toString()Hangi yerel tam olarak tanımlayan bir dize verir, örneğin "en_US" tercih ederim .
Tom

835

Android 4.1.2 cihazımda Yerel ayar yöntemlerini ve sonuçları kontrol ettim:

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

7
Teşekkürler, olasılıklar listesi ile güzel. Lütfen "Tom" tarafından yapılan bir yorumda önerildiği gibi "Locale.getDefault (). ToString ()" öğesini ekleyebilir misiniz?
RenniePet

Kafam karıştı. Cevabı DeRagan'dan yeni kopyaladın mı?
Dieter

1
Bunun için üzgünüm. Oraya eklediğim doğrudur. Buradan geldiğine dair bir not bırakmalıydım. İnsanlara ihtiyaç duydukları cevabı daha hızlı bulmalarına yardımcı olmak için hata yaptım. Çünkü seninki daha iyi bir cevap. Ama elbette seninki asla zirveye çıkmayacak, çünkü insanlar onu en iyisi olarak görmüyor. Bu cevaba geldiğini not ederek oraya eklersek sorun olmaz mı?
Patrick Boos

1
Tekrar merhaba. Bu çözümü tercih etmiyorum. Şu anda DeRagan'ın cevabı ilk sırada, benimki ise ikinci olarak gösteriliyor. Bir araştırmacı için, soru sayfasındaki ikinci cevabı kontrol etmek o kadar zor olmamalıdır. @Pinki kabul edilen cevabı değiştirseydi daha iyi olurdu. Ama son 3 ay önce görülen pinki gibi görünüyor.
trante

1
Ayrıca Locale.getDefault().getDisplayLanguage()geri dönen"English"
spor

105

Benim için işe yarayan şuydu:

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() yalnızca sistem kaynaklarına erişim sağlayan (uygulama kaynağı yok) ve geçerli ekran için yapılandırılmamış (boyut birimlerini kullanamaz, yönlendirmeye bağlı olarak değişmez, vb.) genel bir paylaşılan Kaynaklar nesnesi döndürür.

Artık getConfiguration.localekullanımdan kaldırıldığı için Android Nougat'ta birincil yerel ayarı almanın tercih edilen yolu:

Resources.getSystem().getConfiguration().getLocales().get(0);

Önceki Android sürümleriyle uyumluluğu garanti etmek için olası bir çözüm basit bir kontrol olacaktır:

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;
}

Güncelleme

Destek kitaplığından başlayarak 26.1.0, Android sürümünü kontrol etmeniz gerekmez, çünkü geriye dönük uyumlu bir yöntem sunargetLocales() .

Sadece arayın:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());

6
getConfiguration (). yerel ayarı şu anda kullanımdan kaldırıldı, getConfiguration () kullanın. getLocales (). get (0) yerine
Eliseo Ocampos

4
Bu soruya doğru cevap bu. diğer yanıtlar uygulamanın yerel olmasını sağlar, cihaz değil.
2017'de

6
Yanıt yazılırken bunun olup olmadığını bilmiyorum, ancak destek kitaplığının bunun geriye dönük uyumlu sürümleri var, geriye uyumluluk kendiniz yazmaya gerek yok. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

@Thorbear'ın işaret ettiği gibi, şimdi yeni destek kütüphanesi yöntemini kullanmak getLocalesyoludur. Cevabımı güncelledim.
Sarpe

Bu doğru cevap. Diğerleri sistem dilini değil uygulama dilini döndürür.
Chintan Rathod

44

Dili geçerli yerel ayardan 'ayıklayabilirsiniz'. Yerel Java'yı standart Java API'sı veya Android Bağlamı kullanarak ayıklayabilirsiniz. Örneğin, aşağıdaki iki çizgi eşdeğerdir:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

10
Bu doğru değil. Onlar farklı. Birincisi, kullanıcı Yerel Ayarı değiştirirse değişebilir. İkincisi, telefona önceden kurulmuş olanıdır. Kullanıcı ne yaparsa yapsın asla değişmez.
gregm

16
Gregm tarafından yapılan yorum yanlış olabilir. Airewyre tarafından verilen cevaba bakınız.
jan groth

4
@ gregm adlı kullanıcının yorumu yanlış. Sadece kendiniz deneyin ve göreceksiniz, ayarlarda dili değiştirdiğinizde Locale.getDefault () değişecektir.
Patrick Boos


@ Gregm'in yorumu yanlış olsa da, hala bu iki satırın aynı yerel ayarı döndürmesi gerekmiyor. Locale.setDefault()Önceden başka bir yerel ayar ile arayın ve farklı sonuçlar elde edin.
arekolek

35

Diğerlerine zamandan ve / veya karışıklıktan tasarruf etmek için Johan Pelgrim tarafından önerilen iki alternatifi denediğimi paylaşmak istedim ve cihazımda eşdeğerler - varsayılan konum değiştirilsin ya da değiştirilmesin.

Cihazımın varsayılan ayarı İngilizce'dir (United Kindom) ve bu durumda beklendiği gibi Johan'ın cevabındaki her iki Tel de aynı sonucu verir. Daha sonra telefon ayarlarında yerel ayarı değiştiririm (italiano'ya (Italia) diyelim) ve yeniden çalıştırırsam Johan'ın cevabındaki her iki Dizge de yerel ayarı italiano (Italia) olarak verir.

Bu nedenle Johan'ın orijinal gönderisinin doğru ve gregm'in yorumunun yanlış olduğuna inanıyorum.



17

Bunu kullanabilirsiniz

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

"xx", "en", "fr", "sp", "ar" .... gibi herhangi bir dil kodu olduğunda vb.


3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ()))) {...}
Clement Martino

1
@ClementMartino, İNGİLİZCE gibi Önceden Tanımlanmış Yerel Ayarlar için öneriniz iyi, ancak Arapça gibi diğer yerel ayarlar için, lang kodunu kullanarak ayrıştırmalıyız
Simon K. Gerges 21:17

8

API düzeyi 24 veya üstü ise, LocaleList.getDefault().get(0).getLanguage() başka bir kullanımLocale.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();
    }
}

başvuru: https://developer.android.com/guide/topics/resources/multilingual-support


2020'de kabul edilebilir bir cevap olmalı!
Andrii Kovalchuk

6

Johan Pelgrim'in cevabına eklemek için

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

eşdeğerdir çünkü android.text.format.DateFormatsınıf her ikisini birbirinin yerine kullanır, ör.

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

ve

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 ...
}

5

Sistem kaynaklarından yerel ayar almaya çalışabilirsiniz:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

1
Bu, yapılandırmanın herhangi bir bölümünü geçersiz
kıldığınızda yanıttır


4

Bu çözüm benim için çalıştı. Bu size android cihazın dilini döndürecektir (uygulamanın yerel dilini değil)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

Bu, "en" veya "de" veya "fr" veya cihaz diliniz ne olursa olsun döndürür.


3

Klavye akımını bulmak için bu kodu kullanabilirsiniz

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();

3

İki dil var.

İşletim sisteminin varsayılan dili:

Locale.getDefault().getDisplayLanguage();

Mevcut Uygulama Dili:

getResources().getConfiguration().locale.getDisplayLanguage();//return string

3
Bu doğru değil, eğer uygulamanızdaki yerel ayarı değiştirirseniz, ilk önce size sistem değeri değil, değer değiştirmiş olursunuz
Kra

3

Bir dil seçerseniz bu Yunanca yazamazsınız.

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

Şimdi Yunanca ile dene

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell

3

Geçerli bir dili kontrol etmek istiyorsanız, @Sarpe (@Thorbear) yanıtını kullanın:

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())

Kullanıcının yerel tarih biçimini uygulamak istiyorsanız kullanın DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind

1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}

2
Lütfen bunun neden soruya cevap verdiğine dair bazı ayrıntılar ekleyin - sadece kod snippet'i okuyucuların çözümü anlamalarına yardımcı olmaz
Wand Maker

Locale.getDefault (). GetDisplayName (), cihazınızın geçerli dilini verir. ve Aygıt dilinin Hintçe olup olmadığını kontrol ediyoruz. Geçerli Aygıt dili Hintçe ise, blokta istediğinizi yapın.
Pratibha Sarode

1

Cihazınızın dilini almanın doğru yolu şudur:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return context.getResources().getConfiguration().getLocales().get(0);
} else {
    return context.getResources().getConfiguration().locale;
}

Umarım yardımcı olur.


1
Locale.getDefault().getDisplayLanguage()

WrittenÖrneğin, Dil için bir ad verecektir.English, Dutch, French

Locale.getDefault().getLanguage()

language codeÖrneğin, size :en, nl, fr

Her iki yöntem de String döndürür


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()));

1

Diğerleri cihaz dili için iyi cevaplar verdiler,

uygulama dilini yapmanın en kolay yolu dilek için bir app_langanahtar eklemektir .strings.xml dosyası ve yanı DİLLER'de her biri için lang belirtin.

Bu şekilde, uygulamanızın varsayılan dili cihaz dilinden farklıysa, bunu hizmetleriniz için parametre olarak göndermeyi seçebilirsiniz.


AssetManager'ın şu anda kullandığı dili vermek için çerçeve desteği olmadığına inanamıyorum. Aslında, Resources.java'daki Dize biçimi yardımcıları varsayılan yerel ayarı [0] kullanır, bu nedenle AssetManager'daki dize aygıtın varsayılan yerel ayarıyla eşleşmeyen bir yerel ayardan geliyorsa (uygulamanız desteklemediği, ancak bir sonraki listede) bir hata var.
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";
}

Sadece kodu yapıştırmak yerine cevaba daha fazla talimat ekleyebilmeniz daha iyi olur.
Calos

0

Benim çözümüm böyle

@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);
}

ve sonra

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

gösterilen ---> tr


0

cihaz ülkesini almak için kod. Android bile tüm sürümleri ile uyumlu oreo.

Çözüm: Kullanıcının ülkeden daha fazla SIM kartı yoksa telefon kurulumu veya geçerli dil seçimi sırasında kullanılır.

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;
}

-3

Hintçe konuşan Hindistan'da yaşayan kullanıcılar için özel bir görev yapmak istiyorsanız, eğer koşul varsa aşağıda kullanın

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.