Я придумала, как мне кажется, слегка улучшенную версию принятого ответа Рикербха.Первое, что нужно понять, это то, что пользовательские настройки по умолчанию организованы в домены, а ключ @"AppleLanguages"
исходит не от домена приложения, а от некоторого домена, расположенного выше по иерархии доменов.Это означает, что полностью безопасно удалить его из пользовательских настроек по умолчанию:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"AppleLanguages"];
После вызова этого кода вы заметите, что вызов [defaults objectForKey:@"AppleLanguages"]
по-прежнему возвращает значение.Поэтому вместо того, чтобы удалять @"AppleLanguages"
в какой-то момент позже, что может быть проблематично в зависимости от сложности вашего приложения, вы хотите сделать наоборот: удалить @"AppleLanguages"
немедленно .По сути, это сбрасывает его обратно к значению по умолчанию и фиксирует любые изменения, внесенные системой, если, например, пользователь изменил предпочитаемый язык.
Вот что я делаю:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"AppleLanguages"];
NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy];
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"];
for (NSString *language in languages) {
NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region];
[appleLanguages removeObject:languageAndRegion];
}
for (NSString *language in languages) {
NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region];
NSInteger index = [appleLanguages indexOfObject:language];
[appleLanguages insertObject:languageAndRegion atIndex:index];
}
[defaults setObject:appleLanguages forKey:@"AppleLanguages"];
(Обратите внимание, что filteredArrayUsingPredicateFormat:
- это метод расширения, который я написал. Это не ракетостроение, чтобы выяснить, что он делает или как работает.)
Это создает локализации для каждого языка в списке в сочетании срегион пользователя.Например, если исходный список был es en en-GB
, а регион пользователя AU, мы получим es-AU es en-AU en en-GB
.Обратите внимание, что es-AU
не существует, но это не имеет значения.Поскольку приложение не находит связанных локализаций или ресурсов, оно просто игнорирует его.