21

假设我的应用程序仅以英语运行。但我不想每次添加新语言时都发布新版本。我的建议是将此localizable.strings文件远程加载到我的应用程序中。

我的应用程序可以从 ftp 站点加载文件。

你们认为可以以这种方式加载语言吗?还是应用程序必须在编译时编译语言文件?

4

1 回答 1

35

所有本地化的字符串资源(以及许多其他类型的资源)都是从捆绑包中提取的。通常,应用程序使用“主包”,它是由 XCode 与您的应用程序一起创建的。但是您可以单独创建任何其他捆绑包,只要您使用正确的结构制作它,然后您可以将其下载到您的应用程序中,最后使用 NSLocalizedStringFromTableInBundle() 函数提取本地化字符串。

因此,假设您提取语言翻译的键“KEY”,那么正常语法将是:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil);

但是此选项有一个变体,可让您指定捆绑包:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);

在标准情况下,您替换myBundle为,[NSBundle mainBundle]但如果您想使用另一个捆绑包,您可以通过以下方式指定它:

NSString *myBundlePath = "the path to the downloaded bundle";
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath];
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);

捆绑包的完整结构可以在 Apple 文档的“捆绑包编程指南”中看到,但在您的情况下,您可以简单地以这种方式创建:

  • 在您的 Mac 中创建一个目录,并将其命名为“MyBundle”
  • 在此目录中移动您的本地化字符串(如果您在捆绑包中有多种语言,则 localizable.strings 文件将位于 lproj 目录中:en.lproj、it.lproj、fr.lproj...)
  • 然后将目录重命名为“MyBundle.bundle”

您会注意到最后一个操作现在这个对象被视为一个独立的对象,但实际上它是一个目录。

现在您可以决定采用多包方法还是采用单包技术:在后一种情况下,您可以打包所有语言,然后使用系统自动本地化规则使用唯一更新的包进行语言翻译;在另一种情况下,您可以为每种语言制作一个包,然后 - 基于当前选择的语言 - 加载适当的包并为您的翻译选择它。

于 2012-09-10T20:02:39.473 回答