Подтвердить что ты не робот

Локализация приложений для iPhone - проблемы с английским языком?

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

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

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

Спасибо,

- д

4b9b3361

Ответ 1

Локализация iPhone (или это локализация?) не обращает внимания на регион, который пользователь устанавливает (например, UK, Aus, NZ). По умолчанию доступен только один "английский" перевод. Однако вы можете взломать вещи, чтобы заставить использовать другую настройку перевода. Я только что сделал это для выбора между "английским" (US) и "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".

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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