近期伊書突然接到一些外國用戶的投訴,說伊書界面變成了中文,但他們系統語言不是中文,是法文俄文日文等,伊書只支持中文跟英文,在不支持系統所用語言的時候,理應會自動選用英文,不知為什麼會選成了中文,經過艱難困苦的重重排查,終於找到原因,知道了iOS多語言備選的規則。
主要有兩個影響因素,一是CFBundleDevelopmentRegion(Info.plist的一個字段),二是iOS8新增的系統首選語言列表:
在iOS7及之前版本,系統只能設置一種語言,如果APP不支持系統設置的語言,選用備選語言的規則是:
1.如果APP支持英文,直接選擇英文
2.如果APP不支持英文,隨機挑選一個,不清楚這裡挑選的規則。文檔上說會選用CFBundleDevelopmentRegion設置的語言,但我測試後發現並沒有,系統直接忽略了這個字段。
舉個例子,APP支持中文跟英文,當系統語言是不是中文或英文時,都會選擇英文。若APP支持中文跟日文,系統語言不是中文或日文,將會隨機挑選一個。
從iOS8開始,系統語言可以設置一個語言列表,會根據這個語言列表的排序選用備選語言,規則就變了:
1.如果APP支持的語言在系統語言列表裡有,優先選擇列表上排序靠前的語言。
2.如果APP支持的語言沒在系統語言列表上,按CFBundleDevelopmentRegion的值選擇,無論APP是否支持英文,英文不再是默認的備選語言。
舉個例子,APP支持中文跟英文,CFBundleDevelopmentRegion的值是中文,當系統語言列表是[日文]或[日文,中文]時,會選擇中文,系統語言列表是[日文,英文]時,會選擇英文。
蘋果在語言方面似乎有不少bug,調試過程中出現不少坑爹的事,例如改變增刪語言文件一定要clean工程否則不生效,iOS8模擬器不認 CFBundleDevelopmentRegion的值,真機才認,再加上一開始不知道iOS8系統語言變成列表這事,把我迷惑得費了大量時間。總而言之,若要國際化,讓APP支持英文,CFBundleDevelopmentRegion填英文,應該萬無一失。