? ??正當公司遠赴拉斯維加斯去參加CES展會的前夕,我們的產品總監屁顛屁顛地跑過來對我說:“這兩天幫我多做一個功能吧, 用戶可以設置各國各種語言的, 還要帶藍牙綁定功能的,用我們的手機app去控制我們的硬件設備,畢竟咱們也要去參加international的會展了,要做的高端大氣上檔次一點” ?我當時聽完后是一臉懵逼, 然后說:“好。” 接著就開始加班加點的趕工了。
?
??? 因為之前并沒有做過可以設置多國語言的這個功能的經驗, 所以我第一個想到的方法是新建一個.plist文件, 在文件中存儲各國所需的語言文本,并且編號。然而這個方案并不能實現在桌面改變app的名稱,使名稱也國際化。好在網上能搜到很多關于國際化設置語言的博客和教程,感謝網絡上各種開發工程師大牛的無私奉獻,接下來我的國際語言設置功能才一步步地完善。
?
??? 第一步,我們需要新建一個.strings文件,在Xcode6之前,每個工程都會自帶一個Infoplist.strings文件,Xcode6開始以后,就需要我們手動去建了。在菜單欄打開File>New>File,選擇Recource中的Strings File,點擊Next. 此時這個文件名字可以自己取,我命名為LanguageSet.strings. 這個文件是用來設置app內部的文字的。然后再用同樣的方法新建一個InfoPlist.strings文件,這個名字是固定的,不能自己隨便定義。這個文件將會用來設置app在桌面上顯示的名字。
?
??? 第二步,點擊工程,進入到PROJECT,然后在Info的Localizations欄點擊加號,添加想要的國家語種,比如我添加了English,那么現在我有了基本語言Chinese,和一個添加的語言English。然后回到我們的InfoPlist.strings文件,這個時候發現,在它的左邊多了個小箭頭,點擊一下,展開后會有它的子文件,分別是InfoPlist.strings(Base)(即我們的基本語言Chinese)和InfoPlist.strings(English)。接著在InfoPlist.strings(Base)中,添加 CFBundleDisplayName =?“你要的app中文名”;在InfoPlist.strings(English)中添加CFBundleDisplayName =?“English name for your app”;這些字段都添加完后,我們發現現在我們切換手機的系統語言后,app的名稱也會自動變為我們想要的語種。那么為什么是CFBundleDisplayName而不是別的字段呢?如果你在Info.plist點擊鼠標右鍵,選擇Show Raw Keys/Values,然后所有的Key值都變成了它底層顯示的Key值了。
?
??? 第三步,現在我們開始設置app內部的國際化語言了。第二步中設置app國際化名稱原理相同,也是一個key對應一個value的格式。在我們的LanguageSet.strings的文件左側,單機箭頭打開它的字文件,在LanguageSet.strings(Base)中添加?“text” =?“你好,蝸牛睡眠”;?在LanguageSet.strings(English)中添加?“text” =?“hello snail sleep”;其中”text”是我們所取的key值 = 號后面對應的文字,就是我們在app中展示出來的文字。那么該如何去使用這個key和value呢?我們可以先在viewController中添加一個UILabel對象,命名就為label吧,設置好這個label的大小及位置參數后,我們再設置這個label的文字。一般我們會是這樣設置 label.text = @“測試文字”;那么控制器上就會展示出測試文字這四個字,接著我們把 label 的文字設置為 label.text =? NSLocalizedString(<#key#>, <#comment#>);參數key填我們之前的@“text”(前面需要加@),參數comment可以為nil,這樣如果系統為中文環境那么就會展示“你好,蝸牛睡眠”,如果改為英文環境就會顯示”hello snail sleep”。到此為止,我們的app國際化語言功能基本就完成了。然而我還是太天真了……
?
??? 在以上都做完之后,產品總監又屁顛屁顛地跑過來對我說:“怎么在英文環境下不能設置成中文呀?我需要在英文環境下也能設置中文,快,再改改(微笑臉)。”聽完后,我又是一臉懵逼,然后也就是我們接下來的第四步了……
?
??? 第四步,如何在英文環境下也能把展示的文字變成我們中文設置的那些key和value呢?其實也不難,我們剛剛是使用 NSLocalizedString方法來獲取文字的。接下來,我們先創建一個 NSBundle 對象,命名為bundle。然后我們每次設置語言的時候,先把bundle的地址改換掉,bundle = [NSBundle bundleWithPath:path]; 變量path就是我們國際化語言包的地址,比如 path = [[NSBundle mainBundle] pathForResource:@“en” ofType:@“lproj”];這樣就獲得了英文的語言包地址,然后我們的label.text = [bundle localizedStringForKey:@“text” value:nil table:@“LanguageSet”];這樣即使在中文語言環境,也會從我們的英文語言包地址去獲取key和value,所以會展示出英文。注意table后面的參數,一定要和我們的LanguageSet.strings文件名對應,否則將無法獲取。
?
文末我要提一下,其實可以建一個語言管理類專門去管理語言設置,當然怎么去寫這個語言管理類,各人有各人的洗好,我也就不贅述了。此外,我在GitHub上放了語言設置的開源Demo,里面的代碼都是參考網絡上各種大神的文獻后去寫的,可惜我沒有一一記錄那些文獻的地址,非常感謝也非常抱歉。
Github:https://github.com/WayHouse/international-language-localsetting.
2021-12-06 蝸牛睡眠發布了 《錯過了這次15號線借夢告白,但我不想錯過你》的文章
2021-11-29 蝸牛睡眠發布了 《高嵩:做一家以科技改善睡眠的健康創新企業》的文章
2020-02-25 蝸牛睡眠獲得了抖音快手藍V認證&幫開5G直播帶貨的關注