假设我的应用程序仅以英语运行。但我不想每次添加新语言时都发布新版本。我的建议是将此localizable.strings
文件远程加载到我的应用程序中。
我的应用程序可以从 ftp 站点加载文件。
你们认为可以以这种方式加载语言吗?还是应用程序必须在编译时编译语言文件?
假设我的应用程序仅以英语运行。但我不想每次添加新语言时都发布新版本。我的建议是将此localizable.strings
文件远程加载到我的应用程序中。
我的应用程序可以从 ftp 站点加载文件。
你们认为可以以这种方式加载语言吗?还是应用程序必须在编译时编译语言文件?
所有本地化的字符串资源(以及许多其他类型的资源)都是从捆绑包中提取的。通常,应用程序使用“主包”,它是由 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 文档的“捆绑包编程指南”中看到,但在您的情况下,您可以简单地以这种方式创建:
您会注意到最后一个操作现在这个对象被视为一个独立的对象,但实际上它是一个目录。
现在您可以决定采用多包方法还是采用单包技术:在后一种情况下,您可以打包所有语言,然后使用系统自动本地化规则使用唯一更新的包进行语言翻译;在另一种情况下,您可以为每种语言制作一个包,然后 - 基于当前选择的语言 - 加载适当的包并为您的翻译选择它。