前言
項目國際化效果是根據(jù)不同語言及地區(qū)顯示對應語言的界面內容欣范,需要對工程中的資源、字符串等進行相應的國際化操作令哟。在實際的項目需求中恼琼,有可能進行應用內語言切換,除了默認的跟隨系統(tǒng)之外屏富,還要實現(xiàn)動態(tài)的語言版本切換晴竞;國際化后相應的會增加安裝包的大小,主要是因為資源文件的多語言版本數(shù)據(jù)造成的狠半。
語言切換方式
- 手機系統(tǒng)設置語言
- App 在支持語言里切換
- App 內部語言切換管理
國際化操作
- App 名稱
- 權限使用說明
- 原生代碼中字符串
- 圖片噩死、文件、音視頻等資源文件
- Storyboard / Xib 文件
- 時間
- 網(wǎng)絡請求數(shù)據(jù)(后端支持國際化數(shù)據(jù))
項目配置語言
國際化的準備工作是配置需要國際化的語言神年,這是我們國際化操作的必要配置已维。
-
配置語言
iShot_2022-11-12_17.11.47.png -
結果如下
iShot_2022-11-12_17.12.52.png
1. App 名稱
App 名稱國際化是指應用在不同的語言環(huán)境下顯示不同的名稱,也就是手機設備的語言設置已日;
注意 App 名稱只受手機設備系統(tǒng)的語言影響垛耳,也就是上面切換語言的第一種方式控制的;
- 創(chuàng)建
InfoPlist.strings
文件飘千、配置需要國際化的語言
iShot2022-11-14 10.56.28.png
-
InfoPlist.strings
文件中設置不同語言對應的 App 名字
/// en
CFBundleDisplayName = "LocalizeDemo";
/// zh-Hans
CFBundleDisplayName = "本地化示例";
/// zh-Hant
CFBundleDisplayName = "本地話示例";
2. 權限使用說明
應用在使用到系統(tǒng)權限時堂鲜,會詢問用戶是否同意使用該權限,說明理由的文案需要國際化
-
InfoPlist.strings
文件中設置不同語言對應的權限 key 對應的描述
NSBluetoothAlwaysUsageDescription = "APP需要您的允許才能允許藍牙與設備通信";
NSBluetoothPeripheralUsageDescription ="APP需要您的允許才能允許藍牙與設備通信";
NSCalendarsUsageDescription ="APP需要您的允許才能訪問日歷";
NSCameraUsageDescription ="APP需要您的允許才能使用照相機功能";
NSContactsUsageDescription ="APP需要您的允許才能訪問您的通訊簿";
NSLocationAlwaysUsageDescription ="APP需要您的允許才能始終啟用位置功能 ";
NSLocationWhenInUseUsageDescription ="APP需要您的允許才能始終啟用位置功能 ";
NSMicrophoneUsageDescription ="APP需要您的允許才能錄制";
NSPhotoLibraryAddUsageDescription ="APP需要您的允許才能將照片保存到相冊 ";
NSPhotoLibraryUsageDescription ="APP需要您的允許才能訪問相冊";
NSSpeechRecognitionUsageDescription ="APP需要您的允許才能使用語音識別";
NSAppleMusicUsageDescription = "APP需要你的允許才能訪問多媒體";
3. 原生代碼中字符串
字符串國際化指 App 內的字符串在不同的語言環(huán)境下顯示不同的內容护奈;字符串國際化和 App 名稱國際化相同缔莲,只是創(chuàng)建的文件不一樣,必須是 Localizable.strings
霉旗。
-
Localizable.strings
文件中設置不同語言對應的字符串展示的內容
/// en
"這是一個示例痴奏!" = "Here's an example!";
/// zh-Hans
"這是一個示例厌秒!" = "這是一個示例读拆!";
/// zh-Hant
"這是一個示例!" = "這是一個示例简僧!";
- 代碼中使用
/// 國際化字符串宏定義建椰,key:需要國際化的字符串雕欺,comment:一個注釋岛马,一般設置為nil
NSLocalizedString(<#T##key: String##String#>, comment: <#T##String#>)
// 舉例
Text(NSLocalizedString("這是一個示例棉姐!", comment: ""))
4. 圖片、文件啦逆、音視頻等資源文件
-
圖片國際化
圖片存放方式:Assets.xcassets伞矩、項目文件夾;
針對不同的存放方式夏志,圖片國際化也有對應的方式乃坤;
-
Assets.xcassets
Assets資源文件直接設置支持的語言,不同語言設置對應的資源圖片沟蔑,使用時直接使用同一個文件名
iShot2022-11-14 11.04.33.png
/// 直接使用文件名加載圖片
Image("icon")
- 項目文件夾存放
項目文件夾存放圖片時湿诊,有兩種國際方式:
(1).不同語言存放不同文件名的資源文件, Localizable.strings
文件中配置不同語言的資源圖片名字瘦材,通過國際化字符串的方式獲取對應的圖片資源
/// en
"book" = "book_en";
/// zh-Hans
"book" = "book_hans";
/// zh-Hant
"book" = "book_hant";
/// 通過國際化字符串的方式獲取對應的圖片資源
Image(uiImage: UIImage(named: NSLocalizedString("book", comment: ""))!)
(2).圖片資源文件直接設置支持的語言厅须,不同語言對應文件夾下存放對應的資源文件,使用時直接使用同一個文件名
/// 直接使用文件名加載圖片
Image(uiImage: UIImage(named: "cup")!)
-
文件食棕、音視頻等資源文件國際化
文件朗和、音視頻等存放方式與圖片存放在項目文件夾中一樣,國際化方式通圖片存放在項目文件夾中的國際化方式相同
iShot2022-11-14 11.13.19.png
5. Storyboard / Xib 文件
Storyboard / Xib 文件國際化原理和字符串差不多簿晓,需要開啟Storyboard / Xib 文件的國際化支持眶拉,在Storyboard / Xib 文件右側添加需要國際化的語言,然后Xcode會自動生成xxx.strings
文件憔儿,我們只需要翻譯該文件中的字符串即可忆植,如下圖所示:
/// zh-Hans
"A6V-b6-9hZ.text" = "測試";
/// zh-Hant
"A6V-b6-9hZ.text" = "測試";
UILabel
的text屬性,其中 key 是 Storyboard 自動生成的控件的唯一編碼皿曲,value則是我們需要國際化的字符串唱逢,只需要將翻譯好的字符串進行替換就可以了。
6. 時間
時間涉及業(yè)務和顯示的地方屋休,在不同時區(qū)時間應該是不一樣的坞古,讓應用根據(jù)不同的時區(qū)來顯示時間。
- 前后端統(tǒng)一系統(tǒng)中和時間相關的字段劫樟,都需要返回時間戳格式
- 通過
NSDateFormatter
對象將時間戳轉換成可用的字符串痪枫,NSDateFormatter
對象里面TimeZone
屬性,默認系統(tǒng)當前時區(qū)叠艳,無需setTimeZone
奶陈,獲取到的時間就是當前系統(tǒng)對應的時間,隨系統(tǒng)時區(qū)切換附较,時間會跟著變化吃粒。
7. 網(wǎng)絡請求數(shù)據(jù)(后端支持國際化數(shù)據(jù))
建議在請求頭header中增加當前展示語言類型的字段,服務端獲根據(jù)語言類型返回對應語言的數(shù)據(jù)拒课,一般差異會體現(xiàn)在文案徐勃、圖片等方面