IOS: язык приложений не зависит от устройства без изменения NSUserDefaults

Я использую следующий оператор для изменения языка приложения (независимо от языка системы):

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", nil] forKey:@"AppleLanguages"];

В другой ситуации я хочу получить системный язык. Когда я использую

[[NSLocale preferredLanguages] objectAtIndex:0]

результатом будет всегда "de". Даже когда приложение перезапускается и второй оператор выполняется первым. Это имеет смысл для меня, поскольку это то, что я только что настроил с помощью приведенной выше строки кода. Однако я хотел бы получить фактический системный язык, который был настроен для всей системы.

Обоснование: приложение должно иметь три языковых параметра: английский, немецкий, язык системы. Пользователь должен иметь возможность запускать приложение на английском языке, в то время как остальная часть системы работает на немецком языке или, в качестве альтернативы, просто использовать стандартную настройку системного языка.

Я был бы очень признателен за помощь здесь :) С уважением, Джонатан


Наконец-то я нашел простое и надежное решение. Первоначальная проблема заключалась в том, что

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", nil] forKey:@"AppleLanguages"];

возвращает значения, которые я настроил ранее. Но это не то, что я хочу иметь. Я хочу иметь язык, настроенный «глобально» (независимо от приложения/используемого в меню и т. д.). Это не кажется достижимым с помощью NSUserDefaults. Однако CFPreferences делает свое дело:

CFPropertyListRef propertyList = CFPreferencesCopyValue(CFSTR("AppleLanguages"),
    kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
NSArray *appleLanguages = (__bridge_transfer NSArray*)propertyList;

AppleLanguages ​​теперь содержит список языков, изначально определенных для пользователя. И appleLanguages[0] — это как раз то, что я хотел :)


person Jona    schedule 20.06.2012    source источник


Ответы (1)


Вы устанавливаете язык de в качестве объекта с индексом: 0 здесь: [NSArrray arrayWithObjects: @"de", @"en", nil]. Когда вы проверяете, какие здесь предпочтительные языки, вы проверяете только первый язык (язык с индексом 0), но есть и языки с другими индексами (вы устанавливаете «en» как индекс 1): [[NSLocale preferredLanguages]objectAtIndex:0];. Допустим, вы хотите сохранить предпочтительные языки в массиве; вы можете сделать это:

NSArray *arrayOfLanguages = [NSArray arrayWithArray:[NSUserDefaults arrayForKey:@"AppleLanguages"]];

Надеюсь это поможет!

person pasawaya    schedule 20.06.2012
comment
@Jona Я действительно не предлагаю хранить языки в массиве; Я просто привел пример того, как вы должны правильно обращаться к языковым данным. Вы можете сохранить его в массиве и поместить код в App Delegate в методе finishedLaunching:WithOptions. Это заставит приложение проверять языки при каждом перезапуске. - person pasawaya; 20.06.2012