接口本地化

如果我们将应用定位到比我们的国家更广泛的范围,则最好对应用进行本地化以使用户易于理解。 一个很好的习惯是用您的母语(至少是英语)本地化应用程序。

在iOS应用程序中进行本地化可能有点棘手。

UI国际化

过去,本地化接口文件(xib或情节提要)时,xCode使用* language-code * .proj创建该文件的克隆。

我们具有完全相同的文件,可以在其中更改UI组件(如标签,按钮等)的属性。

这种方法的一个优点是,我们可以为不同的国家定义完全不同的UI。

基础国际化

为了避免克隆界面文件,我们可以在“项目常规”选项卡中标记“ 使用基础国际化”复选标记,而不是我们可以选择使用界面文件或字符串文件来国际化应用程序的UI部分。

  / * Class =“ UIBarButtonItem”;  title =“添加”;  ObjectID =“ aFc-bV-NJn”;  * / 
  “ aFc-bV-NJn.title” =“添加”; 
  / * Class =“ UINavigationItem”;  title =“演示文稿”;  ObjectID =“ cZ7-QZ-PGj”;  * / 
  “ cZ7-QZ-PGj.title” =“演示文稿”; 

它减小了应用程序的大小。 我们尚未克隆我们支持的UI时代语言,但是此文件很难阅读/理解,甚至更难以维护。 当我们添加新的UILabel时,xCode不支持生命更新字符串文件。

使用代码本地化UI

当我们从代码构建整个视图时,很自然地从代码中设置本地化的字符串。 Wen我们有Xib或Storyboard文件,对每个控件进行输出并转换显示的值很奇怪。
我看到了一种解决方案,其中有人使用一种新颖的方法,该方法遍历视图层次结构中的所有子视图并根据标签或用户定义的运行时属性来翻译标签以查找翻译凯。
当我们添加新的本地化视图时,这会导致在viewDidLoad,awakeFromNib或其他初始化方法中调用一些代码……很多工作。

我的解决方案

在iOS应用程序中构建UI三年之后,我得出了一些结论,即如何构建易于维护和扩展的UI。
从一段时间以来,我几乎在Interface Builder中定义的每个组件都使用自定义类。 这使我可以在自己的应用程序中顺利介绍我的方法。

我的与UI连接的类层次结构如下所示:
*标签:UILabel
** AccentLabel:标签
** SecondaryLabel:标签
*按钮:UIButton
* TextField:UITextField
… 等等。

在层次结构顶部的每个类中,我都有@IBInspectable属性。 对于Label类,定义为:

  @IBInspectable 
public var localizable:Bool = false {
didSet {
保护可本地化的其他{返回}
警卫队让text = text else {return}
  self.text = NSLocalizedString(text,tableName:“ UIStrings”,注释:文本) 
}
}

设置此属性后,将调用“界面构建器”或代码didSet观察器。 当新值设置为true并且label有一些文本时,我正在UIStrings.strings文件中寻找该键,该文件位于我的应用程序的主捆绑包中。

在Identity Inspector的Interface Builder中,我将标签的类设置为:

在Property Inspector中,我将fallable属性设置为on:

此操作添加用户定义的属性:

如果将字符串文件中存在键,则在将类加载到内存中并且解析在text属性中定义的文本之后,将解析此属性。

我的POC(概念验证)应用程序UI如下所示:

解析为: