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

StackOverflow https://stackoverflow.com/questions/3308519

Вопрос

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

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

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

Спасибо,

--д

Это было полезно?

Решение

Локальные локации iPhone (или в том, что локализации?) Не предпринимайте уведомление о регионе, которые пользовательские наборы (т. Е. Великобритания, AUS, NZ). Есть только один «английский» язык языка, доступный по умолчанию. Тем не менее, вы можете взломать вещи, чтобы заставить его использовать другую настройку перевода - я только что сделал это для выбора между «английским» (AS) и «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 Locale. Если они (в моем случае) соответствуют EN и GB, то я устанавливаю пользователей настроек языковых предпочтений по умолчанию, чтобы быть «en_GB», то «en».

Затем в вашем приложении делегаты Приложение: метод DidfiniShlaunchingWithOptions Вы хотите удалить это настройку NSUSERDEFAULTS, которые вы просто устанавливаете с кодом

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

Безопасно удалить на данный момент, потому что все инициализация связки завершено. Теперь ваше приложение должно использоваться файл локализации .Strings в каталоге EN_GB.LPROJ.

Это немного ужасного, взлом раствора, но это работает для меня.

Другие советы

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

Apple Documents Эта отсутствующая функция IOS здесь,

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

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

стоит отметить здесь, что Xcode очень вводит в заблуждение - вы можете перейти к проекту (не целью), информацию, локализацию, нажмите кнопку +, которая появляется под списком языков, затем прокрутите вниз к нижней части списка языков, которыеПоявляются в всплывающем окне, пока не дойдете до «другого» (с стрелкой вправо рядом с ним), это откроет хороший большой список, который включает в себя региональные варианты для языков.Тем не менее, эти региональные варианты не работают на iPhone - вы ничего не получаете (как документируются Apple и ссылаетесь в другой ответ, который появляется здесь).Очевидно, необходимо одно из перечисленных выше решений на основе кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top