介紹說(shuō)明
App對(duì)于多語(yǔ)言這塊無(wú)非2種需求,一是軟件根據(jù)手機(jī)當(dāng)前操作系統(tǒng)的語(yǔ)言來(lái)顯示對(duì)應(yīng)的語(yǔ)言;另外一種是,不論當(dāng)前手機(jī)設(shè)置的是什么語(yǔ)言,用戶可以通過(guò)設(shè)置(點(diǎn)擊按鈕)改變當(dāng)前軟件的語(yǔ)言。
下面先介紹第一種,根據(jù)手機(jī)當(dāng)前操作系統(tǒng)的語(yǔ)言來(lái)顯示對(duì)應(yīng)的語(yǔ)言
1、在Xcode工程里面創(chuàng)建文件

2、添加多語(yǔ)言,在這里添加了簡(jiǎn)體中文和英語(yǔ)兩個(gè)版本


3、多語(yǔ)言的使用
分別在不同的語(yǔ)言文件中添加測(cè)試代碼
1. "text" = "English text";
2. "text" = "簡(jiǎn)體中文";
說(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)的資源文件;
1. NSLocalizedString(key,comment)
2. NSLocalizedStringFromTable(key, tbl, comment)
第一種適合于,讓?xiě)?yīng)用跟隨系統(tǒng)的語(yǔ)言版本進(jìn)行切換,而用戶卻不能手動(dòng)進(jìn)行切換;
注意:如果用第一個(gè)方法實(shí)現(xiàn)多語(yǔ)言,多語(yǔ)言的文件名必須是 Localizable
參數(shù)說(shuō)明:第一個(gè)參數(shù)是多語(yǔ)言文件中的key,第二個(gè)參數(shù)是對(duì)key的注釋說(shuō)明,一般為nil就可以了
如果要實(shí)現(xiàn)的是既可以跟隨系統(tǒng),又可以用戶自己切換,就不能使用第一種了,那就要使用第二種 NSLocalizedStringFromTable(key, tbl, comment) tbl這個(gè)參數(shù),就是我們自己命名的多語(yǔ)言文件名稱;
注:直接使用第二種的話,會(huì)跟隨系統(tǒng)語(yǔ)言
參數(shù)說(shuō)明:第一個(gè)參數(shù)是多語(yǔ)言文件中的key,第二個(gè)參數(shù)是多語(yǔ)言文件的名字,第三個(gè)參數(shù)是對(duì)key的注釋說(shuō)明,一般為nil就可以了
代碼中直接定義的Label控件就可以直接使用,實(shí)現(xiàn)語(yǔ)言根據(jù)系統(tǒng)的切換
_label.text = NSLocalizedString(@"text", nil);
下面先介紹第二種,用戶可以設(shè)置語(yǔ)言
創(chuàng)建和上面的步驟一樣,不再一一列舉;主要看代碼實(shí)現(xiàn)邏輯;
AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
//用來(lái)記錄選中的哪種語(yǔ)言
@property(strong, nonatomic)NSString *languageName;
//通過(guò)傳進(jìn)來(lái)的參數(shù)key,獲取相應(yīng)語(yǔ)言的文本
-(NSString*)getLanguageName:(NSString*)languageKey;
@end
AppDelegate.m
//實(shí)現(xiàn)方法
-(NSString*)getLanguageName:(NSString *)languageKey
{
//獲取指定的語(yǔ)言文件的路徑
NSString *path = [[NSBundle mainBundle]pathForResource:_languageName ofType:@"lproj"];
//在指定的路徑下獲取語(yǔ)言文件,并取出key所對(duì)應(yīng)的語(yǔ)言文本
NSString *textLanguage = [[NSBundle bundleWithPath:path]localizedStringForKey:languageKey value:nil table:@"Localizable"];
return textLanguage;
}
下面是實(shí)現(xiàn)類里面的代碼:
//添加兩個(gè)button的監(jiān)聽(tīng)事件,手動(dòng)切換哪種語(yǔ)言
-(void)clickEnglish
{
//賦值指定相應(yīng)的語(yǔ)言文件
_appDelegate.languageName = @"en";
//通過(guò)相應(yīng)的key,在指定的語(yǔ)言文件取出相應(yīng)的語(yǔ)言文本
_label.text = [_appDelegate getLanguageName:@"text"];
}
-(void)clickChinese
{
_appDelegate.languageName = @"zh-Hans";
_label.text = [_appDelegate getLanguageName:@"text"];
}
這里的@"en" @"zh-Hans"你可能會(huì)問(wèn),從哪來(lái)的?實(shí)際上當(dāng)你前面按照上面的配置好了以后,你的工程文件夾下面會(huì)有幾個(gè)文件夾。這樣就知道該寫(xiě)什么了吧?
