前言:网络上关于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"];
        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)获得当前语言方法

+(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、运行界面

可以看到点击切换语言之后,语言切换成功。

退出程序再次进入,保留了上次选择的语言。

atany原创,转载请注明博主与博文链接,3Q

http://blog.csdn.net/yang8456211/article/details/12031667

—— by atany

[置顶] iOS 应用程序内部国际化,不跟随系统语言的更多相关文章

  1. iOS 应用程序内部国际化,不跟随系统语言

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

  2. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

  3. [置顶] ios App 中嵌入应用商店

    昨晚同事拿了一个app 发现其app 内部页面打开了appstore 并没有唤起手机自带的appstore, 刚开始以为是用webview 加载的 ,可是自己些了一个demo 发现并不是那样一回事 用 ...

  4. [置顶] ios 在一定选项范围随机选取选项demo

    原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9408285 demo功能:ios 在一定范围随机选取demo,如截屏.在 ...

  5. [置顶] ios 时间定时器 NSTimer应用demo

    原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9251917 demo功能:ios NSTimer应用demo .ipho ...

  6. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

  7. [置顶] iOS开发规范

    iOS代码编程规范 详细讲解代码该如何写,怎样写,如何规范. 什么样的代码是最美的,本文档会给你讲解 iOS代码编程规范........................................ ...

  8. [置顶] IOS培训资料

    1 前言 今天给公司部门培训IOS,经过两天整理弄了个PPT和一个小的Demo,希望对大家入门有所帮助. 2 详述 培训内容,主要从开发环境讲起,到Objective-C的简单入门,IOS的简介,以及 ...

  9. [置顶] ios 无限循环翻页源码例子

    原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9923053 demo功能:ios 无限循环翻页源码例子.iphone 6 ...

随机推荐

  1. Log4Qt使用(三)在DailyRollingFileAppender类中增加属性mMaxBackupIndex

    在Log4Qt中存在一个比较大的问题,当使用 DailyRollingFileAppender对日志进行输出时,会无限输出文件,也就是说,当系统运行很久时,日志文件有可能很大,大到无法想象.因此,很多 ...

  2. 使用Mina框架开发 QQ Android 客户端

    Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步AP ...

  3. Java基础知识强化66:基本类型包装类之JDK5新特性自动装箱和拆箱

    1. JDK1.5以后,简化了定义方式. (1)Integer  x = new  Integer(4):可以直接写成如下:         Integer  x = 4 ://自动装箱,通过valu ...

  4. 解决蛋疼的阿里云单CPU使用率的问题。

    工作中涉及到阿里云的应用.在性能测试阶段,压测过程中只要一个CPU未使用满,第二个CPU以至于第三个和第四个CPU完全用不到. 后来和阿里云的同事沟通他们现在用的是单队列的网卡,只能靠RPS/RFS这 ...

  5. vi & vim 基本指令(持续更新ing)

    Abstract:1) 文本编辑模式:                      --INSERT--2)一般模式:                      --i.o.a.R--3)命令行命令模式 ...

  6. NPM与调试工具的使用

    1)NPM 2)nodemon 自动监视文件的变化并重启应用 3)pm2 启动node,资源共享 4)node-inspector node调试工具 5)Chrome Developer Tools

  7. 树形dp hdu1561

    有的堡垒攻克需要攻克另一个堡垒,形成一个森林,最多攻克m个堡垒,求获得宝物的最大价值. 1,以0做根将森林形成树: 2,用背包计算当前节点下需要攻克k个堡垒能获得的宝物最大价值,但是注意同一个根节点的 ...

  8. 新安装的mysql必须调整的10项配置

    还在为新安装的mysql服务,不知道修改哪些默认配置而发愁吗?mysql可调整参数有100多个,到底要立即!马上!调整哪些最重要的参数? 网络神贴答复你: 这篇文章主要介绍了MySQL优化必须调整的1 ...

  9. CSS应用五

    1. 页面变灰 html {   filter: grayscale(100%);//IE浏览器   -webkit-filter: grayscale(100%);//谷歌浏览器   -moz-fi ...

  10. php基础之三 数组

    一.正则表达式: 1. "/"代表界定符, "^"代表开始符号 "&"结束符号 eg:   $reg="/(13[0-9] ...