我知道在Mac应用程序中,可以将.strings文件添加到项目文件夹中以添加本地化。
是否有任何方法可以将其他本地化添加到应用程序(iOS或Mac OS),而无需在编译时从资源包中加载它们。比如说,下载一个额外的本地化并将其存储在/ Documents on iOS?
答案 0 :(得分:19)
是的,但这不是你的想法。
您可以获取字符串文件并将其加载到NSString
,然后使用-[NSString propertyListFromStringsFileFormat]
将其转换为字典。
这将为您提供一种将自定义翻译的字符串存储在内存中的方法。
至于实际使用它,你必须定义自定义翻译功能。 IE,你不能再使用NSLocalizedString()
和朋友了。幸运的是,genstrings
(用于生成字符串文件的实用程序)允许您指定custom function names:
genstrings -s "JPLocalizedString" ...
这意味着在代码中,您可以定义:
NSString* JPLocalizedString(NSString *key, NSString *comment) {
return [myLoadedStrings objectForKey:key];
}
以及JPLocalizedStringFromTable()
,JPLocalizedStringFromTableInBundle()
,JPLocalizedStringWithDefaultValue()
。 genstrings
会接受所有这些。 (换句话说,仅仅因为NSLocalizedString
是一个宏并不意味着你的版本必须是)
如果您执行此操作并使用这些JPLocalizedString
变体,则genstrings
仍会为您生成字符串文件(假设您使用-s
标记)。
调用这些函数后,您可以使用所需的任何查找机制,如果找不到任何内容,则默认返回NSLocalizedString
版本。
答案 1 :(得分:1)
如果要在应用程序中实现备用版本的NSLocalizedString(),那么有很多好的策略。这将允许您修改应用程序本身内使用的值。但是那些在Push Notifications方面不会起作用。
警告但是:对于使用本地化字符串的iOS推送通知,没有合法的运行时方法修改内置字符串资源,这些资源用于将从服务器发送的本地化参数转换为设备的本机语言。
因此,如果您想使用本地化字符串作为推送通知的一部分,则必须在提交到商店时在应用程序中发送它们。以后可以通过从服务器加载某些内容来修改它们。
答案 2 :(得分:0)
您应该可以通过覆盖类别中的NSBundle
个pathForResource:
...方法来实现此目的。 (我认为它们都经过了-pathForResource:ofType:inDirectory:forLocalization:
,但是没有记录,所以你不能依赖它,即使现在结果是这样,所以你应该覆盖所有这些。)
我还建议使用filing an enhancement request来覆盖查找机制。