iOS 超簡單的應(yīng)用內(nèi)切換語言

  • 應(yīng)用國際化 是現(xiàn)在很多app 都在做的了划咐。怎么國際化 相信在看這篇文章之前 都應(yīng)該了會了,就不在贅述了切威。直奔主題勺馆。在應(yīng)用內(nèi)切換語言库物。
  • 當我們做過應(yīng)用的語言國際化了,當系統(tǒng)語言更改后粘茄,我們的客戶端內(nèi)使用NSLocalizedString(@"key", @"")方法签舞,語言也會對應(yīng)的改變,這是做內(nèi)部切換的前提柒瓣。
  • 思路:使用NSUserDefaults 用一個key記錄一個自設(shè)置語言,打開應(yīng)用時儒搭,如果沒有這個記錄語言,使用系統(tǒng)該語言芙贫,并存入NSUserDefaults的這個key搂鲫。如果我們內(nèi)部進行了切換,切換的語言存入NSUserDefaults這個key.
    打開應(yīng)用的時運行的邏輯就是 :這個key有語言就使用該語言磺平,沒有就用系統(tǒng)的語言.
  • 邏輯簡單魂仍,代碼更是簡單.我們先寫一個類方便統(tǒng)一管理.
  • .h文件暴露以下幾個方法
 @interface ZBLocalized : NSObject

 + (ZBLocalized *)sharedInstance;

 //初始化多語言功能
 - (void)initLanguage;

 //當前語言
 - (NSString *)currentLanguage;

 //設(shè)置要轉(zhuǎn)換的語言
 - (void)setLanguage:(NSString *)language;

 //設(shè)置為系統(tǒng)語言
 - (void)systemLanguage;
  • .m
  - (void)initLanguage{
      NSString *language=[self currentLanguage];
      if (language.length>0) {
          NSLog(@"自設(shè)置語言:%@",language);
      }else{
          [self systemLanguage];
      }
  }
    - (NSString *)currentLanguage{
        NSString *language=[[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];
    return language;
    }
  - (void)setLanguage:(NSString *)language{
    [[NSUserDefaults standardUserDefaults] setObject:language forKey:AppLanguage];
    [[NSUserDefaults standardUserDefaults] synchronize];
  }

設(shè)置 NSUserDefaults 設(shè)置語言的key @"appLanguage"
并設(shè)置代替NSLocalizedString(@"key", @"")的宏 ,新宏名為:ZBLocalized(@"key", @"")

//語言切換
static NSString * const AppLanguage = @"appLanguage";
#define ZBLocalized(key, comment)  [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:AppLanguage]] ofType:@"lproj"]] localizedStringForKey:(key) value:@"" table:nil]

下面這個方法需要說明以下 ,是個坑拣挪。 我們語言文件Localizable.strings 是存在.lproj文件里的擦酌,比如英文的是 en.lproj ,而在升級ios9之后中英文目錄名字改了菠劝。在真機上赊舶,中文資源目錄名由zh-Hans---->zh-Hans-CN,英文資源目錄名由en---->en-CN赶诊,ios9模擬器上面的中英文資源目錄名和真機上面的不一樣笼平,分別是zh-Hans-US,en-US舔痪。所以我們要自己判斷一下出吹,去掉后面的CN或US。

- (void)systemLanguage{
    NSString *languageCode = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0];
    NSLog(@"系統(tǒng)語言:%@",languageCode);
    if([languageCode hasPrefix:@"zh-Hant"]){
        languageCode = @"zh-Hant";//繁體中文
    }else if([languageCode hasPrefix:@"zh-Hans"]){
        languageCode = @"zh-Hans";//簡體中文
    }else if([languageCode hasPrefix:@"pt"]){
        languageCode = @"pt";//葡萄牙語
    }else if([languageCode hasPrefix:@"es"]){
        languageCode = @"es";//西班牙語
    }else if([languageCode hasPrefix:@"th"]){
        languageCode = @"th";//泰語
    }else if([languageCode hasPrefix:@"hi"]){
        languageCode = @"hi";//印地語
    }else if([languageCode hasPrefix:@"en"]){
        languageCode = @"en";//英語
    }else{
        languageCode = @"en";//英語
    }
    [self setLanguage:languageCode];
}

方法寫完 就是這么簡單辙喂。
先準備 Localizable.strings 文件


1D858AD2-2099-47E0-A148-D6B91E818AAD.png
0BD7062A-DEF5-44B9-82F8-6D519CC5D096.png

使用時在AppDelegate 要進行初始化 注意 一定要在根視圖初始化的前面捶牢。比如tabbar 否則鸠珠,你切換語言后 tabbar是不會改變的 .

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor=[UIColor whiteColor];
    
    [[ZBLocalized sharedInstance]initLanguage];//放在tabbar前初始化
    
    TabBarController *tabbar=[[TabBarController alloc]init];
    
    self.window.rootViewController = tabbar;
    [self.window makeKeyAndVisible];
    return YES;
}

上面初始化 就會走這個方法。比如第次一啟動應(yīng)用 我們沒有 對NSUserDefaults 的@"appLanguage"這個key 進行存入語言 所以會走系統(tǒng)語言的方法 ,并存進了@"appLanguage"這個key秋麸,以后每次啟動 就都會走 已經(jīng)保存的@"appLanguage"這個key的語言

  - (void)initLanguage{
      NSString *language=[self currentLanguage];
      if (language.length>0) {
          NSLog(@"自設(shè)置語言:%@",language);
      }else{
          [self systemLanguage];//key 沒有 @"appLanguage"   就走此方法
      }
  }

在代碼中 使用 ZBLocalized(@"key",nil); 宏代替系統(tǒng)的宏.

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 200, 200,100)];
    label.text =ZBLocalized(@"setlanguage",nil);

*內(nèi)部切換時調(diào)用更簡單 使用 [[ZBLocalized sharedInstance]setLanguage:@"zh-Hans"]; 方法 參數(shù)寫上要切換的語言 保存到@"appLanguage"這個key里渐排,

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    if (indexPath.row==0) {
        
        [[ZBLocalized sharedInstance]systemLanguage];
    }
    if (indexPath.row==1) {
        
        [[ZBLocalized sharedInstance]setLanguage:@"zh-Hans"];
        
    }
    if (indexPath.row==2) {
        
        [[ZBLocalized sharedInstance]setLanguage:@"en"];
        
    }
    if (indexPath.row==3) {
        
        [[ZBLocalized sharedInstance]setLanguage:@"zh-Hant"];
    }
    
    [self initRootVC];
    
    NSString *language=[[ZBLocalized sharedInstance]currentLanguage];
    NSLog(@"切換后的語言:%@",language);
}

- (void)initRootVC{
    TabBarController *tab=[[TabBarController alloc]init];
    tab.selectedIndex=2;
   [self dismissViewControllerAnimated:YES completion:^{
        [UIApplication sharedApplication].keyWindow.rootViewController = tab;
    }];
}

最后演示


localizedGIF.gif

點擊github地址下載

結(jié)尾:水平有限,代碼也很爛灸蟆,一直在努力學(xué)習(xí)中驯耻,大家多多包涵。如果你喜歡這個輪子炒考,請給個star可缚,這是對作者最大的鼓勵和支持,拜謝U唷A泵摇!假如你有更好的想法或方案請留言瓤帚!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末描姚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戈次,更是在濱河造成了極大的恐慌轩勘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怯邪,死亡現(xiàn)場離奇詭異绊寻,居然都是意外死亡,警方通過查閱死者的電腦和手機悬秉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門榛斯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搂捧,你說我怎么就攤上這事《疲” “怎么了允跑?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搪柑。 經(jīng)常有香客問我聋丝,道長,這世上最難降的妖魔是什么工碾? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任弱睦,我火速辦了婚禮,結(jié)果婚禮上渊额,老公的妹妹穿的比我還像新娘况木。我一直安慰自己垒拢,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布火惊。 她就那樣靜靜地躺著求类,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屹耐。 梳的紋絲不亂的頭發(fā)上尸疆,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音惶岭,去河邊找鬼寿弱。 笑死,一個胖子當著我的面吹牛按灶,可吹牛的內(nèi)容都是我干的症革。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼兆衅,長吁一口氣:“原來是場噩夢啊……” “哼地沮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羡亩,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤摩疑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畏铆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雷袋,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年辞居,在試婚紗的時候發(fā)現(xiàn)自己被綠了楷怒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓦灶,死狀恐怖鸠删,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贼陶,我是刑警寧澤刃泡,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站碉怔,受9級特大地震影響烘贴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撮胧,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一桨踪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芹啥,春花似錦锻离、人聲如沸铺峭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逛薇。三九已至,卻和暖如春疏虫,著一層夾襖步出監(jiān)牢的瞬間永罚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工卧秘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呢袱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓翅敌,卻偏偏與公主長得像羞福,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚯涮,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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