Jestem w trakcie internacjonalizacji aplikacji na iPhone'a - muszę wprowadzić programowe zmiany w niektórych widokach w oparciu o aktualne ustawienia regionalne użytkownika. Oszalałem, ponieważ bez względu na preferencje językowe w symulatorze iPhone'a lub rzeczywisty sprzęt, locale
zawsze ocenia się jako „en_US”:
NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Szaleństwem jest to, że reszta aplikacji zachowuje się zgodnie z oczekiwaniami. Odpowiednie ciągi są wybierane z pliku Localization.strings i używane w interfejsie, a także używane są prawidłowe pliki .xib dla wybranej lokalizacji.
Próbowałem również następujących rzeczy, bezskutecznie iz takim samym wynikiem:
NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Czy brakuje mi czegoś prostego? Może preferencja czy może import?
Co robiłem:
Jak sugeruje odpowiedź Darrena, preferencji, której szukam, nie ma NSLocale
, a raczej jest tutaj:
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);
Odpowiedź Piotra wydaje się lepszym rozwiązaniem:
NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);
źródło
AppleLanguages
Klucz nie jest udokumentowany, to jedyny udokumentowany sposób, aby uzyskać użytkownika preferowane języki na systemy przed OS X 10.5 (co w dzisiejszych czasach jest bardzo rzadkie, ale nadal, to jest udokumentowane ).[NSLocale currentLocale]
jest oparty 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.źródło
Aby uzyskać aktualny język urządzenia, użyj tego:
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
Jak opisano tutaj: Pobieranie aktualnego języka urządzenia w iOS?
źródło
Dla nas problemem było to, że zastępowaliśmy język aplikacji i region aplikacji w naszym schemacie deweloperskim. Upewnij się, że język aplikacji jest ustawiony na język systemu w opcjach schematu (Edytuj schemat -> Opcje).
źródło
dla mnie obie
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
i
NSArray *array = [NSLocale preferredLanguages]; self.label.text = array[0];
dają ten sam wynik, gdy jesteś w symulatorze.
źródło
Wystąpił problem z formatowaniem nazw miesięcy w języku angielskim na urządzeniu z ustawieniem języka francuskiego.
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];
źródło
stwierdziłem, że jeśli zostawię "en_US" poza lokalizacją "en", która jest kopią "en_US", symulator automatycznie zaczyna przestrzegać ustawień języka, ale gdy tylko "en_US" jest opcją, zawsze ją wybiera niezależnie ustawień.
źródło
Pytanie jest za stare, ale ten kod może pomóc wielu:
Plik main.m powinien 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 robi? Jeśli aktualny język urządzenia to hiszpański, angielski lub portugalski, aplikacja używa zlokalizowanych ciągów znakó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.
źródło
Pokazuje poprawne ustawienie regionalne na prawdziwym iPadzie. Jednak symulator ma własne iOS, które jest domyślnie ustawione na en-US. Przejdź do preferencji symulatora iOS i zmień język i region na żądany.
To załatwia sprawę.
źródło