IOS国际化(三)app内部语言的切换
来源:互联网 发布:淘宝买飞机票怎么取票 编辑:程序博客网 时间:2024/06/03 23:49
只随着手机系统的语言的改变而改变的程序是满足不了我们的需求的,所以我们需要在自己的程序中来完成语言的切换。结果如图:
第一步:按照IOS国际化(二)的1和2中的(1)和(2),来操作,完成Localizable.strings的添加,如果你不想使用Localizable.strings,那么你重新添加一个.strings如:YouLing.strings
第二步:
我们需要读取本地化的文件如:简体中文、英文和繁体中文,在这之前,我们可以在NSBundle中看到本地化的宏如下:
#define NSLocalizedString(key, comment) [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]#define NSLocalizedStringFromTable(key, tbl, comment) \ [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \ [bundle localizedStringForKey:(key) value:@"" table:(tbl)]#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \ [bundle localizedStringForKey:(key) value:(val) table:(tbl)]
从上面的代码中我们可以看到四种实现本地化的方法,IOS国际化(二)中使用的是第一种本地化的宏来实现的,这个时候方法的value的值是@”” ,默认的读取的是Localizable.strings本地化,如果IOS国际化(二)不想使用Localizable.strings,那么就重新创建一个一个.strings语言文件,然后使用NSLocalizedStringFromTable(key, tbl, comment)这个宏来完成key在这里是国际化的唯一标识key,tb1就是需要加载的你创建的.strings文件的名称。第二个宏和第三个宏为我们提供了自定义语言本地化的宏,这两个宏的区别就是第一个宏默认的读取Localizable.strings文件,第二个宏就是读取程序员指定的.strings文件,在这里我们以第三个宏为例NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) 来实现。
(1)创建bundle,根据语言的不同创建不同的不同的,在这里要让bundle是静态的以免多次创建:
/* *设置城全局的bundel */static NSBundle* bundle = nil;
方法的定义:
/* *获取NSBundle */+(NSBundle*) getLanguageBundle;/* *改变NSBundel */+(NSBundle*) changeLanguageBundle:(NSString*) languageType;
方法的实现:
/* *获取NSBundle */+(NSBundle*) getLanguageBundle{ /* *如果bundle为空时,就用系统默认的语言进行赋值 */ if (bundle == nil) { /* *获取是否支持自定义的语言切换 */ if([[YLUtility getWhetherCustomLanguage] isEqualToString:@"NO"]) { /* *获取系统的语言 */ NSString *path = [[NSBundle mainBundle] pathForResource:[YLUtility getSysCurrentLanguage] ofType:@"lproj"]; bundle = [NSBundle bundleWithPath:path];//生成bundle } else { /* *获取自定义的语言 */ NSString *path = [[NSBundle mainBundle] pathForResource:[YLUtility getCustomCurrentLanguage] ofType:@"lproj"]; bundle = [NSBundle bundleWithPath:path];//生成bundle } } return bundle;}/* *当自定义的语言切换时重新给bundle赋值 */+(NSBundle*) changeLanguageBundle:(NSString*) languageType{ NSString *path = [[NSBundle mainBundle] pathForResource:languageType ofType:@"lproj"]; bundle = [NSBundle bundleWithPath:path]; return bundle;}
对控件进行赋值:在对控件进行赋值时,我们可以定义宏NSLocalizedStringYL(key,table,comment) ,这个可以简写代码。
#define NSLocalizedStringYL(key,table,comment) NSLocalizedStringFromTableInBundle(key, table, [YLUtility getLanguageBundle], comment)
-(void) setControlValueWithCustomLanguage{ self.label_title.text = NSLocalizedStringYL(@"Language-English",@"", @"YLRootViewController——label_title"); self.label_name.text = NSLocalizedStringYL(@"userName:",@"", @"YLRootViewController——label_name"); self.label_password.text = NSLocalizedStringYL(@"userPasw:", @"",@"YLRootViewController——label_password"); self.headImage.image = [UIImage imageNamed:NSLocalizedStringYL(@"English.png", @"",@"YLRootViewController-headImage")]; self.text_name.text = NSLocalizedStringYL(@"YouLing",@"", @"YLRootViewController-text_name"); self.text_password.text = NSLocalizedStringYL(@"123456",@"", @"LRootViewController-text_password"); self.label_swithch.text = NSLocalizedStringYL(@"WhetherCustomLanguage",@"", @"LRootViewController-label_swithch");}
完成后对文中的key进行语言版本的翻译,这里的快速的方法可以直接使用XLIFFTool工具来翻译。
语言在进行切换过程中需要重新给控件赋值,所以我们需要添加通知,以便于所有的活动界面能够即使的改变语言:
定义通知:
/* *当修改语言时发送的通知 */#define YL_CHANGE_LANGUAGE @"YLCHANGELANGUAGE"
增加监听事件:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor lightGrayColor]; /* *NSLocalizedString(key, comment) */ //[self setControlValue]; /* *NSLocalizedStringFromTable(key, tbl, comment) */ //[self setControlValuetb1]; [self initControlUI]; [self setSegmentedControlState]; [self setControlValueWithCustomLanguage]; /* *对语言切换时进行监听通知 */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage:) name:YL_CHANGE_LANGUAGE object:nil];}
语言切换时发送语言切换通知:
/* *语言切换 */-(void) segmentedControlChangValue:(UISegmentedControl*) sender{ NSInteger senderId = sender.selectedSegmentIndex; NSString* languageType; switch (senderId) { case 0: languageType = @"en"; break; case 1: languageType = @"zh-Hans"; break; case 2: languageType = @"zh-Hant"; break; default: languageType = @"en"; break; } [YLUtility changeLanguageBundle:languageType]; /* *存储当前的语言 */ [YLUtility setCuntomCurrentLanguage:languageType]; /* *发送的语言切换的通知 */ [[NSNotificationCenter defaultCenter] postNotificationName:YL_CHANGE_LANGUAGE object:nil userInfo:nil];}
接收到语言修改的处理函数:
-(void) changeLanguage:(id) sender{ [self setControlValueWithCustomLanguage];}
总上我们就实现了语言在程序内部的切换。
界面的操作主要是:
YLRootViewController.h
YLRootViewController.m
帮助工具文件:
YLUtility.h
YLUtility.m
代码地址:
https://IOSYUNYUN@github.com/IOSYUNYUN/YL_IOS_Internationalization.git
- IOS国际化(三)app内部语言的切换
- IOS:国际化APP内部切换
- iOS App的国际化,以及App内的语言切换
- iOS App的国际化,以及App内的语言切换
- swift3.0-iOS app内部语言国际化(本地化)
- iOS国际化之app内切换语言
- 关于iOS国际化(根据手机系统来切换语言) App支持多语言切换
- App语言国际化(iOS)
- app内部切换语言
- iOS语言国际化(切换语言)
- 关于iOS国际化(根据手机App用户自己来切换语言) App支持多语言切换
- iOS开发:国际化之app支持多种语言切换
- iOS开发:国际化之app支持多种语言切换
- iOS APP多语言开发(国际化)
- iOS 之国际化语言切换
- iOS - 国际化语言切换
- iOS本地化国际化(续):不更随系统,手动选择APP语言 本地化和国际化的实现
- iOS App多语言国际化
- [整理]HTTP错误码大全与常见错误原因详解
- kestrel轻量级消息队列的安装
- 百度ueditor1.4.3几个bug修复
- Ng2 应用初始化脚本v0.1
- opnet调试之逻辑错误
- IOS国际化(三)app内部语言的切换
- c语言链表,头插法和尾插法
- URL简介(上)
- Java学习笔记之JSP内置对象
- 控制台下运行cl命令
- linux学习笔记--file命令
- URL简介(下)
- [技术]hibernate初步学习(一)
- qq邮箱发送