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 ...
随机推荐
- PHP代码审计笔记--代码执行漏洞
漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞. 常见代码注射函数: 如:eval.preg_replace+/e.assert.call_user_func. ...
- ActiveX 控件导入程序
ActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件. http://msdn.microsoft.com/zh-cn/library/8 ...
- cannot access android.support.v4.app.BaseFragmentActivityJB的解决
//implementation 'com.android.support:appcompat-v7:26.1.0' 改成implementation 'com.android.support:app ...
- 在windows2003下可以用哪个版本的JDK
JDK在windows下只区分32位还是64位的, 而windows 2003有32位也有64位的,你先查查看自己机器是哪种,参照下面这个经验http://jingyan.baidu.com/arti ...
- 【Mybatis】Mybatis基本构成
SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口) SqlSessionFactory:依靠工厂来生成SqlSes ...
- 【Shell脚本编程系列】Shell脚本开发的习惯和规范
1.开头指定脚本解释器 #!/bin/sh或#!/bin/bash 2.开头加版本版权信息 #Date #Author #Mail #Function #Version 提示:可配置vim编辑文件时自 ...
- 【Spring Boot&&Spring Cloud系列】Spring Boot项目集成Swagger UI
前言 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...
- 一起脱去小程序的外套和内衣 - 微信小程序架构解析
版权声明:本文由渠宏伟 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/760767001484042227 来源:腾云阁 ...
- android include标签的使用,在RelativeLayout中使用include标签需注意!!!!!
转:http://4265337.blog.163.com/blog/static/195375820127935731114/ include和merge标记的作用主要是为了解决layout的重用问 ...
- Java toString()方法的自动调用
如果某一个对象出现在字符串表达式中(涉及“+”字符串对象的表达式),toString()方法就会被自动调动.