给大家分享一个在xib中做国际化比较优雅的实现方案。
要对xib中的控件做国际化,一般的实现是这样的:找到Xib控件的ID,再把这个ID和文案作为key-value写到我们的Localizable.strings(必须是这个名字)文件中去。控件ID在这里可以找到:
在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名:再在Localizable.strings的Simplified文件中写入
"testLabelKey" = "国际化标签测试";
再在Localizable.strings的English文件中写入
"testLabelKey" = "localize label test";
运行,切换语言:
大功告成!
本文demo下载:XibLocalization