Переопределение предпочтительной локализации строк на лету для тестирования

Использование приложения «Настройки» в симуляторе iPhone для переключения языков — это способ PITA протестировать настройки локализации. Я пытаюсь найти способ переключения локализаций (en/fr/es/etc) на лету в моем приложении с настройкой отладки без перезапуска приложения.

NSBundle предоставляет способы запроса локализованных ресурсов из произвольной локализации, например.

- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension inDirectory:(NSString *)subpath forLocalization:(NSString *)localizationName

Но я не нахожу эквивалента для подсистемы управления строками. Это звучит из этих questions, что вы можете переопределить зарегистрированные значения по умолчанию, что звучит глупо и требует перезапуска приложения.

Есть ли здесь другие стратегии? Если бы я обернул NSLocalizedString чем-то, что в сборках отладки сделало свою работу, каков самый короткий путь для загрузки данного файла .strings? Есть ли программный способ получить доступ к этим таблицам строк, не собираясь и не анализируя их самостоятельно?

Спасибо.


person Ben Zotto    schedule 25.06.2010    source источник


Ответы (3)


Единственный способ сделать это, который я понял, - использовать тонкий трюк, предложенный этот ответ. Вы можете обернуть NSLocalizedString() в функцию, которая знает о «переопределении» локализации и выбирает, как получить свои строки в зависимости от того, установлено ли это. Если вы хотите переопределить, вы можете создать «подпакет» из каталога локализации, а затем извлечь строку из этого пакета. Вот суть:

if (CurrentLocalization != nil) {
    NSBundle * locBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:CurrentLocalization ofType:@"lproj"]];
    return [locBundle localizedStringForKey:key value:nil table:nil];
} else {
    return NSLocalizedString(key, @"");
}    

и Т. Д.

person Ben Zotto    schedule 28.06.2010

Хитрость использования определенного языка путем выбора его из приложения заключается в том, чтобы заставить NSLocalizedString использовать определенный пакет в зависимости от выбранного языка,

вот сообщение, которое я написал для этого http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

а вот код одного примера приложения https://github.com/object2dot0/Advance-Localization-in-ios-apps

person object2.0    schedule 01.05.2011

Установите AppleLanguages по умолчанию для массива, состоящего из предпочтительных языков, начиная с наиболее предпочтительного. Например, если вас интересует только английский язык, установите для него значение '("en");'.

person Community    schedule 25.06.2010
comment
Привет, Грэм, спасибо за быстрый ответ. Я действительно ненавижу быть тем парнем, но я заметил, что искал оперативное решение, которое не требует перезапуска приложения, и связан с вашим ответом на предыдущие связанные вопросы. Похоже, мне нужно будет проанализировать список строк напрямую. - person Ben Zotto; 26.06.2010
comment
@quixoto, вы говорите, что если вы программно обновите AppleLanguages по умолчанию, это не повлияет на то, какая таблица строк используется? - person ; 26.06.2010
comment
Это произошло, но, похоже, только после перезапуска приложения. Предположительно, подсистема локали инициализирует/кэширует таблицу строк во время запуска приложения? - person Ben Zotto; 26.06.2010
comment
К сожалению, этот трюк работает только после перезапуска приложения. (Проверено на iPad с iOS 3.2) - person 0xced; 01.07.2010