12

我正在将一个 iOS 项目翻译成葡萄牙语,并创建了一个 pt.lproj/Localizable.strings 文件,并将 NSLocalizedString() 添加到源代码中。这一切都有效!有一个小问题 - XIB 文件中的字符串没有被翻译......我知道这是设计使然。

我已经看到 ibtool 命令可用于从名为 x 的 XIB 文件中提取字符串并将其放入名为 x.strings 的文件中......但我的问题是,有没有办法从所有 xib 中提取字符串文件并将它们全部放入一个 .strings 文件(例如 Localizable.strings?甚至另一个名为 XIBs.strings 的文件就可以了吗?)

4

3 回答 3

10

您有两种选择如何翻译 xib 文件。一种是将 UI 元素连接到插座并使用NSLocalizedString宏在 viewDidLoad 方法中设置字符串。

第二个选项是为您的应用支持的每种语言提供单独的 xib。您不必手动创建它们,您可以使用ibtool命令(我假设您的源语言是英语,目标是葡萄牙语):

ibtool --strings-file pt.lproj/Example.strings en.lproj/Example.xib –write pt.lproj/Example.xib

要收集在您的项目中找到的字符串,您可以使用genstrings命令 - 但是我建议使用此python 脚本来收集所有字符串 - 当您需要向应用程序添加/删除字符串时,它可以很好地处理这种情况,而无需翻译和/或手动合并所有以前的字符串

编辑

哦,我找到了我从中学到这个技巧的文章

于 2011-12-01T16:37:52.607 回答
3

我做了一个类别来做到这一点:

@implementation UIView (Localise)

- (void)localise
{
    [self.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
        [view localise];
        if ([view isKindOfClass:[UILabel class]]) {
            UILabel *label = (UILabel *)view;
            [label setText:NSLocalizedString(label.text, nil)];
        }
    }];
}

那么在你看来:

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self localise];
}

您将需要添加对其他 UI 元素的支持(textField.placeholder = NSLocal...blah blah),但这对 UILabel 和孩子们有用。

在性能方面可能不是很好,但可以完成工作。

于 2013-11-19T17:39:26.510 回答
0

这将取决于应用程序和本地化的数量,但总的来说,我更喜欢单独的 .xib 文件,因为布局可能会改变。将本地化文件放在 pt.lproj/ 中。

于 2011-12-01T17:26:55.743 回答