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 ...
随机推荐
- Codeforces 32E Hide-and-Seek 乞讨2关于镜面反射点 计算几何
主题链接:点击打开链接 必须指出的是,反射镜和2个人共线是不是障碍,但根据该壁其他情况 #include<cstdio> #include<iostream> #include ...
- 一个简单的java僵局演示示例
在实际编程,为了避免死锁情况,但是,让你写一个有用的程序死锁似几乎不要太简单(种面试题),下面是一个简单的死锁样例. 线程的同步化可能会造成死锁,死锁发生在两个线程相互持有对方正在等待的东西(实际是两 ...
- Sublime Text 3 最性感的编辑历史
↑ ↑ ↑ ↑ ↑ 请参阅文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 装 windows / MAC OS 官网下载.双击安装,这个都会吧- linux linux下安装.一种办法是从官网下载 tar.bz ...
- wpf做的3d滑动gallery
原文:wpf做的3d滑动gallery wpf做的3d滑动gallery 随着iphone\ipad的流行及热捧,现在做移动产品不管是什么平台的,领导总想做成像ios系统的样子.自从微软发布了wind ...
- java编程规范之java注释规范
代码要是没有注释,对读者来说就是一堆乱七八糟的字母,为了提高代码的可读性和可维护性,必须对代码进行必要的注释,这里小编整理了一下java注释规范. (一)技巧 1:注释当前行快捷方式:ctrl+/ 2 ...
- hdu4288 Coder(段树+分离)
主题链接: huangjing 题意: 题目中给了三个操作 1:add x 就是把x插进去 2:delete x 就是把x删除 3:sum 就是求下标%5=3的元素的和. 另一个条件是插入和删除最后 ...
- CodeForces 22D Segments 排序水问题
主题链接:点击打开链接 升序右键点.采取正确的点 删边暴力 #include <cstdio> #include <cstring> #include <algorith ...
- Java 解析 lnk 快捷方式文件的方法(转)
package file.extendsion; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.F ...
- 最新jhost免费jsp云空间会员邀请码
jhost支持jsp.php的免费云空间,邀请码用于激活空间服务: 邀请码:20141003104317_149661 有效期:2014-10-03 http://w ...
- 成不了天才,但为何也没成"人材"?(转)
长期以来,"软件业"一直被视为"智力密集"型的"朝阳"产业,大多数从业者都受过高等教育,其平均素质居于社会各行业的前列,这个产业的顶尖人物被 ...