- 應(yīng)用國際化 是現(xiàn)在很多app 都在做的了划咐。怎么國際化 相信在看這篇文章之前 都應(yīng)該了會了,就不在贅述了切威。直奔主題勺馆。在應(yīng)用內(nèi)切換語言库物。
- 當我們做過應(yīng)用的語言國際化了,當系統(tǒng)語言更改后粘茄,我們的客戶端內(nèi)使用NSLocalizedString(@"key", @"")方法签舞,語言也會對應(yīng)的改變,這是做內(nèi)部切換的前提柒瓣。
- 思路:使用NSUserDefaults 用一個key記錄一個自設(shè)置語言,打開應(yīng)用時儒搭,如果沒有這個記錄語言,使用系統(tǒng)該語言芙贫,并存入NSUserDefaults的這個key搂鲫。如果我們內(nèi)部進行了切換,切換的語言存入NSUserDefaults這個key.
打開應(yīng)用的時運行的邏輯就是 :這個key有語言就使用該語言磺平,沒有就用系統(tǒng)的語言. - 邏輯簡單魂仍,代碼更是簡單.我們先寫一個類方便統(tǒng)一管理.
- .h文件暴露以下幾個方法
@interface ZBLocalized : NSObject
+ (ZBLocalized *)sharedInstance;
//初始化多語言功能
- (void)initLanguage;
//當前語言
- (NSString *)currentLanguage;
//設(shè)置要轉(zhuǎn)換的語言
- (void)setLanguage:(NSString *)language;
//設(shè)置為系統(tǒng)語言
- (void)systemLanguage;
- .m
- (void)initLanguage{
NSString *language=[self currentLanguage];
if (language.length>0) {
NSLog(@"自設(shè)置語言:%@",language);
}else{
[self systemLanguage];
}
}
- (NSString *)currentLanguage{
NSString *language=[[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];
return language;
}
- (void)setLanguage:(NSString *)language{
[[NSUserDefaults standardUserDefaults] setObject:language forKey:AppLanguage];
[[NSUserDefaults standardUserDefaults] synchronize];
}
設(shè)置 NSUserDefaults 設(shè)置語言的key @"appLanguage"
并設(shè)置代替NSLocalizedString(@"key", @"")的宏 ,新宏名為:ZBLocalized(@"key", @"")
//語言切換
static NSString * const AppLanguage = @"appLanguage";
#define ZBLocalized(key, comment) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:AppLanguage]] ofType:@"lproj"]] localizedStringForKey:(key) value:@"" table:nil]
下面這個方法需要說明以下 ,是個坑拣挪。 我們語言文件Localizable.strings 是存在.lproj文件里的擦酌,比如英文的是 en.lproj ,而在升級ios9之后中英文目錄名字改了菠劝。在真機上赊舶,中文資源目錄名由zh-Hans---->zh-Hans-CN,英文資源目錄名由en---->en-CN赶诊,ios9模擬器上面的中英文資源目錄名和真機上面的不一樣笼平,分別是zh-Hans-US,en-US舔痪。所以我們要自己判斷一下出吹,去掉后面的CN或US。
- (void)systemLanguage{
NSString *languageCode = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0];
NSLog(@"系統(tǒng)語言:%@",languageCode);
if([languageCode hasPrefix:@"zh-Hant"]){
languageCode = @"zh-Hant";//繁體中文
}else if([languageCode hasPrefix:@"zh-Hans"]){
languageCode = @"zh-Hans";//簡體中文
}else if([languageCode hasPrefix:@"pt"]){
languageCode = @"pt";//葡萄牙語
}else if([languageCode hasPrefix:@"es"]){
languageCode = @"es";//西班牙語
}else if([languageCode hasPrefix:@"th"]){
languageCode = @"th";//泰語
}else if([languageCode hasPrefix:@"hi"]){
languageCode = @"hi";//印地語
}else if([languageCode hasPrefix:@"en"]){
languageCode = @"en";//英語
}else{
languageCode = @"en";//英語
}
[self setLanguage:languageCode];
}
方法寫完 就是這么簡單辙喂。
先準備 Localizable.strings 文件
使用時在AppDelegate 要進行初始化 注意 一定要在根視圖初始化的前面捶牢。比如tabbar 否則鸠珠,你切換語言后 tabbar是不會改變的 .
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor=[UIColor whiteColor];
[[ZBLocalized sharedInstance]initLanguage];//放在tabbar前初始化
TabBarController *tabbar=[[TabBarController alloc]init];
self.window.rootViewController = tabbar;
[self.window makeKeyAndVisible];
return YES;
}
上面初始化 就會走這個方法。比如第次一啟動應(yīng)用 我們沒有 對NSUserDefaults 的@"appLanguage"這個key 進行存入語言 所以會走系統(tǒng)語言的方法 ,并存進了@"appLanguage"這個key秋麸,以后每次啟動 就都會走 已經(jīng)保存的@"appLanguage"這個key的語言
- (void)initLanguage{
NSString *language=[self currentLanguage];
if (language.length>0) {
NSLog(@"自設(shè)置語言:%@",language);
}else{
[self systemLanguage];//key 沒有 @"appLanguage" 就走此方法
}
}
在代碼中 使用 ZBLocalized(@"key",nil); 宏代替系統(tǒng)的宏.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 200, 200,100)];
label.text =ZBLocalized(@"setlanguage",nil);
*內(nèi)部切換時調(diào)用更簡單 使用 [[ZBLocalized sharedInstance]setLanguage:@"zh-Hans"]; 方法 參數(shù)寫上要切換的語言 保存到@"appLanguage"這個key里渐排,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row==0) {
[[ZBLocalized sharedInstance]systemLanguage];
}
if (indexPath.row==1) {
[[ZBLocalized sharedInstance]setLanguage:@"zh-Hans"];
}
if (indexPath.row==2) {
[[ZBLocalized sharedInstance]setLanguage:@"en"];
}
if (indexPath.row==3) {
[[ZBLocalized sharedInstance]setLanguage:@"zh-Hant"];
}
[self initRootVC];
NSString *language=[[ZBLocalized sharedInstance]currentLanguage];
NSLog(@"切換后的語言:%@",language);
}
- (void)initRootVC{
TabBarController *tab=[[TabBarController alloc]init];
tab.selectedIndex=2;
[self dismissViewControllerAnimated:YES completion:^{
[UIApplication sharedApplication].keyWindow.rootViewController = tab;
}];
}
最后演示
點擊github地址下載
結(jié)尾:水平有限,代碼也很爛灸蟆,一直在努力學(xué)習(xí)中驯耻,大家多多包涵。如果你喜歡這個輪子炒考,請給個star可缚,這是對作者最大的鼓勵和支持,拜謝U唷A泵摇!假如你有更好的想法或方案請留言瓤帚!