iOS之国际化

 

 

iOS国际化原理分析

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

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

 

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

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

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

 

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

.

 

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

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

 

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

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

 

 

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

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

 

 

 

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

 

下面时名字为自定义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。

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

第一种方式:===

 

这种方式和本地化代码中的字符串一样,通过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,如下图:

34.png

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

35.png

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

36.png

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

37.png

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

38.png

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

39.png

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

40.png

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

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环境下运行效果如下:

QQ截图20170122153125.png

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

41.png

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

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

 

 

 

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

基于一个基础的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/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值