iOS 國際化處理

iOS國際化原理分析

國際化其實(shí)都大同小異姿染,其核心思想就是為每種語言單獨(dú)定義一份資源背亥。

iOS就是通過xxx.lproj目錄來定義每個(gè)語言的資源,這里的資源可以是圖片悬赏,文本狡汉,Storyboard,Xib等闽颇。我們在項(xiàng)目中可以看到的物理目錄結(jié)構(gòu)


每種語言都有自己的語言代碼.lproj文件夾盾戴,加載資源時(shí)只需要加載相應(yīng)語言文件夾下的資源就OK,這步可以系統(tǒng)為我們完成兵多,也可以手動去做尖啡。

一、 根據(jù)本地設(shè)置自動切換國際化語言

1. 添加項(xiàng)目支持的國際化語言剩膘。

首先點(diǎn)擊項(xiàng)目->PROJECT->Info->Localizations中添加要支持的語言.


此處Use Base Internationalization開啟狀態(tài)下衅斩,每個(gè)國際化資源文件會有個(gè)Base選項(xiàng),主要針對String援雇,Storyboard矛渴,Xib作為一個(gè)基礎(chǔ)的模板。

在點(diǎn)擊+ 添加相應(yīng)語言時(shí)會彈出以下對話框惫搏,意思是為現(xiàn)有的資源添加語言文件具温,我們點(diǎn)擊Finish就行了.

2.創(chuàng)建Localizable.strings文件,它是iOS默認(rèn)加載的文件筐赔,如果想用自定義名稱命名铣猩,在使用NSLocalizedString方法時(shí)指定tableName為自定義名稱就好了,但你的應(yīng)用規(guī)模不是很大就不要分模塊搞特殊了茴丰。

每個(gè)資源文件如果想為一種語言添加支持达皿,通過其屬性面板中的Localization添加相應(yīng)語言就行了天吓,此時(shí)Localizable.strings處于可展開狀態(tài),子級有著相應(yīng)語言的副本峦椰。我們把相應(yīng)語言的文本放在副本里面就行了.

3. ?在string文件中創(chuàng)建相應(yīng)的key龄寞,value值,類似于這樣汤功。


然后就是創(chuàng)建宏了

#define MyNSLocalizedString(key)? ? NSLocalizedString(key, nil)

這樣在每個(gè)賦值的地方都用到這宏來賦值物邑。

注意啦,這里只是最基本的做法滔金,現(xiàn)在告訴大家一個(gè)偷懶的方法色解,那就是給需要賦值的控件添加分類,然后通過runtime機(jī)制餐茵,將給控件設(shè)置文本的方法替換成自己的方法科阎,然后再里面實(shí)現(xiàn)國際化操作。下面以UILabel的分類為例

```

#import "UILabel+SGLocalizable.h"

#import@implementation UILabel (SGLocalizable)

- (void)setNeedChange:(BOOL)needChange

{

?objc_setAssociatedObject(self, @"needChange", @(needChange), ? ? ? ? OBJC_ASSOCIATION_ASSIGN);

}

- (BOOL)needChange

{

return [objc_getAssociatedObject(self, @"needChange") boolValue];

}

+ (void)load{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

Class class = [self class];

SEL originalInitSelector = @selector(setText:);

Method originalInitMethod = class_getInstanceMethod(class, originalInitSelector);

SEL swizzledInitSelector = @selector(setSGText:);

Method swizzledInitMethod = class_getInstanceMethod(class, swizzledInitSelector);

BOOL didInitAddMethod =

class_addMethod(class,

originalInitSelector,

method_getImplementation(swizzledInitMethod),

method_getTypeEncoding(swizzledInitMethod));

if (didInitAddMethod) {

class_replaceMethod(class,

swizzledInitSelector,

method_getImplementation(originalInitMethod),

method_getTypeEncoding(originalInitMethod));

} else {

method_exchangeImplementations(originalInitMethod, swizzledInitMethod);

}

});

}

- (void)setSGText:(NSString *)text

{

if (self.needChange == YES)

{

[self setSGText:text];

}

else

{

//? ? ? ? NSString *str = MyNSLocalizedString(text);

[self setSGText:DTGetStringWithKeyFromTable(text,@"Localizable")];

}

}

```

二忿族、 應(yīng)用內(nèi)切換國際化語言

應(yīng)用內(nèi)切換語言锣笨,實(shí)際上就是根據(jù)其原理來設(shè)置的。上面已經(jīng)講到道批,iOS就是通過xxx.lproj目錄來定義每個(gè)語言的資源票唆。

1. 首先創(chuàng)建一個(gè)國際化的管理類

```

+ (id)sharedInstance

{

if (!sharedModel)

{

sharedModel = [[DTLanguageUtils alloc]init];

}

return sharedModel;

}

-(instancetype)init

{

self = [super init];

if (self)

{

[self initLanguage];

}

return self;

}

```

在初始化的時(shí)候需要判斷當(dāng)前的系統(tǒng)設(shè)置是何種語言。

```

languageStr = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] firstObject]];

```

得到的languageStr就是資源文件夾的名稱 比如zh-Hans屹徘,en走趋。

2. 然后接下來是設(shè)置語言。

```

-(void)setNewLanguage:(LanguageType )language{

if (language ==self.languageType)

{

return;

}

switch (language) {

case LanguageTypeZHCN:

{

NSString *path = [[NSBundle mainBundle]pathForResource:CNS ofType:@"lproj"];

self.bundle = [NSBundle bundleWithPath:path];

}

break;

case LanguageTypeZHTK:

{

NSString *path = [[NSBundle mainBundle]pathForResource:CNT ofType:@"lproj"];

self.bundle = [NSBundle bundleWithPath:path];

}

break;

case LanguageTypeEN:

{

NSString *path = [[NSBundle mainBundle]pathForResource:EN ofType:@"lproj"];

self.bundle = [NSBundle bundleWithPath:path];

}

break;

default:

break;

}

self.languageType = language;

[MyUserDefaults setObject:@(language) forKey:LanguageMode];

[MyUserDefaults synchronize];

[self resetRootViewController];

}

/**

*? 返回table中指定的key的值

*

*? @param key? key

*? @param table table

*

*? @return 返回table中指定的key的值

*/

-(NSString *)getStringForKey:(NSString *)key withTable:(NSString *)table

{

if (self.bundle)

{

return NSLocalizedStringFromTableInBundle(key, table, self.bundle, @"");

}

return NSLocalizedStringFromTable(key, table, @"");

}

```

最后就是定義一個(gè)獲取多語言的宏了

#define DTGetStringWithKeyFromTable(key, tbl)? ? ? [[DTLanguageUtils sharedInstance] getStringForKey:key withTable:tbl]

完結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末噪伊,一起剝皮案震驚了整個(gè)濱河市簿煌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鉴吹,老刑警劉巖姨伟,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豆励,居然都是意外死亡夺荒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門良蒸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來技扼,“玉大人,你說我怎么就攤上這事嫩痰〗宋牵” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵串纺,是天一觀的道長丽旅。 經(jīng)常有香客問我椰棘,道長,這世上最難降的妖魔是什么榄笙? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任邪狞,我火速辦了婚禮,結(jié)果婚禮上茅撞,老公的妹妹穿的比我還像新娘外恕。我一直安慰自己,他們只是感情好乡翅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罪郊,像睡著了一般蠕蚜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悔橄,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天靶累,我揣著相機(jī)與錄音,去河邊找鬼癣疟。 笑死挣柬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的睛挚。 我是一名探鬼主播邪蛔,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扎狱!你這毒婦竟也來了侧到?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淤击,失蹤者是張志新(化名)和其女友劉穎匠抗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體污抬,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汞贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了印机。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矢腻。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖射赛,靈堂內(nèi)的尸體忽然破棺而出踏堡,到底是詐尸還是另有隱情,我是刑警寧澤咒劲,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布顷蟆,位于F島的核電站诫隅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帐偎。R本人自食惡果不足惜逐纬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望削樊。 院中可真熱鬧豁生,春花似錦、人聲如沸漫贞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迅脐。三九已至芍殖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谴蔑,已是汗流浹背豌骏。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隐锭,地道東北人窃躲。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像钦睡,于是被迫代替她去往敵國和親蒂窒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • 最近被安排處理一下舊項(xiàng)目的國際化處理荞怒。寫篇文章記錄下心得刘绣,也希望能為遇到問題的你提供點(diǎn)思路。開始進(jìn)入正題挣输。 國際化...
    碼動人生閱讀 1,080評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • 今天開始分析YYCache 包含的文件類 YYCache YYMemoryCache YYDiskCache YY...
    充滿活力的早晨閱讀 792評論 4 1
  • 本文主要講解國際化相關(guān)的知識點(diǎn): 國際化設(shè)置及默認(rèn)語言設(shè)置 國際化文件格式互轉(zhuǎn):xml纬凤,excel,strings...
    A_rcher34閱讀 927評論 0 2
  • 最近項(xiàng)目再做國際化處理, 記錄一下,方便以后參考,這里面有些是自己寫的,有些是從網(wǎng)上找的.僅供參考 環(huán)境是 Xco...
    Zakerberg閱讀 273評論 0 1