iOS-多语言版本开发(二)(转载)
题记
iOS 多语言版本的开发(一) 中我们完成了让应用跟随系统语言进行切换,而用户自己却不能切换的功能,也基本上算是实现了多语言版本;可是,对于某些应用来说,实现跟随系统语言切换的同时, 也想要实现让用户自己选择应用语言版本的功能;针对这种情况,利用这篇文章来写写如何让用户自己切换应用语言版本;
语言文件存在的形式
想要实现用户自己手动切换语言版本,就先要了解语言文件在资源文件中存在的形式;

如图中,不管是英语(en.lproj)、简体(zh-Hans.lproj)、还是繁体(zh-Hant.lproj)都是以.lproj 的文件夹形式存在, 所以当我们要切换语言的时候,其实也就是做到去取这些.lproj 文件夹中的ASLocalized.strings文件;
到这里,原理应该懂了,接下来就是动手实现了;
根据语言获取 ASLocalized.strings
这时候,需要根据不同的语言.lproj 获取到对应的ASLocalized.strings语言文件, 从而让页面显示对应的语言内容;
这里暂且先根据English获取英语的语言文件,English 的.lproj存在的形式是en.lproj
NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSString *showValue = [[NSBundle bundleWithPath:path] localizedStringForKey:@"showTxt" value:nil table:@"ASLocalized"];
NSLog(@"result: %@", showValue);
输出结果:result: this is test text
以上代码,只是以English 为语言文件,是写死的,如果想要让用户自己手动改变,只需要替换掉
[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"] 中的en 为其他的语言标识就好了;
既然是用户手动切换,那就需要写代码去实现了;
到这里,有一个问题,如何让用户选择后一个语言后,即使程序退出后,下次进入依然保留呢, 既然需要保存数据,就要涉及到本地存储了,对于少量的保存我们可以使用NSUserDefaults 来操作,简单方便快捷;
使用NSUserDefaults 记录选择的语言
这里我简单写了个界面,作为辅助讲解

- (IBAction)changeLanguage:(UIButton *)sender {
switch (sender.tag) {
case 101: { //简体
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
}
break;
case 102: { //繁体
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hant" forKey:appLanguage];
}
break;
case 103: { //English
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
}
break;
default:
break;
}
}
以上方法,是图中三种语言的点击事件,分别将对应的语言标识,记录到NSUserDefaults 对应的 appLanguage key 中
既然重新选择了语言,就需要重新加载控件的内容,因为是Demo,这里直接将给控件赋值写成一个方法,如下:
- (void)showLbl {
NSString *lanType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]];
NSString *path = [[NSBundle mainBundle] pathForResource:lanType ofType:@"lproj"];
NSString *showValue = [[NSBundle bundleWithPath:path] localizedStringForKey:@"showTxt" value:nil table:@"ASLocalized"];
NSLog(@"result: %@", showValue);
self.lblShowTxt.text = showValue;
}
可将此方法在点击事件中调用下,即可;
Demo效果图:

首次进入应用的考虑
到这里,还没有完,这时我们需要考虑下,用户第一次进来时,该显示什么样的语言,是跟随系统,还是我们给一种默认的语言;
1、给一种默认语言
这种处理很简单,只需要在didFinishLaunchingWithOptions 方法中,进行判断本地是否记录了语言标识,如果没有给一种默认即可,代码如下:
if (![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) {
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
}`
2、跟随系统语言
这种处理相对来说,比较复杂写,首页需要获取系统的首选语言顺序,然后取第一个首选语言,其次,还要判断你要做的语言版本,首选语言组中存在与否;
获取首选语言:
NSArray *languages = [NSLocale preferredLanguages];
获取第一个首选语言:
NSString *language = [languages objectAtIndex:0];
处理过程如下:
if (![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) {
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0];
if ([language hasPrefix:@"zh-Hans"]) {
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
} else if ([language hasPrefix:@"zh-TW"] || [language hasPrefix:@"zh-HK"] || [language hasPrefix:@"zh-Hant"]) {
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hant" forKey:appLanguage];
} else if ([language hasPrefix:@"en"]) {
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
}else{
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
}
}
注:由于繁体又有台湾繁体和香港繁体之分,所以代码中也做出了相应的处理;
╮(╯▽╰)╭ 到了这里基本上算是完成了多语言版本的工作了,但是,但是,但是,这只是完成了项目起步期,项目中还不存在大量的中文字符串的情况;暂时先不考虑项目已经开发完成的情况,接下来先来优化下,我们刚刚写过的代码;
对于 showLbl 方法中的内容,可以定义成宏,以供项目中,任何地方需要多元化时的使用;
为了方便,我将showLbl 中取key对应的语言内容,封装进了一个带参数的宏中;
使用起来就很Easy了,只需要这样使用即可: ASLocalizedString(@"showTxt")
我在github上,上传了本篇Demo 以供辅助参考;
iOS-多语言版本开发(二)(转载)的更多相关文章
- ios-多语言版本开发(三)(转载)
写在前面 iOS 多语言版本的开发(二)中我们实现了如何让用户自己去切换系统语言的功能,我们还写了Demo 以供辅助学习:但是,继以上两篇文章都是建立在项目刚刚启动或启动不久,项目中存在的中文字符串 ...
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- android 多语言版本开发
最近项目中用用到语言切换功能,第一想到的就是资源文件,没错. 在资源文件中新建一个文件夹values-en,en表示英语,有一些还细化到地区,如values-en-rUS 即美国地区的英语,r是必需的 ...
- iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
一:尾随系统切换语言 1>创建好项目project后, 新建一个多语言文件: 2>加入要设置的语言类型: 3>加入成功 细心的朋友可能会发如今English后面写的是3 Files ...
- 玩转iOS开发:iOS中的GCD开发(三)
上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的 ...
- iOS-多语言版本的开发(一)(转载)
引言 多语言 & 本地化,随你怎么叫,道理差不多:一个App 要想走出国门,只支持一种语言是不能够的,也是不可能的,多元化世界已经融入我们的生活,对于一些应用,开发多语言版本,已经是不可避免 ...
- iOS开发-二维码扫描和应用跳转
iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现类似于微信的悬浮显示二维码效果
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...
- Android开发--二维码开发应用(转载!)
android项目开发 二维码扫描 基于android平台的二维码扫描项目,可以查看结果并且链接网址 工具/原料 zxing eclipse 方法/步骤 首先需要用到google提供的zxin ...
随机推荐
- Winform判断EventHandler是否已经添加
斜体部分替换成自己需要的 private bool HasValueChangedEventHandler(DateTimePicker b) { FieldInfo f1 = typeof(Date ...
- Lottie 动画库
强大的动画库,且同时支持 android.ios.react native 和 web http://airbnb.io/lottie/
- 【内网渗透笔记】Windows2008 R2搭建域控制器
0x00 前言 将网络中的多台计算机逻辑上组织到一起,进行集中管理,这种区别于工作组的逻辑环境叫做域(domain).域是日常计算机管理的一种很有效手段,因此,域控制器自然而然就在成域环境中最重要的角 ...
- mongo数据库查询结果不包括_id字段方法
db.GPRS_PRODUCT_HIS_FEE.find({"条件字段" : "412171211145135"},{_id:0}) db.GPRS_PRODU ...
- BootStrap Table将时间戳更改为日期格式
一.使用BootStrap Table遇到的问题: 1.MyBatis从数据库中取出的时间格式如下:2017-12-04 21:43:19.0,时间后面多了一个点零. 2.从BootStrap Tab ...
- 51开发环境的搭建--KeilC51的安装及工程的创建
学习单片机的开发,单靠书本的知识是远远不够的,必须实际操作编程才能领会书中的知识点,起到融会贯通的效果.51单片机作为入门级的单片机--上手容易.网上资源丰富.单片机稳定性及资源比较丰富.通过串口即可 ...
- Lua学习笔记 入门的两个小程序
[Hello World]第一个Lua程序将遵循传统做法,打印一句“Hello World”: print("Hello World") [阶乘]下面的程序用于输出输入值对应的阶乘 ...
- (转载)JVM实现synchronized的底层机制
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- chrome 安装页面编码选择插件
https://chrome.google.com/webstore/detail/set-character-encoding/bpojelgakakmcfmjfilgdlmhefphglae se ...
- jQuery事件处理(一)
1.jQuery事件绑定的用法: $( "elem" ).on( events, [selector], [data], handler ); events:事件名称,可以是自定义 ...