NSLocale currentLocale her zaman kullanıcının geçerli dilini değil "en_US" değerini döndürür


82

Bir iPhone uygulamasını uluslararasılaştırma sürecindeyim - Kullanıcının mevcut yerel ayarına bağlı olarak belirli görünümlerde programatik değişiklikler yapmam gerekiyor. Çıldırıyorum çünkü iPhone simülatöründe veya gerçek donanımda dil tercihi ne olursa olsun, localeher zaman "en_US" olarak değerlendiriliyor:

NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

Çılgın olan şey, uygulamanın geri kalanının beklendiği gibi davranmasıdır. Localization.strings dosyasından doğru dizeler seçilir ve arabirimde kullanılır ve seçilen yerel ayar için doğru .xib dosyaları kullanılır.

Ayrıca şunu da denedim, boşuna ve aynı sonuçla:

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

Kaçırdığım basit bir şey mi var? Bir tercih mi yoksa bir ithalat mı?

Yaptığım şey:

Darren'ın cevabının önerdiği gibi, aradığım tercih NSLocaleburada değil, burada:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);

Peter'ın cevabı daha iyi bir çözüm gibi görünüyor:

NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);

Yanıtlar:


36

Belgelenmemiş bir anahtar kullanarak varsayılanları doğrudan sorgulamak yerine , NSLocale sınıfından tercih edilen diller dizisini isteyin .


@PeterHosey Ben de mevcut dille ilgili benzer bir problemim var ve her şeyi denedim ama hiçbiri işe yaramadı. Çok üzücü ... Şuna bir bakabilir misin, stackoverflow.com/questions/26572115/… ? Teşekkürler!
S1U

@ s1u Xcode 6.1'de bir hata var. Bu yanıtı kontrol edin: stackoverflow.com/a/26641497/1085556
Bart van Kuik

@ s1u: Birkaç şey: (1) Birden çok tercih edilen dil olabilir; Tek bir "mevcut dil" yoktur ve (2) yanıtınızla ilgili olarak (2) kullanıcının tercih ettiği dilleri değil , mevcut yerel ayarın (diğer bir deyişle bölge) baskın dilini döndürür .
Peter Hosey

2
AppleLanguagesAnahtarı öncesinde OS X 10.5 için sistemler üzerinde kullanıcının tercih ettiği dil almak için tek belgelenmiş yolu, belgelenmemiş değildir (bu gün çok nadir, ama yine de bir belgelenmiş ).
dreamlax

58

[NSLocale currentLocale]dil değil, cihazın Bölge Biçimi ayarlarına bağlıdır. Bölge Amerika Birleşik Devletleri olarak ayarlanmışsa, hangi dili kullanıyor olursanız olun en_US alırsınız.


Teşekkürler Darren, bu beni başlattı, aynı zamanda mevcut dil ayarını nasıl elde edeceğimi de buldum, gerçekten yapmaya çalıştığım şey buydu.
prairiedogg

2
Merhaba Prairiedogg, mevcut dil ayarını nasıl aldınız? bende de aynı sorun var .. hepsi dil için EN değerini döndürür.
Zaldy

@ZaldzBugz: şöyle bir şey: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [yerel displayNameForKey: NSLocaleIdentifier değeri: [[NSLocale preferLanguages] objectAtIndex: 0]];
powerj1984

3
bu, iOS 8'de geçerli değildir. Diliniz Almanca ve bölgeniz ABD ise iOS 8 "de_US" döndürür. Yapması gereken şey bu.
odyth

Kullanıcı Avustralya'ya gittiğinde bölge otomatik olarak güncellenir mi?
Nagendra Rao


9

Bizim için sorun, geliştirme programımızda uygulama dilini ve uygulama bölgesini geçersiz kılıyor olmamızdı. Şema seçeneklerinde (Düzeni Düzenle -> Seçenekler) Uygulama Dilinin Sistem Dili olarak ayarlandığından emin olun.


Simon'a bu yönü işaret ettiği için teşekkürler ... Test için onu yerel dile ayarladım ve daha sonra değiştirmeyi unuttum.
Ameer

İşte buydu! İşi mahveden bir Xcode ayarı olduğuna inanamıyorum.
Pedro

Bu benim pastırmamı kurtardı! Teşekkürler.
Kirby Todd

4

benim için ikisi de

NSString *localeString = [[NSLocale currentLocale] localeIdentifier];

ve

NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];

bir simülatörde olduğunuzda aynı sonucu verir.


2
Aslında, benim durumumda, iOS 8 / Xcode 6'da her zaman en_US
Adrian

3

Fransızca olarak ayarlanmış bir cihazda ay adlarının İngilizce olarak biçimlendirilmesiyle ilgili bir sorun yaşadım.

Benim çözümüm bunu kullanmaktı:

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];

[NSLocale currentLocale] 'in iOS10'da ay adlarını Fransızcaya doğru şekilde çevirdiğini ancak iOS11'de olmadığını buldum. Kullanım: NSLocale * locale = [NSLocale localeWithLocaleIdentifier: [[NSLocale preferLanguages] objectAtIndex: 0]]; sorunu çözdü. Teşekkürler Ben +1
birdman

2

"en_US" u dışarıda bırakırsam, ancak "en" yerelleştirmesine sahipsem, "en_US" nin bir kopyası varsa, simülatör otomatik olarak dil ayarlarına uymaya başlar, ancak "en_US" bir seçenek olduğunda, her zaman ne olursa olsun onu seçer ayarların.


1

Soru çok eski, ancak bu kod birçok kişiye yardımcı olabilir:

Main.m şöyle görünmeli:

    NSString *localecode=[[NSLocale currentLocale] localeIdentifier];
    localecode=[localecode substringToIndex:2]; //en_GB -> en
    NSArray *arr = [NSLocale preferredLanguages];
    NSMutableArray * mutable = [arr mutableCopy];
    NSString *prefered = [mutable firstObject];
    if(![localecode isEqualToString:prefered]){
        if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){
            int index = [mutable indexOfObject:@"en"];
            [mutable replaceObjectAtIndex:0 withObject:@"en"];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];

        }
        else{
            int index = [mutable indexOfObject:localecode];
            [mutable replaceObjectAtIndex:0 withObject:localecode];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
        }
    }
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

Bu ne? Cihazın mevcut dili İspanyolca, İngilizce veya Portekizce kullanıyorsa, uygulama yerelleştirilmiş dizeleri kullanır, diğer yandan mevcut dil bunlardan biri değilse ve uygulama tarafından desteklenmiyorsa İngilizce olarak ayarlanır.


0

Gerçek bir iPad'de doğru yerel ayarı gösterir. Ancak, simülatörün kendi iOS'u vardır ve varsayılan olarak en-US olarak ayarlanmıştır. Simülatör iOS tercihlerine gidin ve dil ve bölgeyi istediğiniz gibi değiştirin.

İşin püf noktası bu.

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.