精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現(xiàn)模塊化應(yīng)用的本地化

移動開發(fā) iOS
讓我們看看代碼庫的一個簡化版本。它包含一個 Xcode 項目,一個單獨的 app target(即將運行的那個)和一個名為 Features 的 Swift 包。后者將包含 app 中所有頁面的代碼,每一頁將被定義為自己的產(chǎn)品。

前言

我已經(jīng)有一段時間沒有從頭開始一個需要支持多種語言的新項目了。當(dāng)然不是從頭開始,而是在代碼庫中通過使用 Swift 包將代碼分成不同模塊。

我想提醒自己記住許多在本地化實行中的過程,所以我認為最好寫一篇文章,以便下次開始同類型項目時可以參考。

開始吧!

讓我們看看代碼庫的一個簡化版本。它包含一個 Xcode 項目,一個單獨的 app target(即將運行的那個)和一個名為 Features 的 Swift 包。后者將包含 app 中所有頁面的代碼,每一頁將被定義為自己的產(chǎn)品:

Package.swift

// swift-tools-version: 5.6
import PackageDescription

let package = Package(
name: "Features",
products: [
.library(
name: "Home",
targets: ["Home"]),
.library(
name: "Detail",
targets: ["Detail"]
)
],
dependencies: [
],
targets: [
.target(
name: "Home"
),
.target(
name: "Detail"
)
]
)

這個 app target 將會作為 app 的組合層,其唯一的目的是導(dǎo)入每個功能,實例化它們并協(xié)調(diào)導(dǎo)航。所有的 UI ,演示和業(yè)務(wù)邏輯將留在各自的 "模塊" 中( Features Swift Package 中的一個 target)。這將允許每個功能獨立開發(fā)并完全的與其他功能隔離。

為了簡單起見,這個例子里僅有兩個功能:主頁和詳情,他們代表 app 中僅有的兩個頁面。

主頁有一個按鈕允許用戶導(dǎo)航到詳情頁面,還有一個標(biāo)簽展示用戶當(dāng)前所在區(qū)域的語言代碼。詳情頁只展示一個標(biāo)簽,和主頁標(biāo)簽展示的信息一致:

圖片

添加字符串!

看起來不錯,但是現(xiàn)在展示的信息是用英文通過硬編碼編寫的字符串。app 需要內(nèi)容被翻譯成另外兩種語言:加泰羅尼亞語和西班牙語。

雖然有多種實現(xiàn)方式,我更傾向每個功能(或頁面)只包含它所需要的本地化字符串,這樣可以增加功能的可移植性和可重用性。

這可以在 Swift 包中完成,通過將所有必需的 .lproj 文件和所有需要本地化的內(nèi)容(當(dāng)前例子中只有 Localizable.strings 文件)放在目標(biāo)文件夾下 - 我的習(xí)慣是放在父 Resources/ 文件夾下,并將這些資源定義為 Package.swift 的特定 target。

添加文件之后構(gòu)建該功能將導(dǎo)致編譯器拋出如下錯誤:

圖片

這是因為 defaultLocalization 必須由 Package.swift 提供。所有功能的 target 來自一個包,所以只能有一個 defaultLocalization 。以下是 Package.swift 添加本地化內(nèi)容之后的樣子:

Package.swift

// swift-tools-version: 5.6
import PackageDescription
let package = Package(
name: "Features",
defaultLocalization: "en",
platforms: [.iOS(.v15)],
products: [
.library(
name: "Home",
targets: ["Home"]),
.library(
name: "Detail",
targets: ["Detail"]
)
],
dependencies: [
],
targets: [
.target(
name: "Home",
dependencies: [],
resources: [.process("Resources/")]
),
.target(
name: "Detail",
resources: [.process("Resources/")]
)
]
)

注意:如果沒有為默認的本地化代碼提供本地化的內(nèi)容,編譯器會顯示警告。這對于確保你不會發(fā)布包含基本本地化內(nèi)容的軟件包版本非常有幫助。

圖片

Xcode warning shown when default localisation is missing。

支持本地化

可能與你的想法正好相反,把設(shè)備系統(tǒng)語言設(shè)置為加泰羅尼亞語或西班牙語并且運行 app 內(nèi)容仍然用英文展示。原因是 Swift 包需要額外的信息去決定使用哪些本地化的內(nèi)容,就目前來看,如果包里有目標(biāo)內(nèi)容,它們將只使用目標(biāo)的基本本地化,否則使用包的默認本地化。

現(xiàn)在有兩種方式我們可以實現(xiàn)本地化:使新的本地化在 app target 中可用或啟用混合本地化。

在 app target 中添加新的本地化內(nèi)容

在 Features  Swift 包中啟用新的本地化的一種方式是將它們添加到導(dǎo)入功能的 Xcode 項目中。這可以通過進入 Xcode 項目,在項目設(shè)置中的 "Info" 一欄,添加本地化支持:

圖片

需要注意的是,本地化需要至少一個文件(例如一個空的 Localizable.strings 文件)。在本例中,因為 app target 是用 UIKit 構(gòu)建的,并且在添加新的本地化時選擇了啟動 storyboard 進行本地化(如上視頻所示),所以已經(jīng)有一個本地化文件。

現(xiàn)在這將允許包從主包中獲取支持的本地化,并選擇相應(yīng)的要使用的資源。

值得注意的是,如果設(shè)備有被 app 支持但是包不支持的語言,則后者將會回退到 Package.swift 中提供的 defaultLocalization .

同樣的,如果 app 不支持該語言,同樣會回退到相同的值。這也是為什么將 defaultLocalization 設(shè)置為與主目標(biāo)基礎(chǔ)語言相同,以確保所有頁面上的一致性是非常重要的。這也是我更傾向于所有功能分組在一個 Swift 包之下的原因,這樣所有頁面上的 defaultLocalization 就有了單一真正的來源。

允許混合本地化

雖然采用 app target 的本地化是首選方法,因為他確保了所有頁面的一致性,并且只允許少數(shù)受支持的地方使用,但還有另一種方法允許包內(nèi)容被本地化,而不必在主項目之外。

可以通過將 app 的 Info.plist 文件中的 CFBundleAllowMixedLocalizations 值設(shè)置為 YES 來實現(xiàn)。

這個設(shè)置將會告訴 app target 在不同的 target 或功能使用不同本地化是可以的,當(dāng)添加新的本地化資源時, app 本地化會自動工作。

圖片

Enabling mixed localisations in the app targe

使用這種方法需要注意以下幾點:

1.不再需要將本地化添加到 app target,添加帶有本地化內(nèi)容的 lproj 到包資源就可以了。當(dāng)用戶修改區(qū)域時,如果你的資源包存在該語言包或默認提供 Package.swift ,軟件包也會展示該區(qū)域的語言內(nèi)容。

2.支持多少個區(qū)域就會有多少個本地化資源。這意味著沒有一個單一的真實來源來確定整個 app 支持哪些本地化。這可能會導(dǎo)致一些問題,例如,某個功能有本地化資源內(nèi)容,而該內(nèi)容的本地化資源還未被應(yīng)用。在本例中,除了刪除資源,沒有辦法隱藏它。

視頻鏈接:https://www.polpiella.dev/assets/posts/modularised-app-localisation/mixed-localisations.mp4。

第二點如上面的視頻中所示,當(dāng)用戶把設(shè)備語言設(shè)置為法語。混合來源導(dǎo)致了不一致,因為主屏幕沒有 fr.lproj --因此它又回到了默認本地化資源,英語。另一方面,在詳情頁面,有可用的本地化內(nèi)容,這是正確翻譯字符串的原因,正是這個原因,我喜歡將 app target 作為所有支持本地化的真實來源。

額外提示 - 自動化

我一直鼓勵盡可能地自動化檢索特定包的本地化字符串的流程。如果你的 app 有很多頁面,希望使添加本地化字符串的過程盡可能簡單和簡便。

我一直在使用的一款工具 SwiftGen,它可以為各種資源生成 Swift 接口,例如 Localizable.strings 文件。

創(chuàng)建一個利用這個可執(zhí)行文件的構(gòu)建工具插件,可以使支持新本地化過程變得容易一點,并在各功能之間保持一致。

責(zé)任編輯:姜華 來源: Swift社區(qū)
相關(guān)推薦

2012-05-14 17:10:50

iOS

2012-05-13 13:15:54

IOS

2023-12-18 14:56:00

模塊化單體系統(tǒng)數(shù)據(jù)庫

2017-11-30 14:44:41

語言代碼文件

2011-05-25 10:13:09

WordPressJavaScript

2019-08-28 16:18:39

JavaScriptJS前端

2011-10-10 13:40:22

Distimo移動應(yīng)用本地化

2024-01-10 09:00:00

OpenAILocalGPT開源大模型

2010-08-02 09:10:36

Flex模塊化

2020-09-17 10:30:21

前端模塊化組件

2010-01-20 09:14:49

C語言模塊化

2020-09-18 09:02:32

前端模塊化

2012-06-08 10:48:31

商務(wù)社交

2011-05-30 17:11:08

測試策略

2011-07-04 10:56:42

諾基亞蘋果谷歌

2015-03-30 09:32:15

XcodeiOS應(yīng)用程序

2010-01-21 09:27:30

模塊化的優(yōu)點NetBeans

2022-09-05 09:01:13

前端模塊化

2016-10-09 11:03:41

Javascript模塊化Web

2011-05-26 17:28:48

軟件本地化測試
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲成a人v欧美综合天堂下载| 国产精品中文有码| 亚洲视频第一页| 中文字幕成人在线视频| 香蕉久久aⅴ一区二区三区| 成人av电影免费观看| 日韩av手机在线| 九九热最新地址| 欧洲亚洲成人| 56国语精品自产拍在线观看| 免费看毛片的网址| av资源网站在线观看| 国产成人激情av| 国产精品91在线观看| 欧美爱爱小视频| 欧美人与物videos另类xxxxx| 在线成人午夜影院| 国产综合免费视频| 黄色小说在线播放| 国产精品超碰97尤物18| 国产伦精品一区二区三区在线 | 欧美日韩国产综合一区二区 | 精品无人乱码一区二区三区| 一区二区三区自拍| 亚洲欧洲国产精品久久| 欧美一级淫片免费视频魅影视频| 蜜桃av噜噜一区| 欧美性在线观看| 欧美人与禽zozzo禽性配| 精品国精品国产自在久国产应用 | 91久久综合亚洲鲁鲁五月天| 天堂а√在线中文在线新版 | 伊人五月天婷婷| 日韩和的一区二在线| 亚欧色一区w666天堂| 视频一区二区视频| 91看片在线观看| 久久人人爽人人爽| 久久国产精品免费一区| www.久久精品.com| 国内久久婷婷综合| 国产欧美一区二区三区久久人妖| 黄色一级视频免费看| 亚洲国产午夜| 欧美激情一区二区三区久久久 | 欧美性猛交xxxx| 岛国大片在线播放| segui88久久综合9999| 亚洲美女在线国产| 青少年xxxxx性开放hg| jizzjizz在线观看| 中文久久乱码一区二区| 亚洲国产精品www| 电影av一区| 欧美国产亚洲另类动漫| 欧洲久久久久久| 精品乱码一区二区三四区视频 | 欧美黄色aaa| 午夜精品久久久久久久四虎美女版| 在线成人中文字幕| 成人精品一二三区| 99久久婷婷国产综合精品电影√| 中文字幕日韩有码| 久久久久99精品成人| 欧美成人直播| 欧美大片va欧美在线播放| 在线免费观看亚洲视频| 欧美啪啪一区| 8090成年在线看片午夜| 免费黄色av片| 久久狠狠亚洲综合| 亚洲影院色无极综合| 性一交一乱一乱一视频| 成人一区在线看| 久99久视频| lutube成人福利在线观看| 综合中文字幕亚洲| 日韩激情视频一区二区| 天堂8中文在线最新版在线| 日韩欧美一区二区三区久久| 久久综合久久色| 亚洲综合视频| 亚洲国产精品字幕| 国产一区二区三区精品在线| 久久中文字幕av| 欧美精品成人91久久久久久久| 色播视频在线播放| 日韩 欧美一区二区三区| 国产日韩换脸av一区在线观看| 国产又黄又粗又猛又爽| 成人国产亚洲欧美成人综合网| 欧美极品日韩| 日韩三级影院| 亚洲国产精品嫩草影院| 男人透女人免费视频| 伊人久久大香线蕉综合影院首页| 欧美一卡二卡三卡| 亚洲精品一区中文字幕乱码| 国产精品99久久久久久白浆小说| a片在线免费观看| 成人性生交大片免费看中文| 欧美不卡在线一区二区三区| 美女隐私在线观看| 天天av天天翘天天综合网 | 日本黑人久久| 福利在线视频网站| 色噜噜久久综合| 极品人妻一区二区| 欧美美乳视频| 97精品国产97久久久久久免费 | 精品少妇爆乳无码av无码专区| 久久裸体视频| 国产精品视频免费一区| 天天在线视频色| 欧美日韩免费在线观看| 国产九九九视频| 成人羞羞网站入口免费| 91精品国产高清久久久久久| 国产毛片毛片毛片毛片| 国产欧美综合在线观看第十页| 丁香婷婷综合激情| 日韩免费小视频| 日韩激情第一页| 国产亚洲第一页| 国产在线视频一区二区三区| 日韩免费av电影| 涩涩视频在线| 亚洲黄色在线看| 五月天综合在线| 国产精品系列在线观看| 一区二区三区偷拍| 精品免费av在线| 日韩电影大片中文字幕| 五月天综合在线| 懂色av中文一区二区三区| 久久99国产精品一区| 国产欧美自拍| 中文字幕亚洲欧美日韩在线不卡 | 国产乱妇乱子在线播视频播放网站| 欧美三级电影在线看| 久久久久久久久久久久| 9色国产精品| 国产欧美日韩在线播放| 女人黄色免费在线观看| 欧美www视频| 久久久国产精品黄毛片| 国产另类ts人妖一区二区| 一级黄色免费在线观看| 国色天香久久精品国产一区| 日韩视频在线免费| 国产精品自产拍| 伊人色综合久久天天| 杨幂一区二区国产精品| 欧美在线黄色| 国产一级二级三级精品| 少妇视频在线观看| 亚洲视频一区二区| 日韩乱码一区二区三区| 国产精品嫩草影院com| 精品久久久99| 国内自拍一区| 精品一区二区不卡| av在线日韩| xvideos亚洲人网站| 国产精品欧美激情在线| 亚洲天堂福利av| 蜜臀aⅴ国产精品久久久国产老师| 国产伊人精品| 国产在线精品日韩| 日本欧美日韩| 久久精品亚洲热| 成人毛片视频免费看| 疯狂欧美牲乱大交777| 中文字幕免费高清| 久久成人免费日本黄色| 日韩国产小视频| 天堂俺去俺来也www久久婷婷| 国产成人自拍视频在线观看| 久cao在线| 精品久久久久久久久久久久久久久 | 欧美精品123| 欧洲亚洲精品久久久久| 欧美极品少妇xxxxⅹ免费视频 | 亚洲成熟丰满熟妇高潮xxxxx| 成人3d动漫在线观看| 91久久在线观看| 欧美aa一级| 日韩在线高清视频| 欧美性猛交 xxxx| 日本大香伊一区二区三区| 日本黄色片免费观看| 9色porny自拍视频一区二区| 亚洲国产精品三区| 激情成人亚洲| 亚洲欧美国产精品桃花| 久久99精品国产自在现线| 国产精品女主播| 岛国片av在线| 日韩午夜在线视频| 三级av在线| 欧美一区二区三区四区五区 | 欧美亚洲精品日韩| 嫩呦国产一区二区三区av| 欧美一区二三区| 午夜伦理大片视频在线观看| 亚洲网站在线观看| 熟妇人妻中文av无码| 欧美猛男gaygay网站| 性无码专区无码| 一区二区三区精品在线观看| 欧美丰满老妇熟乱xxxxyyy| 粉嫩av亚洲一区二区图片| 亚洲最大成人在线观看| 国产一区二区三区的电影| 99re99热| 日本久久一二三四| 久久久av水蜜桃| 国产精品三p一区二区| 成人黄色中文字幕| 久久亚洲精品爱爱| 2019国产精品自在线拍国产不卡| 性欧美猛交videos| 自拍偷拍免费精品| 韩国三级av在线免费观看| 欧美精品一区二区不卡 | 国产精品亚洲人在线观看| 一级黄色特级片| 日韩主播视频在线| 四虎永久在线精品无码视频| 欧美午夜精品| 欧美性猛交内射兽交老熟妇| 香蕉综合视频| 亚洲欧洲国产日韩精品| 欧美欧美黄在线二区| 欧美日韩成人一区二区三区| 欧美一级二级三级视频| 国产综合 伊人色| 欧美黑人做爰爽爽爽| 国产综合欧美在线看| 久久99国产精品久久99大师| 国产亚洲精品自在久久| 国产精品调教视频| 国产精品一区二区a| 凹凸av导航大全精品| 91免费欧美精品| 国产一区二区三区亚洲综合 | 久久97精品| 久久免费视频1| 妖精视频一区二区三区| 欧美成人综合一区| 国产一区99| 亚欧洲精品在线视频免费观看| 欧美性感美女一区二区| 亚洲图片都市激情| 久久久久久美女精品| 日本一区二区三区四区五区六区| 综合日韩在线| 久青草视频在线播放| 亚洲精品字幕| 国内外免费激情视频| 国产亚洲综合精品| 国产精品99久久免费黑人人妻| 久热综合在线亚洲精品| 深夜黄色小视频| 国产成人自拍高清视频在线免费播放| 又色又爽又黄18网站| jiyouzz国产精品久久| 久久亚洲AV成人无码国产野外| 久久久久久免费毛片精品| 国产熟女一区二区| 日韩一区在线播放| 久久久香蕉视频| 一本一本久久a久久精品综合麻豆| 亚洲大尺度在线观看| 欧美狂野另类xxxxoooo| 亚洲国产中文字幕在线| 精品一区二区电影| 日韩美女网站| 97国产在线视频| 国产成人免费精品| 国产精品日韩一区二区| 欧美精美视频| 日本大片免费看| 日韩精品一卡二卡三卡四卡无卡| 91精品999| 91玉足脚交白嫩脚丫在线播放| 人妻熟人中文字幕一区二区| 夜夜精品浪潮av一区二区三区| 青草视频在线观看免费| 欧美精品色一区二区三区| 手机av在线免费观看| 在线播放国产一区中文字幕剧情欧美 | 国产女人18毛片水真多成人如厕 | 亚洲国产日产av| 欧美性受xxx黑人xyx性爽| 日韩欧美综合在线| 成人精品一区| 26uuu国产精品视频| 国产成人免费av一区二区午夜 | 蝌蚪视频在线播放| 欧美老女人xx| 精品视频在线一区二区在线| 国产精品国产三级欧美二区 | 超碰97久久国产精品牛牛| 视频一区二区精品| 日韩亚洲国产精品| 亚洲精品中文字幕乱码无线| 久久精品这里都是精品| 久久久久亚洲av成人片| 欧美剧在线免费观看网站 | 亚洲乱码国产一区三区| 成人在线视频首页| 一级免费黄色录像| 色欧美乱欧美15图片| 色屁屁草草影院ccyycom| 久久精品国产精品亚洲| 亚州一区二区三区| 国产在线视频欧美一区二区三区| 综合激情视频| 久久久精品高清| 国产欧美综合色| 久久精品视频5| 日韩的一区二区| a天堂资源在线| 97影院在线午夜| 伊人色**天天综合婷婷| 欧美日韩一区二区三区69堂| 久久精品一区二区三区四区| 日本网站在线播放| 亚洲成人av资源网| caoprom在线| 国产成人免费观看| 国模大胆一区二区三区| 日本少妇一区二区三区| 亚洲视频在线观看三级| 中文字幕永久在线观看| 一区二区三区在线播放欧美| 日韩性xxx| 欧美三级电影在线播放| 久久亚洲影院| 欧美 日韩 国产 成人 在线观看 | 国产精品入口免费软件| 国产亚洲精品福利| 无码任你躁久久久久久久| 亚洲欧美三级伦理| 经典三级一区二区| 香蕉久久免费影视| 久草热8精品视频在线观看| 貂蝉被到爽流白浆在线观看| 欧美三级电影在线观看| 91社区在线观看播放| 91香蕉嫩草影院入口| 欧美国产三区| 看全色黄大色黄女片18| 偷拍一区二区三区| 国产永久免费高清在线观看视频| 国产精品96久久久久久| 色综合久久网| 亚洲一二三av| 亚洲综合精品久久| 香蕉久久一区二区三区| 国产成人精品久久亚洲高清不卡| 精品国产不卡| 51自拍视频在线观看| 亚洲一区自拍偷拍| 日本一二三区在线视频| 国产精品久久久久免费a∨| 色综合咪咪久久网| 日本天堂在线播放| 欧美日韩亚洲一区二区三区| 国产精品无码2021在线观看| 成人黄色av网站| 国产综合激情| 老司机福利av| 欧美精品久久天天躁| 欧美黑人xx片| 欧美凹凸一区二区三区视频| 久久精品国产亚洲aⅴ| 免费在线看黄网址| 亚洲系列中文字幕| 欧美欧美在线| 日日摸天天爽天天爽视频| 亚洲丝袜自拍清纯另类| 日韩国产福利| 91老司机在线| 久久国产直播| 妺妺窝人体色www婷婷| 亚洲欧美视频在线| 97久久亚洲| 少妇一级淫免费播放| 亚洲国产综合人成综合网站| 你懂得网站在线| 91av免费看| 蜜臀久久久久久久| 日韩欧美亚洲视频| 久久中文久久字幕| 激情婷婷综合| 国产黑丝在线观看| 制服丝袜亚洲精品中文字幕| 亚洲优女在线|