首先怎么創(chuàng)建多語(yǔ)言就不說(shuō)了 創(chuàng)建多個(gè)語(yǔ)言文件 根據(jù)key找到對(duì)應(yīng)的value以對(duì)應(yīng)不同的語(yǔ)言。
說(shuō)一下怎么在應(yīng)用中設(shè)置
首先創(chuàng)建一個(gè)工具類 用于管理應(yīng)用中的語(yǔ)言
在單例方法中
+(instancetype)sharedTool{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
sharedTool= [[FBLanguageToolalloc]init];
NSArray*array = [selfgetFontsArray];
sharedTool.fontsArray= array;
NSUserDefaults*def = [NSUserDefaultsstandardUserDefaults];
NSString*string = [defvalueForKey:userLanguage];
if(string.length==0){
//獲取系統(tǒng)當(dāng)前語(yǔ)言版本(中文zh-Hans,英文en)
NSArray* languages = [defobjectForKey:@"AppleLanguages"];
NSString*current = [languagesobjectAtIndex:0];
sharedTool.current= current;
//確定是否能在預(yù)置的語(yǔ)言中找到本機(jī)的語(yǔ)言如未找到則用默認(rèn)語(yǔ)言
if(![selfcanChangeCurrent:current]) {
//設(shè)置默認(rèn)語(yǔ)言是英語(yǔ)
sharedTool.current=@"en";
}
string =sharedTool.current;
[defsetValue:currentforKey:userLanguage];
[defsynchronize];
}
//獲取文件路徑
NSString*path = [[NSBundlemainBundle]pathForResource:stringofType:@"lproj"];
sharedTool.bundle= [NSBundlebundleWithPath:path];//生成bundle
});
returnsharedTool;
}
其中g(shù)etFontsArray方法用于獲取預(yù)置的幾種語(yǔ)言
+(NSArray*)getFontsArray{
FBLanguageObject*zhhans = [[FBLanguageObjectalloc]initWithTitle:@"簡(jiǎn)體中文"language:@"zh-Hans"];
FBLanguageObject*en = [[FBLanguageObjectalloc]initWithTitle:@"english"language:@"en"];
FBLanguageObject*ko = [[FBLanguageObjectalloc]initWithTitle:@"???"language:@"ko"];
FBLanguageObject*idl = [[FBLanguageObjectalloc]initWithTitle:@"Indonesia"language:@"la"];
FBLanguageObject*jan = [[FBLanguageObjectalloc]initWithTitle:@"日本語(yǔ)"language:@"ja"];
FBLanguageObject*th = [[FBLanguageObjectalloc]initWithTitle:@"???????"language:@"th"];
FBLanguageObject*ru = [[FBLanguageObjectalloc]initWithTitle:@"русский"language:@"ru"];
NSArray*array = [NSArrayarrayWithObjects:zhhans,en,jan,idl,ko,th,ru,nil];
returnarray;
}
canChangeCurrent用于判斷當(dāng)前機(jī)器所在環(huán)境是否包含在預(yù)置的語(yǔ)言中苗踪,如果不存在則選擇默認(rèn)語(yǔ)言应闯。
+(BOOL)canChangeCurrent:(NSString*)current{
for(FBLanguageObject*objectinsharedTool.fontsArray) {
if([currenthasPrefix:object.language]) {
sharedTool.current= object.language;
returnYES;
}
}
returnNO;
}
languageWithLocalTitle用于通過(guò)key查找對(duì)應(yīng)環(huán)境下的value
-(NSString*)languageWithLocalTitle:(NSString*)localTitle{
return[self.bundlelocalizedStringForKey:localTitlevalue:niltable:@"hello"];
}
在應(yīng)用中設(shè)置語(yǔ)言 通過(guò)setUserLanguage進(jìn)行修改济炎。
-(void)setUserLanguage:(NSString*)language{
NSUserDefaults*def = [NSUserDefaultsstandardUserDefaults];
//1.第一步改變bundle的值
NSString*path = [[NSBundlemainBundle]pathForResource:languageofType:@"lproj"];
self.bundle= [NSBundlebundleWithPath:path];
//2.持久化
[defsetValue:languageforKey:userLanguage];
//3.同步
[defsynchronize];
[[NSNotificationCenterdefaultCenter]postNotificationName:languageDidChangeobject:nil];
}
到這里 工具類就寫好了
在相應(yīng)的需要變換文字的控件中添加消息的監(jiān)聽
-(instancetype)initWithFrame:(CGRect)frame{
self= [superinitWithFrame:frame];
if(self) {
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(changeTitle)name:languageDidChangeobject:nil];
}
returnself;
}
-(void)changeTitle{
[selfsetTitle:[[FBLanguageToolsharedTool]languageWithLocalTitle:_localTitle]forState:UIControlStateNormal];
}
-(void)setLocalTitle:(NSString*)localTitle{
_localTitle= localTitle;
[selfchangeTitle];
}
-(void)dealloc{
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
到此問(wèn)題解決
代碼就放在https://github.com/slamdunk0414/Localization