最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年01月14日 15:43:43   作者:AntScript  
這篇文章主要給大家介紹了關(guān)于iOS多語言本地化流程的優(yōu)化的相關(guān)資料,多語言本地化是我們大家在開發(fā)中經(jīng)常會遇到的一個功能,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。

前言

多語言本地化,是我們在做IOS項目的時候經(jīng)常用的,下面根據(jù)自己的經(jīng)驗和使用場景,來全面的說說多語言本地化的解決方案。本文從提升效率和減少錯誤兩方面對傳統(tǒng)的多語言本地化方式進(jìn)行了優(yōu)化,雖然標(biāo)題是iOS,但其實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”) ,雖然有代碼補全,但依然很費時。

提升點效率

直接上代碼:

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

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

這里涉及到編碼中的一個小技巧:不要徒手寫同一個需要多次使用的字符串,盡量定義成常量進(jìn)行調(diào)用。

減少些錯誤

還是直接上代碼:

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代碼提示補全的功能,我只需輸入”.” “l(fā)ogin” 回車,基本就就可以完成輸入: localized_login.png

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

自動化萬歲

思路:使用腳本讀取 Localizable.strings ,然后輸出成我們需要的常量格式。

Build Phases中新建一個 Run Script,填入以下腳本:

# Localizable.strings文件路徑
localizableFile="${SRCROOT}/${PROJECT_NAME}/Support/en.lproj/Localizable.strings"

# 生成的swift文件路徑(根據(jù)個人習(xí)慣修改)
localizedFile="${SRCROOT}/${PROJECT_NAME}/Source/Utils/LocalizedUtils.swift"

touch $localizedFile

# 將localizable.strings中的文本轉(zhuǎn)為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作為計算屬性輸出到目標(biāo)文件
echo -e "import Foundation\n\nextension String {\n var localized: String { return NSLocalizedString(self, comment: self) }" > "${localizedFile}"

# 再將臨時文件中的常量增量輸出到目標(biāo)文件
cat "${localizedFile}.tmp" >> "${localizedFile}"

# 最后增量輸出一個"}"到目標(biāo)文件,完成輸出
echo -e "\n}" >> "${localizedFile}"

# 刪除臨時文件
rm "${localizedFile}.tmp"

以上腳本的作用就是將localizable.strings中的內(nèi)容轉(zhuǎn)換成swift的常量形式,并作為String的extension存儲起來,具體步驟看注釋。

其中有幾點需要注意:

  • 第一次運行記得將LocalizableUtils.swift加入到Xcode項目中
  • sed的用法中,^… 表示以…開頭,…$ 表示以…結(jié)尾 [參考鏈接]。
  • > 表示覆蓋輸出到文件,>> 表示增量輸出到文件。
  • echo -e 表示將\n作為換行符輸出(其他轉(zhuǎn)義字符同效)。
  • 將 Run Script 放在 Compile Sources 的上面,這樣可以在編譯代碼前執(zhí)行,如果出現(xiàn)錯誤也很容易定位(例如Localizable.strings中行末忘記寫分號)。

腳本效果:

本地化文件:

# 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一下,就能愉快的使用了。

總結(jié)

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

相關(guān)文章

  • iOS tableview實現(xiàn)簡單搜索功能

    iOS tableview實現(xiàn)簡單搜索功能

    這篇文章主要為大家詳細(xì)介紹了iOS tableview實現(xiàn)簡單搜索功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • iOS實現(xiàn)自定義起始時間選擇器視圖

    iOS實現(xiàn)自定義起始時間選擇器視圖

    本篇文章主要介紹了iOS實現(xiàn)自定義起始時間選擇器視圖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 30分鐘快速帶你理解iOS中的謂詞NSPredicate

    30分鐘快速帶你理解iOS中的謂詞NSPredicate

    NSPredicate類是用來定義邏輯條件約束的獲取或內(nèi)存中的過濾搜索。下面這篇文章將通過30分鐘快速帶大家理解iOS中的謂詞NSPredicate類,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • IOS 聊天界面(自適應(yīng)文字)的實現(xiàn)

    IOS 聊天界面(自適應(yīng)文字)的實現(xiàn)

    本文主要介紹一個實現(xiàn)聊天界面的思路過程,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • iOS瀑布流的簡單實現(xiàn)(Swift)

    iOS瀑布流的簡單實現(xiàn)(Swift)

    這篇文章主要介紹了iOS瀑布流的簡單實現(xiàn),說到瀑布流, 或許大家都不陌生, 瀑布流的實現(xiàn)也有很多種! 本文使用兩種方法介紹,有興趣的可以了解一下。
    2016-11-11
  • iOS App使用GCD導(dǎo)致的卡頓現(xiàn)象及解決方法

    iOS App使用GCD導(dǎo)致的卡頓現(xiàn)象及解決方法

    這篇文章主要給大家介紹了關(guān)于iOS App使用GCD導(dǎo)致的卡頓現(xiàn)象及解決方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式

    詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式

    這篇文章主要介紹了詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式,文中示例基于Objective-C語言,需要的朋友可以參考下
    2016-02-02
  • iOS添加購物車動畫效果示例

    iOS添加購物車動畫效果示例

    本篇文章主要介紹了iOS 購物車動畫效果示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • iOS應(yīng)用腳本重簽名的實現(xiàn)方法

    iOS應(yīng)用腳本重簽名的實現(xiàn)方法

    這篇文章主要介紹了iOS應(yīng)用腳本重簽名的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Observing?KVO?Key-Value基本使用原理示例詳解

    Observing?KVO?Key-Value基本使用原理示例詳解

    這篇文章主要為大家介紹了Observing?KVO?Key-Value基本使用原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論

垣曲县| 曲阳县| 南乐县| 大兴区| 安溪县| 永善县| 禄丰县| 迭部县| 库伦旗| 兴城市| 汕头市| 洛南县| 清苑县| 昌黎县| 密云县| 西贡区| 肃宁县| 宁阳县| 华坪县| 黄冈市| 策勒县| 牡丹江市| 诸城市| 漳平市| 阿图什市| 兰溪市| 五莲县| 莆田市| 新津县| 宜宾县| 惠州市| 阳江市| 昌图县| 招远市| 绥中县| 西安市| 神木县| 达日县| 禹城市| 永平县| 松原市|