Android技术交流ios技术交流

ios架构篇-2 国际化多语言

2021-03-09  本文已影响0人  浪人残风

关键字:ios,国际化,多语言

实现功能:
1.默认采用系统语言
2.语言切换后实时生效
3.支持中英文,包含页面、app名称、系统默认权限弹框(如相机相册权限)

思路:app首次初始设置为系统语言,用户在app内切换语言时发送语言切换通知,刷新所有页面

  1. project增加需要支持的语言
    操作: PROJECT -> Info -> Localizations, 点击“+”增加语言


    image.png
  2. 创建多语言对应的翻译文件
    操作:
    2.1 File -> New -> File...,文件名为Localizable.strings,后面需要用到文件名


    image.png

    2.2 Localizable.strings增加多语言,对应的语言上打勾


    image.png
    2.3 app启动时初始化为默认语言,并保存到UserDefaults,关键代码为:
public func initCurrentLanguage() -> Void {
    // 如果首次UserDefaults没有保存用户语言,则将系统默认语言保存到UserDefaults
    if UserDefaults.standard.value(forKey: CPLANGUAGE_KEY) == nil {
        var languageType: CPLanguageType = .ZhHans
        // 获取系统默认的语言
        if let languages = UserDefaults.standard.object(forKey: "AppleLanguages")as? [String] {
            if languages.count > 0 {
                if let sysCurrent = languages.first {
                    if sysCurrent.contains(CPLanguageType.ZhHans.rawValue) {
                        languageType = .ZhHans
                    } else if sysCurrent.contains(CPLanguageType.En.rawValue) {
                        languageType = .En
                    }
                }
            }
        }
        // 保存到UserDefaults
        setUserlanguageType(languageType: languageType)
    }
}

2.4 增加多语言翻译,每种语言对应的key要一致,建议行号也一致,方便翻译多了以后查找对照


image.png
image.png
  1. 页面获取当前语言对应的翻译,通过key来获取不同语言的翻译


    image.png
  2. 切换语言后发送通知刷新所有页面,关键代码:
public func setUserlanguageType(languageType: CPLanguageType) -> Void {
    UserDefaults.standard.set(languageType.rawValue, forKey: CPLANGUAGE_KEY)
    UserDefaults.standard.synchronize()
    NotificationCenter.default.post(name: CPLANGUAGE_CHANGE_NOTIFICATION, object: nil)
}

获取不同语言的翻译关键代码:

public func getLocalizedString(key: String, value: String?, table: String?, languageType: CPLanguageType) -> String {

    if let bundle = getLanguageBundle(languageType: languageType) {

        return bundle.localizedString(forKey: key, value: value, table: table)

    } else {
        return ""
    }
}

这里的table参数就是上面创建的翻译文件的文件名

public extension String {

    func localizedString(table: String?) -> String {

        var aa = LOCALIZABLE

        if let str = table {

            aa = str

        }

        return getLocalizedString(key: self, value: nil, table: aa, languageType: getCurrentLanguage())

    }

}

String增加多语言的获取extension,方便上层调用

上一篇 下一篇

猜你喜欢

热点阅读