ios自定义国际化

工作闲暇之余,对ios知识进行梳理。废话不多说,直接上图,简单明了。

一、应用中字符串国际化

a、新建一个工程,工程默认是支持英文,这里添加中文。
ios自定义国际化_第1张图片
图1

ios自定义国际化_第2张图片
图2

ios自定义国际化_第3张图片
图3

ios自定义国际化_第4张图片
图4

b、新建一个本地化文件
ios自定义国际化_第5张图片
图5

这里命名一定是Localizable
ios自定义国际化_第6张图片
图6

ios自定义国际化_第7张图片
图7

ios自定义国际化_第8张图片
图8

ios自定义国际化_第9张图片
图9

c、在每个文件输入内容
ios自定义国际化_第10张图片

图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];

效果图如下:
ios自定义国际化_第11张图片
图11 英文

ios自定义国际化_第12张图片

图12 中文

二、应用程序国际化
a、多余步骤不再重复介绍、这里同样需要新建一个文件,名称必须是InfoPlist、其余操作步骤相同。详情界面如下:

ios自定义国际化_第13张图片
图13

b、输入内容
这里key一定是CFBundleDisplayName,详情如下:
ios自定义国际化_第14张图片
图14 应用中文名称

ios自定义国际化_第15张图片

图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进行读取系统文件。

ios自定义国际化_第16张图片
图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

参考文献:
https://www.jianshu.com/p/88c1b65e3ddb/

你可能感兴趣的:(国际化,国际化)