Я нахожусь в процессе интернационализации приложения для iPhone - мне нужно внести программные изменения в определенные представления в зависимости от текущего языкового стандарта пользователя. Я схожу с ума, потому что независимо от языковых предпочтений симулятора iPhone или реального оборудования, locale
всегда оценивается как «en_US»:
NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Самое безумное, что остальная часть приложения ведет себя так, как ожидалось. Правильные строки выбираются из файла Localization.strings и используются в интерфейсе, а также используются правильные файлы .xib для выбранной локали.
Я также пробовал следующее, но безрезультатно и с тем же результатом:
NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Что-то простое, что мне не хватает? Возможно, предпочтение или импорт?
Что раньше делал:
Как следует из ответа Даррена, предпочтение, которое я ищу, отсутствует NSLocale
, скорее оно здесь:
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);
Ответ Питера кажется лучшим решением:
NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);
AppleLanguages
Ключ не документированы, это единственный документированный способ получить предпочтительные языки пользователя на системах до OS X 10.5 (который, в эти дни очень редко, но все же, это будет документально ).[NSLocale currentLocale]
основан на настройках формата региона устройства, а не на языке. Если выбран регион США, вы получите en_US независимо от того, какой язык вы используете.источник
Чтобы получить текущий язык устройства, используйте вместо этого:
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
Как описано здесь: Как получить текущий язык устройства в iOS?
источник
Для нас проблема заключалась в том, что мы переопределяли язык приложения и область приложения в нашей схеме разработки. Убедитесь, что язык приложения установлен на системный язык в параметрах схемы (Изменить схему -> Параметры).
источник
для меня оба
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
и
NSArray *array = [NSLocale preferredLanguages]; self.label.text = array[0];
дают тот же результат, когда вы находитесь в симуляторе.
источник
У меня возникла проблема, из-за которой названия месяцев форматирования отображались на английском языке на устройстве, настроенном на французский язык.
Мое решение было использовать это:
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ]; [self.monthNameFormatter setLocale:locale]; [self.monthNameFormatter setDateFormat:@"MMMM"]; [self.monthNameFormatter stringFromDate:myDate];
источник
Я обнаружил, что если я оставлю "en_US", но имею локализацию "en", которая является копией "en_US", симулятор автоматически начинает соблюдать языковые настройки, но как только "en_US" является вариантом, он всегда выбирает его независимо от настроек.
источник
Вопрос слишком старый, но этот код может многим помочь:
Main.m должен выглядеть так:
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]));
Что делать? Если текущий язык устройства, например, испанский, английский или португальский, использует приложение, использующее локализованные строки, с другой стороны, если текущий язык не является одним из этих и не поддерживается приложением, установлен английский.
источник
На реальном iPad он показывает правильную локаль. Однако у симулятора есть собственная iOS, которая по умолчанию установлена на en-US. Перейдите в настройки симулятора iOS и переключите язык и регион на тот, который вам нужен.
Это трюк.
источник