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

时间:2011-05-20 16:50:07

标签: objective-c ios cocoa macos localization

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

是否有任何方法可以将其他本地化添加到应用程序(iOS或Mac OS),而无需在编译时从资源包中加载它们。比如说,下载一个额外的本地化并将其存储在/ Documents on iOS?

3 个答案:

答案 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)

您应该可以通过覆盖类别中的NSBundlepathForResource: ...方法来实现此目的。 (我认为它们都经过了-pathForResource:ofType:inDirectory:forLocalization:,但是没有记录,所以你不能依赖它,即使现在结果是这样,所以你应该覆盖所有这些。)

我还建议使用filing an enhancement request来覆盖查找机制。