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








Localize...按鈕或者文件下拉列表區(qū)能看到xx.lproj文件夾,不同的是在多語言本地配置的方式上有所區(qū)別。下面我們就以.json文件為例,來實操一下如何將.json本地化(國際化),在不同的系統(tǒng)語言與地區(qū)下,展現(xiàn)不同的json數(shù)據(jù)。第一步:創(chuàng)建一個
Localizable.json文件,并將文件添加進項目中。Xcode沒有直接Command+N創(chuàng)建.json文件的選項,我們可以使用終端命令行touch Localizable.json創(chuàng)建一個.json文件內(nèi)容如下:
[
{
"country":"中國",
"telCode":"+86"
},
{
"country":"俄羅斯",
"telCode":"+7"
},
{
"country":"朝鮮",
"telCode":"+850"
},
{
"country":"巴基斯坦",
"telCode":"+92"
},
{
"country":"塞爾維亞",
"telCode":"+381"
}
]
第二步:開啟Localizable.json文件本地化能力,新增需要支持的國家語言配置。在App開發(fā)過程中默認的開發(fā)語言是English - Development Localization,根據(jù)第一步創(chuàng)建的文件內(nèi)容,我們需要新增中國、俄羅斯、朝鮮、巴基斯坦、塞爾維亞五國語言。


Localizable.json是這樣的:
第三步:分別將本地化后生成的
Localizable.json文件內(nèi)容進行相應(yīng)翻譯,這里使用的百度在線翻譯和有道在線翻譯。
中文(簡體)
[
{
"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":"Кина",
"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"
}
]
第四步:編譯運行App,修改手機系統(tǒng)設(shè)置語言與地區(qū)項,切換以上五國官方語言(不含英語)分別查看App內(nèi)展示內(nèi)容。

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

日語,但App內(nèi)卻顯示的是中文,你肯定又開始疑惑了為什么不是English,畢竟上述我們提到默認語言是English,所以你依舊很是不甘,覺得至少應(yīng)該也要顯示的是English內(nèi)容,如果是這樣,那這個坑你是踩定了!
修改App默認語言
由這個坑引出本篇文章的主題《修改App默認語言》,上段我們說到日語環(huán)境下App內(nèi)顯示的是中文內(nèi)容,很顯然此時的App默認語言應(yīng)該還是中文(簡體),那么如何修改App默認語言呢?比如我想把默認語言設(shè)置成English,在五國以外的語言統(tǒng)統(tǒng)顯示為English,那肯定有人支招了:
第一招:修改Info.plist屬性配置,添加Localization native development region或者Development localization屬性值為en或者English。


Localized resources can be mixed屬性配置,值設(shè)置為YES。
第二招:打開Xcode導(dǎo)航欄菜單
Product>Scheme>Edit Scheme>App Language選擇要設(shè)置的默認語言。

App Language設(shè)置成五國以外的其他什么語言,App內(nèi)這回都會顯示English內(nèi)容,但是,問題來了,比如下圖的操作:
Localizable.json勾掉Base和English本地配置時[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"]會找不到Localizable.json的文件路徑,說白點以下調(diào)用會直接導(dǎo)致App報錯退出
NSString *filePath =[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
因為filePath沒有值,進而data也為nil,最后導(dǎo)致Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil',結(jié)果就是App閃退,只有勾上Base和English其中任一項,App會以其作為默認語言并做對應(yīng)的內(nèi)容展示,當兩項同時勾上時,會優(yōu)先選擇English作為App的默認語言,所以在使用第二招時,要確保Base和English至少有一項是勾選上的,否則就有可能出現(xiàn)上述的情況。
第三招:使用KVC機制修改App默認語言,但是這種方式,只有在App再次啟動時才會生效,也就是說,一旦采用KVC去修改App語言環(huán)境,就應(yīng)該給用戶附加一個彈窗交互,提示用戶完全關(guān)閉kill掉整個App的進程,重新啟動App。
[[NSUserDefaults standardUserDefaults] setValue:@[@"語言代號"] forKey:@"AppleLanguages"];
其中語言代號可以在首選語言列表中去選擇:[NSLocale preferredLanguages];當你隨意填寫一個語言代號去KVC一個默認App語言,那么恭喜你[NSLocale preferredLanguages]后面會以這個隨意的語言代號為唯一元素的NSarray作為返回值,即使是重啟App,但App會以English作為默認語言展示內(nèi)容。
最后總結(jié)一下,以上三個辦法,第二招是最方便、最簡單、最實用的,其次是第二招,而第一招是徒勞,所以你以為這樣就完了嗎,13不答應(yīng)!
13重磅出擊,支持App獨立語言設(shè)置
在說13支持App獨立語言設(shè)置之前,先來溫故下App同步系統(tǒng)語言之首選語言順序的那些事。還是以上述實操例子中的五國語言為例,首先我們在設(shè)置iPhone語言時,當所選擇的語言為五國語言之一時,App會按照所選的語言做對應(yīng)的內(nèi)容展示,就像這樣

iPhone語言設(shè)置為五國語言之外時,App會按照首選語言順序從上往下的順序查找所支持的語言,當查到所支持的語言時,App會以此語言作為App語言來做對應(yīng)的內(nèi)容展示


再來說13支持App獨立語言設(shè)置:打開
設(shè)置>LocalizationsDemo(App名稱)>語言,選擇語言。
建議語言)列表和手機系統(tǒng)的首選語言順序列表并不是一致的 

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