天天看点

iOS之国际化

iOS之国际化

iOS国际化原理分析

国际化其实都大同小异,其核心思想就是为每种语言单独定义一份资源。

iOS就是通过xxx.lproj目录来定义每个语言的资源,这里的资源可以是图片,文本,Storyboard,Xib等。

每种语言都有自己的 语言代码.lproj文件夹,加载资源时只需要加载相应语言文件夹下的资源就OK,这步可以系统为我们完成,也可以手动去做。

项目源代码中如果有多个不同目录的国际化资源,则会有产生多个xxx.lproj。

开始国际化:-------------

首先点击项目->PROJECT->Info->Localizations中添加要支持的语言。

.

iOS之国际化
iOS之国际化

infopist里面的国际化显示displayname和文本的国际化----------

备注:CFBundleDisplayName可以使用双引号,也可以不使用双引号!

所谓字符串本地化,就是指App内的字符串在不同的语言环境下显示不同的内容。

比如,"主页"这个字符串在中文语言环境下显示“主页”,在英语环境下显示“home”。下面就开始进行字符串本地化。

通过一个Localizable.strings文件来存储每个语言的文本,它是iOS默认加载的文件,

如果想用自定义名称命名,在使用NSLocalizedString方法时指定tableName为自定义名称就好了。

iOS之国际化
iOS之国际化

下面时名字为Localizable.strings时的使用--------

iOS之国际化

下面时名字为自定义xxx.strings时的使用--------

如果你的strings文件名字不是Localizable而是自定义的话,如VVS.strings,那么你就得使用NSLocalizedStringFromTable这个宏来读取本地化字符串。

NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>);

// key:系统根据key取字符串

// tbl:自定义strings文件的名字

// comment:可以不传

NSString *title = NSLocalizedStringFromTable(@

"click"

, @

"VVS"

, nil);

[self.btn setTitle:title forState:UIControlStateNormal];

图片的 国际化-------有两种方式:

新版Xcode中Images.xcassets不支持国际化(属性页面中没有Localization);

在XIB或Storyboard中引用图片时如果只使用名称是实时显示不了的,一定要加上后缀名。如avater.png。

在不同的语言下面设置同的显示,同上面的文本国际化;

第一种方式:===

iOS之国际化

这种方式和本地化代码中的字符串一样,通过NSLocalizedString(key,comment)来获取相应的字符串,然后根据这个字符串再获取图片。

这种方式获取的是同一张图片。

NSString *imageName = NSLocalizedString(@

"icon"

, nil);

UIImage *image = [UIImage imageNamed:imageName];

self.imageView.image = image;

=====国际化图片的第二种方式:这种方式可以根据不同的语言设置不同的图片;

以下引用别人的文章:

首先需要添加需要本地化的语言,具体步骤参考第一章配置需要国际化的语言。因为我演示的demo中在本地化App名称时已经添加了需要国际化的语言。所以不需要再设置。

将图片拖入工程中,例如“icon.png”,然后选中icon.png,展开Xcode右侧的file Inspection,点击Localize,如下图:

iOS之国际化

然后,右击icon.png->show in Finder,我们发现在en.Iproj文件中多了一个名为icon.png的图片,如下图:

iOS之国际化

当然,zh-Hans.Iproj文件夹下并没有图片,如下图:

iOS之国际化

我们只需给zh-Hans.Iproj添加一个名字也为icon.png的图片。如下图:

iOS之国际化

然后把zh-Hans.Iproj中的icon.png拖到Xcode中,如下图:

iOS之国际化

然后发现,icon.png左边出现了一个可以展开的三角形。如下图:

iOS之国际化

展开后发现里面包含两张图片,如下图:

iOS之国际化

然后控制器中添加如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {

[

super

viewDidLoad];

NSString *imageName = NSLocalizedString(@

"icon"

, nil);

UIImage *image = [UIImage imageNamed:imageName];

self.imageView.image = image;

}

@end

english环境下运行效果如下:

iOS之国际化

中文环境改下运行效果如下:

iOS之国际化

其他语言环境,例如法语、中文繁体、韩语,操作步骤完全和上面相同。

都是在对应的.Iproj文件夹下添加同名的图片,然后把图片拖放到Xcode中,不再赘述。

storyBoard和Xib国际化-----------

iOS之国际化

基于一个基础的Storyboard,可以看作是一个基础的模板,Storyboard里面所有的文本类资源(如UILabel的text)都会被放在相应语言的strings里面。

此时我们为Storyboard里的字符类资源作国际化只需要编辑相应语言的strings就行了。

查看/切换本地语言------------

原理:应用启动时,首先会读取NSUserDefaults中的key为AppleLanguages对应的value,该value是一个String数组,

也就是说,我们访问这个名为AppleLanguages的key可以返回一个string数组,该数组存储着APP支持的语言列表,

数组的第一项为APP当前默认的语言。

既然我们可以通过AppleLanguages这个key从NSUserDefaults中取出语言数组,

那么我们也可以给AppleLanguages这个key赋值来达到切换本地语言的效果。

- (void)viewDidLoad {

[

super

viewDidLoad];

// 切换语言前

NSArray *langArr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@

"AppleLanguages"

];

NSString *language1 = langArr1.firstObject;

NSLog(@

"模拟器语言切换之前:%@"

,language1);

// 切换语言

NSArray *lans = @[@

"en"

];

[[NSUserDefaults standardUserDefaults] setObject:lans forKey:@

"AppleLanguages"

];

// 切换语言后

NSArray *langArr2 = [[NSUserDefaults standardUserDefaults] valueForKey:@

"AppleLanguages"

];

NSString *language2 = langArr2.firstObject;

NSLog(@

"模拟器语言切换之后:%@"

,language2);

}

获取当前语言
#define skyCurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])
           

https://www.jianshu.com/p/88c1b65e3ddb/