Xib StoryBoard中控件的国际化/本地化方案

给大家分享一个在xib中做国际化比较优雅的实现方案。

要对xib中的控件做国际化,一般的实现是这样的:找到Xib控件的ID,再把这个ID和文案作为key-value写到我们的Localizable.strings(必须是这个名字)文件中去。控件ID在这里可以找到:


1562989972847.jpg

在Localizable.strings文件中的key-value是这样写的:

"qtT-Bt-mkE.text" = "国际化标签测试";

毫无疑问,这样的代码可读性、维护性实在是太差了,我们需要更好的方案。
那么,我们的目标就是:
可以自定义控件在Localizable.strings中的键值,再在Localizable.strings统一管理这些国际化的字符串。如下:

"testLabel_text" = "国际化标签测试"
"testButton_text" = "国际化按钮测试"

问题就很简单了,用@IBInspectable和extension:
新建一个Localization.swift文件,文件中代码如下:

import UIKit

//MARK: - String Extension
extension String {
    var localized: String {
        return NSLocalizedString(self, comment: "")
    }
}


////MARK: - Controls IBInspect extension
extension UILabel {
    @IBInspectable var LocalizeKey: String? {
        get { return nil}
        set(key) {
            self.text = key?.localized
        }
    }
}

extension UIButton {
    @IBInspectable var LocalizeKey: String? {
        get { return nil}
        set(key) {
            self.setTitle(key?.localized, for: .normal)
        }
    }
}

extension UINavigationItem {
    @IBInspectable var LocalizeKey: String? {
        get { return nil}
        set(key) {
            self.title = key?.localized
        }
    }
}

extension UIBarButtonItem {
    @IBInspectable var LocalizeKey: String? {
        get { return nil}
        set(key) {
            self.title = key?.localized
        }
    }
}

extension UITextField {
    @IBInspectable var LocalizeKey: String? {
        get { return nil}
        set(key) {
            self.placeholder = key?.localized
        }
    }
}

这时候,我们回到xib文件界面,在@IBInspectable生成的属性中填入我们想要的key名:
1562992029433.jpg

再在Localizable.strings的Simplified文件中写入

"testLabelKey" = "国际化标签测试";

再在Localizable.strings的English文件中写入

"testLabelKey" = "localize label test";

运行,切换语言:


Screen Shot 2019-07-13 at 12.40.38.png

大功告成!

本文demo下载:XibLocalization

你可能感兴趣的:(Xib StoryBoard中控件的国际化/本地化方案)