【发布时间】:2012-11-26 22:50:28
【问题描述】:
我有一个相当复杂的项目,由几个大型本地化子项目组成。
我的大部分子项目都通过一个 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 本地化。
【问题讨论】:
标签: ios localization uikit nsbundle nslocalizedstring