前言
多語言本地化,是我們在做IOS項目的時候經常用的,下面根據自己的經驗和使用場景,來全面的說說多語言本地化的解決方案。本文從提升效率和減少錯誤兩方面對傳統的多語言本地化方式進行了優化,雖然標題是iOS,但其實macOS也通用。下面話不多說了,來一起看看詳細的介紹吧。
在 Localizable.strings 中寫入多種語言的版本,然后使用 NSLocalizedString 進行本地化:
# en.lproj/Localizable.strings"login" = "Login";"logout" = "Logout";# zh-Hans.lproj/Localizable.strings"login" = "登錄";"logout" = "退出";# usageloginButton.title = NSLocalizedString("login", comment: "login")logoutButton.title = NSLocalizedString("logout", comment: "logout")
這有什么問題呢?
繁瑣!每次都要寫 NSLocalizedString(“xxx”, comment: “xxx”)
,雖然有代碼補全,但依然很費時。
直接上代碼:
extension String { var localized: String { return NSLocalizedString(self, comment: self) }}
于是現在的使用方式就變成了:
loginButton.title = "login".localizedlogoutButton.title = "logout".localized
這樣代碼簡潔多了,也保留了代碼的自解釋。
但,依然還有問題,如果我不小心寫成了:
loginButton.title = "login".localizedlogoutButton.title = "loguot".localized
編譯不會報錯,但logoutButton的title卻出不來(注意 “loguot”.localized
),寫錯一個字母,抓bug抓好長時間的經歷相信很多人都遇到過吧。
這里涉及到編碼中的一個小技巧:不要徒手寫同一個需要多次使用的字符串,盡量定義成常量進行調用。
還是直接上代碼:
extension String { static var localized_login: String { return "login".localized } static var localized_logout: String { return "logout".localized }}
現在用起來就更爽了:
loginButton.title = .localized_loginlogoutButton.title = .localized_logout
得益于Xcode代碼提示補全的功能,我只需輸入”.” “login” 回車,基本就就可以完成輸入: localized_login.png
乍一看,已經將寫字符串時出錯的概率降到最低了,但這樣又要多寫一堆代碼,豈不是把之前好不容易提升起來的效率又降低了,再加上萬一,我們在寫 localized_logout 時還是寫成了 “loguot”.localized
,這不是”辛辛苦苦大半年,一朝回到解放前”的節奏?
思路:使用腳本讀取 Localizable.strings
,然后輸出成我們需要的常量格式。
Build Phases中新建一個 Run Script,填入以下腳本:
# Localizable.strings文件路徑localizableFile="${SRCROOT}/${PROJECT_NAME}/Support/en.lproj/Localizable.strings"# 生成的swift文件路徑(根據個人習慣修改)localizedFile="${SRCROOT}/${PROJECT_NAME}/Source/Utils/LocalizedUtils.swift"touch $localizedFile# 將localizable.strings中的文本轉為swift格式的常量,存入一個臨時文件sed "s//" = /".*$/;/g" ${localizableFile} | sed "s/.*/& &/" | sed "s/^/"/ static var localized_/g" | sed "s/; /"/: String { return /"/g" | sed "s/;//".localized }/g" > "${localizedFile}.tmp"# 先將localized作為計算屬性輸出到目標文件echo -e "import Foundation/n/nextension String {/n var localized: String { return NSLocalizedString(self, comment: self) }" > "${localizedFile}"# 再將臨時文件中的常量增量輸出到目標文件cat "${localizedFile}.tmp" >> "${localizedFile}"# 最后增量輸出一個"}"到目標文件,完成輸出echo -e "/n}" >> "${localizedFile}"# 刪除臨時文件rm "${localizedFile}.tmp"
以上腳本的作用就是將localizable.strings
中的內容轉換成swift的常量形式,并作為String的extension存儲起來,具體步驟看注釋。
其中有幾點需要注意:
LocalizableUtils.swift
加入到Xcode項目中Localizable.strings
中行末忘記寫分號)。
腳本效果:
本地化文件:
# en.lproj/Localizable.strings"login" = "Login";"logout" = "Logout";
輸出文件:
# LocalizedUtils.swiftimport Foundationextension 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 }}
至此,我們只要在寫好Localizable.strings
或有修改時 ?+B build一下,就能愉快的使用了。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答