亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2019-10-21 18:42:14
字體:
來源:轉載
供稿:網友

前言

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

ios,多語言本地化,macos本地化語言包,ios開發語言本地化

腳本效果:

本地化文件:

# 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武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区二区三区久久久狼| 国产成人黄色av| 国产精品视频99| 久久久久久久久久av| 国产成人在线亚洲欧美| 麻豆一区二区在线观看| 亚洲午夜未满十八勿入免费观看全集| 久久精品99久久香蕉国产色戒| 亚洲精品小视频| 伦伦影院午夜日韩欧美限制| 欧美激情网站在线观看| 欧美国产日韩一区二区在线观看| 成人综合国产精品| 久久久噜噜噜久噜久久| 欧美视频在线免费| 国产精品久久婷婷六月丁香| 日韩av免费看| 成人黄色短视频在线观看| 另类专区欧美制服同性| 国内免费久久久久久久久久久| 一区二区三区久久精品| 高跟丝袜一区二区三区| 久久精品视频网站| 久久久久女教师免费一区| 91精品久久久久久久久不口人| 欧美日韩中文字幕综合视频| 91精品国产成人| 欧美性xxxx极品hd欧美风情| 日韩精品免费在线视频| 亚洲区bt下载| 精品视频偷偷看在线观看| 国产噜噜噜噜噜久久久久久久久| 日韩av成人在线观看| 欧美成aaa人片在线观看蜜臀| 久久精品久久久久| 久久精品国产成人精品| 国产成人高清激情视频在线观看| 久久久999精品视频| 欧美日韩亚洲高清| 午夜精品一区二区三区视频免费看| 亚洲色图17p| 91在线直播亚洲| 亚洲视频在线免费看| 91国内在线视频| 国产精品看片资源| 欧美亚洲在线视频| 国产小视频国产精品| 伊人一区二区三区久久精品| 欧美www在线| 欧美成人精品在线观看| 成人网中文字幕| 国产极品jizzhd欧美| 91精品国产91久久久久久最新| 日韩精品亚洲元码| 亚洲国产高清福利视频| 欧洲s码亚洲m码精品一区| 中文字幕国产精品久久| 亚洲精品第一国产综合精品| 九九久久久久久久久激情| 成人精品一区二区三区电影免费| 91福利视频网| 蜜臀久久99精品久久久无需会员| 91久久久亚洲精品| 国产亚洲xxx| 亚洲无限乱码一二三四麻| 亚洲国产成人久久| 国产一区二中文字幕在线看| 欧美大全免费观看电视剧大泉洋| 成人国产在线视频| 国产成人一区二区三区电影| 91色视频在线观看| 国产亚洲精品一区二区| 国产99久久精品一区二区 夜夜躁日日躁| 伊人伊成久久人综合网小说| 亚洲成人av在线播放| 欧美性猛交视频| 91产国在线观看动作片喷水| 92裸体在线视频网站| 国产精品揄拍500视频| 日日摸夜夜添一区| 国产亚洲精品久久久久动| 日韩亚洲欧美中文高清在线| 78m国产成人精品视频| 久久久久久这里只有精品| 中文字幕欧美日韩在线| 亚洲精品99999| 精品久久久一区二区| 国产一区二区三区在线观看视频| 成人国产在线激情| www亚洲欧美| 欧美人与性动交a欧美精品| 国产91精品在线播放| 国产一区二区三区三区在线观看| 国产精品稀缺呦系列在线| 日韩精品视频免费在线观看| 国产成人精品国内自产拍免费看| 日韩av中文字幕在线免费观看| 亚洲国产精品va在线| 成人在线视频网| 最近2019免费中文字幕视频三| 亚洲高清在线观看| 亚洲精品电影久久久| 日韩暖暖在线视频| 性夜试看影院91社区| 亚洲深夜福利网站| 国产91久久婷婷一区二区| 精品偷拍各种wc美女嘘嘘| 91精品视频播放| 亚洲网站在线播放| 91日本在线观看| 精品亚洲男同gayvideo网站| 久久免费视频这里只有精品| 2019国产精品自在线拍国产不卡| 国产综合在线视频| 亚洲一区二区福利| 亚洲欧美资源在线| 主播福利视频一区| 欧美日韩亚洲一区二区三区| 最近中文字幕mv在线一区二区三区四区| 日韩av综合网站| 一本大道久久加勒比香蕉| 欧美色道久久88综合亚洲精品| 欧美精品生活片| 欧美在线一区二区视频| 日韩视频―中文字幕| 亚洲精品国产欧美| 日韩视频在线免费观看| 久久久久久久久久婷婷| 亚洲高清一区二| 日韩电影中文字幕在线| 日韩美女免费线视频| 2019国产精品自在线拍国产不卡| 亚洲欧洲av一区二区| 91精品国产沙发| 91人成网站www| 国产精品免费小视频| 久久精品久久久久| 国产成人福利视频| 91精品国产777在线观看| 亚洲图中文字幕| 久久精品国产精品亚洲| 自拍视频国产精品| 日韩在线视频网站| 国自产精品手机在线观看视频| 91久久久精品| 久久噜噜噜精品国产亚洲综合| 国产999精品| 亚洲剧情一区二区| 美女黄色丝袜一区| 欧美激情videos| 97欧美精品一区二区三区| 亚洲欧洲在线观看| 亚洲国产精品女人久久久| 久久精品视频亚洲| 草民午夜欧美限制a级福利片| 免费99精品国产自在在线| 国产日韩欧美中文| 亚洲电影成人av99爱色| 国产自摸综合网| 日韩大陆欧美高清视频区| 国产免费一区视频观看免费| 久久天堂电影网| 亚洲精品乱码久久久久久按摩观| 国产精品va在线播放我和闺蜜|