成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

前言

我已經(jīng)有一段時(shí)間沒(méi)有從頭開(kāi)始一個(gè)需要支持多種語(yǔ)言的新項(xiàng)目了。當(dāng)然不是從頭開(kāi)始,而是在代碼庫(kù)中通過(guò)使用 Swift 包將代碼分成不同模塊。

我想提醒自己記住許多在本地化實(shí)行中的過(guò)程,所以我認(rèn)為最好寫(xiě)一篇文章,以便下次開(kāi)始同類(lèi)型項(xiàng)目時(shí)可以參考。

開(kāi)始吧!

讓我們看看代碼庫(kù)的一個(gè)簡(jiǎn)化版本。它包含一個(gè) Xcode 項(xiàng)目,一個(gè)單獨(dú)的 app target(即將運(yùn)行的那個(gè))和一個(gè)名為 Features 的 Swift 包。后者將包含 app 中所有頁(yè)面的代碼,每一頁(yè)將被定義為自己的產(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"
)
]
)

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

為了簡(jiǎn)單起見(jiàn),這個(gè)例子里僅有兩個(gè)功能:主頁(yè)和詳情,他們代表 app 中僅有的兩個(gè)頁(yè)面。

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

圖片

添加字符串!

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

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

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

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

圖片

這是因?yàn)?nbsp;defaultLocalization 必須由 Package.swift 提供。所有功能的 target 來(lái)自一個(gè)包,所以只能有一個(gè) 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/")]
)
]
)

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

圖片

Xcode warning shown when default localisation is missing。

支持本地化

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

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

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

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

圖片

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

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

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

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

允許混合本地化

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

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

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

圖片

Enabling mixed localisations in the app targe

使用這種方法需要注意以下幾點(diǎn):

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

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

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

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

額外提示 - 自動(dòng)化

我一直鼓勵(lì)盡可能地自動(dòng)化檢索特定包的本地化字符串的流程。如果你的 app 有很多頁(yè)面,希望使添加本地化字符串的過(guò)程盡可能簡(jiǎn)單和簡(jiǎn)便。

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

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

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

2012-05-14 17:10:50

iOS

2012-05-13 13:15:54

IOS

2017-11-30 14:44:41

語(yǔ)言代碼文件

2023-12-18 14:56:00

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

2011-05-25 10:13:09

WordPressJavaScript

2019-08-28 16:18:39

JavaScriptJS前端

2011-10-10 13:40:22

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

2024-01-10 09:00:00

OpenAILocalGPT開(kāi)源大模型

2010-08-02 09:10:36

Flex模塊化

2020-09-17 10:30:21

前端模塊化組件

2010-01-20 09:14:49

C語(yǔ)言模塊化

2020-09-18 09:02:32

前端模塊化

2012-06-08 10:48:31

商務(wù)社交

2011-05-30 17:11:08

測(cè)試策略

2011-07-04 10:56:42

諾基亞蘋(píng)果谷歌

2015-03-30 09:32:15

XcodeiOS應(yīng)用程序

2010-01-21 09:27:30

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

2022-09-05 09:01:13

前端模塊化

2016-10-09 11:03:41

Javascript模塊化Web

2011-05-26 17:28:48

軟件本地化測(cè)試
點(diǎn)贊
收藏

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

主站蜘蛛池模板: av中文网| 精品国产一区二区在线 | 日日噜噜噜夜夜爽爽狠狠视频, | 阿v视频在线观看 | 韩日一区 | 欧美激情久久久 | 日本成人午夜影院 | 欧美日韩一区在线 | 国产精品久久久亚洲 | 欧美成视频在线观看 | 国产日韩欧美 | 久久综合伊人 | 免费的一级视频 | 国产精品久久av | 日韩在线观看视频一区 | 亚洲免费一区 | 亚洲人人 | 天天影视亚洲综合网 | www精品 | 99热精品在线观看 | 欧美日韩久久精品 | 夜久久| 91久久久精品国产一区二区蜜臀 | 一级片子 | 国产精品无码久久久久 | 国内精品久久精品 | 日韩伦理电影免费在线观看 | 精品视频在线免费观看 | 一区在线视频 | 国产91成人 | 国产99视频精品免费播放照片 | 中文字幕免费 | 亚洲www啪成人一区二区 | 欧美视频第三页 | 中文字幕 亚洲一区 | 日韩一区二区黄色片 | 国产色| 美女中文字幕视频 | 成人毛片视频免费 | 在线一区二区三区 | 亚洲最大的成人网 |