iOS 多語(yǔ)言版本的開(kāi)發(fā)(一)
引言
多語(yǔ)言 & 本地化,隨你怎么叫褐桌,道理差不多;一個(gè)App 要想走出國(guó)門象迎,只支持一種語(yǔ)言是不能夠的荧嵌,也是不可能的,多元化世界已經(jīng)融入我們的生活砾淌,對(duì)于一些應(yīng)用啦撮,開(kāi)發(fā)多語(yǔ)言版本,已經(jīng)是不可避免的汪厨,特別是旅游等方面的應(yīng)用赃春;國(guó)內(nèi)也有很多App 已經(jīng)接入多語(yǔ)言,例如:支付寶劫乱、微信织中、收留我(嘻嘻,做下廣告)等衷戈;
開(kāi)發(fā)多語(yǔ)言狭吼,一般有兩種情況
1、App還沒(méi)有開(kāi)始寫殖妇,這個(gè)時(shí)候創(chuàng)建一個(gè)多語(yǔ)言版本刁笙,很是容易,然后再寫代碼的時(shí)候稍微留意下哪里需要保持多語(yǔ)言就行了谦趣;
2疲吸、App已經(jīng)上線了,而且之前沒(méi)有任何的為開(kāi)發(fā)多語(yǔ)言準(zhǔn)備過(guò)前鹅,這時(shí)候Boss讓開(kāi)發(fā)多語(yǔ)言版本摘悴,這下你就苦逼了,想想項(xiàng)目中長(zhǎng)長(zhǎng)短短的中文字符串舰绘,沒(méi)有上千也得上幾百了吧烦租,在想想一個(gè)一個(gè)替換,哎呀媽呀除盏,那么多叉橱,想想都想死了,在想想還容易出錯(cuò)者蠕,哎呀媽呀窃祝,讓我死了算了;
別急踱侣,這次我就針對(duì)兩種情況都講解下粪小;
項(xiàng)目剛開(kāi)始啟動(dòng)
1大磺、新建一個(gè)項(xiàng)目(我就不多說(shuō)了)
2、command + N 添加多語(yǔ)言文件探膊,如下圖
3杠愧、添加多語(yǔ)言,如圖
選擇English 點(diǎn)擊Localize
到這里已經(jīng)算是添加好了多語(yǔ)言文件逞壁,接下來(lái)就是添加多語(yǔ)言
之前的XCode(具體到哪一個(gè)版本之前流济,不清楚了,我使用的是XCode7)腌闯,是可以在如下圖中直接點(diǎn)擊?號(hào) 绳瘟,添加多語(yǔ)言的
現(xiàn)在需要進(jìn)入項(xiàng)目的Project中的Localizations 中進(jìn)行添加,如圖
我只添加了中文繁體姿骏,簡(jiǎn)體糖声,以及英文,Demo使用的StoryBoard, 而添加多語(yǔ)言時(shí)分瘦,我沒(méi)有選擇為StoryBoard添加多語(yǔ)言版本的蘸泻,畢竟是Demo??;但是不影響使用嘲玫。
到這里多語(yǔ)言文件中會(huì)出現(xiàn)如上圖中的三個(gè).strings 后綴的文件悦施,這就是多語(yǔ)言對(duì)應(yīng)的文件了,多語(yǔ)言添加的方式類似趁冈,字典 key=value 一一對(duì)應(yīng)的關(guān)系歼争,key 在三個(gè).strings 中必須一致拜马,而value 則分別對(duì)應(yīng)不同的語(yǔ)言字體渗勘,即可;
4俩莽、多語(yǔ)言文件的使用
現(xiàn)分別在不同的語(yǔ)言文件中添加如下測(cè)試文本:
"showTxt"="this is test text";
"showTxt"="這是一個(gè)測(cè)試的文本";
"showTxt"="這是一個(gè)測(cè)試的文本";
說(shuō)到使用旺坠,就要了解下NSLocalizedString
是什么
#define NSLocalizedString(key, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
其實(shí)就是宏,而宏定義的又是在資源文件中尋找對(duì)應(yīng)的資源文件扮超;在這里有個(gè)坑點(diǎn)取刃,當(dāng)你使用第一種實(shí)現(xiàn)多語(yǔ)言本地化,意味著你的多語(yǔ)言文件名字必須是Localizable
,否則你的多語(yǔ)言實(shí)現(xiàn)出刷,到最后顯示的卻只能是key璧疗;
第一種適合于,讓應(yīng)用跟隨系統(tǒng)的語(yǔ)言版本進(jìn)行切換馁龟,而用戶卻不能手動(dòng)進(jìn)行切換崩侠; 我們要實(shí)現(xiàn)的是既可以跟隨系統(tǒng),又可以用戶自己切換坷檩,就不能使用這一個(gè)了却音,那就要使用第二種NSLocalizedStringFromTable(key, tbl, comment)
?tbl這個(gè)參數(shù)改抡,就是我們自己命名的多語(yǔ)言文件名稱;
因此我們暫且這樣使用(這樣直接使用系瓢,會(huì)跟隨系統(tǒng)語(yǔ)言):
NSLocalizedStringFromTable(@"showTxt", @"ASLocalized", nil);
參數(shù)說(shuō)明: 第一個(gè)參數(shù)阿纤,是多語(yǔ)言中的key, 第二個(gè)參數(shù),是多語(yǔ)言文件的名字夷陋,第三個(gè)是對(duì)key的注釋說(shuō)明欠拾,一般為nil就可以了;
對(duì)于這樣使用NSLocalizedString("showTxt", nil)
肌稻,切記多語(yǔ)言文件名必須是Localizable
, 這里我們就不可以使用這種了清蚀;
到這里,就可以實(shí)現(xiàn)簡(jiǎn)單的跟隨系統(tǒng)語(yǔ)言的多語(yǔ)言版本了;
效果圖如下: