同一App的不同目标的替代字符串 - 使用NSLocalizedString?

时间:2011-02-21 12:12:27

标签: iphone objective-c xcode target nslocalizedstring

我正在构建我已经发布的应用程序版本,但有一些更改。它不是一个精简/完整版本关系,但它们足够相似,我正在使用具有不同目标的相同项目。

我想重新编写我在新版本的第一个版本中使用的几乎所有字符串,并且想知道解决此问题的最佳方法。我没有在声明每个字符串之前使用#ifdef / #else语句,而是考虑使用NSLocalizedStrings。但是,实际语言仍然相同。

我在this post读到你可以自己设置语言,所以我想我可以发明自己的语言并将其设置为那样。但我想知道这是不是最好的办法?任何建议都是最受欢迎的。

3 个答案:

答案 0 :(得分:12)

您可以为任何给定语言(即多个.strings文件)提供多个字符串表。如果需要本地化字符串,可以通过以下方式获取:

NSString *str;

// Look up string in Full.strings
str = [[NSBundle mainBundle] localizedStringForKey:@"SomeKey"
                                             value:@"DefaultValue"
                                             table:@"Full"];

// Look up strings in Lite.strings
str = [[NSBundle mainBundle] localizedStringForKey:@"SomeKey"
                                             value:@"DefaultValue"
                                             table:@"Lite"];

由于此方法的表可以是变量,因此您甚至可以在运行时切换它。以上假设您有一个Full.strings表和一个Lite.strings表。

Full.strings

"SomeKey" = "This string appears in the full version";

Lite.strings

"SomeKey" = "This string appears in the lite version";

您可能不希望将它们一起发送,如果是这种情况,您可以将Info.plist配置为包含要用于特定目标的表的名称(如果添加名为"TableToUse"的条目,你可以通过[[[NSBundle mainBundle] infoDictionary] objectForKey:@"TableToUse"]

获得

答案 1 :(得分:2)

NSLocalizedStrings实际上是一个定义为

的宏
#define NSLocalizedString(key, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

将table参数设置为nil,代码将使用默认值“ Localizable ”,因此如果我们添加另一个本地化字符串文件,我们应该直接调用[[NSBundle mainBundle] localizedStringForKey:value:table:而不是调用NSLocalizedStrings < / p>

答案 2 :(得分:0)

非常犹豫要发明我自己的语言,但你可能也不需要。如果在适当的位置使用NSLocalizedString,然后使用genstrings将这些提取到Localizable.strings(请参阅docs),那么您可以简单地拥有此文件的两个版本,然后在每个目标中复制正确的版本。