只随着手机系统的语言的改变而改变的程序是满足不了我们的需求的,所以我们需要在自己的程序中来完成语言的切换。结果如图:
第一步:按照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://[email protected]/IOSYUNYUN/YL_IOS_Internationalization.git