iOS-i18N國際化

前言

項目國際化效果是根據(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. 圖片、文件、音視頻等資源文件
  1. 圖片國際化
    圖片存放方式: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)的圖片資源

iShot2022-11-14 11.07.04.png

/// 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)的資源文件,使用時直接使用同一個文件名


iShot2022-11-14 11.10.20.png
/// 直接使用文件名加載圖片
Image(uiImage: UIImage(named: "cup")!)
  1. 文件、音視頻等資源文件國際化
    文件、音視頻等存放方式與圖片存放在項目文件夾中一樣,國際化方式通圖片存放在項目文件夾中的國際化方式相同
    iShot2022-11-14 11.13.19.png
5. Storyboard / Xib 文件

Storyboard / Xib 文件國際化原理和字符串差不多,需要開啟Storyboard / Xib 文件的國際化支持,在Storyboard / Xib 文件右側(cè)添加需要國際化的語言,然后Xcode會自動生成xxx.strings文件,我們只需要翻譯該文件中的字符串即可,如下圖所示:

iShot_2022-11-13_17.43.09.png

/// 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)在文案、圖片等方面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容