上篇文章介绍了配置App多语言支持(跟随设备的系统语言变化),本篇文章则继续介绍配置App多语言支持(应用程序内部国际化,不跟随系统语言)
1.创建生成并配置多语言文件
参考上一篇文章 iOS-配置App多语言支持(跟随设备的系统语言变化)中步骤1~5。
2.流程+实现思路
- 流程图:
- 思路:
在初始化首个Controller的时候,进行应用语言的加载。首次加载因为userLanguage(应用内语言)不存在,则使用系统当前的语言,保存到userlanguage,下次直接读。读出来之后,获取到对应文件路径,得到文件的索引,储存到工具类InternationalControl的静态变量bundle中。
其他地方需要用字符串时,用工具类获得bundle即可读取相应文件中的字符串。切换语言后本文暂且用通知的方式进行传递。
3.用到的工具类InternationalControl,方法介绍都有注释
InternationalControl.h
//
// InternationalControl.h
// MultiLanguage
//
// Created by chenqianfeng on 16/4/19.
// Copyright © 2016年 chenqianfeng. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface InternationalControl : NSObject
+(NSBundle *)bundle;//获取当前资源文件
+(void)initUserLanguage;//初始化语言文件
+(NSString *)userLanguage;//获取应用当前语言
+(void)setUserlanguage:(NSString *)language;//设置当前语言
@end
InternationalControl.m
//
// InternationalControl.m
// MultiLanguage
//
// Created by chenqianfeng on 16/4/19.
// Copyright © 2016年 chenqianfeng. All rights reserved.
//
#import "InternationalControl.h"
@implementation InternationalControl
//1)创建静态变量bundle,以及获取方法bundle(注:此处不要使用getBundle)。
static NSBundle *bundle = nil;
+ ( NSBundle * )bundle{
return bundle;
}
//2)初始化方法: userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。
+(void)initUserLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *string = [def valueForKey:@"userLanguage"];
if(string == nil){
//获取系统当前语言版本(中文zh-Hans,英文en)
NSArray* languages = [def objectForKey:@"AppleLanguages"];
NSString *current = [languages objectAtIndex:0];
if ([current isEqualToString:@"zh-Hans"]) {
//部分手机中文环境为zh-Hans,此时不需要截取
string = current;
}else{
//部分手机中文环境为zh-Hans-US或者zh-Hans-CN,此时需要截取到zh-Hans
NSArray *arr = [current componentsSeparatedByString:@"-"];
//拿到[arr lastObject]操作系统语言的手机版本后缀,然后把其截去
NSArray *stringArr = [current componentsSeparatedByString:[NSString stringWithFormat:@"-%@",[arr lastObject]]];
string = stringArr[0];
}
[def setValue:string forKey:@"userLanguage"];
[def synchronize];//持久化,不加的话不会保存
}
//获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];//生成bundle
}
//3)获得当前语言方法
+(NSString *)userLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
return language;
}
//4)设置语言方法
+(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];
}
@end
4.工具类的使用
//初始化应用语言,首次存入系统语言
[InternationalControl initUserLanguage];
//set language
[InternationalControl setUserlanguage:@"zh-Hans"];//简体中文
[InternationalControl setUserlanguage:@"en"];//英文
/**
取值
hello.strings 多语言文件名
paly 多语言文件中的一个key
注释:如果多语言文件名用的是系统默认名称Localizable.strings,也可以用NSLocalizedString(@"play", @"title")来进行取值
*/
NSString *rightItemTitle = [[InternationalControl bundle] localizedStringForKey:@"play" value:nil table:@"hello"];
网友评论