取得App此時此刻採用的語言

iOS是百年難得一見的語言天才,除了火星文之外,地球上根本沒有難得倒它的語言。因此想在iOS上做出支援各國語言,打入國際市場的App,實在是件再簡單不過的小事。

當App在iOS上執行時,其顯示的語言將依據系統偏好的語言順序列表。如上圖所示,列表的前三名依序是繁中,日文,英文。假設此時我們專案裡設定支援的語言為英文和日文,如下圖Localizations區塊所示。(雖然iOS支援各國語言,但App要真正支援還是必須花錢請人翻譯。App尚未賺錢,目前彼得潘只能目標App最賺錢的兩大市場,英文和日文。)

若是使用者的偏好語言Top 1剛好是英文或日文,那麼很簡單,我們辛苦花錢翻譯的文字,都可以完美地呈現。但是,如果今天Top 1的是其它語言,比方繁中,那App到底會顯示何種語言呢?

很簡單。系統將從偏好列表查詢,以排名在前的為優先。此時由於日文在英文前面,所以App將呈現日文。(若是在偏好列表找不到App支援的語言,App將顯示我們設定的default語言。若是沒有特別調整,App預設的default語言將為英文)

大部份的時候,我們其實完全不需煩心語言的轉換,App會聰明地套用對應語言的文字和圖片。然而在某些特殊情況,我們還是需要費心地另外寫程式做判斷。比方當圖片是在Images.xcassets下時,由於它不能依語言設定不同圖片,因此我們需要從程式判斷此時App採用的語言來選擇合適的圖片。

此時我們第一個想到的方法是取得系統目前的語言。經由NSUserDefaults裡查詢AppleLanguages,我們可以輕易取得系統目前設定的語言。

 var defaults = NSUserDefaults.standardUserDefaults()
var lans = defaults.objectForKey(“AppleLanguages”) as NSArray!
var lan = lans.firstObject as String

然而令人意外的,採用此法其實是大錯特錯! 比方在剛剛的例子裡,目前系統的語言是繁中。但我們知道,App此時此刻採用的語言卻是日文,因此我們真正希望取得的資訊,其實是目前App採用的語言,而不是系統的語言。同樣簡單地,只要經由NSBundle物件的preferredLocalizations property,我們即可取得目前App採用的語言array, 而array裡的第一個成員,正是我們心之所向,App目前採用的語言!

var array = NSBundle.mainBundle().preferredLocalizations
var lan = array.first