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

简介: <h1 style="padding:0px; margin:0px; color:rgb(80,80,80); font-family:宋体,'Arial Narrow',arial,serif; font-weight:normal; font-size:20px; vertical-align:middle"> <span class="link_title" style="pad

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

分类: IOS开发工作笔记 1161人阅读 评论(0) 收藏 举报

前言:网络上关于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

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>  

  2.   

  3. #import <UIKit/UIKit.h>  

  4.   

  5. @interface InternationalControl : NSObject  

  6.   

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

  8.   

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

  10.   

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

  12.   

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

  14.   

  15. @end  


InternationalControl.m

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


[cpp] view plaincopy

  1. static NSBundle *bundle = nil;  

  2.   

  3. + ( NSBundle * )bundle{  

  4.       

  5.     return bundle;  

  6.   

  7. }  



2)初始化方法:

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

[cpp] view plaincopy

  1. +(void)initUserLanguage{  

  2.       

  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  

  4.       

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

  6.        

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

  8.           

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

  10.   

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

  12.           

  13. <pre class="cpp" name="code">        NSString *current = [languages objectAtIndex:0];  

  14.           

  15.         string = current;  

  16.           

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

  18.           

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

  20. }  

  21.   

  22.     //获取文件路径  

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

  24.       

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

  26. }  

  27. </pre>  


3)获得当前语言方法

[cpp] view plaincopy

  1. +(NSString *)userLanguage{  

  2.       

  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  

  4.       

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

  6.       

  7.     return language;  

  8. }  


4)设置语言方法

[cpp] view plaincopy

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

  2.       

  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  

  4.       

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

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

  7.       

  8.     bundle = [NSBundle bundleWithPath:path];  

  9.       

  10.     //2.持久化  

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

  12.       

  13.     [def synchronize];  

  14. }  


8、拖nib,配置点击事件

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

                                                                        



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

YGViewController.h

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>  

  2.   

  3. @interface YGViewController : UIViewController  

  4.   

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

  6.   

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

  8.   

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

  10.   

  11. @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.   

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

  7.       

  8.     NSBundle *bundle = [InternationalControl bundle];  

  9.       

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

  11.   

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

  13.       

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

  15.       

  16.     _inviteLabel.text = inviteMsg;  

  17.       

  18.     [super viewDidLoad];  

  19. }  


2)点击修改语言方法

[cpp] view plaincopy

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

  2.       

  3.     NSString *lan = [InternationalControl userLanguage];  

  4.       

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

  6.       

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

  8.       

  9.     }else{  

  10.       

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

  12. }  

  13.       

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

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

  16. }  


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

[cpp] view plaincopy

  1. -(void)changeLanguage{  

  2.       

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

  4.       

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

  6. }  


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


10、运行界面

                                                                             


                                                                             


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

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

目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
235 4
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
2月前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
2月前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
55 1
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
41 2
|
2月前
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
2月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
61 9
|
2月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
2月前
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。