多语言切换
更新时间: 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()
}
实现语言切换流程
-
切换语言时进行持久化设置,并发出通知。
objective-c
NEAppLanguageUtil.setCurrentLanguage(lanType) NotificationCenter.default.post( name: NENotificationName.changeLanguage, object: nil )
-
在其他页面收通知,通过 localizable 方法重新设置文案,localizable 方法内部会重新获取当前语言环境下的文案,以我的-设置页为例:
objective-c
NotificationCenter.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 等。
此文档是否对你有帮助?