2011-05-20 53 views
11

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

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

+0

5年后,有一个产品为此。 https://lokalise.co/“无需重新提交您的应用程序进行审查了。使用Lokalise iOS和Android SDK通过几行代码更新字符串和翻译“ – JoePasq 2017-10-27 14:21:16

回答

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

谢谢,这更多是一个理论问题,我没有计划实现这一点。 – JoePasq 2011-05-21 15:28:23

0

您应该可以通过覆盖NSBundle的各种pathForResource: ...方法来实现此目的。 (我假设他们都经历过-pathForResource:ofType:inDirectory:forLocalization:,但这没有记录,所以你不能依赖它,即使它原来是,现在的情况,所以你应该覆盖所有的人。)

我也建议filing an enhancement request用于覆盖查找机制的干净方式。

+1

ooph,糟糕的主意。唯一的办法就是通过将' - [NSBundle localizedStringForKey:value:table: ]''方法,这真的是一个非常糟糕的想法 – 2011-05-20 17:33:54

+0

嗯,我回过头来,你可以使用'NSBundle'的子类,重写方法中的逻辑,并在必要时调用'super', *您必须*总是*使用'NSLocalizedStringFromTableInBundle()'或'NSLocalizedStringWithDefaultValue()'宏指定您的自定义捆绑软件 – 2011-05-20 17:45:31

0

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

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

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

相关问题