ios - iOS App Bundle 中的多个本地化 .strings 文件

标签 ios localization uikit nsbundle nslocalizedstring

我有一个相当复杂的项目,由几个大型本地化子项目组成。

我的大部分子项目都通过单个 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));
}

所以当 bundle 是实际的 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 本地化。

最佳答案

我能够重现并修复该问题,尽管该解决方案确实暗示 NSBundle 中存在错误。

我用下面的包结构复制了它:

MyApp.app/
 |
  - MyResources.bundle/
      |
       - en.lproj/
      |
       - fr.lproj/

和代码:

  NSLog(@"A key: %@", NSLocalizedString(@"A key", nil));
  NSBundle *bundle = [NSBundle bundleWithPath: [[NSBundle mainBundle] pathForResource: @"MyResources" ofType: @"bundle"]];
  NSLog(@"Current locale: %@", [[NSLocale currentLocale] localeIdentifier]);
  NSLog(@"Bundle localizations: %@", [bundle localizations]);
  NSLog(@"Key from bundle: %@", [bundle localizedStringForKey: @"A key" value: @"Can't find it." table: nil]);
  NSLog(@"Key using bundle macro: %@", NSLocalizedStringFromTableInBundle(@"A key",
                                                                             nil,
                                                                             bundle,
                                                                             nil));

将语言环境设置为 fr_FR(即法语), bundle 从英语字符串表中挑选字符串 - 即使字符串“无法找到它”也不会出现。

在不更改代码的情况下,我能够使用以下结构来获取法语字符串:

MyApp.app/
 |
  - MyResources.bundle/
      |
       - Resources/
          |
           - en.lproj/
          |
           - fr.lproj/

看起来 NSBundle 仍然需要旧的 Mac OS X 捆绑结构,而不是 iOS 应该使用的结构。所以一个简单的 bundle 结构的改变应该可以解决这个问题......

关于ios - iOS App Bundle 中的多个本地化 .strings 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785455/

相关文章:

ios - 享受 UIView 动画和 UIView 翻转的乐趣

iphone - 在 iPhone 上使用 OpenGL 的分层 2D 应用程序最有效的 "architecture"?

ios - 如何在 UICollectionView performBatchUpdates block 中对移动、插入、删除和更新进行排序?

iOS Autolayout 视觉格式 - 如何设置间距以尝试一个值但在小屏幕上回退到另一个值?

ios - APNS : is APNS certificate needed if Auth Key using?

iphone - 如何告诉 VoiceOver 控件已动画化?

ios - %@ 的超链接在 iOS 上不起作用

ios - App Store Connect 如何添加阿拉伯语截图和文字?

language-agnostic - 网站应该如何处理本地化设置? (来自 “What are common UI misconceptions and annoyances?” )

ios - 计算点大小以适合矩形内的字符串