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

Posted

技术标签:

【中文标题】如何使本地化的 Storyboard 或 XIB 保持同步?【英文标题】:How do I keep localized Storyboards or XIBs in sync? 【发布时间】:2015-07-22 15:47:30 【问题描述】:

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

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

除了以后总是在基本版本中更改 UI 之外,我该怎么做?

【问题讨论】:

如果您想要一个自动流程(我相信您会这样做),那么更新应该从您的基础语言流向您的本地化。永远不要在另一个方向! 【参考方案1】:

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

【讨论】:

有时我想知道Apple是否故意让XCode中的某些事情变得痛苦。【参考方案2】:

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

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

https://github.com/douglasddf/iosLocalizationDemo

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

以您想要支持的语言配置您的项目;

创建支持位置的文件;

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

创建继承自目标的可视化组件;

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

- (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 的属性时动态设置键值。

一般帮助:

http://www.raywenderlich.com/64401/internationalization-tutorial-for-ios-2014 http://www.appcoda.com/ios-programming-tutorial-localization-apps/

【讨论】:

问题不在于原则上本地化是如何工作的,我知道这一点。相反,它是关于在不同本地化版本的接口文件中所做的更改以及如何使它们保持同步。 好的。我现在知道了。我将编辑我的答案并尝试演示如何执行。 您的方法需要覆盖我使用的所有 UI 类,以便自己进行国际化,不是吗?这似乎是大量的样板。我也喜欢尽可能将 UI 和代码分开,所以以编程方式设置字符串是一件麻烦事。为这个想法 +1。 不需要自定义所有组件。这只是一个想法,让视觉组件无需手动以编程方式替换内容。

以上是关于如何使本地化的 Storyboard 或 XIB 保持同步?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过编码管理 .storyboard 或 .xib 文件中的多个视图。?

xib或storyBoard中往scrollView添加子控件

Xcode 5 - iOS - 如何在没有 Storyboard 或 XIB 的情况下在 Xcode 中创建视图控制器以及如何将其配置为 AppDelegate 作为根视图

iOS 多国语言本地化与App内语言切换(Swift)

没有 Storyboard 或 XIB 的 UIViewControllers 之间的 Segue

在xib或storyboard中textView或label的换行