iOS國際化

相關(guān)問題

國際化官網(wǎng)鏈接

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

有關(guān)信息屬性列表的完整說明隘蝎,請參閱信息屬性列表鍵參考购啄。

  1. 多target國際化添加說明
  • 工程包含多個target的時候需要創(chuàng)建對應(yīng)target名字的文件(方便區(qū)分),然后在每個文件中分別生成InfoPlist.strings文件末贾,再一一對應(yīng)勾選相關(guān)target皆可以實現(xiàn)不同的target讀取其唯一對應(yīng)的InfoPlist.strings文件了闸溃,具體看展示圖.
    生成多個文件多個.strings文件
按名字對應(yīng)勾選target
  1. Localizable.strings == 匹配系統(tǒng)宏
  • 在運行時,NSLocalizedString 會確定首選的語言拱撵,并在應(yīng)用程序包中找到相應(yīng)的 Localizable.strings 文件辉川。例如赋兵,如果用戶首選法語侣姆,文件 fr.lproj/Localizable.strings 將來用作參考慌烧。
  • Localizable.strings 文件最初將由 genstrings 產(chǎn)生庐冯。genstrings 程序用給定的參數(shù)從 C 或 Objective-C(.c 或 .m)的源代碼文件生成一個 .strings 文件。一個 .strings 文件用于為應(yīng)用程序的不同語言作本地化局嘁,正如 Cocoa 開發(fā)者文檔下的 “Internationalization” 描述的那樣川无。
  1. 自定義文字國際化喇喉,方法參數(shù)說明
參數(shù)
key
指定表中字符串的鍵。
tableName
包含鍵值對的表的名稱妆距。此外穷遂,字符串文件的后綴(具有.strings擴展名的文件)用于存儲本地化字符串。
comment
注釋放在字符串文件中的鍵值對之上娱据。
#define NSLocalizedStringFromTable(key, tbl, comment)
  • 從OS X 10.11和iOS 9開始蚪黑,它NSBundle是線程安全的。因此中剩,可以安全地從任何執(zhí)行上下文中調(diào)用忌穿。
  1. 兩種啟動圖國際化,各有各的問題结啼,啟動圖緩存問題
    緩存圖片需要刪除APP再安裝
    黑屏問題
  • iOS 8.0之前,系統(tǒng)優(yōu)先選用 Launch Image 作為啟動圖.
  • iOS 8.0以后,系統(tǒng)優(yōu)先選用 Launch Screen 作為啟動圖 (注意, Info.plist文件中,Launch screen interface file base name 需要填寫對應(yīng)的storyboard名稱).
  • 如果你 LauncScreen 和 LaunchImage 同時都使用了,就有可能出現(xiàn)啟動圖黑屏 (建議只使用一種).
  • 使用 LaunchImage 時出現(xiàn)黑屏,需要檢查以下幾個地方: (在LaunchScreen 將Info.plist中的 Launch screen interface file base name 刪除,可解決黑屏).
  1. Xib存在的問題:不能時時變換掠剑;&& 我們的工程不能用
  • xib的國際化,如果把xib放在framework或者bundle中郊愧,xib的國際化文件中不能切換對應(yīng)語言環(huán)境的xib.strings文件朴译。
  1. 不同系統(tǒng)適配問題

做指定語言切換開發(fā)與測試過程中最好使用真機代替模擬器,避免同語言在模擬器讀取語言不準確糕珊。比如簡體中文環(huán)境下动分,模擬器11.4版本iPhone8:“zh-Hans-US”毅糟,真機11.2.1版本iPhoneX:“zh-Hans-CN”红选。

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

  • 1.APP名稱國際化姆另。
  • 2.系統(tǒng)權(quán)限提示語國際化喇肋。
  • 3.語言與圖片國際化。
  • 4.啟動圖國際化迹辐。
  • 5.xib國際化蝶防。
  • 6.獲取本地語言與語言切換。

1.APP名稱國際化

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

  • 1.1 設(shè)置支持的語言间学,點“?”添加,點擊finish確定印荔。

    APP名稱-1.png

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

    國際化名稱-2.png

  • 1.3 選中創(chuàng)建好的InfoPlist.strings文件仍律,點擊右側(cè)Localize

    名稱國際化-3.png

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

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

關(guān)于CFBundleDevelopmentRegion
官網(wǎng): 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)指定的默認語言和區(qū)域包,作為一種語言ID钢拧。例如,英國英語語言ID en-UK蟹漓。系統(tǒng)使用這個值如果不能找到一個資源用戶的首選語言。

關(guān)于Base文件
Base多語言默認文件源内,被其它多語言 (Chinese, English, ...) 繼承和覆蓋牧牢,不會被iOS直接使用,只有當對應(yīng)的多語言文件中沒有找到相應(yīng)條目時才會到Base中查找姿锭,作用跟函數(shù)參數(shù)的默認值差不多塔鳍。
查找原理App啟動時,iOS會遍歷用戶設(shè)定的語言優(yōu)先級去和App的多語言文件匹配如果匹配呻此,會使用對應(yīng)的語言如果不匹配轮纫,會使用plist中開發(fā)地區(qū)所對應(yīng)的語言。

  • 1.5 勾選需要環(huán)境語言文件焚鲜,把需要的語言選項勾選上掌唾。


    名稱-5.png
  • 1.6 這時候右邊文件列表會出現(xiàn)infoPlist.strings文件列表,選中指定語言環(huán)境的strings文件忿磅,配置國際化APP名稱糯彬。

    名稱-6.png

  • 1.7 設(shè)置名稱需要在strings文件中對應(yīng)設(shè)置"CFBundleDisplayName" = "xxxxx";,APP就會在對應(yīng)的系統(tǒng)語言環(huán)境下顯示不同strings里設(shè)置的名稱了。

名稱-7.png

2.系統(tǒng)權(quán)限提示語國際化

InfoPlist.strings文件中葱她,定義key和value.
關(guān)于系統(tǒng)權(quán)限提示語的國際化撩扒,和設(shè)置APP名稱一樣需要在InfoPlist.strings文件里配置。

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

配置好系統(tǒng)在不同語言環(huán)境下的權(quán)限提示就會顯示所對應(yīng)的提示語吨些。一批訪問權(quán)限的對應(yīng)字段搓谆。

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

3.語言與圖片國際化

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

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

    Localizable.strings

  • 3.2 分別在不同的Localizable.strings文件設(shè)置相應(yīng)的key與value:

    設(shè)置相應(yīng)key-value

  • 3.3 使用系統(tǒng)宏定義設(shè)置文字
    NSLocalizedString傳遞的第一個參數(shù)是當前國際化文字的key泉手,第二個參數(shù)是注釋comment,這個參數(shù)可有可為nil偶器;當國際化文件某一語言中沒有對應(yīng)的指定國際化信息的時候斩萌,默認會以key的值來顯示。

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


    香港繁體語言環(huán)境下

    簡體中文語言環(huán)境下

簡單的圖片國際化與上述文字國際化是一樣的屏轰,就是根據(jù)一樣的圖片key對應(yīng)展示不同的圖片value颊郎,就不上圖片了 比如這樣:

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

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

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


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

#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.啟動圖國際化

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

  • LaunchScreen啟動圖國際化

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

  • 4.2 創(chuàng)建不同語言環(huán)境下的LaunchScreen.storyboard啟動頁。

  • 4.3 分別畫好不同LaunchScreen的啟動效果叨粘,然后在InfoPlist.strings文件下配置不同語言環(huán)境下的指定LaunchScreen文件猾编,如圖

strings文件里的啟動圖配置

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

5.xib國際化

xib國際化比較麻煩瘤睹,因為生成xib對應(yīng)的.strings文件后,再更改時不能動態(tài)修改對應(yīng)的.strings文件答倡,還需要重置此文件轰传,笨方法就是先制作好了xib 最后再對應(yīng)生成不同環(huán)境下的.strings文件,還有就是使用腳本動態(tài)生成國際化內(nèi)容瘪撇。(待研究學習...)

  • 5.1 創(chuàng)建帶xib的控制器获茬,設(shè)置其Label的布局與文字后,點擊右側(cè)Localizable添加多語言strings文本倔既。(建議變動的xib文本可以把控件與控制器關(guān)聯(lián)恕曲,在控制器中再進行國際化處理)

    xib-1.png

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

    xib-4.png

  • 5.3 分別在xib下不同的.strings文件設(shè)置對應(yīng)文本渤涌,切換系統(tǒng)后就會變更佩谣,顯示國際化對應(yīng)文本。

也可以把xib里的控件與其控制器關(guān)聯(lián)实蓬,在控制器中再進行國際化文本處理茸俭。


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

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

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

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

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

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

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

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


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

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

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

官網(wǎng)國際化指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼻由,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厚棵,更是在濱河造成了極大的恐慌蕉世,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婆硬,死亡現(xiàn)場離奇詭異狠轻,居然都是意外死亡,警方通過查閱死者的電腦和手機彬犯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門向楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查吊,“玉大人,你說我怎么就攤上這事湖蜕÷呗簦” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵昭抒,是天一觀的道長评也。 經(jīng)常有香客問我,道長灭返,這世上最難降的妖魔是什么盗迟? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮熙含,結(jié)果婚禮上诈乒,老公的妹妹穿的比我還像新娘。我一直安慰自己婆芦,他們只是感情好怕磨,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著消约,像睡著了一般肠鲫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上或粮,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天导饲,我揣著相機與錄音,去河邊找鬼氯材。 笑死渣锦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的氢哮。 我是一名探鬼主播袋毙,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冗尤!你這毒婦竟也來了听盖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤裂七,失蹤者是張志新(化名)和其女友劉穎皆看,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體背零,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡腰吟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徙瓶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毛雇。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡录语,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禾乘,到底是詐尸還是另有隱情澎埠,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布始藕,位于F島的核電站蒲稳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伍派。R本人自食惡果不足惜江耀,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诉植。 院中可真熱鬧祥国,春花似錦、人聲如沸晾腔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灼擂。三九已至壁查,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剔应,已是汗流浹背睡腿。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峻贮,地道東北人席怪。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像纤控,于是被迫代替她去往敵國和親挂捻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

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