- 目的 :
应用国际化,提供多种语言支持 - 目录结构:
支持特定语言文件,放在特定的目录下。目录命名"<本地代号>.lprog",例如en.lprog,zh-Hans.lprog等。
需要本地化的内容
- 文本信息 应用的名称、按钮、 警告提示信息、静态文本等。
- XIB和故事板文件 同一界面和场景提供多个本地化版本。
- 资源文件 图片(按钮图片、应用图标,其他图标等)、音视频等。
文本信息本地化
一般,系统按钮上的文本和系统提示的信息是不能修改的,始终是英文,如果需要中文显示就必须本地化。
步骤:
准备工作:PROJECT - >工程名 ->Localizations ->+ ->选择需要本地化的语言。
(一)创建strings文件,注意,不要试图使用默认文件,否则无效。
(二)选择创建的strings文件,打开其文件检查器,点击Localization中的Localize...按钮。
(三)添加需要的语言支持。
(四)打开添加的语言文件,添加该语言的本地化的信息。
- 应用名称本地化
例如:创建InfoPlist.strings文件
InfoPlist.strings(Chinese)文件中输入:
CFBundleDisplayName = "中文应用名";
InfoPlist.strings(English)文件中输入:
CFBundleDisplayName = "English APP Name";
PS:苹果虽然没有规定应用名称的字符个数,但是宽度有限,一般中文大约5个,英文大约20多个。
-
代码本地化
代码中可以通过OC中定义的宏,进行本地化。
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
例如:本地化导航控制器中第一个控制器的标题
在FirstViewController.m中,注意conment、tableName、bundle 可以省略,逗号不可以省略:
self.title = NSLocalizedString(@"First",);
strings 文件中:
//English
"First1" = "First1";
//中文
"First1" = "第一";
XIB和故事板文件本地化
步骤: 选中需要本地化的xib,文件检查器,和文本信息本地化创建步骤相似。
例如Main.storyboard本地化
Main.strings(English)
/* Class = "UILabel"; text = "用户ID:"; ObjectID = "6zX-7P-dFn"; */
"6zX-7P-dFn.text" = "User ID:";
/* Class = "UINavigationItem"; title = "注册"; ObjectID = "ENn-j0-X3J"; */
"ENn-j0-X3J.title" = "Register";
/* Class = "UINavigationItem"; title = "登录"; ObjectID = "Iab-Ax-Bfv"; */
"Iab-Ax-Bfv.title" = "Log in";
/* Class = "UIBarButtonItem"; title = "Cancel"; ObjectID = "QcN-K6-33q"; */
"QcN-K6-33q.title" = "Cancel";
/* Class = "UIButton"; normalTitle = "注册"; ObjectID = "Wbe-4S-5Vx"; */
"Wbe-4S-5Vx.normalTitle" = "Register";
/* Class = "UILabel"; text = "密码:"; ObjectID = "dxq-a1-6id"; */
"dxq-a1-6id.text" = "Password:";
/* Class = "UIBarButtonItem"; title = "Save"; ObjectID = "nAC-aF-YYg"; */
"nAC-aF-YYg.title" = "Save";
/* Class = "UIButton"; normalTitle = "登录"; ObjectID = "rd7-DX-Ugt"; */
"rd7-DX-Ugt.normalTitle" = "Log in";
/* Class = "UILabel"; text = "用户ID:"; ObjectID = "wc6-s4-0ii"; */
"wc6-s4-0ii.text" = "User ID:";
Main.strings(Simplifiled)
/* Class = "UILabel"; text = "用户ID:"; ObjectID = "6zX-7P-dFn"; */
"6zX-7P-dFn.text" = "用户 ID:";
/* Class = "UINavigationItem"; title = "注册"; ObjectID = "ENn-j0-X3J"; */
"ENn-j0-X3J.title" = "注册";
/* Class = "UINavigationItem"; title = "登录"; ObjectID = "Iab-Ax-Bfv"; */
"Iab-Ax-Bfv.title" = "登录";
/* Class = "UIBarButtonItem"; title = "Cancel"; ObjectID = "QcN-K6-33q"; */
"QcN-K6-33q.title" = "取消";
/* Class = "UIButton"; normalTitle = "注册"; ObjectID = "Wbe-4S-5Vx"; */
"Wbe-4S-5Vx.normalTitle" = "注册";
/* Class = "UILabel"; text = "密码:"; ObjectID = "dxq-a1-6id"; */
"dxq-a1-6id.text" = "密码:";
/* Class = "UIBarButtonItem"; title = "Save"; ObjectID = "nAC-aF-YYg"; */
"nAC-aF-YYg.title" = "保存";
/* Class = "UIButton"; normalTitle = "登录"; ObjectID = "rd7-DX-Ugt"; */
"rd7-DX-Ugt.normalTitle" = "登录";
/* Class = "UILabel"; text = "用户ID:"; ObjectID = "wc6-s4-0ii"; */
"wc6-s4-0ii.text" = "用户 ID:";
PS: 也可以使用Base Internationalization 技术
PS:还有一点,本地化后,如果再在xib上添加控件,且需要本地化,选中该控件 -> 标识检查器 ->Document ->Object ID,然后根据此ID,参考Strings文件中的格式,进行设置。
资源文件本地化
步骤:
选中需要本地化的图片或音视频,打开文件检查器,步骤和上述类似,就不多描述。
例如background.png本地化
选择background.png ->文件检查器 ->点击Localization ->点击Localized... ->选择需要支持的语言 。。。 。。。
PS:文本相关信息本地化后,一定要注意文本是否超出控件范围,本地化最好结合Auto Layout技术。