该方案是围绕LROLocalizedString
类来完成的。
APP内语言选择
代码
自定义语言包类
class LROLocalizedString {
static var share: LROLocalizedString = LROLocalizedString()
lazy var bundle: Bundle = {
if let languages = UserDefaults.standard.object(forKey: "AppleLanguages") as? Array<String>, let language = languages.first {
if let path = Bundle.main.path(forResource: language, ofType: "lproj") {
if let b = Bundle(path: path) {
return b
}
}
}
return Bundle.main
}()
func string(key: String) -> String {
return NSLocalizedString(key, bundle: self.bundle, comment: "")
}
}
类的使用
// 更改语言包
LROLocalizedString.share.bundle = Bundle(path: Bundle.main.path(forResource: "zh-Hans", ofType: "lproj")!)!
// 根据语言包获取本地化文本
LROLocalizedString.share.string(key: "your key")
语言切换
// AppleLanguages是语言包列表,启动APP时,会从AppleLanguages里取当前语言进行本地化
UserDefaults.standard.set(["zh-Hans"], forKey: "AppleLanguages")
// 更改LROLocalizedString类的语言包
LROLocalizedString.share.bundle = Bundle(path: Bundle.main.path(forResource: "zh-Hans", ofType: "lproj")!)!
//执行上面代码后,重新设置根视图刷新界面
语言本地化拼接参数
因为本地化文件的格式只有文本格式"key" = "value";
,所以只能借助String(format: <#T##String#>, <#T##arguments: CVarArg...##CVarArg#>)
,来完成本地化文本拼接不固定的内容。
// en
"scroe" = "score: %d";
// zh-Hans
"scroe" = "分数: %d";
let format = LROLocalizedString.share.string(key: "score")
let str = String(format: format, 100)
Localizable.strings
创建的本地化文件的必须是这个名字
InfoPlist.strings
这是info.plist文件的本地化文件,如果需要按照这个名称创建。