iOS多語言本地化流程的優(yōu)化方案

前言

目前創(chuàng)新互聯(lián)已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、合肥網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

多語言本地化,是我們?cè)谧鯥OS項(xiàng)目的時(shí)候經(jīng)常用的,下面根據(jù)自己的經(jīng)驗(yàn)和使用場景,來全面的說說多語言本地化的解決方案。本文從提升效率和減少錯(cuò)誤兩方面對(duì)傳統(tǒng)的多語言本地化方式進(jìn)行了優(yōu)化,雖然標(biāo)題是iOS,但其實(shí)macOS也通用。下面話不多說了,來一起看看詳細(xì)的介紹吧。

傳統(tǒng)的方法

在 Localizable.strings 中寫入多種語言的版本,然后使用 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")

這有什么問題呢?

繁瑣!每次都要寫 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

這樣代碼簡潔多了,也保留了代碼的自解釋。

但,依然還有問題,如果我不小心寫成了:

loginButton.title = "login".localized
logoutButton.title = "loguot".localized

編譯不會(huì)報(bào)錯(cuò),但logoutButton的title卻出不來(注意 “l(fā)oguot”.localized),寫錯(cuò)一個(gè)字母,抓bug抓好長時(shí)間的經(jīng)歷相信很多人都遇到過吧。

這里涉及到編碼中的一個(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)在用起來就更爽了:

loginButton.title = .localized_login
logoutButton.title = .localized_logout

得益于Xcode代碼提示補(bǔ)全的功能,我只需輸入”.” “l(fā)ogin” 回車,基本就就可以完成輸入: localized_login.png

乍一看,已經(jīng)將寫字符串時(shí)出錯(cuò)的概率降到最低了,但這樣又要多寫一堆代碼,豈不是把之前好不容易提升起來的效率又降低了,再加上萬一,我們?cè)趯?localized_logout 時(shí)還是寫成了 “l(fā)oguot”.localized ,這不是”辛辛苦苦大半年,一朝回到解放前”的節(jié)奏?

自動(dòng)化萬歲

思路:使用腳本讀取 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ǔ)起來,具體步驟看注釋。

其中有幾點(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))。

iOS多語言本地化流程的優(yōu)化方案

腳本效果:

本地化文件:

# 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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)站名稱:iOS多語言本地化流程的優(yōu)化方案
網(wǎng)頁鏈接:http://bm7419.com/article26/ijhpcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)頁設(shè)計(jì)公司、企業(yè)建站、動(dòng)態(tài)網(wǎng)站、全網(wǎng)營銷推廣、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司