如何使本地化的 Storyboard 或 XIB 保持同步?

How do I keep localized Storyboards or XIBs in sync?

我用XCode 6. 想象一下以下场景:您的应用程序的基本语言是英语,而您决定添加德语本地化版本。您现在有两个版本的 Interface.xib。如果要将 UI 元素添加到基本版本,您可以简单地将德语版本转换为可本地化的字符串并返回,所有更改都将被移植(如果添加了字符串,当然必须手动编辑这些内容)

但是,如果您编辑的 Interface.xib 是德文版呢?如何将新的 UI 元素添加到英文版中?你不能简单地使用相同的技巧,至少我没有找到从本地化字符串转换回来的方法,可能 XCode 不知道它应该使用剩余的德语 XIB 并填充英语本地化字符串。

除了以后总是对基础版本进行 UI 更改外,我该怎么办?

您可以使用一种策略将 XIB 或故事板保存在单个文件中并定位视觉对象 按需组件,以编程方式制作。

我创建了一个演示项目并穿上了我的 github:

我相信您可以通过几个步骤评估该策略是否对您的需求有效:

  • 以您希望支持的语言配置您的项目;

  • 创建文件以支持位置;

  • 使用创建的文件,添加目标语言,然后Xcode将为每种语言创建一个文件,您可以放置​​您的键和翻译值。

  • 创建从其目标继承的视觉组件;

如果您自定义一个可视化组件(例如 UILabel),重写该方法可以 'drawRect' 并动态替换放置在文本字段中的键。因此,您可以为所有屏幕保留通用设计,而不必担心为国际化维护多个布局。

- (void)drawRect:(CGRect)rect {
    NSString *text = NSLocalizedStringWithDefaultValue([self text], nil, [NSBundle mainBundle], [self text], @"");
    if (self.attributedText && [[self text] length] > 0) {

        NSDictionary *attributes = [(NSAttributedString *)self.attributedText attributesAtIndex:0
                                                                                 effectiveRange:NULL];
        [self setText:text];
        self.attributedText = [[NSAttributedString alloc] initWithString:self.text attributes:attributes];
    }else{
        [self setText:text];
    }

    [super drawRect:rect];
}

当您 运行 您的项目现在注意到 UILabel 组件将在您设置其 XIB 或故事板的 属性 时动态设置键值。

一般帮助:

你的结论是正确的。 Xcode 中的本地化设计方式希望您发起基础语言中的所有 UI 更改。