中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS多語言本地化流程的優化方案

發布時間:2020-10-14 13:15:15 來源:腳本之家 閱讀:131 作者:AntScript 欄目:移動開發

前言

多語言本地化,是我們在做IOS項目的時候經常用的,下面根據自己的經驗和使用場景,來全面的說說多語言本地化的解決方案。本文從提升效率和減少錯誤兩方面對傳統的多語言本地化方式進行了優化,雖然標題是iOS,但其實macOS也通用。下面話不多說了,來一起看看詳細的介紹吧。

傳統的方法

在 Localizable.strings 中寫入多種語言的版本,然后使用 NSLocalizedString 進行本地化:

# 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”) ,雖然有代碼補全,但依然很費時。

提升點效率

直接上代碼:

extension String {
 var localized: String {
 return NSLocalizedString(self, comment: self)
 }
}

于是現在的使用方式就變成了:

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

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

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

loginButton.title = "login".localized
logoutButton.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_login
logoutButton.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項目中
  • sed的用法中,^… 表示以…開頭,…$ 表示以…結尾 [參考鏈接]。
  • > 表示覆蓋輸出到文件,>> 表示增量輸出到文件。
  • echo -e 表示將\n作為換行符輸出(其他轉義字符同效)。
  • 將 Run Script 放在 Compile Sources 的上面,這樣可以在編譯代碼前執行,如果出現錯誤也很容易定位(例如Localizable.strings中行末忘記寫分號)。

iOS多語言本地化流程的優化方案

腳本效果:

本地化文件:

# 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或有修改時 ⌘+B build一下,就能愉快的使用了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沧州市| 睢宁县| 西藏| 天长市| 宿州市| 黔南| 本溪| 邵阳县| 共和县| 会宁县| 健康| 来宾市| 玉门市| 湾仔区| 巩留县| 石嘴山市| 商丘市| 和林格尔县| 青铜峡市| 福清市| 韶山市| 长寿区| 海晏县| 东莞市| 资溪县| 清水河县| 福清市| 永胜县| 从江县| 齐河县| 科技| 滨州市| 昭觉县| 林芝县| 新宁县| 商城县| 会宁县| 太康县| 三门峡市| 祁东县| 开江县|