本人只是記錄下自己實(shí)現(xiàn)的過程掺栅, 大家可以參考:http://www.cnblogs.com/boai/p/5337558.html
或者:http://jingyan.baidu.com/article/fd8044fac8c0d55030137a4c.html
1.添加語言
在工程的info里面選擇添加語言
2.創(chuàng)建.strings文件
因?yàn)槭鞘謩忧袚Q陕习,所以文件名不需要為Localizable.strings
文件名可以自己取 這里是Language.strings
3.創(chuàng)建完成之后選擇.strings文件膊升, 點(diǎn)擊右側(cè)的Localization按鈕法焰, 會彈出一個(gè)框秧荆, 選擇下拉框里的語言
勾選語言, Base可以勾選埃仪,也可以不勾選
然后會發(fā)現(xiàn).string文件會多出兩個(gè)文件乙濒,(English 和 Simplified)
4.在對應(yīng)的文件里面進(jìn)行設(shè)置不同語言下要顯示的數(shù)據(jù)
格式為
"key" = "values";?
沒有@符號, 而且要用雙引號贵试,不要忘記最后的分號
英語文件里面
漢語文件里面
兩個(gè)文件里面的values是最后顯示的數(shù)據(jù)琉兜, key類似于字典里面的key凯正, 兩個(gè)文件key值要一致, 不然顯示的時(shí)候數(shù)據(jù)會不是你想要的效果豌蟋, 而且key值是唯一的廊散,意味著不能重復(fù), 否則會報(bào)錯(cuò)梧疲,鍵可以用中文允睹,也可有用英文,性能有沒差別看不出
5幌氮。
寫個(gè)宏定義缭受,用來讀取語言文件和返回的value值。宏最好是全局的该互,畢竟在一個(gè)項(xiàng)目里會有多個(gè)文件會用到米者。(pch文件或者其他文件)
#define Localized(key)? [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:“創(chuàng)建.strings的文件名”]
其中“appLanguage”是保存在本地的語言key,這里保存在了NSUserDefaults中宇智,table是指創(chuàng)建的.strings文件名稱蔓搞,這里是"Language",注意沒有".string"后綴
6 保存當(dāng)前使用語言到NSUserDefaults
在AppDelegate.m文件didFinishLaunchingWithOptions獲取當(dāng)前手機(jī)語言,并存儲到NSUserDefaults随橘。
if (![[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]) {
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0];
if ([language hasPrefix:@"zh-Hans"]) {//開頭匹配
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}else{
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
}
}
7 ?切換語言的事件
在ViewController.m創(chuàng)建并初始化UILabel用于顯示多語言文字喂分,UIButton切換語言按鈕及響應(yīng)事件。
//修改本地獲取的語言文件-交替
NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"];
if ([language isEqualToString: @"en"]) {
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}else {
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
8.因?yàn)榍袚Q語言之后要停留在當(dāng)前頁面机蔗,所以發(fā)送一個(gè)通知重新設(shè)置文字
[[NSNotificationCenter defaultCenter] postNotificationName:kLanguageChanged object:nil];
上面第二個(gè)語言是重新回到rootVc里面蒲祈,相當(dāng)于重新初始化整個(gè)vc,所以不需要重新設(shè)置文字萝嘁, 因?yàn)殡m然我們選擇了語言梆掸, 但是只有在控件初始化的時(shí)候會讀取我們的語言文件, 所以要么是回到rootVc酿愧, 要么是自己重新設(shè)置文字(暫時(shí)不知道其他方法沥潭, 如果有人知道請告知。 謝謝)嬉挡, 在自己pop回去的上一個(gè)頁面里面接收通知钝鸽,并設(shè)置文字, 但是如果是重新進(jìn)入新的頁面庞钢,那該頁面不需要進(jìn)行任何操作拔恰, 會自動切換語言