2009-10-05 16 views
74

Jestem w procesie internacjonalizacji aplikacji na iPhone'a - Muszę wprowadzić zmiany programistyczne do niektórych widoków na podstawie bieżących ustawień regionalnych użytkownika. Idę orzechy, ponieważ bez względu na preferowany język na symulatorze iPhone lub rzeczywistego sprzętu są locale zawsze ocenia na „pl”:NSLocale currentLocale zawsze zwraca "en_US", a nie bieżący język użytkownika.

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

szaloną rzeczą jest to, że reszta aplikacji zachowuje się zgodnie z oczekiwaniami. Poprawne ciągi są wybierane z pliku Localization.strings i używane w interfejsie, a używane są poprawne pliki .xib dla wybranych ustawień narodowych.

Próbowałem również następujące, bezskutecznie iz tym samym skutkiem:

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

Czy istnieje coś prostego mi brakuje? Może preferencja czy import?

Co robiłem:

Jako odpowiedź Darrena sugeruje, preferencja szukam nie jest w NSLocale, raczej to jest tutaj:

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

odpowiedź Piotra wydaje się być lepszym rozwiązaniem:

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

Odpowiedz

33

Zamiast bezpośredniego sprawdzania wartości domyślnych za pomocą nieudokumentowanego klucza, ask the NSLocale class for the array of preferred languages.

+0

@PeterHosey Mam również podobny problem dotyczący obecnego języka i wypróbowałem wszystko, ale żaden z nich nie działał. Tak smutno ... Mógłbyś rzucić okiem na to, http://stackoverflow.com/questions/26572115/nslocale-preferredlanguages-objectatindex0-always-return-en/26574075#26574075? Dzięki! – S1U

+0

@ s1u W Xcode 6.1 występuje błąd. Sprawdź tę odpowiedź: http://stackoverflow.com/a/26641497/1085556 –

+0

@ s1u: Kilka rzeczy: (1) Istnieje wiele preferowanych języków; nie ma jednego "aktualnego języka" i (2) dotyczącego twojej (usuniętej) odpowiedzi, która zwraca dominujący język bieżących ustawień narodowych (region a.k.a.), * nie * preferowanych języków użytkownika. –

54

[NSLocale currentLocale] jest oparty na ustawieniach regionu regionu, a nie na języku. Jeśli region jest ustawiony na Stany Zjednoczone, otrzymasz en_US niezależnie od używanego języka.

+0

Dzięki Darren, że mam zacząć, również zorientowałem się, jak uzyskać aktualne ustawienie języka, co tak naprawdę próbowałem zrobić. – Prairiedogg

+1

Cześć Prairiedogg, jak dostałeś bieżące ustawienie języka? Mam ten sam problem również .. all zwraca wartość EN dla języka. – Zaldy

+0

@ZaldzBugz: coś takiego: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey: NSLocaleIdentifier wartość: [[NSLocale preferredLanguages] objectAtIndex: 0]]; – powerj1984

2

Zauważyłem, że jeśli zostawię "en_US", ale mam lokalizację "en", która jest kopią "en_US", symulator automatycznie zacznie respektować ustawienia językowe, ale tak szybko, jak "en_US" jest opcją, zawsze wybiera go niezależnie od ustawień.

2

miałem problem gdzie formatowanie nazwy miesiącu ukazała się w języku angielskim na urządzeniu ustawionym na język francuski .

Moje rozwiązanie było użyć tego:

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

Pytanie jest zbyt stary, ale kod ten może przyczynić się do wielu:

main.m powinna wyglądać następująco:

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

Co to oznacza? Jeśli aktualny język urządzenia jest hiszpański, angielski lub portugalski, aplikacja używa zlokalizowanych ciągów, z drugiej strony, jeśli bieżący język nie jest jednym z nich i nie jest obsługiwany przez aplikację, jest ustawiony na angielski.

4

dla mnie, zarówno

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

i

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

dają ten sam wynik, gdy jesteś w symulatorze.

+1

Rzeczywiście, w moim przypadku na iOS 8/Xcode 6 zawsze en_US – Adrian

0

Pokazuje prawidłowe ustawienia narodowe na prawdziwym iPadzie. Symulator ma jednak własny system iOS, który domyślnie jest ustawiony na en-US. Przejdź do preferencji symulatora systemu iOS i zmień język na region, który chcesz.

To wystarczy.

1

Dla nas problemem było to, że zmieniliśmy język aplikacji i region aplikacji w naszym systemie deweloperskim. Upewnij się, że Język aplikacji jest ustawiony na Język systemu w opcjach schematu (Edycja schematu -> Opcje).

+0

To działało dla mnie. Dzięki @ Simon – Ramakrishna