iOS多語言功能開發(fā)小結(jié)

當(dāng)前xcode版本7.2 手機(jī)端 iOS 9.3

? ? ? ?我們的項(xiàng)目已經(jīng)非常龐大了,也上線了,老板突然說要加一個(gè)多語言功能,在他眼里程序員就是個(gè)魔術(shù)師,點(diǎn)一個(gè)按鈕然后項(xiàng)目所有的中文字就變成英文的了。聽得我都醉了,于是這兩天我調(diào)研了一下,寫了一個(gè)Demo來演示如何辦到多語言之間的切換。

Demo地址

? ? ? ?Demo上傳到了github上,有興趣的童鞋可以下載去看看。

實(shí)現(xiàn)方法和原理解釋

? ? ? ?基本上所有的App對于多語言這塊無非2種需求,一個(gè)是軟件根據(jù)手機(jī)當(dāng)前操作系統(tǒng)的語言來顯示對應(yīng)的語言。另外一個(gè)種是,不論當(dāng)前手機(jī)設(shè)置的是什么語言,用戶可以通過設(shè)置(點(diǎn)擊按鈕,就像老板說的一樣變魔術(shù))改變當(dāng)前軟件的語言。
? ? ? ? 第一種需求的童鞋們可以參考這篇文章,應(yīng)該說的很詳細(xì)了,而且也比較簡單。這里我主要說明一下手動(dòng)改變語言設(shè)置的實(shí)現(xiàn)方法。

  1. xCode創(chuàng)建工程,起名languageChangeDemo,然后創(chuàng)建資源CustomLocalizable.strings
1.創(chuàng)建.strings資源文件

2.添加多語言,這里我添加了三種語言英文、簡體中文、和繁體中文(臺灣)。

2.添加語言
3.默認(rèn)就選個(gè)英文先添加上
4.添加語言
點(diǎn)擊.strings文件把語言勾選上

? ? ? ?這樣就變成了第一張圖里面三個(gè).strings 后綴的文件,相當(dāng)于每個(gè)文件代表了一種語言。這樣基本上就算是配置好了,接下來就看怎么用了。

3.點(diǎn)擊這三個(gè).strings文件,在里面分別寫入"showText" = "this is a English Text";英文的"showText" = "這是一個(gè)簡體中文";中文的"showText" = "這是壹個(gè)臺灣繁體";繁體的。

鍵值

這里實(shí)際上就是說,以后你要給哪個(gè)label顯示文字不要用具體的字了,用這里面的Key來替代,然后在不同的語言環(huán)境下,會使用后面的值來替代。
4.代碼實(shí)現(xiàn)起來的思路就是你告訴你的工程去文字的時(shí)候從哪個(gè).strings文件中去取。然后調(diào)用[bundle localizedStringForKey:(key) value:@"" table:(tbl)]來設(shè)置具體的字符串,通常網(wǎng)上說的都會把這些方法封裝成宏來實(shí)現(xiàn)。
xib視圖

我創(chuàng)建了3個(gè)按鈕,每個(gè)按鈕事件底下寫了:

- (IBAction)englishBtn:(UIButton *)sender {
    
    //這句話告訴項(xiàng)目是從哪個(gè).string文件中取字體。
    _appDelegate.lan = @"en";
   //這個(gè)是給上面的label賦值,不管上面語言都賦值那個(gè)Key,但顯示的時(shí)候回事Value
    _StrtLabel.text = CustomStr(@"showText");
}

- (IBAction)chineseSimpleBtn:(UIButton *)sender {
    
    _appDelegate.lan =@"zh-Hans";
    _StrtLabel.text = CustomStr(@"showText");
}

- (IBAction)chineseTWBtn:(UIButton *)sender {
    
    _appDelegate.lan =@"zh-Hant-TW";
    _StrtLabel.text = CustomStr(@"showText");
}
```
       這里的`@"en"``@"zh-Hans"``@"zh-Hant-TW"`你可能會問,從哪來的?實(shí)際上當(dāng)你前面按照我說的配置好了以后,你的工程文件夾下面會有幾個(gè)文件夾。這樣就知道該寫什么了吧?

![Snip20160408_15.png](http://upload-images.jianshu.io/upload_images/1538778-cdd500ae5b70b35b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

       我這個(gè)Demo的思路是把這個(gè)字符串存到appDelegate的lan屬性中(我自己創(chuàng)建了一個(gè))。然后剩下一些工作我都在appDelegate里面封裝了一下,包括宏的定義,目的是讓程序中其他地方設(shè)置字的時(shí)候只用調(diào)用一個(gè)簡單的宏就行了,例如:`_StrtLabel.text = CustomStr(@"showText");`這樣,下面看一下appDelegate中的一些方法:
AppDelegate.h
```
#import <UIKit/UIKit.h>

//封裝了一個(gè)宏 用來方便輸入文字--實(shí)際是文字對應(yīng)的key
#define CustomStr(key) [(AppDelegate *)[[UIApplication sharedApplication] delegate] showText:(key)];



@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property(strong,nonatomic) NSString *lan; //用來保存選擇的語言

-(NSString *)showText:(NSString *)key;  //用來替代以往的 NSString 方法


@end
```
AppDelegate.m
```
-(NSString *)showText:(NSString *)key
{

    NSString *path = [[NSBundle mainBundle] pathForResource:_lan ofType:@"lproj"];
    
    
    return [[NSBundle bundleWithPath:path] localizedStringForKey:key value:nil table:@"CustomLocalizable"];
}
```

&#160; &#160; &#160; &#160;AppDelegate.m中`@"lproj"`就是剛才那些存放語言的幾個(gè)文件夾的后綴名`_lan`就是當(dāng)前語言的類型了。然后這個(gè)方法就是返回了那些語言包里Key對應(yīng)的Value值。
&#160; &#160; &#160; &#160;AppDelegate.h中,我用了一個(gè)宏封裝了一下`-(NSString *)showText:(NSString *)key; `這個(gè)方法的調(diào)用。這樣的好處就是比如好幾個(gè)小伙伴開發(fā),他們用直接用這個(gè)宏就行了,很簡單。
##總結(jié)
&#160; &#160; &#160; &#160;如果你的工程一開始就考慮多語言化,那么像我這樣配置好,以后碰到給label賦值、等等的文字顯示操作都用`CustomStr(key)`這個(gè)宏來搞定就行了。如果你的工程項(xiàng)目都上線好幾版了,才想起來這個(gè)問題,那么按照我說的辦法配置好,讓你的小伙伴們,一個(gè)一個(gè)地方改吧,如果你的項(xiàng)目不是那么大,這個(gè)辦法還是挺好的。當(dāng)然,如果你的項(xiàng)目像我們一樣,超級龐大,那么還有一個(gè)更高大上的更改辦法,前面的這些工作都基本一樣,然后思路就是用正則表達(dá)式查找你工程中所有的中文,然后替換,然后有一些編譯不過的地方,再人工修改,具體的參考[這篇文章](http://www.itdecent.cn/p/e97584e7ca13
)吧。目前我的老板還沒有逼我,趕緊改。所以這方法我還沒有試,等哪天實(shí)在沒辦法了,我再去試試吧,祝我好運(yùn)!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容