IOS開發(fā)之App語言國際化,內(nèi)部切換中英文等

今天項(xiàng)目中添加了一個需求想许,App設(shè)置中有個語言切換伶授,需要實(shí)現(xiàn)的效果是中英繁切換,針對APP國際化進(jìn)行操作流纹,使APP內(nèi)部控件顯示語言可以不隨系統(tǒng)語言做改變糜烹,自由切換:效果簡約如下:


切換中英文顯示

核心方法:

NSLocalizedStringFromTable(<#key#>,<#tbl#>,<#comment#>)

原理即在工程內(nèi)部建立 .String,在內(nèi)部采用鍵值對方式對所需要切換語言的文字進(jìn)行賦值

1.工程內(nèi)部創(chuàng)建.String文件漱凝,命名為Language.String


2.右側(cè)菜單欄點(diǎn)擊Localize疮蹦,彈出菜單選擇English,確定



3.第二步結(jié)束后選擇工程茸炒,選擇PROJECT愕乎,下方Localizations菜單中點(diǎn)擊+號選擇添加中文


4.此時Language.String中會顯示兩個文件阵苇,Language.String(Chinese) 和 Language.String(English),這一步像這兩個文件中添加鍵值對


英文文件中:

"denglu" = "Login";

"account" = "Phone number/email address";

"password" = "Password";

"verification" = "Verification code";

"message" = "SMS verification code";

"forget" = "Forget?";

"newregist" = "Registration";

"question" = "Problems";

中文文件中:

"denglu" = "登錄";

"account" = "請輸入手機(jī)號/郵箱";

"password" = "請輸入登錄密碼";

"verification" = "請輸入驗(yàn)證碼";

"message" = "通過短信驗(yàn)證碼登錄";

"forget" = "忘記密碼感论?";

"newregist" = "新用戶注冊";

"question" = "常見問題";

5.新建一個單例類绅项,ChangeLanguage,.h中添加屬性方法

#import <Foundation/Foundation.h>

@interface ChangeLanguage:NSObject

#define FGGetStringWithKeyFromTable(key, tbl)? [[ChangeLanguage sharedInstance] getStringForKey:key withTable:tbl]

@property(nonatomic,strong)NSString * language;

+(id)sharedInstance;

/**

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

*

*? @param key? key

*? @param table table

*

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

*/

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

/**

*? 改變當(dāng)前語言

*/

-(void)changeNowLanguage;

/**

*? 設(shè)置新的語言

*

*? @param language 新語言

*/

-(void)setNewLanguage:(NSString *)language;

@end

6.在.m中實(shí)現(xiàn)方法:

#import"ChangeLanguage.h"

#import"AppDelegate.h"

#define CNS @"zh-Hans"

#define EN @"en"

#define LANGUAGE_SET @"langeuageset"

@interface ChangeLanguage()

@property(nonatomic,strong)NSBundle * bundle;

@end

@implementation ChangeLanguage

static ChangeLanguage * sharedModel;

+(id)sharedInstance{

? ? if(!sharedModel){

? ? ? ? sharedModel=[[ChangeLanguage alloc]init];

? ? }

? ? ? ? return sharedModel;

? ?}

-(instancetype)init{

? ? self=[super init];

? ? if(self){

? ? ? ?[self initLanguage];

? ? }

? ? return self;

}

-(void)initLanguage{

? ? NSString*tmp=[[NSUserDefaults standardUserDefaults]objectForKey:LANGUAGE_SET];

? ? NSString*path;

? ? //默認(rèn)是中文?

? ? if([tmp isEqualToString:CNS]||!tmp){

? ? ? ? tmp=CNS;

? ? }else{

? ? ? ? tmp=EN;

? ?}

? ?self.language=tmp;//更改之前語言

? ?path=[[NSBundle mainBundle]pathForResource:self.language ofType:@"lproj"];

? ?self.bundle=[NSBundle bundleWithPath:path];

}

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

? ? if(self.bundle){

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

? ?}

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

}

-(void)changeNowLanguage{

? ?if([self.language isEqualToString:EN]){

? ? ? [self setNewLanguage:CNS];

}else{

? ? ? [self setNewLanguage:EN];

? ? ? ?}

}

-(void)setNewLanguage:(NSString*)language{

? ? ? if([language isEqualToString:self.language]){

? ? ? ? ?return;

? ? ?}

? ? //找到需要改成的語言路徑

? ?if([language isEqualToString:EN]||[language isEqualToString:CNS]){

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

? ? ? ?self.bundle=[NSBundle bundleWithPath:path];

? }

? self.language=language;NSLog(@"%@",language);

? [[NSUserDefaults standardUserDefaults]setObject:language forKey:LANGUAGE_SET];

? [[NSUserDefaults standardUserDefaults]synchronize];

? [self resetRootViewController];

}

//重新設(shè)置

-(void)resetRootViewController{

? ? ? ?AppDelegate * appDelegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];

? ? ? ?UIStoryboard * SB=[UIStoryboard storyboardWithName:@"Main"bundle:nil];

? ? ? ?UITabBarController * tabBarController=[SB

instantiateViewControllerWithIdentifier:@"tabBarController"];

? ? ? ?tabBarController=(UITabBarController *)appDelegate.window.rootViewController;

}

@end

7.具體使用:在具體方法中先調(diào)用changeNowLanguage方法比肄,然后用FGGetStringWithKeyFromTable賦值即可快耿;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芳绩,隨后出現(xiàn)的幾起案子掀亥,更是在濱河造成了極大的恐慌,老刑警劉巖妥色,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺浇,死亡現(xiàn)場離奇詭異,居然都是意外死亡垛膝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門丁稀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吼拥,“玉大人,你說我怎么就攤上這事线衫≡淇桑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵授账,是天一觀的道長枯跑。 經(jīng)常有香客問我,道長白热,這世上最難降的妖魔是什么敛助? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮屋确,結(jié)果婚禮上纳击,老公的妹妹穿的比我還像新娘。我一直安慰自己攻臀,他們只是感情好焕数,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刨啸,像睡著了一般堡赔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上设联,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天善已,我揣著相機(jī)與錄音灼捂,去河邊找鬼。 笑死雕拼,一個胖子當(dāng)著我的面吹牛纵东,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啥寇,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼偎球,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辑甜?” 一聲冷哼從身側(cè)響起衰絮,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磷醋,沒想到半個月后猫牡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邓线,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年淌友,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骇陈。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡震庭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出你雌,到底是詐尸還是另有隱情器联,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布婿崭,位于F島的核電站拨拓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氓栈。R本人自食惡果不足惜渣磷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望授瘦。 院中可真熱鬧幸海,春花似錦、人聲如沸奥务。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氯葬。三九已至挡篓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背官研。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工秽澳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戏羽。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓担神,卻偏偏與公主長得像,于是被迫代替她去往敵國和親始花。 傳聞我的和親對象是個殘疾皇子妄讯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344