7

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

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

我在这篇文章中读到,您可以自己设置语言,所以大概我可以发明自己的语言并将其设置为该语言。但我想知道这是否是最好的处理方式?任何建议都将受到欢迎。

4

3 回答 3

13

对于任何给定的语言(即多个.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"]

于 2011-02-21T12:50:16.090 回答
2

NSLocalizedStrings 实际上是一个宏定义为

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

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

于 2015-05-27T10:29:34.257 回答
0

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

于 2011-02-21T12:46:05.983 回答