我(与其他人一样)使用NSLocalizedString
本地化我的应用程序。
不幸的是,有几个“缺点”(不一定是NSLocalizedString本身的错误),包括
genstring
最终会以一个字符串的多个注释结束genstring
某些字符串之后再使用,则必须小心不要丢失旧的本地化版本。NSLocalizedString(@"Abort", @"Cancel action")
在任何地方都使用,然后Code Review会要求重命名字符串NSLocalizedString(@"Cancel", @"Cancel action")
以使代码更加一致。我所做的(并且经过一些搜索之后,我认为很多人都这样做)是要有一个单独的strings.h
文件,我需要#define
所有的本地化代码。例如
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
这基本上提供了代码完成,一个地方改变变量名称(所以不再需要genstring)和一个唯一的关键字自动重构。然而,这需要花费一大堆#define
非固有结构的语句(即像LocString.Common.Cancel或类似的东西)。
NSLocalizedString
有一些限制,但它对Cocoa来说非常重要,因为编写自定义代码来处理本地化是不合理的,不得不使用它。
genstrings
覆盖你的字符串文件,丢弃你之前的所有解释。有一个update_strings.py来解析旧的字符串文件,运行genstrings
并填写空白,以便不必手动恢复现有的翻译。脚本尝试尽可能匹配现有的字符串文件,以避免在更新它们时出现太大差异。
如果使用NSLocalizedString
:
NSLocalizedString(@"Cancel or continue?", @"Cancel notice message when a download takes too long to proceed");
可能最终会在代码的另一部分中定义相同的字符串,这可能会因为相同的英语术语在不同的上下文中具有不同含义而发生冲突:
NSLocalizedString(@"DOWNLOAD_CANCEL_OR_CONTINUE", @"Cancel notice window title when a download takes too long to proceed");
至于Xcode中字符串的自动完成,可以尝试http://questbe.at/lin/...