前言
項目國際化效果是根據(jù)不同語言及地區(qū)顯示對應(yīng)語言的界面內(nèi)容,需要對工程中的資源、字符串等進行相應(yīng)的國際化操作。在實際的項目需求中,有可能進行應(yīng)用內(nèi)語言切換,除了默認的跟隨系統(tǒng)之外,還要實現(xiàn)動態(tài)的語言版本切換;國際化后相應(yīng)的會增加安裝包的大小,主要是因為資源文件的多語言版本數(shù)據(jù)造成的。
語言切換方式
- 手機系統(tǒng)設(shè)置語言
- App 在支持語言里切換
- App 內(nèi)部語言切換管理
國際化操作
- App 名稱
- 權(quán)限使用說明
- 原生代碼中字符串
- 圖片、文件、音視頻等資源文件
- Storyboard / Xib 文件
- 時間
- 網(wǎng)絡(luò)請求數(shù)據(jù)(后端支持國際化數(shù)據(jù))
項目配置語言
國際化的準備工作是配置需要國際化的語言,這是我們國際化操作的必要配置。
-
配置語言
iShot_2022-11-12_17.11.47.png -
結(jié)果如下
iShot_2022-11-12_17.12.52.png
1. App 名稱
App 名稱國際化是指應(yīng)用在不同的語言環(huán)境下顯示不同的名稱,也就是手機設(shè)備的語言設(shè)置;
注意 App 名稱只受手機設(shè)備系統(tǒng)的語言影響,也就是上面切換語言的第一種方式控制的;
- 創(chuàng)建
InfoPlist.strings文件、配置需要國際化的語言
iShot2022-11-14 10.56.28.png
-
InfoPlist.strings文件中設(shè)置不同語言對應(yīng)的 App 名字
/// en
CFBundleDisplayName = "LocalizeDemo";
/// zh-Hans
CFBundleDisplayName = "本地化示例";
/// zh-Hant
CFBundleDisplayName = "本地話示例";
2. 權(quán)限使用說明
應(yīng)用在使用到系統(tǒng)權(quán)限時,會詢問用戶是否同意使用該權(quán)限,說明理由的文案需要國際化
-
InfoPlist.strings文件中設(shè)置不同語言對應(yīng)的權(quán)限 key 對應(yīng)的描述
NSBluetoothAlwaysUsageDescription = "APP需要您的允許才能允許藍牙與設(shè)備通信";
NSBluetoothPeripheralUsageDescription ="APP需要您的允許才能允許藍牙與設(shè)備通信";
NSCalendarsUsageDescription ="APP需要您的允許才能訪問日歷";
NSCameraUsageDescription ="APP需要您的允許才能使用照相機功能";
NSContactsUsageDescription ="APP需要您的允許才能訪問您的通訊簿";
NSLocationAlwaysUsageDescription ="APP需要您的允許才能始終啟用位置功能 ";
NSLocationWhenInUseUsageDescription ="APP需要您的允許才能始終啟用位置功能 ";
NSMicrophoneUsageDescription ="APP需要您的允許才能錄制";
NSPhotoLibraryAddUsageDescription ="APP需要您的允許才能將照片保存到相冊 ";
NSPhotoLibraryUsageDescription ="APP需要您的允許才能訪問相冊";
NSSpeechRecognitionUsageDescription ="APP需要您的允許才能使用語音識別";
NSAppleMusicUsageDescription = "APP需要你的允許才能訪問多媒體";
3. 原生代碼中字符串
字符串國際化指 App 內(nèi)的字符串在不同的語言環(huán)境下顯示不同的內(nèi)容;字符串國際化和 App 名稱國際化相同,只是創(chuàng)建的文件不一樣,必須是 Localizable.strings。
-
Localizable.strings文件中設(shè)置不同語言對應(yīng)的字符串展示的內(nèi)容
/// en
"這是一個示例!" = "Here's an example!";
/// zh-Hans
"這是一個示例!" = "這是一個示例!";
/// zh-Hant
"這是一個示例!" = "這是一個示例!";
- 代碼中使用
/// 國際化字符串宏定義,key:需要國際化的字符串,comment:一個注釋,一般設(shè)置為nil
NSLocalizedString(<#T##key: String##String#>, comment: <#T##String#>)
// 舉例
Text(NSLocalizedString("這是一個示例!", comment: ""))
4. 圖片、文件、音視頻等資源文件
-
圖片國際化
圖片存放方式:Assets.xcassets、項目文件夾;
針對不同的存放方式,圖片國際化也有對應(yīng)的方式;
-
Assets.xcassets
Assets資源文件直接設(shè)置支持的語言,不同語言設(shè)置對應(yīng)的資源圖片,使用時直接使用同一個文件名
iShot2022-11-14 11.04.33.png
/// 直接使用文件名加載圖片
Image("icon")
- 項目文件夾存放
項目文件夾存放圖片時,有兩種國際方式:
(1).不同語言存放不同文件名的資源文件, Localizable.strings 文件中配置不同語言的資源圖片名字,通過國際化字符串的方式獲取對應(yīng)的圖片資源

/// en
"book" = "book_en";
/// zh-Hans
"book" = "book_hans";
/// zh-Hant
"book" = "book_hant";
/// 通過國際化字符串的方式獲取對應(yīng)的圖片資源
Image(uiImage: UIImage(named: NSLocalizedString("book", comment: ""))!)
(2).圖片資源文件直接設(shè)置支持的語言,不同語言對應(yīng)文件夾下存放對應(yīng)的資源文件,使用時直接使用同一個文件名

/// 直接使用文件名加載圖片
Image(uiImage: UIImage(named: "cup")!)
-
文件、音視頻等資源文件國際化
文件、音視頻等存放方式與圖片存放在項目文件夾中一樣,國際化方式通圖片存放在項目文件夾中的國際化方式相同
iShot2022-11-14 11.13.19.png
5. Storyboard / Xib 文件
Storyboard / Xib 文件國際化原理和字符串差不多,需要開啟Storyboard / Xib 文件的國際化支持,在Storyboard / Xib 文件右側(cè)添加需要國際化的語言,然后Xcode會自動生成xxx.strings文件,我們只需要翻譯該文件中的字符串即可,如下圖所示:

/// zh-Hans
"A6V-b6-9hZ.text" = "測試";
/// zh-Hant
"A6V-b6-9hZ.text" = "測試";
UILabel的text屬性,其中 key 是 Storyboard 自動生成的控件的唯一編碼,value則是我們需要國際化的字符串,只需要將翻譯好的字符串進行替換就可以了。
6. 時間
時間涉及業(yè)務(wù)和顯示的地方,在不同時區(qū)時間應(yīng)該是不一樣的,讓應(yīng)用根據(jù)不同的時區(qū)來顯示時間。
- 前后端統(tǒng)一系統(tǒng)中和時間相關(guān)的字段,都需要返回時間戳格式
- 通過
NSDateFormatter對象將時間戳轉(zhuǎn)換成可用的字符串,NSDateFormatter對象里面TimeZone屬性,默認系統(tǒng)當前時區(qū),無需setTimeZone,獲取到的時間就是當前系統(tǒng)對應(yīng)的時間,隨系統(tǒng)時區(qū)切換,時間會跟著變化。
7. 網(wǎng)絡(luò)請求數(shù)據(jù)(后端支持國際化數(shù)據(jù))
建議在請求頭header中增加當前展示語言類型的字段,服務(wù)端獲根據(jù)語言類型返回對應(yīng)語言的數(shù)據(jù),一般差異會體現(xiàn)在文案、圖片等方面




