1. 新建 Localizable.strings
文件
2. 添加語言
項目名 --> info --> 添加語言
此時
Localizable.strings
文件下會多出相應(yīng)語言的文件
3. 添加對應(yīng)語言變量
在Localizable.strings(English)
文件中添加語言變量,注意:末尾有分號!
title = "Hello!";
在Localizable.strings(Simplified)
文件中添加語言變量,注意:末尾有分號泥技!
title = "你好!";
4. 變量的使用
NSLocalizedString("topic", comment: "")
5. 切換語言
- 在項目文件夾(
finder
中)可以看到對應(yīng)的語言文件神妹,如
這就是我們切換語言時所需要獲取的文件 - 獲取語言文件函數(shù)
// MARK: - 獲取 language bundle 文件 如 en.lproj
// 我也是剛學(xué)習(xí)颓哮,可能寫得不是很好家妆,僅提供相關(guān)思路鸵荠。
enum LanguageOptions: String {
case english = "English" // 英語
case german = "Deutsche" // 德語
case chinese = "中文(簡體)" // 中文(簡體)
static func getFileName(title: String) -> String {
switch title {
case "English":
return "en"
case "Deutsche":
return "de"
case "中文(簡體)":
return "zh-Hans"
default:
return "en"
}
}
}
extension Bundle {
class func getLanguageBundle() -> Bundle? {
// 根據(jù)用戶選擇的不同語言,獲取不同的語言的文件
let language = LanguageOptions.getFileName(title: Defaults[.currentLanguage])
let languageBundlePath = Bundle.main.path(forResource: language, ofType: "lproj")
guard languageBundlePath != nil else {
return nil
}
let languageBundle = Bundle.init(path: languageBundlePath!)
guard languageBundle != nil else {
return nil
}
return languageBundle!
}
}
- 獲取字符串
// MARK: - 根據(jù)語言文件 和 key 值獲取 相對應(yīng)的 字符串
class LanguageManager {
static func localizedLanguage(key: String) -> String {
let languageBundle = Bundle.getLanguageBundle() ?? Bundle.main
return NSLocalizedString(key, tableName: "Localizable", bundle: languageBundle, value: "?", comment: "")
}
}
// MARK: - 字符串?dāng)U展(簡化本地化寫法)
extension String {
func localized() -> String {
// 如果用戶未設(shè)置字體伤极,則使用系統(tǒng)默認(rèn)字體
if Defaults[.currentLanguage] == "" {
return NSLocalizedString(self, comment: "")
}
// 如果用戶設(shè)置過字體蛹找,則使用用戶選擇的字體
return LanguageManager.localizedLanguage(key: self)
}
}
此時,當(dāng)系統(tǒng)改變語言設(shè)置的時候(Defaults[.currentLanguage]
)哨坪,就可以通過 string.localized()
得到相應(yīng)語言的字符串庸疾。
- 用戶點擊語言,切換到相應(yīng)的語言当编。
// 切換當(dāng)點擊的語言
Defaults[.currentLanguage] = languageOptions[indexPath.row]
// 顯示切換時的loading
LCProgressHUD.showLoading("language_setting_language".localized())
// 重啟整個應(yīng)用
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1,
execute: {
LCProgressHUD.hide()
UIView.animate(withDuration: 0.4, animations: {
UIApplication.shared.keyWindow?.alpha = 0
}) { isFinished in
UIApplication.shared.keyWindow?.rootViewController = MainTabViewController()
UIView.animate(withDuration: 0.4, animations: {
UIApplication.shared.keyWindow?.alpha = 1
})
}
})
6. 使用方法
let label = UILabel()
// "title" 是前面 "Hello!"的變量名
label.text = "title".localized()