189 8069 5689

iOS应用程序内部国际化,不跟随系统语言-创新互联

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

分类: IOS开发工作笔记2013-12-07 18:21 1161人阅读 评论(0) 收藏 举报

创新互联建站是一家专注于成都网站建设、网站设计与策划设计,大方网站建设哪家好?创新互联建站做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:大方等地区。大方做网站价格咨询:18980820575

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

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

一、总则:

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

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

二、应用内的国际化

1、新建工程

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

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

2、添加多语言文件

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

在Resource中添加新的Strings File:

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

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

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

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

3、配置hello.string国际化

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

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

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

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

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

4、配置项目国际化

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

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

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

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

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

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

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

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、看看流程

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

【实现思路:】

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

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

7、新建工具类InternationalControl

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

InternationalControl.h

[cpp] view plaincopy

  1. #import 

  2. #import 

  3. @interface InternationalControl : NSObject

  4. +(NSBundle *)bundle;//获取当前资源文件

  5. +(void)initUserLanguage;//初始化语言文件

  6. +(NSString *)userLanguage;//获取应用当前语言

  7. +(void)setUserlanguage:(NSString *)language;//设置当前语言

  8. @end

InternationalControl.m

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

[cpp] view plaincopy

  1. static NSBundle *bundle = nil;

  2. + ( NSBundle * )bundle{

  3.     return bundle;

  4. }

2)初始化方法:

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

[cpp] view plaincopy

  1. +(void)initUserLanguage{

  2.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

  3.     NSString *string = [def valueForKey:@"userLanguage"];

  4.     if(string.length == 0){

  5.         //获取系统当前语言版本(中文zh-Hans,英文en)

  6.         NSArray* languages = [def objectForKey:@"AppleLanguages"];

  7.         NSString *current = [languages objectAtIndex:0];

  8.         string = current;

  9.         [def setValue:current forKey:@"userLanguage"];

  10.         [def synchronize];//持久化,不加的话不会保存

  11. }

  12.     //获取文件路径

  13.     NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];

  14.     bundle = [NSBundle bundleWithPath:path];//生成bundle

  15. }

3)获得当前语言方法

[cpp] view plaincopy

  1. +(NSString *)userLanguage{

  2.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

  3.     NSString *language = [def valueForKey:@"userLanguage"];

  4.     return language;

  5. }

4)设置语言方法

[cpp] view plaincopy

  1. +(void)setUserlanguage:(NSString *)language{

  2.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

  3.     //1.第一步改变bundle的值

  4.     NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];

  5.     bundle = [NSBundle bundleWithPath:path];

  6.     //2.持久化

  7.     [def setValue:language forKey:@"userLanguage"];

  8.     [def synchronize];

  9. }

8、拖nib,配置点击事件

一个button,一个label,button用于切换语言,label用于显示信息。

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

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

YGViewController.h

[cpp] view plaincopy

  1. #import 

  2. @interface YGViewController : UIViewController

  3. @property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label

  4. - (IBAction)changeLanguage:(id)sender;//点击事件

  5. @property (retain, nonatomic) IBOutlet UIButton *btChange;//button

  6. @end

YGViewController.m

1)加载:

[cpp] view plaincopy

  1. - (void)viewDidLoad

  2. {

  3.     //注册通知,用于接收改变语言的通知

  4.     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];

  5.     [InternationalControl initUserLanguage];//初始化应用语言

  6.     NSBundle *bundle = [InternationalControl bundle];

  7.     NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];

  8.     NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table为hello.string的文件名

  9.     [_btChange setTitle:buttonInfo forState:UIControlStateNormal];

  10.     _inviteLabel.text = inviteMsg;

  11.     [super viewDidLoad];

  12. }

2)点击修改语言方法

[cpp] view plaincopy

  1. - (IBAction)changeLanguage:(id)sender {

  2.     NSString *lan = [InternationalControl userLanguage];

  3.     if([lan isEqualToString:@"en"]){//判断当前的语言,进行改变

  4.         [InternationalControl setUserlanguage:@"zh-Hans"];

  5.     }else{

  6.         [InternationalControl setUserlanguage:@"en"];

  7. }

  8.     //改变完成之后发送通知,告诉其他页面修改完成,提示刷新界面

  9.     [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];

  10. }

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

[cpp] view plaincopy

  1. -(void)changeLanguage{

  2.     [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];

  3.     _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];

  4. }

如果有多个界面的话,需要每个界面都配置接收通知,用于修改界面。

10、运行界面

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

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

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

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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:iOS应用程序内部国际化,不跟随系统语言-创新互联
分享链接:http://cdxtjz.cn/article/jgioc.html

其他资讯