iOS修改App默認(rèn)語言

現(xiàn)在越來越多的“螺絲”廠商加入了地球村,走上了國(guó)際大舞臺(tái)田晚,國(guó)際化的道路是越走越寬、越走越遠(yuǎn)智润,App也要國(guó)際化以避免不必要的使用障礙及舍,方能更好地服務(wù)于地球村,所以我們就先來說一說如何國(guó)際化(本地化)App窟绷。
在App開發(fā)過程中可Localize...本地化的文件很多锯玛,其中包括.string.xib(.nib)钾麸、.plist.json炕桨、.storyboard(故事板)饭尝、.bundle.xcassets(Image/Color Set)等等都是可以做本地化配置献宫。

.strings
.xib
.plist
.json
.storyboard
.bundle
.xcassets/Image
.xcassets/Color
在實(shí)際開發(fā)過程中不難發(fā)現(xiàn)以上文件會(huì)有一些共同之處钥平,一般在文件屬性配置區(qū)都能看到Localize...按鈕或者文件下拉列表區(qū)能看到xx.lproj文件夾,不同的是在多語言本地配置的方式上有所區(qū)別姊途。下面我們就以.json文件為例涉瘾,來實(shí)操一下如何將.json本地化(國(guó)際化),在不同的系統(tǒng)語言與地區(qū)下捷兰,展現(xiàn)不同的json數(shù)據(jù)立叛。
第一步:創(chuàng)建一個(gè)Localizable.json文件,并將文件添加進(jìn)項(xiàng)目中贡茅。Xcode沒有直接Command+N創(chuàng)建.json文件的選項(xiàng)秘蛇,我們可以使用終端命令行touch Localizable.json創(chuàng)建一個(gè).json文件內(nèi)容如下:

[
    {
        "country":"中國(guó)",
        "telCode":"+86"
    },
    {
        "country":"俄羅斯",
        "telCode":"+7"
    },
    {
        "country":"朝鮮",
        "telCode":"+850"
    },
    {
        "country":"巴基斯坦",
        "telCode":"+92"
    },
    {
        "country":"塞爾維亞",
        "telCode":"+381"
    }
]

第二步:開啟Localizable.json文件本地化能力,新增需要支持的國(guó)家語言配置顶考。在App開發(fā)過程中默認(rèn)的開發(fā)語言是English - Development Localization赁还,根據(jù)第一步創(chuàng)建的文件內(nèi)容,我們需要新增中國(guó)驹沿、俄羅斯艘策、朝鮮、巴基斯坦渊季、塞爾維亞五國(guó)語言朋蔫。

開啟本地化能力
添加多國(guó)語言
完成以上步驟后,現(xiàn)在的Localizable.json是這樣的:
Localizable.json

第三步:分別將本地化后生成的Localizable.json文件內(nèi)容進(jìn)行相應(yīng)翻譯却汉,這里使用的百度在線翻譯有道在線翻譯斑举。

中文(簡(jiǎn)體)
[
    {
        "country":"中國(guó)",
        "telCode":"+86"
    },
    {
        "country":"俄羅斯",
        "telCode":"+7"
    },
    {
        "country":"朝鮮",
        "telCode":"+850"
    },
    {
        "country":"巴基斯坦",
        "telCode":"+92"
    },
    {
        "country":"塞爾維亞",
        "telCode":"+381"
    }
]
俄語
[
    {
        "country":"Китай",
        "telCode":"+86"
    },
    {
        "country":"Россия",
        "telCode":"+7"
    },
    {
        "country":"Северн кор",
        "telCode":"+850"
    },
    {
        "country":"Пакистан",
        "telCode":"+92"
    },
    {
        "country":"сербия",
        "telCode":"+381"
    }
]
朝鮮語
[
    {
        "country":"??",
        "telCode":"+86"
    },
    {
        "country":"???",
        "telCode":"+7"
    },
    {
        "country":"??",
        "telCode":"+850"
    },
    {
        "country":"????",
        "telCode":"+92"
    },
    {
        "country":"????",
        "telCode":"+381"
    }
]
烏爾都語(巴基斯坦)
[
    {
        "country":"???",
        "telCode":"+86"
    },
    {
        "country":"???",
        "telCode":"+7"
    },
    {
        "country":"???? ?????",
        "telCode":"+850"
    },
    {
        "country":"???????",
        "telCode":"+92"
    },
    {
        "country":"????",
        "telCode":"+381"
    }
]
塞爾維亞語
[
    {
        "country":"Кина",
        "telCode":"+86"
    },
    {
        "country":"Руси?а",
        "telCode":"+7"
    },
    {
        "country":"Северна Коре?а",
        "telCode":"+850"
    },
    {
        "country":"Пакистан",
        "telCode":"+92"
    },
    {
        "country":"Срби?а",
        "telCode":"+381"
    }
]
英語
[
    {
        "country":"China",
        "telCode":"+86"
    },
    {
        "country":"Russia",
        "telCode":"+7"
    },
    {
        "country":"North Korea",
        "telCode":"+850"
    },
    {
        "country":"Pakistan",
        "telCode":"+92"
    },
    {
        "country":"Serbia",
        "telCode":"+381"
    }
]

第四步:編譯運(yùn)行App,修改手機(jī)系統(tǒng)設(shè)置語言與地區(qū)項(xiàng)病涨,切換以上五國(guó)官方語言(不含英語)分別查看App內(nèi)展示內(nèi)容富玷。

不同語言展示內(nèi)容
不出意外的話,應(yīng)該都會(huì)得到上述的結(jié)果,如果你覺得這樣就OK了赎懦,甚至腦子里開始浮現(xiàn)老外用戶各種開心的樣子時(shí)雀鹃,其實(shí)隱藏的坑正躺在那里,你的老外用戶隨時(shí)都有可能踩破那個(gè)坑励两。

坑@杈ァ!当悔!

當(dāng)你覺得應(yīng)該傅瞻、已經(jīng)沒有坑的時(shí)候,我們應(yīng)該千方百計(jì)去制造可能的坑盲憎。正如上述過于簡(jiǎn)單的過程和輕易得到的結(jié)果嗅骄,后面一定隱藏著出人意料的大坑,所以我們的項(xiàng)目(實(shí)操)還沒有結(jié)束饼疙,下面我們將手機(jī)系統(tǒng)設(shè)置語言與地區(qū)項(xiàng)設(shè)置成五國(guó)語言以外的語言比如日語溺森,再來看看App內(nèi)會(huì)展示什么內(nèi)容。

日語下的App
你會(huì)發(fā)現(xiàn)雖然手機(jī)系統(tǒng)語言已切換成日語窑眯,但App內(nèi)卻顯示的是中文屏积,你肯定又開始疑惑了為什么不是English,畢竟上述我們提到默認(rèn)語言是English磅甩,所以你依舊很是不甘炊林,覺得至少應(yīng)該也要顯示的是English內(nèi)容,如果是這樣卷要,那這個(gè)坑你是踩定了铛铁!

修改App默認(rèn)語言

由這個(gè)坑引出本篇文章的主題《修改App默認(rèn)語言》,上段我們說到日語環(huán)境下App內(nèi)顯示的是中文內(nèi)容却妨,很顯然此時(shí)的App默認(rèn)語言應(yīng)該還是中文(簡(jiǎn)體)饵逐,那么如何修改App默認(rèn)語言呢?比如我想把默認(rèn)語言設(shè)置成English彪标,在五國(guó)以外的語言統(tǒng)統(tǒng)顯示為English倍权,那肯定有人支招了:
第一招:修改Info.plist屬性配置,添加Localization native development region或者Development localization屬性值為en或者English捞烟。

屬性1
屬性2
不知道是不是由于姿勢(shì)不對(duì)薄声,還是因?yàn)閄code照的是大中國(guó)的月亮,然并卵题画,可能還要加一個(gè)Localized resources can be mixed屬性配置默辨,值設(shè)置為YES
屬性3
本以為可以出現(xiàn)奇跡苍息,結(jié)果又很意外缩幸,可能真的是因?yàn)榇笾袊?guó)的月亮沒外國(guó)的圓壹置、美、亮還大表谊,最終還是宣告失敗钞护。
第二招:打開Xcode導(dǎo)航欄菜單Product>Scheme>Edit Scheme>App Language選擇要設(shè)置的默認(rèn)語言。
設(shè)置默認(rèn)語言
設(shè)置默認(rèn)語言
這一招操作起來簡(jiǎn)單爆办,而且暫時(shí)可以滿足預(yù)期的效果难咕,而且無論App Language設(shè)置成五國(guó)以外的其他什么語言,App內(nèi)這回都會(huì)顯示English內(nèi)容距辆,但是余佃,問題來了,比如下圖的操作:
當(dāng)Localizable.json勾掉BaseEnglish本地配置時(shí)[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"]會(huì)找不到Localizable.json的文件路徑跨算,說白點(diǎn)以下調(diào)用會(huì)直接導(dǎo)致App報(bào)錯(cuò)退出

NSString *filePath =[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

因?yàn)?code>filePath沒有值爆土,進(jìn)而data也為nil,最后導(dǎo)致Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'漂彤,結(jié)果就是App閃退雾消,只有勾上BaseEnglish其中任一項(xiàng)灾搏,App會(huì)以其作為默認(rèn)語言并做對(duì)應(yīng)的內(nèi)容展示挫望,當(dāng)兩項(xiàng)同時(shí)勾上時(shí),會(huì)優(yōu)先選擇English作為App的默認(rèn)語言狂窑,所以在使用第二招時(shí)媳板,要確保BaseEnglish至少有一項(xiàng)是勾選上的,否則就有可能出現(xiàn)上述的情況泉哈。
第三招:使用KVC機(jī)制修改App默認(rèn)語言蛉幸,但是這種方式,只有在App再次啟動(dòng)時(shí)才會(huì)生效丛晦,也就是說奕纫,一旦采用KVC去修改App語言環(huán)境,就應(yīng)該給用戶附加一個(gè)彈窗交互烫沙,提示用戶完全關(guān)閉kill掉整個(gè)App的進(jìn)程匹层,重新啟動(dòng)App。

[[NSUserDefaults standardUserDefaults] setValue:@[@"語言代號(hào)"] forKey:@"AppleLanguages"];

其中語言代號(hào)可以在首選語言列表中去選擇:[NSLocale preferredLanguages];當(dāng)你隨意填寫一個(gè)語言代號(hào)去KVC一個(gè)默認(rèn)App語言锌蓄,那么恭喜你[NSLocale preferredLanguages]后面會(huì)以這個(gè)隨意的語言代號(hào)為唯一元素的NSarray作為返回值升筏,即使是重啟App,但App會(huì)以English作為默認(rèn)語言展示內(nèi)容瘸爽。
最后總結(jié)一下您访,以上三個(gè)辦法,第二招是最方便剪决、最簡(jiǎn)單灵汪、最實(shí)用的檀训,其次是第二招,而第一招是徒勞识虚,所以你以為這樣就完了嗎肢扯,13不答應(yīng)!

13重磅出擊担锤,支持App獨(dú)立語言設(shè)置

在說13支持App獨(dú)立語言設(shè)置之前蔚晨,先來溫故下App同步系統(tǒng)語言之首選語言順序的那些事。還是以上述實(shí)操例子中的五國(guó)語言為例肛循,首先我們?cè)谠O(shè)置iPhone語言時(shí)铭腕,當(dāng)所選擇的語言為五國(guó)語言之一時(shí),App會(huì)按照所選的語言做對(duì)應(yīng)的內(nèi)容展示多糠,就像這樣

不同語言展示對(duì)應(yīng)內(nèi)容
如果將iPhone語言設(shè)置為五國(guó)語言之外時(shí)累舷,App會(huì)按照首選語言順序從上往下的順序查找所支持的語言,當(dāng)查到所支持的語言時(shí)夹孔,App會(huì)以此語言作為App語言來做對(duì)應(yīng)的內(nèi)容展示
優(yōu)先選擇支持語言
優(yōu)先選擇支持語言
優(yōu)先選擇支持語言

再來說13支持App獨(dú)立語言設(shè)置:打開設(shè)置>LocalizationsDemo(App名稱)>語言被盈,選擇語言。
設(shè)置App獨(dú)立語言
不難最開始的時(shí)候搭伤,App首選語言(建議語言)列表和手機(jī)系統(tǒng)的首選語言順序列表并不是一致的
首選語言
一旦App設(shè)置了獨(dú)立語言只怎,無論手機(jī)系統(tǒng)語言切換成什么語言,App內(nèi)部均會(huì)以設(shè)置的獨(dú)立語言來展示App內(nèi)的內(nèi)容怜俐。
設(shè)置App獨(dú)立語言

最后說一個(gè)很奇怪的現(xiàn)象身堡,當(dāng)將手機(jī)設(shè)置>語言與地區(qū)>首選語言列表中的語言刪減至只有一條時(shí),在手機(jī)設(shè)置主頁會(huì)發(fā)現(xiàn)我們的App會(huì)從底部的應(yīng)用列表中移除拍鲤,但當(dāng)你重新添加一條首選語言后贴谎,手機(jī)設(shè)置主頁底部的應(yīng)用列表中又會(huì)出現(xiàn)我們的App

.END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末季稳,一起剝皮案震驚了整個(gè)濱河市擅这,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌景鼠,老刑警劉巖仲翎,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莲蜘,居然都是意外死亡谭确,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門票渠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逐哈,“玉大人,你說我怎么就攤上這事问顷“和海” “怎么了禀梳?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肠骆。 經(jīng)常有香客問我算途,道長(zhǎng),這世上最難降的妖魔是什么蚀腿? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任嘴瓤,我火速辦了婚禮,結(jié)果婚禮上莉钙,老公的妹妹穿的比我還像新娘廓脆。我一直安慰自己,他們只是感情好磁玉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布停忿。 她就那樣靜靜地躺著,像睡著了一般蚊伞。 火紅的嫁衣襯著肌膚如雪席赂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天时迫,我揣著相機(jī)與錄音颅停,去河邊找鬼。 笑死别垮,一個(gè)胖子當(dāng)著我的面吹牛便监,可吹牛的內(nèi)容都是我干的扎谎。 我是一名探鬼主播碳想,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼毁靶!你這毒婦竟也來了胧奔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤预吆,失蹤者是張志新(化名)和其女友劉穎龙填,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拐叉,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岩遗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凤瘦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宿礁。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔬芥,靈堂內(nèi)的尸體忽然破棺而出梆靖,到底是詐尸還是另有隱情控汉,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布返吻,位于F島的核電站姑子,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏测僵。R本人自食惡果不足惜街佑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捍靠。 院中可真熱鬧舆乔,春花似錦、人聲如沸剂公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纲辽。三九已至颜武,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拖吼,已是汗流浹背鳞上。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吊档,地道東北人篙议。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怠硼,于是被迫代替她去往敵國(guó)和親鬼贱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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