工作闲暇之余,对ios知识进行梳理。废话不多说,直接上图,简单明了。
一、应用中字符串国际化
a、新建一个工程,工程默认是支持英文,这里添加中文。
图1
图2
图3
图4b、新建一个本地化文件
图5这里命名一定是Localizable
图6
图7
图8
图9c、在每个文件输入内容
图10
在代码中使用系统方法NSLocalizedString即可看到中英文切换的效果,详情如下:
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 100, 100, 50)];
self.clickButton = button;
button.backgroundColor = [UIColor blueColor];
NSString *title = NSLocalizedString(@"ButtonTitle", nil);
[button setTitle:title forState:UIControlStateNormal];
[self.view addSubview:button];
UIButton *languageButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
self.languageButton = languageButton;
languageButton.backgroundColor = [UIColor blueColor];
NSString *language = NSLocalizedString(@"Language", nil);
[languageButton setTitle:language forState:UIControlStateNormal];
[languageButton addTarget:self action:@selector(changeLanguage:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:languageButton];
效果图如下:
图11 英文
图12 中文
二、应用程序国际化
a、多余步骤不再重复介绍、这里同样需要新建一个文件,名称必须是InfoPlist、其余操作步骤相同。详情界面如下:
图13b、输入内容
这里key一定是CFBundleDisplayName,详情如下:
图14 应用中文名称
图15 应用中文名称
效果图自己下载demo看一下吧
三、应用程序内部中英文切换
上面程序可以实现中英文切换,前提是要切换系统的语言。但是,有时候我们不想这么麻烦,想在程序内部设置一个按钮,直接进行中英文切换。废话不多说,直接讲解原理,上代码。
a、分析系统方法NSLocalizedString
以下是NSLocalizedString的定义
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
从上面可以看出国际化三个因素:Bundle、key、table。
Bundle:这里指的是mainBundle,也可以自定义Bundle。
key:国际化key,类似于前面的ButtonTitle、Language等。
table:这里是Localizable.strings。也可以自定义string文件。
简单明了说:系统方法主要是根据中英文,获取对应的文件夹<以下两个文件夹中的一个>,然后利用localizedStringForKey进行读取系统文件。
图16 系统国际化要读取的文件
NSString *languagePath = [[NSBundle mainBundle] pathForResource:self.languageType ofType:@"lproj"];
self.languageBundle = [NSBundle bundleWithPath:languagePath];
NSString *clickString = [self.languageBundle localizedStringForKey:@"ButtonTitle" value:nil table:@"Localizable"];
以上是模仿读取系统的国际化文件,效果等同于NSLocalizedString。只不过是我们可以随意定义系统读取哪个文件,这样我们就可以根据自己的需要进行定制了。
顺便介绍一下,系统的其它的方法:
1、根据key读取内容
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
2、根据key、strings列表名称进行读取
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
3、根据key、strings列表名称、bundle名称进行读取
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
4、根据key、strings列表名称、bundle名称进行读取<这个val不知道干什么用的>
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
b、自定义国际化方法
接下来,我们可以试着模仿系统定义的方法,自己定义一个解析国际化的方法。废话不多说,直接三步走。
前提是获取系统语言。
1、获取en.lproj和zh-Hans.lproj的路径path。
2、将path换成bundle。
3、[bundle localizedStringForKey]进行国际化转换。
到此本文结束,如果有不懂的,请下载demo。
本文demo地址:
https://github.com/yscMichael/Localizations