iOS 应用程序内部国际化,不跟随系统语言
前言:网络上关于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
- }
- </pre>
3)获得当前语言方法
- +(NSString *)userLanguage{
- NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
- NSString *language = [def valueForKey:@"userLanguage"];
- return language;
- }
4)设置语言方法
- +(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];
- }
8、拖nib,配置点击事件
一个button,一个label,button用于切换语言,label用于显示信息。
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"];
- }
如果有多个界面的话,需要每个界面都配置接收通知,用于修改界面。
10、运行界面
可以看到点击切换语言之后,语言切换成功。
退出程序再次进入,保留了上次选择的语言。
iOS 应用程序内部国际化,不跟随系统语言的更多相关文章
- [置顶] iOS 应用程序内部国际化,不跟随系统语言
前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...
- IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源)
http://www.cnblogs.com/tangbinblog/p/3898046.html
- 【转】在企业内部分发 iOS 应用程序
(via:破船之家,原文:Provision iOS IPA App for In-House Enterprise Distribution) 在企业内部分发 iOS 应用程序非常复杂.经过努力 ...
- iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
一:尾随系统切换语言 1>创建好项目project后, 新建一个多语言文件: 2>加入要设置的语言类型: 3>加入成功 细心的朋友可能会发如今English后面写的是3 Files ...
- iOS - 应用程序国际化
开发的移动应用更希望获取更多用户,走向世界,这就需要应用国际化,国际化其实就是多语言.这篇文章介绍Xcode4.5以后的国际化,包括应用名国际化和应用内容国际化.如果是Xcode4.5之前版本请参考. ...
- ios应用程序国际化
1.程序名称国际化: 在Xcode中新建项目后,能够在project的info选项卡中找到Localization的项目,能够加入应用程序须要支持的国际语言. 回到项目中能够发如今InfoPlist. ...
- iOS应用程序工程文件以及启动流程
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51351188 本文出自:[openXu的博客] iOS程序启动流程 完整启动流程 UIApp ...
- iOS app 程序启动原理
iOS app 程序启动原理 Info.plist: 常见设置 建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...
- 浅析 - iOS应用程序的生命周期
1.应用程序的状态 状态如下: Not running 未运行 程序没启动 Inactive 未激活 程序在前台运行,不过没有接收到事件.在没有事件处理情况下程序通 ...
随机推荐
- YTU 1068: 复制字符串
1068: 复制字符串 时间限制: 1 Sec 内存限制: 128 MB 提交: 602 解决: 382 题目描述 有一字符串,包含n个字符.写一函数,将此字符串中从第m个字符开始的全部字符复制成 ...
- codeforces 448B. Suffix Structures 解题报告
题目链接:http://codeforces.com/problemset/problem/448/B 题目意思:给出两种操作automaton:可以删除字符串中任意一个字符: array:交换字符串 ...
- Nhibernate开发中遇见的问题列表
1.No persister for: LantrackCommon.pentity.BASESTANDARD 解答修改方法:我的是因为映射关系文件在属性里的生成操作设置成:嵌入的资源.
- 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...
- 整体二分 HDU - 5808
题目大意 有n个物品,排成一个序列,每个物品有一个di表示取到i要走的距离,vi表示i的价值. 给m组询问[l,r] ,c,sum,问由[l,r]的di<=c的物品能否凑出sum的价值(每个物品 ...
- Redis高级
Redis高级 redis数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实 ...
- FTP两种工作模式:主动模式(Active FTP)和被动模式
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的FTP数据端口 ...
- k-means 算法介绍
概述 聚类属于机器学习的无监督学习,在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好.它跟分类的最主要区别就在于有没有“标签”.比如说我们有一组数据,数 ...
- CSA Round #50 (Div. 2 only) Min Swaps(模拟)
传送门 题意 给出一个排列,定义\(value为\sum_{i=1}^{n-1}abs(f[i+1]-f[i])\) \(swap(a[i],a[j])(i≠j)为一次交换\),询问最少的交换次数使得 ...
- python __builtins__ slice类 (62)
62.'slice', 对序列化类型数据切片,返回一个新的对象. class slice(object) | slice(stop) | slice(start, stop[, step]) | | ...