iOS-i18N國際化

前言

項目國際化效果是根據(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. 圖片、文件啦逆、音視頻等資源文件
  1. 圖片國際化
    圖片存放方式:Assets.xcassets伞矩、項目文件夾;
    針對不同的存放方式夏志,圖片國際化也有對應的方式乃坤;
  • Assets.xcassets

    Assets資源文件直接設置支持的語言,不同語言設置對應的資源圖片沟蔑,使用時直接使用同一個文件名


    iShot2022-11-14 11.04.33.png
/// 直接使用文件名加載圖片
Image("icon")
  • 項目文件夾存放

項目文件夾存放圖片時湿诊,有兩種國際方式:
(1).不同語言存放不同文件名的資源文件, Localizable.strings 文件中配置不同語言的資源圖片名字瘦材,通過國際化字符串的方式獲取對應的圖片資源

iShot2022-11-14 11.07.04.png

/// en
"book" = "book_en";
/// zh-Hans
"book" = "book_hans";
/// zh-Hant
"book" = "book_hant";
/// 通過國際化字符串的方式獲取對應的圖片資源
 Image(uiImage: UIImage(named: NSLocalizedString("book", comment: ""))!)

(2).圖片資源文件直接設置支持的語言厅须,不同語言對應文件夾下存放對應的資源文件,使用時直接使用同一個文件名


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 文件右側添加需要國際化的語言,然后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è)務和顯示的地方屋休,在不同時區(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)在文案徐勃、圖片等方面

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末事示,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子僻肖,更是在濱河造成了極大的恐慌肖爵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臀脏,死亡現(xiàn)場離奇詭異劝堪,居然都是意外死亡,警方通過查閱死者的電腦和手機揉稚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門秒啦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搀玖,你說我怎么就攤上這事帝蒿。” “怎么了巷怜?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵葛超,是天一觀的道長。 經(jīng)常有香客問我延塑,道長绣张,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任关带,我火速辦了婚禮侥涵,結果婚禮上,老公的妹妹穿的比我還像新娘宋雏。我一直安慰自己芜飘,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布磨总。 她就那樣靜靜地躺著嗦明,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚪燕。 梳的紋絲不亂的頭發(fā)上娶牌,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音馆纳,去河邊找鬼诗良。 笑死,一個胖子當著我的面吹牛鲁驶,可吹牛的內容都是我干的鉴裹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼径荔!你這毒婦竟也來了葛作?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猖凛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绪穆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辨泳,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年玖院,在試婚紗的時候發(fā)現(xiàn)自己被綠了菠红。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡难菌,死狀恐怖试溯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情郊酒,我是刑警寧澤遇绞,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站燎窘,受9級特大地震影響摹闽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜褐健,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一付鹿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚜迅,春花似錦舵匾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刹帕,卻和暖如春烛缔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轩拨。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工践瓷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亡蓉。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓晕翠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淋肾,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容