我正在构建我已经发布的应用程序版本,但有一些更改。它不是一个精简/完整版本关系,但它们足够相似,我正在使用具有不同目标的相同项目。
我想重新编写我在新版本的第一个版本中使用的几乎所有字符串,并且想知道解决此问题的最佳方法。我没有在声明每个字符串之前使用#ifdef / #else语句,而是考虑使用NSLocalizedStrings。但是,实际语言仍然相同。
我在this post读到你可以自己设置语言,所以我想我可以发明自己的语言并将其设置为那样。但我想知道这是不是最好的办法?任何建议都是最受欢迎的。
答案 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),那么您可以简单地拥有此文件的两个版本,然后在每个目标中复制正确的版本。