如何使本地化的故事板或XIB保持同步?

时间:2015-07-22 15:47:31

标签: ios xcode localization xcode6 interface-builder

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用策略将XIB或Storyboard保存在单个文件中并定位可视化 按需编程组件,以编程方式制作。

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

我相信通过几个步骤,您可以评估该策略是否符合您的需求:

  • 使用您要支持的语言配置项目;

enter image description here

  • 创建一个支持位置的文件;

enter image description here

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

enter image description here

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

enter image description here

如果您自定义可视组件(例如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或Storyboard的属性时动态设置键值。

enter image description here

一般帮助:

答案 1 :(得分:2)

你的结论是正确的。 Xcode中设计本地化的方式要求您使用基本语言创建所有UI更改。