Nslocale currentLocale zawsze zwraca "en US", a nie bieżący język użytkownika

Jestem w procesie internacjonalizacji aplikacji na iPhone ' a - muszę wprowadzać zmiany programowe w niektórych widokach w oparciu o bieżące ustawienia regionalne użytkownika. Zaczynam wariować, bo bez względu na preferencje językowe w symulatorze iPhone 'a czy faktycznym sprzęcie, locale zawsze ocenia się na "en_US":

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

Szalone Jest to, że reszta aplikacji zachowuje się zgodnie z oczekiwaniami. Odpowiednie ciągi znaków są wybierane z lokalizacji.plik strings i używany w interfejs i poprawny .używane są pliki xib dla wybranych ustawień regionalnych.

Próbowałem również następujących, bezskutecznie i z takim samym skutkiem:

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

Czy jest coś prostego, co mi umyka? Preferencje czy może import?

Co kiedyś robiłem:

Jak sugeruje odpowiedź Darrena, preferencja, której szukam, nie jest w NSLocale, raczej 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);
Author: prairiedogg, 2009-10-05

9 answers

Zamiast odpytywać domyślne wartości bezpośrednio używając nieudokumentowanego klucza, zapytaj klasę NSLocale o tablicę preferowanych języków.

 36
Author: Peter Hosey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 18:30:16

[NSLocale currentLocale] opiera się na Ustawieniach formatu regionu urządzenia, a nie na języku. Jeśli region jest ustawiony na Stany Zjednoczone, otrzymasz en_US niezależnie od używanego języka.

 59
Author: Darren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-05 21:55:31

Aby uzyskać bieżący język urządzenia, użyj tego zamiast:

NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];

Jak opisano tutaj: Pobieranie bieżącego języka urządzenia w iOS?

 18
Author: sust86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59

Dla nas problemem było to, że nadpisywaliśmy język aplikacji i region aplikacji w naszym schemacie dev. Upewnij się, że język aplikacji jest ustawiony na język systemowy w opcjach scheme (Edytuj schemat -> opcje).

 9
Author: Simon Bengtsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 07:28:36

Dla mnie, zarówno

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

I

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

Uzyskaj ten sam wynik, gdy jesteś w symulatorze.

 4
Author: AlexW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-18 20:48:42

Miałem problem z formatowaniem nazw miesięcy w języku angielskim na urządzeniu ustawionym na język francuski.

Moim rozwiązaniem było użycie tego:

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];
 3
Author: Ben Clayton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 16:17:17

Odkryłem, że jeśli zostawiam" en_US", ale mam lokalizację "en", która jest kopią "en_US", symulator automatycznie zaczyna respektować Ustawienia języka, ale jak tylko" en_US " jest opcją, zawsze wybiera ją niezależnie od ustawień.

 2
Author: Pants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-11 17:24:58

Pytanie jest za stare, ale ten kod może pomóc wielu:

Główny.m powinno wyglądać tak:

    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 zrobić? Jeśli bieżący język urządzenia es hiszpański, angielski lub portugalski użyć aplikacji używa zlokalizowanych ciągów, z drugiej strony, Jeśli bieżący język nie jest jednym z tych i nie jest obsługiwany przez aplikację jest ustawiony na angielski.

 1
Author: cdiazmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-05 14:00:53

Pokazuje poprawne ustawienia regionalne na prawdziwym iPadzie. Jednak symulator ma własny iOS, który domyślnie jest ustawiony na en-US. Przejdź do preferencji iOS symulatora i przełącz język i region na ten, który chcesz.

To wystarczy.

 0
Author: Ronald Hofmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 05:49:12