У меня довольно сложный проект, состоящий из нескольких крупных локализованных подпроектов.
Большинство моих подпроектов локализованы с помощью одного файла Localizable.strings. Этот файл копируется в SubProjectName.bundle
цель, которая используется вместе со статической библиотекой SubProjectName.a
в основном проекте. Это прекрасно работает.
Однако один из моих подпроектов содержит много локализованных файлов .strings. Этот проект не может читать строки на любом языке, кроме английского, независимо от того, как настроено устройство (или симулятор).
Например, эта строка кода всегда возвращает строку на английском языке:
[[NSBundle myResourcesBundle] localizedStringForKey:@"MY_TEST_STRING" value:@"" table:@"MyTable"]
Где MyTable
соответствует файлу MyTable.strings, локализованному на несколько языков. Когда я заглядываю в пакет .app, все локализации находятся внутри ресурса «MyBundle.bundle» в приложении.
Однако следующий код правильно находит переводы для данной строки во всех локализациях:
for (NSString *language in [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"])
{
NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle myResourcesBundle] pathForResource:language ofType:@"lproj"]];
NSLog(@"%@: %@", language, NSLocalizedStringFromTableInBundle(@"MY_TEST_STRING", @"MyTable", bundle, nil));
}
Поэтому, когда пакет представляет собой фактическую папку MyBundle.bundle/<LanguageCode>.lproj
, поиск по строке работает. Но, очевидно, это противоречит цели автоматического поиска, предоставляемого iOS.
(Обратите внимание, что [NSBundle myResourcesBundle]
выше - это просто статический удобный метод для получения моего пользовательского пакета для подпроекта).
--
Изменить: я экспериментировал с этим еще, и если я удалю папку en.lproj
из пакета подпроекта, то она правильно использует языковой стандарт устройства или симулятора.
Например, у меня есть:
MyApp.app/
|
- MyResources.bundle/
|
- en.lproj/
|
- zh-Hans.lproj/
Когда я устанавливаю симулятор (или устройство) на китайский упрощенный , он ищет строки в en.lproj
, даже если языковой стандарт - zh-Hans
. Если я удалю папку en.lproj
и перезапущу приложение, оно правильно использует локализацию zh-Hans.