現(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)
等等都是可以做本地化配置献宫。
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ó)語言朋蔫。
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)容富玷。
坑@杈ァ!当悔!
當(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內(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
捞烟。
Localized resources can be mixed
屬性配置默辨,值設(shè)置為YES
。第二招:打開Xcode導(dǎo)航欄菜單
Product
>Scheme
>Edit Scheme
>App Language
選擇要設(shè)置的默認(rèn)語言。App Language
設(shè)置成五國(guó)以外的其他什么語言,App內(nèi)這回都會(huì)顯示English
內(nèi)容距辆,但是余佃,問題來了,比如下圖的操作:Localizable.json
勾掉Base
和English
本地配置時(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閃退雾消,只有勾上Base
和English
其中任一項(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í)媳板,要確保Base
和English
至少有一項(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)容展示多糠,就像這樣
iPhone語言
設(shè)置為五國(guó)語言之外時(shí)累舷,App會(huì)按照首選語言順序
從上往下的順序查找所支持的語言,當(dāng)查到所支持的語言時(shí)夹孔,App會(huì)以此語言作為App語言來做對(duì)應(yīng)的內(nèi)容展示再來說13支持App獨(dú)立語言設(shè)置:打開
設(shè)置
>LocalizationsDemo(App名稱)
>語言
被盈,選擇語言。建議語言
)列表和手機(jī)系統(tǒng)的首選語言順序
列表并不是一致的 最后說一個(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
。