iOS多語(yǔ)言本地化流程的優(yōu)化方案
前言
多語(yǔ)言本地化,是我們?cè)谧鯥OS項(xiàng)目的時(shí)候經(jīng)常用的,下面根據(jù)自己的經(jīng)驗(yàn)和使用場(chǎng)景,來(lái)全面的說(shuō)說(shuō)多語(yǔ)言本地化的解決方案。本文從提升效率和減少錯(cuò)誤兩方面對(duì)傳統(tǒng)的多語(yǔ)言本地化方式進(jìn)行了優(yōu)化,雖然標(biāo)題是iOS,但其實(shí)macOS也通用。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
傳統(tǒng)的方法
在 Localizable.strings 中寫入多種語(yǔ)言的版本,然后使用 NSLocalizedString 進(jìn)行本地化:
# 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")
這有什么問(wèn)題呢?
繁瑣!每次都要寫 NSLocalizedString(“xxx”, comment: “xxx”)
,雖然有代碼補(bǔ)全,但依然很費(fèi)時(shí)。
提升點(diǎn)效率
直接上代碼:
extension String { var localized: String { return NSLocalizedString(self, comment: self) } }
于是現(xiàn)在的使用方式就變成了:
loginButton.title = "login".localized logoutButton.title = "logout".localized
這樣代碼簡(jiǎn)潔多了,也保留了代碼的自解釋。
但,依然還有問(wèn)題,如果我不小心寫成了:
loginButton.title = "login".localized logoutButton.title = "loguot".localized
編譯不會(huì)報(bào)錯(cuò),但logoutButton的title卻出不來(lái)(注意 “l(fā)oguot”.localized
),寫錯(cuò)一個(gè)字母,抓bug抓好長(zhǎng)時(shí)間的經(jīng)歷相信很多人都遇到過(guò)吧。
這里涉及到編碼中的一個(gè)小技巧:不要徒手寫同一個(gè)需要多次使用的字符串,盡量定義成常量進(jìn)行調(diào)用。
減少些錯(cuò)誤
還是直接上代碼:
extension String { static var localized_login: String { return "login".localized } static var localized_logout: String { return "logout".localized } }
現(xiàn)在用起來(lái)就更爽了:
loginButton.title = .localized_login logoutButton.title = .localized_logout
得益于Xcode代碼提示補(bǔ)全的功能,我只需輸入”.” “l(fā)ogin” 回車,基本就就可以完成輸入: localized_login.png
乍一看,已經(jīng)將寫字符串時(shí)出錯(cuò)的概率降到最低了,但這樣又要多寫一堆代碼,豈不是把之前好不容易提升起來(lái)的效率又降低了,再加上萬(wàn)一,我們?cè)趯?localized_logout 時(shí)還是寫成了 “l(fā)oguot”.localized
,這不是”辛辛苦苦大半年,一朝回到解放前”的節(jié)奏?
自動(dòng)化萬(wàn)歲
思路:使用腳本讀取 Localizable.strings
,然后輸出成我們需要的常量格式。
Build Phases中新建一個(gè) Run Script,填入以下腳本:
# Localizable.strings文件路徑 localizableFile="${SRCROOT}/${PROJECT_NAME}/Support/en.lproj/Localizable.strings" # 生成的swift文件路徑(根據(jù)個(gè)人習(xí)慣修改) localizedFile="${SRCROOT}/${PROJECT_NAME}/Source/Utils/LocalizedUtils.swift" touch $localizedFile # 將localizable.strings中的文本轉(zhuǎn)為swift格式的常量,存入一個(gè)臨時(shí)文件 sed "s/\" = \".*$/;/g" ${localizableFile} | sed "s/.*/& &/" | sed "s/^\"/ static var localized_/g" | 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}" # 再將臨時(shí)文件中的常量增量輸出到目標(biāo)文件 cat "${localizedFile}.tmp" >> "${localizedFile}" # 最后增量輸出一個(gè)"}"到目標(biāo)文件,完成輸出 echo -e "\n}" >> "${localizedFile}" # 刪除臨時(shí)文件 rm "${localizedFile}.tmp"
以上腳本的作用就是將localizable.strings
中的內(nèi)容轉(zhuǎn)換成swift的常量形式,并作為String的extension存儲(chǔ)起來(lái),具體步驟看注釋。
其中有幾點(diǎn)需要注意:
- 第一次運(yùn)行記得將
LocalizableUtils.swift
加入到Xcode項(xiàng)目中 - sed的用法中,^… 表示以…開頭,…$ 表示以…結(jié)尾 [參考鏈接]。
- > 表示覆蓋輸出到文件,>> 表示增量輸出到文件。
- echo -e 表示將\n作為換行符輸出(其他轉(zhuǎn)義字符同效)。
- 將 Run Script 放在 Compile Sources 的上面,這樣可以在編譯代碼前執(zhí)行,如果出現(xiàn)錯(cuò)誤也很容易定位(例如
Localizable.strings
中行末忘記寫分號(hào))。
腳本效果:
本地化文件:
# en.lproj/Localizable.strings "login" = "Login"; "logout" = "Logout";
輸出文件:
# 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 } }
至此,我們只要在寫好Localizable.strings
或有修改時(shí) ⌘+B build一下,就能愉快的使用了。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS對(duì)象指針和基礎(chǔ)數(shù)據(jù)類型的強(qiáng)轉(zhuǎn)詳解
最近在做一些小功能,忽然發(fā)現(xiàn)有的基礎(chǔ)數(shù)據(jù)轉(zhuǎn)換居然都忘記了。于是想著要趕緊整理下記下來(lái)!本文就是記錄的一些內(nèi)容,主要介紹了iOS中對(duì)象指針和基礎(chǔ)數(shù)據(jù)類型的強(qiáng)轉(zhuǎn),有需要的朋友們可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05iOS中UIView實(shí)現(xiàn)不同方向的導(dǎo)角
這篇文章主要給大家介紹了關(guān)于iOS中UIView實(shí)現(xiàn)不同方向的導(dǎo)角的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05iOS開發(fā)中不合法的網(wǎng)絡(luò)請(qǐng)求地址如何解決
這篇文章主要介紹了iOS開發(fā)中不合法的網(wǎng)絡(luò)請(qǐng)求地址的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09iOS輸入框的字?jǐn)?shù)統(tǒng)計(jì)/最大長(zhǎng)度限制詳解
在開發(fā)中經(jīng)常會(huì)遇到鍵盤輸入的字符長(zhǎng)度的限制,下面這篇文章主要給大家介紹了關(guān)于iOS輸入框的字?jǐn)?shù)統(tǒng)計(jì)/最大長(zhǎng)度限制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06剖析iOS開發(fā)中Cocos2d-x的內(nèi)存管理相關(guān)操作
這篇文章主要介紹了剖析iOS開發(fā)中Cocos2d-x的內(nèi)存管理相關(guān)操作,Cocos2d-x是開發(fā)游戲的利器,需要的朋友可以參考下2015-10-10關(guān)于iOS 11下app圖標(biāo)變空白問(wèn)題的解決方法
升級(jí)到iOS11系統(tǒng)下自己的項(xiàng)目桌面app圖標(biāo)不見了,通過(guò)查找相關(guān)的資料終于找到了解決方法,下面這篇文章主要給大家介紹了關(guān)于iOS 11下app圖標(biāo)變空白問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12