Локализация приложений iPhone - проблемы с английским? - PullRequest
18 голосов
/ 22 июля 2010

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

Я создал языковой файл en_AU и en_NZ, но оба они используютстандартный английский файл.Я удалил файл на английском языке, но он продолжает происходить ...

Любые идеи о том, как мне заставить это работать?

Спасибо,

- d

Ответы [ 5 ]

39 голосов
/ 22 июля 2010

Локализации iPhone (или это локализация?) Не учитывают Регион, который устанавливает пользователь (например, Великобритания, Aus, NZ).По умолчанию доступен только один перевод на английский язык.Тем не менее, вы можете взломать вещи, чтобы заставить его использовать другой параметр перевода - я только что сделал это для выбора между "английский" (США) и "en_GB" (британский английский).

В вашемФайл main.m, измените его так, чтобы он выглядел примерно так (вставьте свои собственные тесты для NZ или AU)

int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// Set up the locale jiggery pokery
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) {
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"];
}

int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;

}

Это выскакивает язык пользователя (например, "en") на язык NSString и языковой стандарт пользователей (например, NZ, GB, AU) на язык NSString.Если они (в моем случае) совпадают с en и GB, тогда я устанавливаю для языковых настроек по умолчанию для пользователей значение «en_GB», а затем «en».

Затем в вашем приложении делегируется приложение: метод didFinishLaunchingWithOptions, который вы хотитеудалить тот параметр NSUserDefaults, который вы только что установили с кодом

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];

На этом этапе можно безопасно удалить, потому что вся инициализация пакета была завершена.Ваше приложение должно теперь использовать файл Localization.strings в каталоге en_GB.lproj.

Это немного ужасное, хакерское решение, но оно работает для меня.

16 голосов
/ 16 января 2013

Я придумала, как мне кажется, слегка улучшенную версию принятого ответа Рикербха.Первое, что нужно понять, это то, что пользовательские настройки по умолчанию организованы в домены, а ключ @"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 не существует, но это не имеет значения.Поскольку приложение не находит связанных локализаций или ресурсов, оно просто игнорирует его.

4 голосов
/ 12 мая 2011

Apple документирует эту отсутствующую функцию iOS здесь.

Важно: В iOS интерфейсы пакета не учитывают информацию диалекта или сценария, когдапоиск локализованных ресурсов;рассматривается только код обозначения языка.Поэтому, если ваш проект включает в себя языковые каталоги проектов с указателем языка и региона, эти каталоги игнорируются.Пакетные интерфейсы в Mac OS X поддерживают указатели регионов в языковых каталогах проектов.

0 голосов
/ 25 августа 2014

Стоит отметить, что XCode вводит в заблуждение - вы можете перейти к Project (не Target), Info, Localizations, нажать кнопку +, которая появляется под списком языков, а затем прокрутить вниз до списка языков,появляются во всплывающем окне, пока не дойдете до «Другое» (со стрелкой вправо рядом с ним), это откроет хороший большой список, который включает региональные варианты для языков.Тем не менее, эти региональные варианты не работают на iPhone - вы ничего не получите (как задокументировано Apple и указано в другом ответе, который появляется здесь).Очевидно, что необходимо одно из перечисленных выше решений на основе кода.

0 голосов
/ 26 марта 2013

У меня были те же проблемы с немецким языком, и я думаю, что нашел «правильное» решение. Ошибка заключалась в том, что изначально моим базовым языком был только «немецкий (de)», при добавлении локализаций «немецкий / Австрия (de_AT)» файлы игнорировались. При изменении базового языка на «немецкий / германия (de_DE)» австрийский перевод не был проигнорирован.

...