給大家分享一個在xib中做國際化比較優(yōu)雅的實現(xiàn)方案。
要對xib中的控件做國際化,一般的實現(xiàn)是這樣的:找到Xib控件的ID,再把這個ID和文案作為key-value寫到我們的Localizable.strings(必須是這個名字)文件中去。控件ID在這里可以找到:

1562989972847.jpg
在Localizable.strings文件中的key-value是這樣寫的:
"qtT-Bt-mkE.text" = "國際化標簽測試";
毫無疑問,這樣的代碼可讀性、維護性實在是太差了,我們需要更好的方案。
那么,我們的目標就是:
可以自定義控件在Localizable.strings中的鍵值,再在Localizable.strings統(tǒng)一管理這些國際化的字符串。如下:
"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