我可以通过无线方式将localizable.strings文件加载到iOS应用程序中

msk*_*skw 20 localization objective-c ios

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

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

你们认为有可能以这种方式加载语言吗?或者App是否必须在编译时编译语言文件?

vig*_*o24 34

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

所以,假设您提取了一个关键的"KEY"语言翻译,那么正常的语法将是:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil);
Run Code Online (Sandbox Code Playgroud)

但是此选项的变体允许您指定包:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);
Run Code Online (Sandbox Code Playgroud)

在标准情况下,您替换myBundle[NSBundle mainBundle]但如果您想使用另一个包,您可以这样指定它:

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

捆绑包的完整结构可以在Apple文档的"捆绑编程指南"中看到,但在您的情况下,您可以通过以下方式创建:

  • 在你的Mac上创建一个目录,并将其命名为"MyBundle"
  • 在这个目录中移动你的本地化字符串(如果你在bundle中有多种语言,那么localizable.strings文件将在lproj目录中:en.lproj,it.lproj,fr.lproj,...)
  • 然后将目录重命名为"MyBundle.bundle"

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

现在,您可以决定使用多捆绑方法或遵循单捆绑技术:在后一种情况下,您可以打包所有语言,然后使用自动系统本地化规则使用唯一更新捆绑包进行语言转换; 在另一种情况下,您可以为每种语言创建一个包,然后 - 根据当前选择的语言 - 加载相应的包并为您的翻译选择它.

  • 很有用!不幸的是,如果您想添加App Store元数据的本地化(如果您添加新的本地化,则可能需要),您还是必须提交应用更新... (3认同)
  • 是的,元数据本地化意味着应用程序重新提交。在这种情况下,您可以将新语言合并到包中。但是下载包方法的简单性使您可以在任何应用程序更新之前提供很多本地化(和翻译错误修复)。确保在下一次应用更新(错误修复、新功能)时,您将在主包中合并新语言,并且您也将更新元数据。 (2认同)