2012-09-10 95 views
19

可以说我的应用程序只能用英文运行。但我不想每次添加新语言时都要发布新版本。我的建议是将这个localizable.strings文件远程加载到我的应用程序中。我可以将一个localizable.strings文件加载到iOS应用程序中吗

我的应用程序具有从ftp站点加载文件的功能。

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

+0

同样的问题作为http://stackoverflow.com/questions/12358379/is-it-possible-to-access-the-app-bundles-en-lproj? –

+0

这个问题似乎已被解决[这里](http://stackoverflow.com/a/6075533/1651167) – Shelm

+1

是类似的,但人们根据问他们是如何回答不同的问题。下面这个显然有更好的答案。 – mskw

回答

32

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

所以我们说你提取的关键“钥匙”的语言翻译,那么正常的语法为:

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

,但有这个选项,允许您指定包的变体:

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

在标准情况下你[NSBundle mainBundle]更换myBundle但如果你想使用另一种捆绑,你可以用这种方式指定它:

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

捆绑的完整结构可以看出,在苹果文档的“捆绑编程指南”中,但在你的情况下,你可以简单地创建了这种方式:在您的Mac创建一个目录

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

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

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

+3

非常有用!不幸的是,如果你想添加App Store元数据的本地化(如果你添加一个新的本地化,你可能需要),你必须提交应用更新...... –

+0

App Store元数据将用于什么? – mskw

+1

是的,元数据本地化意味着应用程序重新提交。在这种情况下,您会在捆绑中合并您的新语言。但是下载捆绑方式的简单性使得您可以在任何应用更新之前提供本地化(和翻译错误修复)。当然,在下一次应用更新(错误修复,新功能)中,您将在主包中合并新语言,并且您也将更新元数据。 – viggio24

相关问题