ios多语言、国际化

来源:互联网 发布:初学电钢琴推荐知乎 编辑:程序博客网 时间:2024/05/16 15:05

原文链接

将文本国际化常用的3个方面一一讲解

根据系统语言设置,应用名称的多语言切换
根据系统语言设置,应用内容的多语言切换
在应用内,手动切换多语言
优化
初体验多语言–APP应用图标的多语言

效果:

Uploading 屏幕快照 2016-11-17 上午9.10.00_240252.png …]
在设置——通用——语言 中选择日语

屏幕快照 2016-11-17 上午9.10.00.png
实现:

1 为项目添加支持的语言
在project——info——Localizations 添加简体中文和日语

屏幕快照 2016-11-17 上午9.30.49.png
如果项目中的sb和xib没用到多语言,不用勾选。默认勾选,不影响。

屏幕快照 2016-11-17 上午9.27.54.png
2 生成存放语言的strings文件

2.1 在Resource——Strings File 生成一个名字为 InfoPlist 的strings文件

屏幕快照 2016-11-17 上午9.33.45.png
2.2 点击 Localize 为InfoPlist.strings 生成支持的语言.strings

屏幕快照 2016-11-17 上午9.39.06.png
2.3 添加简体中文和日语

屏幕快照 2016-11-17 上午9.44.12.png
勾选支持的简体中文和日语

2.4 勾选完成后,在InfoPlist.strings文件下自动生成对应语言的.strings文件

屏幕快照 2016-11-17 上午9.49.11.png
3 在strings添加内容

3.1 在InfoPlist.strings(Simplified) 中输入 CFBundleDisplayName = “指尖弹灰”;

在InfoPlist.strings(Japanese) 中输入 CFBundleDisplayName = “指先デフレクタ”;

4 实现功能
4.1 在info.plst 中添加字段 Application has localized display name 并设置成Boolean类型的Yes

屏幕快照 2016-11-17 上午9.58.15.png
4.2 该功能已经实现了。按照效果图中的操作即可。很简单吧,如果改变系统语言,希望应用内的语言也改变,该怎么办呢?往下看!

注意:

1 Terminating since there is no system app.

系统切换语言后,应用发生闪退,要重启应用。
2 APP应用图标的多语言设置 ,strings文件只能叫 InfoPlist.strings

更近一步多语言–APP应用内容的多语言

根据系统语言,APP内语言的自动切换

效果:

当系统语言设为简体中文时,运行程序

屏幕快照 2016-11-17 上午10.42.30.png

当系统语言设为日语时,运行程序

屏幕快照 2016-11-17 上午10.46.32.png
实现:

1 为项目添加支持的语言

添加日语和简体中文

2 生成存放语言的strings文件

生成一个名字为Localizable的strings文件

屏幕快照 2016-11-17 上午10.24.41.png
3 在strings文件中添加多语言

3.1在InfoPlist.strings(Simplified) 中输入 “labelText” = “指尖弹灰”;

在InfoPlist.strings(Japanese) 中输入 “labelText = “指先デフレクタ”;

4 实现功能

为View添加一个label

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(140, 200, 200, 30)];label.text = NSLocalizedString(@"labelText", nil);[self.view addSubview:label];

该功能已经实现了。按照效果图中的操作即可。

关键方法:

1 “labelText”是key , “指尖弹灰” “指先デフレクタ” 是不同语言strings中的value
2 NSLocalizedString(key, comment)

首先获取系统语言——日语
然后在Localizable.strings 文件下找到Localizable.strings(Japanese)文件中key对应的value值,将其返回.
理论:

define NSLocalizedString(key, comment) \

    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

define NSLocalizedStringFromTable(key, tbl, comment) \

    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]

key: 查找的key值
comment: 备注,从上面的预定义中可以看出它不参与代码的运行,只是为了我们好去知道这个字段是什么。如

label.text = NSLocalizedString(@”labelText”, @”程序中lable的名字”);
tbl: 对应的Strings文件的名称(如:InfoPlist ,Localizable)。预定义NSLocalizedString(key,comment)是第二个定义的简化版,它将tbl设为nil.如果tbl为nil则默认tbl是Localizable. 现在大家明白了为什么我们的Strings要命名为Localizable.Strings了吧。

//也可以这样写
label.text = NSLocalizedStringFromTable(@”labelText”, nil, nil);
更多的情况是我们想让用户可以在应用内去设置语言。这时我们的该怎么做呢?往下看
在APP内部,手动实现多语言切换

效果:

屏幕快照 2016-11-17 下午2.36.27.png

屏幕快照 2016-11-17 下午2.36.11.png
实现:

为项目添加支持的语言

为项目添加中文简体和维吾尔语 uyghur(ug)

生成存放语言的strings文件

生成一个名字为demo的strings文件

屏幕快照 2016-11-20 下午5.53.38.png
在strings文件中添加多语言

在demo.strings(Simplified) 中添加

“labelName” =”订单签收”;
“buttonName” =”切换语言”;

在demo.strings(Uyghur) 中添加

labelName” =”زاكاس تالونغا ئىمزا قويۇپ ئېلىش”;
“buttonName” =”ئالماستۇرۇش”;

实现功能

4.1 获取当前保存在NSUerDefaults中的语言

define currentLanguage [NSString stringWithFormat:@”%@”,[NSUserDefaults standarUserDefaults] objectForKey:@”appLanguage”]]

4.2 获取当前语言文件所在的路径

define LanguagePath [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@”lproj”]`

4.3 返回当前语言文件key所对应的value

define THLocalized(key) [[NSBundel bundleWithPath:LanguagePath] localizedStringForKey:(key) value:nil table:@”demo”]
4.4 为了简便,将上述3个预定义合在一起得到

define THLocalized(key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@”%@”,[[NSUserDefaults standardUserDefaults] objectForKey:@”appLanguage”]] ofType:@”lproj”]] localizedStringForKey:(key) value:nil table:@”demo”]

THLocalized(key) 和NSLocalizedString(key, comment)是不是很像呢?

4.5 如果第一次进入应用,NSUserDefaults中没有保存的语言怎么办?

在AppDelegate.m文件中,实现判断。如果NSUserDefaults中没有保存语言,则将系统设置的语言保存到NSUserDefaults中

  • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {

    if (![[NSUserDefaults standardUserDefaults]objectForKey:@”appLanguage”]) {
    NSArray *languages = [NSLocale preferredLanguages];
    NSString *language = [languages objectAtIndex:0];
    if ([language hasPrefix:@”zh-Hans”]) {//开头是否匹配
    [[NSUserDefaults standardUserDefaults] setObject:@”zh-Hans” forKey:@”appLanguage”];
    }else{
    [[NSUserDefaults standardUserDefaults] setObject:@”en” forKey:@”appLanguage”];
    }
    }

    return YES;
    }
    4.6 View中添加一个label和一个button

  • (void)viewDidLoad {

    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
    label.text = THLocalized(@”labelName”);
    [self.view addSubview:label];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(100, 400, 200, 50);
    [button setTitle:THLocalized(@”buttonName”) forState:UIControlStateNormal];
    [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    }
    4.7 点击button时,将当前语言保存到NSUserDefaults中,并刷新应用

  • (void)click {

    NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@”appLanguage”];
    if ([language isEqualToString: @”ug”]) {
    [[NSUserDefaults standardUserDefaults] setObject:@”zh-Hans” forKey:@”appLanguage”];
    }else {
    [[NSUserDefaults standardUserDefaults] setObject:@”ug” forKey:@”appLanguage”];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];

    // 可以将rootViewController设成刷新后停留的页面的controller
    AppDelegate delegate = (AppDelegate )[UIApplication sharedApplication].delegate;
    ViewController * vc = [[ViewController alloc]init];
    delegate.window.rootViewController = vc;
    }
    补充说明: zh-Hans是中文简体的缩写,ug是维吾尔语的缩写.下图括号里面是缩写

屏幕快照 2016-11-17 下午2.33.20.png
优化

切换成其他语言后,view大小应该可以随内容去调整,使得text可以显示完全。

这讲是针对文本的国际化,实际上图片,storyboard,xib也都可以进行国际化

原创粉丝点击