前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 –

今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案。

一、总则:

应用内部语言不跟随系统语言,由应用自己进行控制,通过配置多个语言文件,根据用户的选择动态获取不同文件夹下的语言文件,显示在界面上。

最后把用户选择的语言持久化到本地,下次运行时读取。

二、应用内的国际化

1、新建工程

新建Single View Application工程,取名为MyInternational。

2、添加多语言文件

我们选择使用自己的语言文件,而不是系统的localizable.string,因为在项目开发使用svn时,多人操作同一文件可能会造成冲突。

在Resource中添加新的Strings File:

取名为hello(记得Targets要勾选项目)

新建完成之后会生成hello.string文件,把它拖进Supporting Files里。

3、配置hello.string国际化

首先配置刚才的hello.string文件。

点击hello.strings文件,点击圈中的Make localized(本地化)。

只有English,没关系点击确定。

4、配置项目国际化

网络上很多配置方法不靠谱,因为新版的Xcode位置“+”号的位置换了,这里教大家正确的方法,点击项目—>选择Project—>选择Info—>点击“+”号。

点击“+”号后,添加中文,当然也可以添加其他的语言,弹出对话框,infoPlist是配置系统的国际化文件,可以配置图标之类的多语言环境,不属于本文范围,nib文件看需要配,这里选择不配。

配置完成之后,再看hello.string便分成了两个文件。

完成上面的四步便完成了项目内的多语言环境配置,下面来看看代码怎么写。

5、添加需要的字符串

分别在hello.strings(English)与hello.strings(Chinese)里面添加对应语言的字符串。

字符串的格式为“key”=“value”;键值对(别忘记分号!)

接下来配置项目需要的字符串,一个用于lable的显示,一个用于button的显示。

hello.strings(English)

"invite" ="hello atany,come to join in us!";

"buttonInfo" ="change Language";

hello.strings(Chinese)

"invite" ="你好 atany,快来加入我们吧!";

"buttonInfo" ="切换语言";

6、看看流程

【实现思路:】

在初始化首个Controller的时候,进行应用语言的加载。首次加载因为userLanguage(应用内语言)不存在,则使用系统当前的语言,保存到userlanguage,下次直接读。读出来之后,获取到对应文件路径,得到文件的索引,储存到工具类InternationalControl的静态变量bundle中。

其他地方需要用字符串时,用工具类获得bundle即可读取相应文件中的字符串。

7、新建工具类InternationalControl

InternationalControl.h

    #import <Foundation/Foundation.h>  #import <UIKit/UIKit.h>  @interface InternationalControl : NSObject  +(NSBundle *)bundle;//获取当前资源文件  +(void)initUserLanguage;//初始化语言文件  +(NSString *)userLanguage;//获取应用当前语言  +(void)setUserlanguage:(NSString *)language;//设置当前语言  @end  

InternationalControl.m

1)创建静态变量bundle,以及获取方法bundle(注:此处不要使用getBundle)。

    static NSBundle *bundle = nil;  + ( NSBundle * )bundle{  return bundle;  }  

2)初始化方法:

userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。

 +(void)initUserLanguage{  NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  NSString *string = [def valueForKey:@"userLanguage"];  if(string.length == 0){  //获取系统当前语言版本(中文zh-Hans,英文en)  NSArray* languages = [def objectForKey:@"AppleLanguages"];  <pre class="cpp" name="code">        NSString *current = [languages objectAtIndex:0];  string = current;  [def setValue:current forKey:@"userLanguage"];  [def synchronize];//持久化,不加的话不会保存
}  //获取文件路径  NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];  bundle = [NSBundle bundleWithPath:path];//生成bundle
}  

3)获得当前语言方法

    +(void)setUserlanguage:(NSString *)language{  NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  //1.第一步改变bundle的值  NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];  bundle = [NSBundle bundleWithPath:path];  //2.持久化  [def setValue:language forKey:@"userLanguage"];  [def synchronize];  }  

9、配置加载的第一个Controller,这里是YGViewController

YGViewController.h

    #import <UIKit/UIKit.h>  @interface YGViewController : UIViewController  @property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label  - (IBAction)changeLanguage:(id)sender;//点击事件  @property (retain, nonatomic) IBOutlet UIButton *btChange;//button  @end  

YGViewController.m

1)加载:

    - (void)viewDidLoad  {  //注册通知,用于接收改变语言的通知  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];  [InternationalControl initUserLanguage];//初始化应用语言  NSBundle *bundle = [InternationalControl bundle];  NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];  NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table为hello.string的文件名  [_btChange setTitle:buttonInfo forState:UIControlStateNormal];  _inviteLabel.text = inviteMsg;  [super viewDidLoad];  }  

2)点击修改语言方法

    - (IBAction)changeLanguage:(id)sender {  NSString *lan = [InternationalControl userLanguage];  if([lan isEqualToString:@"en"]){//判断当前的语言,进行改变  [InternationalControl setUserlanguage:@"zh-Hans"];  }else{  [InternationalControl setUserlanguage:@"en"];  }  //改变完成之后发送通知,告诉其他页面修改完成,提示刷新界面  [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];  }  

3)接收到通知执行方法,刷新界面

    -(void)changeLanguage{  [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];  _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];  }  

iOS应用内部切换语言,不跟随系统相关推荐

  1. iOS开发之APP内部切换语言

    2019独角兽企业重金招聘Python工程师标准>>> 前言 iOS开发中,随着APP越来越完善,很多APP都做了国际化,也实现了APP内部切换语言. 原理 国际化都会走到NSBun ...

  2. IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源)...

    此问题已解决.请看: IOS APP 国际化 程序内切换语言实现 不重新启动系统(完美解决方案) 接了个变态的需求,要在程序内切换程序语言实现国际化. 可以先看看这个,比较详细. http://blo ...

  3. app系统语言切换及app内部切换语言

    今天闲来无事看了点关于android系统语言及app内语言的切换,有点小感想就做了个demo,拿出来分享下 1.根据系统语言app适配 这个相对来说比较简单我们只需要建一个相应的values文件夹就好 ...

  4. Win10切换语言后设置系统时间、日期、货币

    可以修改数字格式.货币格式.时间格式.日期格式.

  5. iOS 应用程序内切换语言 中英文切换

    前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...

  6. iOS 应用程序内切换语言 中英文切换

    前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...

  7. iOS开发 国际化/多语言适配

    史上最详细的多语言本地化 iOS中,国际化适配,大概有下面几种情况需要适配. 1,App名称/图标本地化 2,启动页本地化 3,代码中字符串本地化 4,xib/storyboard本地化 5,图片的本 ...

  8. Android 8.0 App内切换语言不生效的问题记录

    国内大部分简单应该都只做了中文简体版,但是有部分项目需要面向国际化,甚至可能就是主打国外市场.因此我们有时候会遇到需要APP内做多语言切换的功能需求. 如何做多语言切换,网上资料还是很多的,本文也不是 ...

  9. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...

最新文章

  1. 数据结构和算法:(3)3.2线性表的链式存储结构
  2. 【Matlab】求解积分方程的数值解
  3. sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用
  4. 关于actionbar的drawerlayout
  5. [四川金信石招人]技术总监架构师测试工程师
  6. 今天的练习是敏捷结果30天的最后一天
  7. Python文档自动生成器
  8. Android绘制基础及手写绘制实例
  9. 百分点集团刘译璟:人工智能四大挑战及对策
  10. 如何安装SQL2005 EXPRESS版
  11. 机器人动力学方程——拉格朗日法
  12. 茎叶图、箱图是什么,如何用SPSS实现?(图文)
  13. C++搜索算法和曼哈顿距离之最少连通代价
  14. 无尽对决怎么修改服务器地区,无尽对决怎么更改账号 | 手游网游页游攻略大全...
  15. 前端课程设计02-购物商城
  16. android 杀进程推送服务,关于APP进程被杀死,极光推送收不到消息的解决办法
  17. 卡片机和单反机详细对比
  18. python生成单位矩阵_python 实现一个反向单位矩阵示例
  19. utf8mb4_unicode_ci、utf8mb4_general_ci的区别总结
  20. linux命令:查询某个字符串在哪个文件中存在,贼拉管用!

热门文章

  1. Notions of Flow Networks and Flows
  2. flask与echarts前后端交互,使用sqlalchemy和pymysql连接数据库
  3. 线程池Executors.newFixedThreadPool
  4. 江苏警官学院计算机技术,江苏警官学院公安科技系简介
  5. 英语情景对话计算机的优缺点,买电脑的英语情景对话
  6. zlmediakit+WVP+kkkkk5G-MediaServerUI-master+obs 桌面视频直播
  7. MMDet3D——报错解决:KeyError: ‘SparseConv2d is already registered in conv layer‘
  8. 2022年最新版TMIC新品策划师题库
  9. 成功解决ValueError: Expected 2D array, got 1D array instead
  10. C++(17):filesystem