iOS國際化

相關問題

國際化官網鏈接

  1. Infoplist.strings為什么可以替換info.plist的名稱?什么時機替換的?為什么必須叫InfoPlist.strings?
  • 導出本地化時,Xcode包含一個InfoPlist.strings用于轉換的文件。但是,此文件包含有關您的應用和公司的屬性,因此您可能需要自己驗證或翻譯此文件。此字符串文件允許您可選地本地化信息屬性列表中的某些屬性值,例如應用程序名稱(包顯示名稱)和版權聲明。
  • Xcode會自動將這些鍵添加到InfoPlist.strings文件中:
    CFBundleDisplayName
    CFBundleName
    CFBundleShortVersionString
    NSHumanReadableCopyright

有關信息屬性列表的完整說明,請參閱信息屬性列表鍵參考

  1. 多target國際化添加說明
  • 工程包含多個target的時候需要創建對應target名字的文件(方便區分),然后在每個文件中分別生成InfoPlist.strings文件,再一一對應勾選相關target皆可以實現不同的target讀取其唯一對應的InfoPlist.strings文件了,具體看展示圖.
    生成多個文件多個.strings文件
按名字對應勾選target
  1. Localizable.strings == 匹配系統宏
  • 在運行時,NSLocalizedString 會確定首選的語言,并在應用程序包中找到相應的 Localizable.strings 文件。例如,如果用戶首選法語,文件 fr.lproj/Localizable.strings 將來用作參考。
  • Localizable.strings 文件最初將由 genstrings 產生。genstrings 程序用給定的參數從 C 或 Objective-C(.c 或 .m)的源代碼文件生成一個 .strings 文件。一個 .strings 文件用于為應用程序的不同語言作本地化,正如 Cocoa 開發者文檔下的 “Internationalization” 描述的那樣。
  1. 自定義文字國際化,方法參數說明
參數
key
指定表中字符串的鍵。
tableName
包含鍵值對的表的名稱。此外,字符串文件的后綴(具有.strings擴展名的文件)用于存儲本地化字符串。
comment
注釋放在字符串文件中的鍵值對之上。
#define NSLocalizedStringFromTable(key, tbl, comment)
  • 從OS X 10.11和iOS 9開始,它NSBundle是線程安全的。因此,可以安全地從任何執行上下文中調用。
  1. 兩種啟動圖國際化,各有各的問題,啟動圖緩存問題
    緩存圖片需要刪除APP再安裝
    黑屏問題
  • iOS 8.0之前,系統優先選用 Launch Image 作為啟動圖.
  • iOS 8.0以后,系統優先選用 Launch Screen 作為啟動圖 (注意, Info.plist文件中,Launch screen interface file base name 需要填寫對應的storyboard名稱).
  • 如果你 LauncScreen 和 LaunchImage 同時都使用了,就有可能出現啟動圖黑屏 (建議只使用一種).
  • 使用 LaunchImage 時出現黑屏,需要檢查以下幾個地方: (在LaunchScreen 將Info.plist中的 Launch screen interface file base name 刪除,可解決黑屏).
  1. Xib存在的問題:不能時時變換;&& 我們的工程不能用
  • xib的國際化,如果把xib放在framework或者bundle中,xib的國際化文件中不能切換對應語言環境的xib.strings文件。
  1. 不同系統適配問題

做指定語言切換開發與測試過程中最好使用真機代替模擬器,避免同語言在模擬器讀取語言不準確。比如簡體中文環境下,模擬器11.4版本iPhone8:“zh-Hans-US”,真機11.2.1版本iPhoneX:“zh-Hans-CN”。

由外到內的順序進行國際化配置,文章最后會有demo與語言切換的簡單工具類。

  • 1.APP名稱國際化。
  • 2.系統權限提示語國際化。
  • 3.語言與圖片國際化。
  • 4.啟動圖國際化。
  • 5.xib國際化。
  • 6.獲取本地語言與語言切換。

1.APP名稱國際化

InfoPlist.strings文件中,定義key和value.

  • 1.1 設置支持的語言,點“?”添加,點擊finish確定。

    APP名稱-1.png

  • 1.2 生成InfoPlist.strings文件,名字必須寫成InfoPlist里面才能支持名稱國際化。

    國際化名稱-2.png

  • 1.3 選中創建好的InfoPlist.strings文件,點擊右側Localize

    名稱國際化-3.png

  • 1.4 添加文件點確定。
    這里涉及一點問題,添加文件時默認的是English語言環境,因為是在此項目中默認的環境是English所以少了Base文件的選項。修改方法---直接在info.plist文件添加此key就可以,把en改成zh-Hans就是默認語言為簡體中文。在其他語言的情況下都使用此語言(非strings配置過的語言環境下).

<key>CFBundleDevelopmentRegion</key> 
<string>en</string>

關于CFBundleDevelopmentRegion
官網: CFBundleDevelopmentRegion (String - iOS, OS X) specifies the default language and region for the bundle, as a language ID. For example, English for the United Kingdom has the language ID en-UK. The system uses this value if it cannot locate a resource for the user’s preferred language.
翻譯:CFBundleDevelopmentRegion(String - iOS,OS X)指定的默認語言和區域包,作為一種語言ID。例如,英國英語語言ID en-UK。系統使用這個值如果不能找到一個資源用戶的首選語言。

關于Base文件
Base多語言默認文件,被其它多語言 (Chinese, English, ...) 繼承和覆蓋,不會被iOS直接使用,只有當對應的多語言文件中沒有找到相應條目時才會到Base中查找,作用跟函數參數的默認值差不多。
查找原理App啟動時,iOS會遍歷用戶設定的語言優先級去和App的多語言文件匹配如果匹配,會使用對應的語言如果不匹配,會使用plist中開發地區所對應的語言。

  • 1.5 勾選需要環境語言文件,把需要的語言選項勾選上。


    名稱-5.png
  • 1.6 這時候右邊文件列表會出現infoPlist.strings文件列表,選中指定語言環境的strings文件,配置國際化APP名稱。

    名稱-6.png

  • 1.7 設置名稱需要在strings文件中對應設置"CFBundleDisplayName" = "xxxxx";,APP就會在對應的系統語言環境下顯示不同strings里設置的名稱了。

名稱-7.png

2.系統權限提示語國際化

InfoPlist.strings文件中,定義key和value.
關于系統權限提示語的國際化,和設置APP名稱一樣需要在InfoPlist.strings文件里配置。

  • InfoPlist.strings文件里
  • 當然也可以在info.plist文件下配置默認提示語(沒有配置過的其他語言環境下)

配置好系統在不同語言環境下的權限提示就會顯示所對應的提示語。一批訪問權限的對應字段。

NSBluetoothPeripheralUsageDescription   訪問藍牙
NSCalendarsUsageDescription   訪問日歷
NSCameraUsageDescription   相機
NSPhotoLibraryUsageDescription   相冊
NSContactsUsageDescription   通訊錄
NSLocationAlwaysUsageDescription   始終訪問位置
NSLocationUsageDescription   位置
NSLocationWhenInUseUsageDescription   在使用期間訪問位置
NSMicrophoneUsageDescription   麥克風
NSAppleMusicUsageDescription   訪問媒體資料庫
NSHealthShareUsageDescription   訪問健康分享
NSHealthUpdateUsageDescription   訪問健康更新
NSMotionUsageDescription   訪問運動與健身
NSRemindersUsageDescription   訪問提醒事項
  • 切換info.plistkey/value展示列表的方法
    info.plist-show

3.語言與圖片國際化

簡單情況(APP初期開發或個人開發是國際化處理)

  • 3.1 和建立APP名稱國際化InfoPlist.strings文件一樣,建立Localizable.strings文件,定義key和value.

    Localizable.strings

  • 3.2 分別在不同的Localizable.strings文件設置相應的key與value:

    設置相應key-value

  • 3.3 使用系統宏定義設置文字
    NSLocalizedString傳遞的第一個參數是當前國際化文字的key,第二個參數是注釋comment,這個參數可有可為nil;當國際化文件某一語言中沒有對應的指定國際化信息的時候,默認會以key的值來顯示。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.titleLabel.text = NSLocalizedString(@"title", nil);
}
  • 3.4 切換系統可以看到不同的文字展示


    香港繁體語言環境下

    簡體中文語言環境下

簡單的圖片國際化與上述文字國際化是一樣的,就是根據一樣的圖片key對應展示不同的圖片value,就不上圖片了 比如這樣:

//  Localizable.strings文件中
"title" = "中文簡體標題";
"imageKey" = "image_simplified";

//  Localizable.strings文件中
"title" = "香港繁體標題";
"imageKey" = "image_traditional";

// 控制器里設置控件
UIImage * iamge = [UIImage imageNamed:NSLocalizedString(@"imageKey", nil)];


多人開發/后期國際化
生成不同的.strings文件,使用系統的宏定義從不同文件中獲取國際化文本

#define NSLocalizedStringFromTable(key, tbl, comment) \
        [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
A-B兩個不同strings文件

使用NSLocalizedStringFromTable定義國際化文本。

NSString *nameStr = NSLocalizedStringFromTable(@"name", @"XesA", nil);
    self.titleLabel.text = nameStr;

4.啟動圖國際化

(啟動圖國際化如果切換語言后無法達到顯示結果,需要刪除APP再次運行)

  • LaunchScreen啟動圖國際化

  • 4.1 配置好使用LaunchScreen作為啟動圖的配置文件

  • 4.2 創建不同語言環境下的LaunchScreen.storyboard啟動頁。

  • 4.3 分別畫好不同LaunchScreen的啟動效果,然后在InfoPlist.strings文件下配置不同語言環境下的指定LaunchScreen文件,如圖

strings文件里的啟動圖配置

"UILaunchStoryboardName" = "LaunchS_Chine";
"UILaunchStoryboardName" = "LaunchS_HKHK";

5.xib國際化

xib國際化比較麻煩,因為生成xib對應的.strings文件后,再更改時不能動態修改對應的.strings文件,還需要重置此文件,笨方法就是先制作好了xib 最后再對應生成不同環境下的.strings文件,還有就是使用腳本動態生成國際化內容。(待研究學習...)

  • 5.1 創建帶xib的控制器,設置其Label的布局與文字后,點擊右側Localizable添加多語言strings文本。(建議變動的xib文本可以把控件與控制器關聯,在控制器中再進行國際化處理)

    xib-1.png

  • 5.2 和上面添加對應Localizable.strings文件一樣,xib里的文本會自動生成下圖這樣:

    xib-4.png

  • 5.3 分別在xib下不同的.strings文件設置對應文本,切換系統后就會變更,顯示國際化對應文本。

也可以把xib里的控件與其控制器關聯,在控制器中再進行國際化文本處理。


6.獲取本地語言與語言切換

在做獲取本地語言與語言切換功能時,最好使用真機測試比較準確,比如同樣系統下的模擬器與真機獲取簡體中文就會有偏差,模擬器的簡體中文為zh-Hans-US,真機為zh-Hans-CN,雖然都可以表示簡體中文 但會有偏差。

// 獲取當前語言環境
// 方法一
 NSArray *languageArry = [NSLocale preferredLanguages];
 NSString *currentLanguage = [languageArry objectAtIndex:0];

// 方法二
 NSArray * languageArry = [[NSUserDefaults standardUserDefaults]  objectForKey:@"AppleLanguages"];
 NSString * currentLanguage = [allLanguages objectAtIndex:0];

// 獲取當前設備支持語言數組
NSArray *languageArr = [NSLocale availableLocaleIdentifiers];

更改當前APP所屬語言環境(語言切換)只需要在NSUserDefaults下的keyAppleLanguages賦相應的語言代碼就好。
比如把當前app語言環境改成英文。

[[NSUserDefaults standardUserDefaults] setObject:@"en-US" forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
切換語言時的常見思路
  • 1.發送通知NSNotification(類似微博),切換語言的時候發送通知刷新所有涉及的頁面,當然每個頁面的每個控件都需要有自己的一套更新機制,比較繁瑣。

  • 2.刷新重置keyWindow的rootViewController(類似微信)最簡單實用。當然也需要根據需求定一個適合的方案。


國際化語言適配問題筆記
iOS8  
簡體中文:zh-Hans
繁體中文香港:zh-HK

iOS9    
簡體中文: zh-Hans-CN
香港繁體  : zh-HK

iOS10及以上
簡體中文   zh-Hans-CN
香港繁體: zh-Hant-HK

官網國際化指南

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容

  • 之前公司的app可能要在島國和東南亞地區使用,所以最合理的方法就是--國際化。 寫這篇文章也是為一個妹子寫的(咦~...
    倫敦鄉下的小作家閱讀 815評論 4 4
  • iOS國際化簡單操作 國際化后的App可以根據手機當前系統語言來切換不同的語言來適應不同的語言使用人群, 所以iO...
    zhouyuhan閱讀 885評論 2 7
  • 國際化(Internationalization ,簡寫為I18N)的作用是防止將本土文化信息寫死仔應用里(所謂本...
    西西西瓜啊閱讀 11,353評論 23 15
  • Demo同步更新到Swift2.3本文地址: http://mokai.me/iOS-i18n.html 在真正...
    _GKK_閱讀 5,869評論 13 55
  • 四月的北國天氣變化無常。早上還是陽光普照,到了中午就變成了大雪紛飛。那些雪花喲,彷佛是從陽光的間隙中飄下來的精靈,...
    徐健舒閱讀 593評論 0 0