关于iOS APP的国际化适配,主要有以下几点:
该文件主要用于字符串的多语言版本,包括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" = "发送";//发送
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)]];
即可.
对于图片的命名,可采用[email protected]之类的规则。
通常涉及到国际化,我们会先判断当前使用的语言类型。
获取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];
NSString *text = NSLocalizedString(@"GUI_TEXT_BACK", @"返回");
比如,按钮的标题在多语言的布局下可能导致布局出现问题。最简单的做法通常是
btn.titleLabel.adjustsFontSizeToFitWidth = YES;