iOS 国际化解决方案

先说下思路: 我通过枚举+KVC的方式来实现整个国际化的解决方案.

  1. 国际化文档配置文件:
    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 代表一个模块的国际化配置, 清晰明了


image.png
  1. 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)"]
        }
    }
    
}

  1. 再来看下模块对应的枚举配置文件, 只要保证枚举的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
}
  1. 使用:
// 调用Service 模块下的话题详情回复国际化文案
LocalizableKeys.services(.topic_detail_reback).value

你可能感兴趣的:(iOS 国际化解决方案)