您好,登錄后才能下訂單哦!
分類: IOS開發(fā)工作筆記2013-12-07 18:21 1161人閱讀 評論(0) 收藏 舉報(bào)
前言:網(wǎng)絡(luò)上關(guān)于iOS國際化的文章很多,但基本上都是基于跟隨系統(tǒng)語言的國際化,筆者就不贅述了-0 –
今天要講的是不跟隨系統(tǒng)的切換語言版本方案,即程序內(nèi)部的切換語言版本方案。
一、總則:
應(yīng)用內(nèi)部語言不跟隨系統(tǒng)語言,由應(yīng)用自己進(jìn)行控制,通過配置多個(gè)語言文件,根據(jù)用戶的選擇動(dòng)態(tài)獲取不同文件夾下的語言文件,顯示在界面上。
最后把用戶選擇的語言持久化到本地,下次運(yùn)行時(shí)讀取。
二、應(yīng)用內(nèi)的國際化
1、新建工程
新建Single View Application工程,取名為MyInternational。
2、添加多語言文件
我們選擇使用自己的語言文件,而不是系統(tǒng)的localizable.string,因?yàn)樵陧?xiàng)目開發(fā)使用svn時(shí),多人操作同一文件可能會(huì)造成沖突。
在Resource中添加新的Strings File:
取名為hello(記得Targets要勾選項(xiàng)目)
新建完成之后會(huì)生成hello.string文件,把它拖進(jìn)Supporting Files里。
3、配置hello.string國際化
首先配置剛才的hello.string文件。
點(diǎn)擊hello.strings文件,點(diǎn)擊圈中的Make localized(本地化)。
只有English,沒關(guān)系點(diǎn)擊確定。
4、配置項(xiàng)目國際化
網(wǎng)絡(luò)上很多配置方法不靠譜,因?yàn)樾掳娴腦code位置“+”號(hào)的位置換了,這里教大家正確的方法,點(diǎn)擊項(xiàng)目—>選擇Project—>選擇Info—>點(diǎn)擊“+”號(hào)。
點(diǎn)擊“+”號(hào)后,添加中文,當(dāng)然也可以添加其他的語言,彈出對話框,infoPlist是配置系統(tǒng)的國際化文件,可以配置圖標(biāo)之類的多語言環(huán)境,不屬于本文范圍,nib文件看需要配,這里選擇不配。
配置完成之后,再看hello.string便分成了兩個(gè)文件。
完成上面的四步便完成了項(xiàng)目內(nèi)的多語言環(huán)境配置,下面來看看代碼怎么寫。
5、添加需要的字符串
分別在hello.strings(English)與hello.strings(Chinese)里面添加對應(yīng)語言的字符串。
字符串的格式為“key”=“value”;鍵值對(別忘記分號(hào)!)
接下來配置項(xiàng)目需要的字符串,一個(gè)用于lable的顯示,一個(gè)用于button的顯示。
hello.strings(English)
"invite" ="hello atany,come to join in us!";
"buttonInfo" ="change Language";
hello.strings(Chinese)
"invite" ="你好 atany,快來加入我們吧!";
"buttonInfo" ="切換語言";
6、看看流程
【實(shí)現(xiàn)思路:】
在初始化首個(gè)Controller的時(shí)候,進(jìn)行應(yīng)用語言的加載。首次加載因?yàn)閡serLanguage(應(yīng)用內(nèi)語言)不存在,則使用系統(tǒng)當(dāng)前的語言,保存到userlanguage,下次直接讀。讀出來之后,獲取到對應(yīng)文件路徑,得到文件的索引,儲(chǔ)存到工具類InternationalControl的靜態(tài)變量bundle中。
其他地方需要用字符串時(shí),用工具類獲得bundle即可讀取相應(yīng)文件中的字符串。
7、新建工具類InternationalControl
InternationalControl.h
[cpp] view plaincopy
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface InternationalControl : NSObject
+(NSBundle *)bundle;//獲取當(dāng)前資源文件
+(void)initUserLanguage;//初始化語言文件
+(NSString *)userLanguage;//獲取應(yīng)用當(dāng)前語言
+(void)setUserlanguage:(NSString *)language;//設(shè)置當(dāng)前語言
@end
InternationalControl.m
1)創(chuàng)建靜態(tài)變量bundle,以及獲取方法bundle(注:此處不要使用getBundle)。
[cpp] view plaincopy
static NSBundle *bundle = nil;
+ ( NSBundle * )bundle{
return bundle;
}
2)初始化方法:
userLanguage儲(chǔ)存在NSUserDefaults中,首次加載時(shí)要檢測是否存在,如果不存在的話讀AppleLanguages,并賦值給userLanguage。
[cpp] view plaincopy
+(void)initUserLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *string = [def valueForKey:@"userLanguage"];
if(string.length == 0){
//獲取系統(tǒng)當(dāng)前語言版本(中文zh-Hans,英文en)
NSArray* languages = [def objectForKey:@"AppleLanguages"];
<pre class="cpp" name="code"> NSString *current = [languages objectAtIndex:0];
string = current;
[def setValue:current forKey:@"userLanguage"];
[def synchronize];//持久化,不加的話不會(huì)保存
}
//獲取文件路徑
NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];//生成bundle
}
</pre>
3)獲得當(dāng)前語言方法
[cpp] view plaincopy
+(NSString *)userLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
return language;
}
4)設(shè)置語言方法
[cpp] view plaincopy
+(void)setUserlanguage:(NSString *)language{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//1.第一步改變bundle的值
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
bundle = [NSBundle bundleWithPath:path];
//2.持久化
[def setValue:language forKey:@"userLanguage"];
[def synchronize];
}
8、拖nib,配置點(diǎn)擊事件
一個(gè)button,一個(gè)label,button用于切換語言,label用于顯示信息。
9、配置加載的第一個(gè)Controller,這里是YGViewController
YGViewController.h
[cpp] view plaincopy
#import <UIKit/UIKit.h>
@interface YGViewController : UIViewController
@property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label
- (IBAction)changeLanguage:(id)sender;//點(diǎn)擊事件
@property (retain, nonatomic) IBOutlet UIButton *btChange;//button
@end
YGViewController.m
1)加載:
[cpp] view plaincopy
- (void)viewDidLoad
{
//注冊通知,用于接收改變語言的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];
[InternationalControl initUserLanguage];//初始化應(yīng)用語言
NSBundle *bundle = [InternationalControl bundle];
NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];
NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table為hello.string的文件名
[_btChange setTitle:buttonInfo forState:UIControlStateNormal];
_inviteLabel.text = inviteMsg;
[super viewDidLoad];
}
2)點(diǎn)擊修改語言方法
[cpp] view plaincopy
- (IBAction)changeLanguage:(id)sender {
NSString *lan = [InternationalControl userLanguage];
if([lan isEqualToString:@"en"]){//判斷當(dāng)前的語言,進(jìn)行改變
[InternationalControl setUserlanguage:@"zh-Hans"];
}else{
[InternationalControl setUserlanguage:@"en"];
}
//改變完成之后發(fā)送通知,告訴其他頁面修改完成,提示刷新界面
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];
}
3)接收到通知執(zhí)行方法,刷新界面
[cpp] view plaincopy
-(void)changeLanguage{
[_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];
_inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];
}
如果有多個(gè)界面的話,需要每個(gè)界面都配置接收通知,用于修改界面。
10、運(yùn)行界面
可以看到點(diǎn)擊切換語言之后,語言切換成功。
退出程序再次進(jìn)入,保留了上次選擇的語言。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。