我开始整理一个已经开发了好几年的大型客户项目。
它大量使用NSLocalizedString()
宏来向系统询问硬编码到程序中的字符串常量的本地化版本。
如果在源目录上运行genstrings
命令行工具,它将找到调用NSLocalizedString()
时引用的所有常量字符串,并创建Localizable.strings
的起始版本。然后,您将这个起始Localizable.strings
文件提供给您的翻译人员,他们以起始语言(本例中为英语)开始使用Localizable.strings,并为每种支持的语言创建Localizable.strings版本。
问题在于,在某些情况下,我从数据结构中获取字符串。在这种情况下,我在变量中有源字符串。
The genstrings utility does not know how to handle this case:
#define K_STRING_TO_LOCALIZE @“This is the string to localize"
...
NSString *localizedString = NSLocalizedString(K_STRING_TO_LOCALIZE, nil);
或者这种情况:
NSString *stringToLocalize = @“This is the string to localize";
...
NSString *localizedString = NSLocalizedString(stringToLocalize, nil);
(假设在上述两种情况下,字符串都在其他地方定义。)
在这种情况下,您需要手动将“边缘大小写”字符串添加到Localizable.strings
。
但是,如果您再进行新的开发并添加更多字符串,则需要更多调用
NSLocalizedString()
,你不能再次在你的程序上运行genstrings,而不会覆盖你手动输入的字符串。
Localizable.strings
似乎不支持#import语句,因此您也不能将一个以编程方式生成的字符串块进行本地化,也不能为边缘情况手动输入单独的块。
管理此选项有哪些选择?
更好的例子:
我的共享Utils
对象中有一个名为showAlertControllerWithTitle:message:showCancelButton:okButtonAction:
的函数,它显示警报控制器的自定义变体。
在内部,该函数对传递给它的标题和消息参数调用NSLocalizedString。这样您就不必为每个调用编写所有样板代码。 这是一个示例调用:
[[Utils sharedUtils]
showAlertControllerWithTitle: @"Error loading collection file"
message: message
showCancelButton: FALSE
okButtonAction: nil];
以编程方式生成消息字符串。标题字符串是固定的字符串。
但是,由于showAlertControllerWithTitle
函数使用变量调用NSLocalizedString,而不是编译时常量字符串,因此genstrings工具不会“看到”该字符串并将其添加到Localized.strings
文件中。 / p>