我们的应用程序都需要国际化,字符串的重要组成部分。一般来说。我们是通过一个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相关推荐

  1. iOS6和iOS7代码的适配(1)

    苹果的iOS7推出后,对于所有的应用来说都提出了一个天然的需求--适配不同版本的SDK.目前来说,用iOS6的SDK生成的应用,可以在iOS7的系统上跑,UI上也保持了原来的风格样式,这是苹果做的向下 ...

  2. iOS6和iOS7环境下微信登录未显示问题微信IOS的SDK:isWXAppInstalled总是返回NO和nil...

    iOS6和iOS7环境下微信登录未显示问题&微信IOS的SDK:isWXAppInstalled总是返回NO和nil 一.问题描述: iOS6和iOS7 环境下未显示微信登录界面,在其他环境下 ...

  3. ios6和ios7区别

    ios6和ios7在界面上有些区别 ios6中 1.statusBar是20,也就是屏幕实际只用到460,但我们加控件或者什么到界面上, 坐标应从 (0,0)开始 2.navigationContro ...

  4. (ios7) 解决代码布局View, ios7 中 subView 高度增加StatusBar20dp的问题,保证Ios6,ios7代码一致...

    在ios7 布局中,Status Bar 和 ToolBar ,NavigateBar 等都包含在ViewControl的主View中. 这样原来ios6 的View布局 整体向上移动了20dp,下面 ...

  5. iOS6和iOS7代码的适配(2)——status bar

    用Xcode5运行一下应用,第一个看到的就是status bar的变化.在iOS6中,status bar是系统在处理,应用中不需要考虑这部分,iOS7之后是应用在处理,每个ViewControlle ...

  6. iOS6和iOS7代码的适配(4)——tableView

    iOS7上不少控件的样子有了变化(毕竟要扁平化嘛),不过感觉变化最大的肯定非tableView莫属.因为这个控件的高度可定制性,原先是使用及其广泛的,这样的一个改变自然也影响颇大. 1.accesso ...

  7. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,支持iOS6+,3行代码即可集成

    重要提示: 1.9.0版本已发布,移除了"prefs:root="的调用,这个API已经被列为私有API,请大家尽快升级.其它同样使用了该API的库大家可以检查下,比如著名的SVP ...

  8. Xcode支持iOS6、iOS7版本

    Xcode升级到8.0版本后,默认只支持iOS8.0了,这时无法支持iOS8.0以下的版本了,同时项目编译时会出现一大堆的黄色警告,警告的内容是一些方法已经被弃用了,但是这些方法是可以正常使用的,只是 ...

  9. 自定义UISearchBar 适配IOS6和IOS7 修改放大镜图标 修改光标颜色 修改边框颜色 placeholder颜色 设置文本框背景

    文章转自:http://blog.csdn.net/zhang_red/article/details/21447535 总结下常用的几点: 1.修改放大镜图标 [self setImage:[UII ...

最新文章

  1. kvm虚拟化技术下虚拟机磁盘的数据保护
  2. CentOS的阿里YUM源安装
  3. 嵌入式成长轨迹11 【嵌入式环境及基础】【Linux shell深入】【深入讨论】
  4. 如何了解这个世界(社会)运行的本质
  5. SpringBoot_配置-@Conditional自动配置报告
  6. 自动填充数据新增测试数据_用测试数据填充员工数据库
  7. 计算机基础及ms应用在线,全国一级计算机基础及MS Office应用课件 (2).pdf
  8. 为什么MySQL不建议使用NULL作为列默认值?
  9. [导入]视频游戏开发系列课程(8):开始创造游戏的“精灵”的行为.zip(14.93 MB)
  10. 台式计算机键盘示意图,电脑键盘示意图
  11. 前端项目框架搭建随笔---Tab组件的编写
  12. mysql取第二大_mysql – SQL:从一行列中获取第二大值
  13. Maple 热工计算
  14. DFS+记忆化搜索 -- 简单练习
  15. 计算机概述(四)——计算机的快速发展
  16. 降噪无线耳机推荐,热销火爆的降噪蓝牙耳机分享
  17. Python查询mysql返回序列化数据
  18. 图解kafka中hw,leo,isr
  19. 数据,数据元素,数据项,数据对象的区别
  20. 大厂机密,30 提升团队研发效能的锦囊

热门文章

  1. 基础学习day03---程序结构与控制、函数与数组入门
  2. 和菜鸟一起学linux内核源码之启动篇
  3. Learning Video Object Segmentation from Static Images
  4. 目标检测分类损失函数——Cross entropy、Focal loss
  5. mac 您没有权限打开应用程序_Mac应用程序无法打开或文件损坏的解决方法
  6. 对字符串进行折半查找c语言,C语言:编写折半查找函数
  7. 空调微型计算机控制,空调自动控制
  8. oracle10gr2安装教程,Solaris10安装Oracle10gR2时的注意事项
  9. tp801单板微型计算机是什么,给TP801单板机配接RX—80打印机
  10. iOS UITextView和UITextViewDelegate