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

一、应用中字符串国际化

a、新建一个工程,工程默认是支持英文,这里添加中文。

ios自定义pickerview ios自定义短语_自定义


图1

ios自定义pickerview ios自定义短语_自定义_02


图2

ios自定义pickerview ios自定义短语_自定义_03


图3

ios自定义pickerview ios自定义短语_#define_04


图4b、新建一个本地化文件

ios自定义pickerview ios自定义短语_自定义_05


图5这里命名一定是Localizable

ios自定义pickerview ios自定义短语_国际化_06


图6

ios自定义pickerview ios自定义短语_国际化_07


图7

ios自定义pickerview ios自定义短语_#define_08


图8

ios自定义pickerview ios自定义短语_自定义_09


图9c、在每个文件输入内容

ios自定义pickerview 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自定义pickerview ios自定义短语_#define_11


图11 英文

ios自定义pickerview ios自定义短语_自定义_12

图12 中文

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

ios自定义pickerview ios自定义短语_自定义_13


图13b、输入内容

这里key一定是CFBundleDisplayName,详情如下:

ios自定义pickerview ios自定义短语_国际化_14


图14 应用中文名称

ios自定义pickerview ios自定义短语_#define_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自定义pickerview 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