0

我一直在通过为每种语言创建字符串文件和/或本地化 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而不是NSTextFieldNSWindow因为这样我可以将所有本地化逻辑保存在一个地方,并且只需else if为我可能想要翻译的每个 UI 类添加另一个语句,而不是创建一个新类别。

4

1 回答 1

1

用于ibtool管理您的 xib 文件。它是随 Xcode 一起安装的命令行工具包的一部分。虽然 Xcode 提供了用于编辑字符串的 GUI,ibtool但可以从脚本运行。

总体而言,Apple 对维护 xib 文件有一些指导方针和建议;你可以在这里找到他们的文档。阅读它,你会发现它ibtool相当容易使用。

与您采用的方法一样令人印象深刻(我见过一些非常糟糕的方法,其中每个UI 元素都连接到 IBOutlet 只是为了实现本地化!),它最终仍然是必须维护的附加胶水代码(相信我,随着需求的变化,您最终会维护它)。

所以就我的两个货币单位而言,我建议坚持使用本地化的笔尖。

于 2013-07-02T02:38:12.990 回答