Ответ 1
Вместо запроса по умолчанию непосредственно с помощью недокументированного ключа запрашивает класс NSLocale для массива предпочтительных языков.
Я участвую в процессах интернационализации приложения для 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);
Вместо запроса по умолчанию непосредственно с помощью недокументированного ключа запрашивает класс NSLocale для массива предпочтительных языков.
[NSLocale currentLocale]
основан на настройках Region Format, а не на языке. Если регион установлен в Соединенные Штаты, вы получите en_US независимо от того, какой язык вы используете.
Чтобы использовать текущий язык устройства, используйте вместо этого:
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
Как описано здесь: Получение текущего языка устройства в iOS?
для меня, оба
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
и
NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];
дает тот же результат, когда вы находитесь в симуляторе.
я обнаружил, что если я выйду из "en_US" , но имею локализацию "en", которая является копией "en_US" , симулятор автоматически начнет соблюдать языковые настройки, но как только "en_US" будет вариантом, он всегда выбирает его независимо от настроек.
У меня возникла проблема, когда имена месяцев форматирования выходили на английском языке на устройстве, установленном на французский язык.
Мое решение состояло в том, чтобы использовать это:
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
[self.monthNameFormatter setLocale:locale];
[self.monthNameFormatter setDateFormat:@"MMMM"];
[self.monthNameFormatter stringFromDate:myDate];
Вопрос слишком стар, но этот код может помочь многим:
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]));
Что это? Если текущий язык устройства, используемый на испанском, английском или португальском языке, использует приложение, использующее локализованные строки, с другой стороны, если текущий язык не является одним из них и не поддерживается приложением, он установлен на английский.
Для нас проблема заключалась в том, что мы переопределили язык приложения и область приложения в нашей схеме dev. Убедитесь, что Язык приложения установлен в "Язык системы" в параметрах схемы ( "Изменить схему" → "Параметры" ).
Он показывает правильную локаль, когда на реальном iPad. Тем не менее, у симулятора есть свой iOS, который по умолчанию установлен в en-US. Перейдите к настройкам iOS симулятора и переключите язык и область на тот, который вы хотите.
Это трюк.