先说下思路: 我通过枚举+KVC的方式来实现整个国际化的解决方案.
- 国际化文档配置文件:
1.1重写了下标方法, 支持传入一个String 作为key 来查找对应的value, 并且实现value(forUndefinedKey key: 保证传递的key即使不存在也不会发生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入口, 这里协议的value 的作用是真正获取传递的枚举值对应的value, 内部是把枚举的key 转化成了String, 然后通过kvc来获取对应value. 我这里只需要中英文的国际化, 如果需要根据个人实际情况扩展代码即可.
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相同就可以.
/*
账号相关
*/
public enum Accounts {
/// = "本机号码一键登录"
case loginWithNumber
/// = "登录即代表已同意"
case loginIsAgree
/// = "用户协议"
case userAgreement
/// = "隐私政策"
case privacy
/// = "其他方式登录"
case exchangeLoginType
/// = "短信验证登录"
case login_header
/// = "请输入手机号码"
case input_number_placeholder
/// = "获取验证码"
case getCaptcha
/// = "输入验证码"
case inputCaptcha
/// = "验证码已发送至 %@"
case captchaHadSend
}
- 使用:
// 调用Service 模块下的话题详情回复国际化文案
LocalizableKeys.services(.topic_detail_reback).value