如何使本地化的 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 更改。
我用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 更改。