多语言切换

更新时间: 2024/12/10 17:48:38

自 V10.5.0 起,UIKit 支持多语言切换。

语言切换原理

获取语言配置

应用语言在未设置之前默认使用系统语言。设置后,通过 UserDefaults,应用程序可以方便地读取和写入数据,实现数据的本地持久化存储。

如果需要获取用户的地区信息(Locale),会优先从本地持久化数据中获取。若本地没有持久化数据,则会获取系统的默认地区信息。

objective-c/// app 内语言环境工具类
public class NEAppLanguageUtil: NSObject {
  /// 获取当前语言环境
  /// - Returns: 返回语言环境
  public static func getCurrentLanguage() -> NEAppLanguage {
    if let language = UserDefaults.standard.value(forKey: "IMKitLanguage") as? String,
       let languageType = NEAppLanguage(rawValue: language) {
      return languageType
    }

    if let preferredLang = Locale.preferredLanguages.first as? NSString {
      switch String(describing: preferredLang) {
      case "en-US", "en-CN", "en":
        return .english // 英文
      case "zh-Hans-US", "zh-Hans-CN", "zh-Hant-CN", "zh-TW", "zh-HK", "zh-Hans":
        return .chinese // 中文
      default:
        return .english
      }
    }
    return .english
  }

  /// 设置当前语言环境
  /// - Parameter language: 当前语言环境
  public static func setCurrentLanguage(_ language: NEAppLanguage) {
    UserDefaults.standard.set(language.rawValue, forKey: "IMKitLanguage")
    UserDefaults.standard.synchronize()
  }
}

语言自主切换

iOS 端通过设置 viewController 的 title 和 控件(如 Button) 的 text 来实现语言的自主切换。

当应用启动时,通过 localizable 方法获取初始语言环境下的文案,localizable 方法会通过 Bundle 获取初始语言 lproj 文件对应的字符,该方法在每次调用时都会根据最新的语言环境返回对应的文案。

objective-cpublic func localizable(_ key: String) -> String {
    var stringBundle = bundle
    let language = NEAppLanguageUtil.getCurrentLanguage().rawValue
    if let path = bundle.path(forResource: language, ofType: "lproj") {
      stringBundle = Bundle(path: path) ?? bundle
    }
    let value = stringBundle.localizedString(forKey: key, value: nil, table: "Localizable")
    return value
  }

语言切换广播

当应用内切换语言后,除了需要持久化到本地外,还需要通过 NotificationCenter 将此事件进行广播。

objective-cNEAppLanguageUtil.setCurrentLanguage(lanType)

NotificationCenter.default.post(
    name: NENotificationName.changeLanguage,
    object: nil
)

各页面监听到语言切换事件后,重新通过 localizable 方法获取当前语言 lproj 文件对应的字符,主动更新 title 或者 text,实现语言切换,以我的-设置页为例:

objective-cNotificationCenter.default.addObserver(self, 
    selector: #selector(changeLanguage), 
    name: NENotificationName.changeLanguage, 
    object: nil
)

 @objc func changeLanguage() {
    viewModel.getData()
    title = localizable("setting")
    tableView.tableFooterView = getFooterView()
    tableView.reloadData()
  }

实现语言切换流程

  1. 切换语言时进行持久化设置,并发出通知。

    objective-cNEAppLanguageUtil.setCurrentLanguage(lanType)
    NotificationCenter.default.post(
        name: NENotificationName.changeLanguage,
        object: nil
    )
    
  2. 在其他页面收通知,通过 localizable 方法重新设置文案,localizable 方法内部会重新获取当前语言环境下的文案,以我的-设置页为例:

    objective-cNotificationCenter.default.addObserver(self, 
        selector: #selector(changeLanguage), 
        name: NENotificationName.changeLanguage, 
        object: nil
    )
    
    @objc func changeLanguage() {
        viewModel.getData()
        title = localizable("setting")
        tableView.tableFooterView = getFooterView()
        tableView.reloadData()
      }
    

多语言扩展

IM UIKit 还支持添加其他语言资源,如:Japanese 等。

此文档是否对你有帮助?
有帮助
去反馈
  • 语言切换原理
  • 获取语言配置
  • 语言自主切换
  • 语言切换广播
  • 实现语言切换流程
  • 多语言扩展