Android geçerli Yerel Ayarı al, varsayılan değil


300

Kullanıcının Android'deki mevcut Yerel Ayarını nasıl edinebilirim?

Varsayılan olanı alabilirim, ancak bu geçerli olan doğru olmayabilir mi?

Temelde geçerli yerel ayardan iki harfli dil kodu istiyorum. Varsayılan değil. YokLocale.current()


default()oldukça güvenli bir bahistir, sadece işlemek için kullanmayın (dokümanlar gibi).
A - C

@ A - C işleme için mi kullanıyorsunuz?
CQM

Evet, dokümanların ne dediğine bakın : bazı yerel ayarlar ondalık nokta olarak ',' ve '.' rakam gruplaması için. bu nedenle parseInt () gibi şeyler başarısız olabilir. Yine default()de kod kullanmanızı engelleyebilecek şeyler için kullanılmalarını öneriyorlar .
A - C

Yanıtlar:


487

Varsayılan Locale, sistem özelliği ayarlarından uygulama işleminiz için çalışma zamanında statik olarak oluşturulur, bu nedenle uygulama başlatıldığındaLocale o cihazda seçileni temsil eder . Genellikle, bu iyidir, ancak Localeuygulama işleminiz çalıştıktan sonra kullanıcı ayarlarında değişiklik yaparsa, getDefaultLocale()muhtemelen değeri hemen güncellenmeyeceği anlamına gelir.

Bunun gibi olayları uygulamanızda herhangi bir nedenle yakalamanız gerekiyorsa, bunun yerine Localekullanılabilir olanı kaynak Configurationnesneden almayı deneyebilirsiniz;

Locale current = getResources().getConfiguration().locale;

Uygulamanız için gerekliyse bir ayar değişikliğinden sonra bu değerin daha hızlı bir şekilde güncellendiğini görebilirsiniz.


1
Herkes sistemde değiştirdiğinizde varsayılan Yerel Ayarın uygulamada değişip değişmediğini kontrol etti mi? Bence bu faaliyetlerin yok edilmesini ve yeniden yaratılmasını sağlayan "konfigürasyon değişikliklerinden" biri
Michał K

11
Ben test, ben yerel değiştirmeye devam ederken hem çıktı; sonuç, çıktı aynıdır. Bu yüzden Locale.getDefault () hemen güncellendiğinde güvenle kullanılabilir. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio

58
Bu, Configuration sınıfında kullanımdan kaldırılmıştır, bu öneri için en son belgelere bakın:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth

7
neden garip getLocales (). get (0) 'dan kaçınmak için sadece bir getFirstLocale () yöntemi eklemiyorlar?
user3290180

1
API'nin eski ve yeni sürümlerini desteklemek isterseniz ne olur?
Ivan

179

Android N (Api düzey 24) güncellemesi (uyarı yok):

   Locale getCurrentLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }

6
Destek kitaplığında if-else'den kaçınmak için bir şey var mı?
Federico Ponzi

8
İf ve fallback kodunu eklerseniz kodunuzda @TargetApi (Build.VERSION_CODES.N) gerekli değildir
Patrick Favre

@FedericoPonzi no ResourceCompat, 25.0.1 itibariyle yerel ayar için bir yöntem gibi görünmüyor
Patrick Favre

2
Kullanıcının birden fazla dili yüklüyse bu çalışmayabilir. Bu LocaleList.getDefault().get(0);, tercih edilen dile göre sıralanmış Loca'ları döndüreceği için kullanmalısınız .
Kıvırcık

21
@FedericoPonzi @ Bu in buldum for3st ConfigurationCompatgibiConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval

63

Android Destek Kitaplığı'nı kullanıyorsanız, kullanımdan ConfigurationCompatkaldırma uyarılarından kurtulmak için @ Makalele'nin yöntemi yerine kullanabilirsiniz :

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

veya Kotlin'de:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

8
Herhangi bir bağlamınız yoksa yapabilirsinizConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.

@QuentinG. Evet, ancak bu durumda Uygulama bağlamını kullanmak daha iyidir .
McMath

Açık olmak gerekirse, bu varsayılan yerel ayarı döndürmez, ancak kullanıcı yerel ayarı tercih eder?
Csaba Toth

12

Adlı kullanıcının getDefaultdokümanlarından:

Kullanıcının tercih ettiği yerel ayarı döndürür. SetDefault (Locale) ile bu işlem için bu geçersiz kılınmış olabilir.

Ayrıca Localedokümanlardan:

Varsayılan yerel ayar, kullanıcıya veri sunmayı içeren görevler için uygundur.

Sadece kullanmalısın gibi görünüyor.


7
bu cevap yanlış, varsayılan bir yerel ayar var, ancak kullanıcı anında değiştirdiyse yanlış gösterir. sonraki cevap doğru
user170317

kabul, yanlış cevap. Benim durumumda, getResources () kullanmak zorunda kalmamanın bir yolunu arıyordum, yani bir bağlama ihtiyacım var. Benim sorunum, bir bağlamı olmayan bir yardımcı sınıftı, ama sanırım bunu aktarmak zorunda kalacağım. İnsanların yerel ayarlarını değiştirmesine ve görünümlerin dizgileri, sayı biçimleri vb.Değiştirmesine izin veren bir uygulamanız varsa, Devunwired'in yanıtını kullanmanız gerekiyor
1mike12

Benim için çalış. Bir kesme noktası ayarlarsam Locale.setDefault(), cihaz dilini en azından Android
5.0'a (

6

Yukarıdaki tüm cevaplar - işe yaramaz. Bu yüzden burada 4 ve 9 android üzerinde çalışan bir işlev koyacağım

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}

Kullanıcının tercih ettiği dil yönünü cihaz düzeyinde döndüren birkaç cevaptan biri. LocaleListCompat.getDefault()AndroidX kullanıyorsanız da kullanabilirsiniz .
Sam

1

Bunu kullandım:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}

0

Resmi belgelere göre ConfigurationCompat destek kitaplıklarında kullanımdan kaldırıldı

Kullanmayı düşünebilirsiniz

LocaleListCompat.getDefault()[0].toLanguageTag() 0'ıncı konum kullanıcının tercih ettiği yerel ayar olacak

0. konumda Varsayılan yerel ayarı almak için LocaleListCompat.getAdjustedDefault()


Evet ama androidx ConfigurationCompat sürümüyle değiştirilecek edilmedi, bkz developer.android.com/reference/androidx/core/os/...
DragonLord

Doğru, belki sadece androidx göçü nedeniyle bahsedildi
Soni
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.