我一直在通过为每种语言创建字符串文件和/或本地化的xib文件来本地化我的程序。这个过程非常缓慢,因为维护所有本地化的xib文件并向接口添加新功能非常复杂。
为了避免这种情况,在我最新的项目中,我只是为界面上的每个UI元素制作了IBOutlets,并在-(void)awakeFromNib
使用NSLocalizedString
和字符串文件更改了所有元素的标题和字符串值。
有没有其他更有效的方法可以批量翻译所有UI,而不需要创建多个xib和/或浪费时间来"保持它们同步"?
我有一个想法来解决这个问题,我制作了一个NSObject类别,如下所示:
@implementation NSObject (Localizable)
-(void)awakeFromNib {
if ([self isKindOfClass:[NSTextField class]]) {
NSTextField *txtField = (NSTextField *)self;
txtField.stringValue = NSLocalizedString(txtField.stringValue, nil);
}
else if ([self isKindOfClass:[NSWindow class]]) {
NSWindow *windowC = (NSWindow *)self;
windowC.title = NSLocalizedString(windowC.title, nil);
}
}
@end
正如您在我的类别中看到的那样,通过将翻译占位符保留为NSTextField
文本,我可以很容易地更改应用程序上所有NSTextField
对象的值。。。
这很好,但我担心性能,因为这将为我的应用程序中的所有对象运行。
这样做有多糟糕?还有更好的选择吗?
PS:我创建了一个类别NSObject
,而不是NSTextField
或NSWindow
,因为这样我可以将所有本地化逻辑保留在一个地方,只需为我可能想要翻译的每个UI类添加另一个else if
语句,而不是创建一个新的类别。
使用ibtool
管理xib文件。它是与Xcode一起安装的命令行工具包的一部分。虽然Xcode提供了一个用于编辑字符串的GUI,但ibtool
可以从脚本中运行。
总的来说,苹果有一些维护xib文件的指导方针和建议;你可以在这里找到他们的文档。阅读它,你会发现ibtool
相当容易使用。
尽管你所采取的方法令人印象深刻(我见过一些非常糟糕的方法,其中每个UI元素都连接到IBOutlet,只是为了实现本地化!),但它最终仍然是必须维护的额外粘合代码(相信我,随着需求的变化,最终会维护它)。
因此,就我的两种货币单位而言,我建议坚持使用本地化的笔尖。