iOS6和iOS7适应代码(6) —— NSLocalizedString
我们的应用程序都需要国际化,字符串的重要组成部分。一般来说。我们是通过一个string资源文件来达到这个目的,我们需要支持多国语言,有多少次把这个文档本地化。需要使用的代码NSLocalizedString这个宏。比方。我希望设置一个tableView的title:
self.navigationItem.title = NSLocalizedString(@"test", nil);
我们这里加了英文和中文简体两种语言。
假设客户选择了我们没有本地化的语言呢?比方。我们选择了繁体中文,那么这个title会显示什么呢?我们一般都希望显示英语。
这点在iOS7曾经确实没问题,但在iOS7上就变了,你会发现这个语言会选择前一次使用的语言。
也就是说,在iOS7上,我先选择。英语,然后换成中文简体,最后换成繁体中文,此时会显示中文简体!
我在开发的一个应用也遇到了这个问题,经过检查,发现这是iOS7调整了语言的顺序导致的。
对照setting页的多国语言设定页:
我们能够非常清楚的看出,iOS6上。英语总是位于第二。余下的依照你的设置顺序反向排列;而iOS7不是这种,它全然是依照你设置语言的顺序反向排列。
在我们调用NSLocalizedString这个宏的时候,系统会依照这个顺序去找本地化的语言文件。这样。当我们选择了繁体中文时,系统发现没有这个语言的本地化。于是依照顺序去逐个检測,iOS6就会使用英语,而iOS7就会使用上一次的语言。
原因已经确定了,那么我们怎么改动呢?有两种方法,以下我们一一来讲。
1. 把应用须要的默认语言放到语言表的第二个位置上,这样能够确保当前语言没有本地化时会显示默认语言
我们知道在UserDefault里面的AppleLanguages里面存储这当前的语言列表,我们能够获得这张列表,然后调整顺序,这样,我们能够确保默认语言放在第二个。代码例如以下:
NSMutableArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
NSUInteger def_lang_index = [langArray indexOfObject:@"en"];
if (def_lang_index != 1 && def_lang_index != 0) {
NSMutableArray *tempArray = [NSMutableArray arrayWithObjects:langArray[0], @"en", nil];
[langArray removeObject:langArray[0]];
[langArray removeObject:@"en"];
[tempArray addObjectsFromArray:langArray]; [[NSUserDefaults standardUserDefaults] setObject:tempArray forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
须要注意的是,这份代码必须放在main.m文件中面UIApplicationMain()之前。否则。应用本次是不起作用的,仅仅能在下次起作用。
2. 指定Bundle里面的resource文件
第一种方法尽管一劳永逸,但感觉改动的非常粗暴。不够优雅!
另外一种方法才干突出我们程序猿们的高大上。不多说了,上代码!
static NSBundle *bundle = nil; - (NSString*)getCurrentLanguage
{
NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
return langArray[0];
} - (void)setLanguage:(NSString *)l {
NSLog(@"preferredLang: %@", l);
NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
if (!path) {
path = [[ NSBundle mainBundle ] pathForResource:@"en" ofType:@"lproj" ];
//[self resetLocalization];
}
bundle = [NSBundle bundleWithPath:path]; } - (NSString *)get:(NSString *)key alter:(NSString *)alternate {
return [bundle localizedStringForKey:key value:alternate table:nil];
}
这几个方法各自是获得当前语言,设置语言——假设没有资源文件就是用默认语言。最后的get:alter:方法就是实际调用的方法,当然,这个没有NSLocalizedString这样方便,所以我们再用宏包装一下:
#define MYLocalizedString(key, comment) \
[self get:(key) alter:(comment)]
使用的时候例如以下:
[self setLanguage:[self getCurrentLanguage]];
self.navigationItem.title = MYLocalizedString(@"test", nil);
OK,结束了,赶紧试一下吧。
这两种方法都能够使用,个人当然推荐另外一种方法,假设另外一种方法在扩充一下。能够自己写一个类,这样我们能够确保全部的项目的使用了。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
iOS6和iOS7适应代码(6) —— NSLocalizedString的更多相关文章
- iOS6和iOS7代码的适配(1)
苹果的iOS7推出后,对于所有的应用来说都提出了一个天然的需求--适配不同版本的SDK.目前来说,用iOS6的SDK生成的应用,可以在iOS7的系统上跑,UI上也保持了原来的风格样式,这是苹果做的向下 ...
- iOS6和iOS7代码的适配(3)——坐标适配
由于iOS7里面status bar和视图是重叠在一起了,所以应用的y坐标就没法和以前一致了,需要重新计算设定.基本上,你的应用用Xcode5运行一下就能看见这个问题,这里写了一个最简单的例子,一个V ...
- iOS6和iOS7代码的适配(5)——popOver
popOver这个空间本身是iPad only的,所以iPhone上见不到,我记得微信上有个这样的弹出框,有扫一扫等几个菜单项,估计这是腾讯自己实现的,用于菜单的扩展. popOver从iOS6到iO ...
- ios6和ios7禁止屏幕旋转
ios6和ios7禁止屏幕旋转 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOr ...
- IOS6和IOS7的屏幕适配问题
自从IOS7出来以后,以前写在IOS6上或者更低版本的程序,跑在IOS7的模拟器上就会出现一些问题.最大的问题就是,所有的UI空间都会统一向上移动20个点(如果空间的y值为0,就会被StatusBar ...
- 解决xib布局方式支持ios6,ios7
xcode5 中的界面布局 根据sdk 分成ios7.0 and Later 和 ios6.1 and Earlier 两种,那如何xib同时支持 ios6 和ios7 的界面呢 方法如下: 在xco ...
- 适配iOS6与iOS7
适配屏幕其实很简单,但为了保持兼容性以及写的代码的通用性,以及最小的改动代码,本人按照如下的一种方式来适配,可以一劳永逸. 1. 先定义几个宏,分辨表示应用可以使用区域的高度,屏幕可用区域的高度,屏幕 ...
- 如何解决iOS6、iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件
如何解决iOS6.iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件
- iOS6和iOS7代码的适配(6) —— NSLocalizedString
我们的应用都是需要国际化的,字符串也是重要的一环.一般来说,我们是通过一个string资源文件来实现这个目的的,我们需要支持几种语言,就把这个文件本地化多少次.代码中需要用NSLocalizedStr ...
随机推荐
- jquey :eq(1)
$("#div_Goods .datagrid-row .numberbox:eq(1)") $("#div_Goods .datagrid-row .numberbox ...
- ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤
务实直接上代码: 1. 重写FilterModule.cs using System; using System.Collections.Generic; using System.Linq; usi ...
- 中文/英文双语言版本TWRP for Nexus5 -hammerheadcaf
编译及作者:laser杨万荣 编译时间: 2015-05-17 编译目的:用于刷cm-12.0 和cm-12.1 ROM 因为现在Nexus5 最新的 CM是 hammerheadcaf ,即和 ao ...
- swift排序算法和数据结构
var arrayNumber: [Int] = [2, 4, 6, 7, 3, 8, 1] //冒泡排序 func maopao(var array: [Int]) -> [Int] { fo ...
- CodeForces 10C. Digital Root
乞讨A.B.C ∈[1.N] && A*B != C,d(A*B) == d(C)组的数量. 首先要知道d(x) = (x%9 == 0 ? 9 : x%9); 那么则会有A*B == ...
- 关于.net MVC5+EF6 网站部署的问题
创建mvc web application,采用code first 的方式,MVC5,EF6.0 整了一个网站.开发完之后.直接publish.就这样部署到服务器上了. 在使用过程中发现,网站打开的 ...
- windows下一个erlang包装镜像启动
于linux环境,erlang经systools:make_script("",[])和systools:make_tar()命令生成图像包,安装镜像包,图片包的安装过程,通过替换 ...
- 站点系统压力測试Jmeter+Badboy
近期项目须要压力測试,因此搜了几款试用,首选的是LoadRunner这款大名鼎鼎的測试软件: LoadRunner11 下载请猛戳这里 传送门LoadRunner破解文件 下载请猛戳这里 传送门Loa ...
- MVC5+EF6 入门完整教程 总目录
本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...