美文网首页Android技术交流ios技术交流
ios架构篇-2 国际化多语言

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

作者: 浪人残风 | 来源:发表于2021-03-09 11:12 被阅读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,方便上层调用

    相关文章

      网友评论

        本文标题:ios架构篇-2 国际化多语言

        本文链接:https://www.haomeiwen.com/subject/qibvqltx.html