先說下思路: 我通過枚舉+KVC的方式來實現(xiàn)整個國際化的解決方案.
- 國際化文檔配置文件:
1.1重寫了下標方法, 支持傳入一個String 作為key 來查找對應的value, 并且實現(xiàn)value(forUndefinedKey key: 保證傳遞的key即使不存在也不會發(fā)生crash
/// 中文
class LocalizableValues_cn: NSObject {
subscript(_ key: String) -> String {
get {
guard let value = LocalizableValues_cn.value(forKey: key) as? String else { return key }
return value
}
}
override static func value(forUndefinedKey key: String) -> Any? {
return nil
}
}
這就是在一個國際化文件里的配置key value.
/*
服務類
*/
@objc static let photo = "相冊"
@objc static let video = "視頻"
1.2 在國際化配置文件中每一個extension 代表一個模塊的國際化配置, 清晰明了
- LocalizableKeys 國際化獲取value入口, 這里協(xié)議的value 的作用是真正獲取傳遞的枚舉值對應的value, 內(nèi)部是把枚舉的key 轉(zhuǎn)化成了String, 然后通過kvc來獲取對應value. 我這里只需要中英文的國際化, 如果需要根據(jù)個人實際情況擴展代碼即可.
protocol LocalizableProtocol {
var value: String { get }
}
public enum LocalizableKeys: LocalizableProtocol {
case services(Services)
case account(Accounts)
case refresh(Refresh)
case home(Home)
case commodity(Commodity)
case message(Message)
case mine(Mine)
public var value: String {
switch self {
case .services(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
case .account(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
case .refresh(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
case .home(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
case .commodity(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
case .message(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
case .mine(let localizable):
return Localizable.localizable == .chinese ? LocalizableValues_cn()["\(localizable)"]:LocalizableValues_en()["\(localizable)"]
}
}
}
- 再來看下模塊對應的枚舉配置文件, 只要保證枚舉的case name 和 國際化配置文件里的name相同就可以.
/*
賬號相關(guān)
*/
public enum Accounts {
/// = "本機號碼一鍵登錄"
case loginWithNumber
/// = "登錄即代表已同意"
case loginIsAgree
/// = "用戶協(xié)議"
case userAgreement
/// = "隱私政策"
case privacy
/// = "其他方式登錄"
case exchangeLoginType
/// = "短信驗證登錄"
case login_header
/// = "請輸入手機號碼"
case input_number_placeholder
/// = "獲取驗證碼"
case getCaptcha
/// = "輸入驗證碼"
case inputCaptcha
/// = "驗證碼已發(fā)送至 %@"
case captchaHadSend
}
- 使用:
// 調(diào)用Service 模塊下的話題詳情回復國際化文案
LocalizableKeys.services(.topic_detail_reback).value