我(像其他所有人一样)正在使用NSLocalizedString
本地化我的应用程序。
不幸的是,存在一些“缺点”(不一定是NSLocalizedString本身的错误),包括
- Xcode中的字符串没有自动完成功能。这使工作不仅容易出错,而且很麻烦。
- 您可能仅仅因为不知道已经存在等效字符串而重新定义了一个字符串(例如,“请输入密码”与“首先输入密码”)
- 与自动完成问题类似,您需要“记住” /复制粘贴注释字符串,否则
genstring
最终将对一个字符串产生多个注释 - 如果要
genstring
在对某些字符串进行本地化之后使用,则必须小心不要丢失旧的本地化版本。 - 相同的字符串分散在整个项目中。例如,您
NSLocalizedString(@"Abort", @"Cancel action")
在各处使用过代码,然后Code Review要求您重命名字符串NSLocalizedString(@"Cancel", @"Cancel action")
以使代码更加一致。
我要做的(在SO上进行了一些搜索之后,我发现很多人都这样做了)是要有一个单独的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的使用吗?甚至有一个封装它的框架吗?