关键字:ios,国际化,多语言
实现功能:
1.默认采用系统语言
2.语言切换后实时生效
3.支持中英文,包含页面、app名称、系统默认权限弹框(如相机相册权限)
思路:app首次初始设置为系统语言,用户在app内切换语言时发送语言切换通知,刷新所有页面
-
project增加需要支持的语言
操作: PROJECT -> Info -> Localizations, 点击“+”增加语言
-
创建多语言对应的翻译文件
操作:
2.1 File -> New -> File...,文件名为Localizable.strings,后面需要用到文件名
2.2 Localizable.strings增加多语言,对应的语言上打勾
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要一致,建议行号也一致,方便翻译多了以后查找对照
-
页面获取当前语言对应的翻译,通过key来获取不同语言的翻译
- 切换语言后发送通知刷新所有页面,关键代码:
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,方便上层调用