【发布时间】:2012-04-11 08:14:35
【问题描述】:
我(和所有其他人一样)使用NSLocalizedString来本地化我的应用程序。
不幸的是,有几个“缺点”(不一定是 NSLocalizedString 本身的错),包括
- Xcode 中的字符串没有自动完成功能。这使得工作不仅容易出错,而且令人厌烦。
- 您最终可能只是因为不知道已经存在等效字符串而重新定义了一个字符串(即“请输入密码”与“先输入密码”)
- 与自动补全问题类似,您需要“记住”/复制粘贴注释字符串,否则
genstring最终会为一个字符串生成多个 cmets - 如果您想在已经本地化了一些字符串之后使用
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 的使用吗?有没有可能封装它的框架?
【问题讨论】:
-
我的做法和你差不多。但我正在使用 NSLocalizedStringWithDefaultValue makro 为不同的本地化问题(如控制器、模型等)创建不同的字符串文件并创建初始默认值。
-
似乎 xcode6 的导出到本地化并没有捕获头文件中定义为宏的字符串。谁能确认或告诉我我可能遗漏了什么?谢谢...!
-
@Juddster,可以确认,即使使用新基金 Editor->Export for Localization 也不会在头文件中找到
标签: objective-c ios localization nslocalizedstring