iOS --- 多语言适配的注意事项

来源:互联网 发布:java 程序员速成班 编辑:程序博客网 时间:2024/05/16 08:59

关于iOS APP的国际化适配,主要有以下几点:

Localizable.strings文件

该文件主要用于字符串的多语言版本,包括Localizable.string(English), Localizable.strings(Chinese(Simplified)), Localizable.strings(Chinese(Traditional))等多个版本。内容格式如下:

// Localizable.string(English)"GUI_TEXT_CANCEL" = "Cancel";//取消"GUI_TEXT_BACK" = "Back";//返回"GUI_TEXT_SEND" = "Send";//发送
// Localizable.strings(Chinese(Simplified))"GUI_TEXT_CANCEL" = "取消";//取消"GUI_TEXT_BACK" = "返回";//返回"GUI_TEXT_SEND" = "发送";//发送

storyboard和xib文件

Main.storyboard也会有多个版本,最重要的就是Base版本,即当前开发者使用语言的版本(如简体中文)。Main.storyboard(Base)文件与常见的Main.storyboard文件无异,其相应文字已在Main.storyboard中标记。
另外,会有Main.strings(English), Main.strings(Chinese(Traditional))版本的两个文件。格式如下:

// Main.strings(English)/* Class = "UITextField"; placeholder = "新密码"; ObjectID = "G9J-mp-XNR"; */"G9J-mp-XNR.placeholder" = "New password";/* Class = "UITextField"; placeholder = "原密码"; ObjectID = "LbQ-a8-5ly"; */"LbQ-a8-5ly.placeholder" = "Old password";/* Class = "UITextField"; placeholder = "手机号码"; ObjectID = "LrI-zH-3OD"; */"LrI-zH-3OD.placeholder" = "Phone number";
// Main.strings(Chinese(Traditional))/* Class = "UITextField"; placeholder = "新密码"; ObjectID = "G9J-mp-XNR"; */"G9J-mp-XNR.placeholder" = "新密碼";/* Class = "UITextField"; placeholder = "原密码"; ObjectID = "LbQ-a8-5ly"; */"LbQ-a8-5ly.placeholder" = "原密碼";/* Class = "UITextField"; placeholder = "手机号码"; ObjectID = "LrI-zH-3OD"; */"LrI-zH-3OD.placeholder" = "手機號碼";

这两个Main.strings文件的格式是自动生成的,我们仅需对应调整其中的placeholder文字即可,步骤请参考Main.storyboard的国际化。其中的OjbectID是唯一对应于一个UI控件的。
xib文件的国际化同Main.storyboard,不再赘述。

图片等资源

最直接的方法,可以准备三个图片, 在Localizable.strings中指定.:

"imageName" = "ilike_en";

然后代码中使用

[_imageView setImage:[UIImage imageNamed: NSLocalizedString(@“imageName”, nil)]];

即可.
对于图片的命名,可采用hello_en@2x.png之类的规则。

获取当前语言类型

通常涉及到国际化,我们会先判断当前使用的语言类型。
获取iOS系统的语言类型可使用:

NSArray *languages = [NSLocale preferredLanguages]; // 获取语言字段NSString *curLanguage = [languages firstObject]; // 获取当前使用语言

对于curLanguage的值,iOS9在其中增加了地区代码。如简体中文,在iOS9之前为@”zh-Hans”,而在iOS9中为@”zh-Hans-CN”。所以iOS9之前的一些判断如

[curLanguage isEqualToString:@"zh-Hans"]

在iOS9之后就会有问题,可使用

[curLanguage hasPrefix:@"zh-Hans"]

来代替。如下:

 //  当前语言是否中文简体-#define isZhHans [[[NSLocale preferredLanguages] firstObject] isEqualToString:@"zh-Hans"]+#define isZhHans [[[NSLocale preferredLanguages] firstObject] hasPrefix:@"zh-Hans"] // 当前语言是否为中文繁体-#define isZhHant [[[NSLocale preferredLanguages] firstObject] isEqualToString:@"zh-Hant"]+#define isZhHant [[[NSLocale preferredLanguages] firstObject] hasPrefix:@"zh-Hant"] // 当前语言是否为中文繁体香港-#define isZhHK [[[NSLocale preferredLanguages] firstObject] isEqualToString:@"zh-HK"]+#define isZhHK [[[NSLocale preferredLanguages] firstObject] hasPrefix:@"zh-HK"]

获取地区代码

NSLocale *locale = [NSLocale currentLocale];[locale localeIdentifier];

获取Localizable.strings中内容

NSString *text = NSLocalizedString(@"GUI_TEXT_BACK", @"返回");

多语言的布局适配

比如,按钮的标题在多语言的布局下可能导致布局出现问题。最简单的做法通常是

btn.titleLabel.adjustsFontSizeToFitWidth = YES;
0 0
原创粉丝点击