一、说明
多语言一般为了实现下面两个目标:
- App展示的语言为目标客户的第一语言,如繁体中文、英语
- 在其它国家,默认展示语言为特定语言,如:英语
二、实现步骤
注:此例实现的语言有:繁体中文、英语,当iPhone设置的语言为其它语言时,默认展示英语
-
Xcode设置Xcode
添加相应语言
-
选择目标语言后,弹框选择
语言选择结果finish
,最终如下:
- 设置不同语言下的应用名称
3.1) 新建用来展示应用名称的多语言文件Strings File
string 文件
- 命名为
InfoPlist
- 选中此文件,在
Xcode
右边的File inspector
点击Localize
:
Localize 按钮
3.2) 选择繁体中文,点击Localize
:
- 再单击此
InfoPlist.strings
文件,选择Base、English、Chinese(Traditional)
选择多语言
这时候,InfoPlist.strings
文件就多了下拉箭头,打开后发现有多个文件,如上图
-
InfoPlist.strings(English)
当iPhone设置语言为英语时,App名称为此文件中配置的名称 -
InfoPlist.strings(Chinese(Traditional))
当iPhone设置语言为繁体中文时,App名称为此文件中配置的名称 -
InfoPlist.strings(Base)
当iPhone设置语言为其它语言时,App名称为此文件中配置的名称
- 配置不同语言下的App名称。因为当iPhone设置语言为其它语言时,我们展示的名称为英语,所以
InfoPlist.strings(Base)
的内容与InfoPlist.strings(English)
内容相同,则3个文件中的内容分别为:
CFBundleDisplayName = "Space App";
CFBundleDisplayName = "国际化应用";
- 设置不同语言下,NSString的取值
-
同上,新建
Strings File
文件,此处取名为:Localizable.strings
注:此处.string的文件名称可以修改,对应的取值方法不同,下面有说明 -
同上,选择此文件的Base、English、Chinese Traditional,
最后生成文件如下:
Localizable.strings文件 -
因为Base 与 English 中配置相同,Base 文件便忽略,不再说明。
-
如我们配置
facebook登录
的NSString,
Localizable.strings(English)
:
"facebook_login" = "Facebook Login";
Localizable.strings(Chinese(Traditional))
:
"facebook_login" = "Facebook登錄";
由上我们可以看到命名规则:
- 形式:
key = value
-
key
、value
需要用双引号
包装起来 - 没有
@
- 行尾有分号
;
4.2) 调用方法:
NSLocalizedString(@"facebook_login", nil)
第二个值comment一般传nil即可。此官方宏很简单,看官方解释即会使用
- 如果上面命名此文件为其它名称,需要使用下面官方宏来获取相应语言的字符串:
NSLocalizedStringFromTable(key, tbl, comment)
如果是在
framework
中,实现的多语言。需要将.string
文件打包在bundle
中,用官方宏NSLocalizedStringFromTableInBundle
来获取,假设此bundle
名称为YHSDK.bundle
,
NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
NSString *languageBundlePath = [mainBundlePath stringByAppendingPathComponent:@"YHSDK.bundle"];
NSBundle *targetBundlePath = nil;
targetBundlePath = [NSBundle bundleWithPath:languageBundlePath];
// if ([[NSFileManager defaultManager] fileExistsAtPath:languageBundlePath]) {
// NSLog(@"targetBundlePath:%@ 地址不存在", targetBundlePath);
// }
NSString *string = NSLocalizedStringFromTableInBundle(key, nil, targetBundlePath, nil);
三、其它注意事项
有时候iPhone设置成其它语言时,如法语,App展示的语言不是英语,而是繁体中文,是因为iPhone的设置导致的,将偏好的语言顺序中将繁体中文删除或调整到英文之后即可:
网友评论