在做项目中 , 如果是人群使用不那么局限的app就可能涉及到国际化问题 , 国际化 大致可以分为 代码部分国际化 , xib 和故事板国际化 , 获取权限提示国际化 (访问相册权限 , 定位权限等等..)和应用内切换语言
前言 : 创建的string文件 , 如果是英文资源的文件 ,系统会生成一个en.lproj文件存放string文件 , 简体中文则是 zh-Hans.lproj文件
一 . 首先 , 最简单的 , 代码部分权限
1.项目配置 —> command + N –>Strings文件 —>命名 : Localizable.strings (必须命名为Localizable.strings , 因为系统会自动加载这个名字的文件 . 也可以自己命名 , 但是个人觉得完全没必要 ,就不说了)
2.配置需要支持的语言 , 此处我仅设置了英文 , 和中文 ,如需要可以设置多国语言
2.1选中创建好的 Localizable.strings 文件 ,右侧点击此按钮
2.2 选择添加英文和中文 , 添加 2次
2.3 选中需要国际化的模板 , Base基础模板可以不选
3.可以开始配置对应的文本了 , 通常情况来讲我们的App都是中文版的 , 所以这对于一个中国人来讲 , 是一件比较好的事 , 中文版的我们就可以不用配置了 . 英文版的 , 在对于的strings文件中 , 添加键值对如下 :
//需要注意的是 , 分号必须要写
4. 可以开始写代码了 , 具体使用方法如下 :
// NSLocalizedString(<#key#>, <#comment#>) 此宏为foundation框架定义 , 直接在key中书写中文即可 , 当手机切换成英文版本时 , 程序会自动将key对应的中文换成中文 .如果是手机设置为中文 , 或者其他语言 , 则还是显示中文
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(150, 300, 100, 50)];
label.textColor = [UIColor redColor];
label.text = NSLocalizedString(@"你好世界",nil);
[self.view addSubview:label];
————————————————-
二 . 访问权限提示国际化
1. 如上述一样 , 配置语言 . 然后新建 InfoPlist.strings文件 , 同样选中,并勾选英文版本和中文版 —-> 在info.plist文件中添加权限字段
在中文文件中 , 添加权限提示
在英文文件中 , 添加权限提示 value值
配置info.plist文件 , 对应的提示内容 不写 , 因为需要根据设置语言 , 加载 string文件中对应的语言
代码中请求用户权限
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//判断用户授权状态
ABAuthorizationStatus state = ABAddressBookGetAuthorizationStatus();
//判断 如果授权状态是未决定的,则请求授权
if (state == kABAuthorizationStatusNotDetermined) {
//请求
//1.获取通讯录对象
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//2.请求授权 (用户决定后就会回调block)
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"用户授权成功");
}else{
NSLog(@"用户授权失败");
}
});
}
return YES;
}
运行设置语言 中文
运行设置语言 英文
我试过使用info.plist原生国际化 , 但是一国际化后 , info.plist的目录结构就发生变化 , 编译报错
我试着把info.plist文件还原到原来的目录下 , 编译不报错了 . 运行弹框获取权限时 , 国际化并没有成功 . 不知道是不是不支持 …
———————————————
三 . 应用内修改语言逻辑
//注意 : 通常来说 , 项目中如果使用了国际化 , 那么项目中语言会跟随手机系统的语言变化而变化 ,程序会自动去读取Userdefault中appleLanguage键的值作为a