https://www.itread01.com/content/1549666469.html
https://kennc.github.io/2020/ios-localization/
開啟專案的國際化選項會有一個開關 Use Base Internationlization,在 Localizable.strings 中也會有 (Base) 檔案。許多人很自以為是地以為 Base 的意思是如果專案並沒有對某個語言做國際化,那麼就使用 Base 語言,然而事實並非是這樣的,實際上 Base Internationlization 是為 xib 和storyboard 服務的。
那麼iOS系統中語言選取的原則究竟是什麼呢?
舉個例子:假設一個應用使用的開發語言 (development language) 是英語,同時對法語、日語、阿拉伯語做了國際化。然而用戶的系統語言設定的是中文,那麼開啟應用會顯示什麼語言呢?
答案是根據用戶系統的首選語言列表而定,在系統設定-語言設定的介面,有一欄列表叫做首選語言列表,假設用戶當前系統語言是中文,但是之前一次選擇過阿拉伯文為系統語言,那麼這種情況下,該應用將會顯示阿拉伯文。
iOS 對應用語言的判定遵循的原則是:
1. 檢視應用是否針對系統語言做國際化,如有,選擇系統語言
2. 遍歷系統的首選語言,如果存在對首選語言做國際化,選擇該首選語言
3. 全部沒有的情況下使用 development language
設定好要顯示在不同語系的字串
格式固定是 Key = String,實作上這部分會是最花時間的,因為要把專案裡所有的文字都取一個Key 抽出來。
Key 沒有固定格式,一般會使用畫面做分類,用底線拆開單字,全大寫或全小寫。
這裡 Key 的命名有點小技巧,建議以畫面+元件+功能,比如:loginVC_login_button_login = "登入",這樣的命名可以幫助理解。
保證 UILabel 和 UITextField 等完美適應不同語言的不同長度
- 利用 AutoLayout 讓 UILabel 根據內容自適應長度
- 如果對 UILabel 或者 UITextField 有硬性的 MaxWidth 設定,達到了最大寬度但是無法顯示全,可以採用 AutoShrink 的方案。
針對 UILabel 可以在 xib 或者 storyboard 中設定 AutoShrink 屬性,該屬性的作用是如果 Label 內容顯示不下,使用何種策略來適應,
iOS 提供了多種選項,包括按比例縮放、最小字型、減小字間距。當然在程式碼中可以統一設定 UILabel 的 adjustsFontSizeToFitWidth、minimumScaleFactor、allowsDefaultTighteningForTruncation 等屬性,這些屬性預設都是 NO。
針對 UITextField,也有一個 Min Font Size 的屬性可以調整
- 配合 Pseudolocalizations 提早發現介面溢位的問題
- 特別需要注意的地方可以提前跟翻譯人員說明,控制字元長度
讓你的應用適配不同的佈局方向,將是個大坑
簡單說就是語系分為「從右到左」或「從左到右」,
若需要同時支援兩類語系,將會有許多眉眉角角需要處理。
如果需要手動獲取系統語言和地區環境,得留意當 iOS 改版時,取值的方法可能會改
當初 iOS 9 剛出來時,微博、微信等應用(這些應用都有一個共同的特點:可以在應用內手動設定系統語言)都出現了語言錯亂的問題,問題的根源就是 iOS 9 中取值的方法改變了。
在 iOS 9 以前,如果當前語言版本是英文,那就是 en,阿拉伯文就是 ar,中文就是 zh-Hans,
然而在 iOS 9 中,假設當前語言是簡體中文,當前地區是埃及,取出來的值就是:zh-Hans-EG,在 iOS 9 新的 API 中,同一個方法返回的引數會帶上地區的字尾。
所以原先對語言的判斷就不能單單 isEquasToString 了,起碼要使用 hasPrefix 方法或者做一下split。

















