在运行时可以添加.strings资源文件吗?

我知道在Mac应用程序中,可以将.strings文件添加到项目文件夹以添加本地化。

有什么方法可以在编译时将其他本地化添加到应用程序(iOS或Mac OS),而无需从资源束中加载它们。 说,下载一个额外的本地化,并将其存储在/ iOS上的文件?

是的,但这不是你的想法。

你可以把一个string文件加载到一个NSString ,然后使用-[NSString propertyListFromStringsFileFormat]把它转换成一个字典。

这将为您提供一种将自定义翻译的string存储在内存中的方法。

至于实际使用,你将不得不定义自定义翻译function。 IE浏览器,你不能再使用NSLocalizedString()和朋友。 幸运的是, genstrings (用于生成string文件的实用程序)允许您指定自定义函数名称 :

 genstrings -s "JPLocalizedString" ... 

这意味着在代码中,您可以定义:

 NSString* JPLocalizedString(NSString *key, NSString *comment) { return [myLoadedStrings objectForKey:key]; } 

以及JPLocalizedStringFromTable()JPLocalizedStringFromTableInBundle()JPLocalizedStringWithDefaultValue()genstrings将拿起所有这些。 (换句话说,只是因为NSLocalizedString是一个macros并不意味着你的版本必须是)

如果你这样做并使用这些JPLocalizedString变体,那么genstrings仍然会为你生成你的string文件(提供你使用-s标志)。

一旦这些函数被调用,你可以使用任何查找机制,默认回到NSLocalizedString版本,如果你找不到任何东西。

你应该能够通过重写NSBundle的各种pathForResource: …方法来实现这一目标。 (我会假设他们都通过-pathForResource:ofType:inDirectory:forLocalization:但是没有logging,所以即使事实certificate是现在的情况,你也不能依赖它,所以你应该覆盖所有的。)

我也build议提交一个重写查询机制的干净方式的增强请求 。

如果你想在应用程序中实现一个替代版本的NSLocalizedString(),那么有很多好的策略。 这将允许您修改应用程序本身内使用的值。 但是这些推送通知不起作用。

但是,警告:对于使用本地化string的iOS推送通知,没有合法的运行时方法修改用于将从服务器发送的本地化参数转换为设备本地语言的内置string资源。

所以如果你想使用本地化的string作为推送通知的一部分,你必须在提交到商店时将它们发送到应用程序中。 以后不能通过从服务器加载某些东西来修改它们。