國際化的核心在于
[[NSBundle bundleWithPath:lPath] localizedStringForKey:key value:nil table:@"Localizable"] 這個方法以及Localizable.strings文件殉簸。我們在切換語言時渠脉,僅僅是在本地偏好中保存了一個字符串,en或者zh-Hans卷玉,而最終顯示的內(nèi)容要依賴于我們在Localizable.strings文件中寫的內(nèi)容侧戴,以及NSBundle加載哪個路徑的strings文件宁昭。
參考:國際化優(yōu)化
自動化核心效果如下:
# en.lproj/Localizable.strings
"login" = "Login";
"logout" = "Logout";
# zh-Hans.lproj/Localizable.strings
"login" = "登錄";
"logout" = "退出";
# usage
loginButton.title = NSLocalizedString("login", comment: "login")
logoutButton.title = NSLocalizedString("logout", comment: "logout")
#Final
# LocalizedUtils.swift
import Foundation
extension String {
var localized: String { return NSLocalizedString(self, comment: self) }
static var localized_login: String { return "login".localized }
static var localized_logout: String { return "logout".localized }
}
主要腳本:
- key 不要空格最好用下劃線分割,最好全小寫酗宋,安卓不能大寫积仗。
- sed的用法中,^… 表示以…開頭蜕猫,…$ 表示以…結(jié)尾 [參考鏈接]寂曹。
- ">" 表示覆蓋輸出到文件,">>" 表示增量輸出到文件回右。
- echo -e 表示將\n作為換行符輸出(其他轉(zhuǎn)義字符同效)隆圆。
- 將 Run Script 放在 Compile Sources 的上面,這樣可以在編譯代碼前執(zhí)行翔烁,如果出現(xiàn)錯誤也很容易定位(例如Localizable.strings中行末忘記寫分號)渺氧。
# Localizable.strings文件路徑
localizableFile="${SRCROOT}/${PROJECT_NAME}/Support/en.lproj/Localizable.strings"
# 生成的swift文件路徑(根據(jù)個人習(xí)慣修改)
localizedFile="${SRCROOT}/${PROJECT_NAME}/Source/Utils/LocalizedUtils.swift"
# 將localizable.strings中的文本轉(zhuǎn)為swift格式的常量,存入一個臨時文件
sed "s/^\"/ static var localized_/g" "${localizableFile}" | sed "s/\" = \"/: String { return \"/g" | sed "s/;$/.localized }/g" > "${localizedFile}.tmp"
# 先將localized作為計(jì)算屬性輸出到目標(biāo)文件
echo -e "import Foundation\n\nextension String {\n var localized: String { return NSLocalizedString(self, comment: self) }" > "${localizedFile}"
# 再將臨時文件中的常量增量輸出到目標(biāo)文件
cat "${localizedFile}.tmp" >> "${localizedFile}"
# 最后增量輸出一個"}"到目標(biāo)文件租漂,完成輸出
echo -e "\n}" >> "${localizedFile}"
# 刪除臨時文件
rm "${localizedFile}.tmp"
正式進(jìn)入APP內(nèi)切換:
let systemDefaultLanguage = UserDefaults.standard.object(forKey: "AppleLanguages")
Change language workflows
第一種:在原國際化的基礎(chǔ)上在,通過保存設(shè)置UserLanguage的值去切換語言阶女,并且得重新初始化app keyWindow的根控制器,會有個跳轉(zhuǎn)的過程哩治,可以改變keyWindow的透明度家loading秃踩,用戶體驗(yàn)可能不太好。
第二種:保存設(shè)置UserLanguage的值后去發(fā)送通知切換語言业筏,缺點(diǎn)是每個根控制器都得去注冊通知憔杨。