ios自定义国际化

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

一、应用中字符串国际化

a、新建一个工程,工程默认是支持英文,这里添加中文。
这里写图片描述
图1

这里写图片描述
图2

这里写图片描述
图3

这里写图片描述
图4

b、新建一个本地化文件
这里写图片描述
图5

这里命名一定是Localizable
这里写图片描述
图6

这里写图片描述
图7

这里写图片描述
图8

这里写图片描述
图9

c、在每个文件输入内容
这里写图片描述

图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、其余操作步骤相同。详情界面如下:

这里写图片描述
图13

b、输入内容
这里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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值