语言本地化,又叫做语言国际化。是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言。往往一些应用程序需要提供给多个国家的人群使用,或者一个国家有多种语言,这就要求应用程序所展示的文字、图片等信息,能够让讲不同语言的用户读懂、看懂。进而提出为同一个应用程序适配多种语言,也即是国际化。
语言国际化之所以又叫做语言本地化,这是站在每个用户的角度而言的,是指能够让用户本地、本土人群能够看懂的语言信息,顾名思义,语言本地化。其实语言本地化 == 语言国际化!
需要做国际化的几个方面:
- App名称
- info.plist中的权限声明
- 字符串
- 图片
- 启动图(包括不显示等等小颠簸)(待更新...)
其他应用小技术: - 使用python将表格导出翻译文件(待更新...)
- pch文件使用
点击这里获取下方Demo(待更新...)
使用的软件环境:Xcode11.3.1 真机设备:iOS13
创建Demo(过程中,由于使用的是Xcode11.3.1 真机设备:iOS13,模拟器上可以运行,但是真机黑屏,如果遇到相同问题:点击这里)
Demo要实现以下效果:
最外层是UITabBarController
三个页面:
控制器名称 | 对应页面 | 包含控件 |
---|---|---|
FirstViewController | 第一页 | 显示字符串label、切换语言button |
SecondViewController | 第二页 | 跳转页面button(selector:跳转到JumpViewController) |
JumpViewController | 第二页跳转到的下一级页面 | 显示字符串label |
在开始所有部分的国际化之前,需要完成的事情(项目)配置需要的国际化语言
配置需要国际化的语言,这也是国际化之前的准备工作,无论我们是国际化App名称、代码中的字符串、图片、还是storyboard和xib,都需要进行这一步的准备工作(一个项目中需要且仅需要配置一次)。
project->Info->Localizations,点击“+”
,添加需要国际化/本地化的语言,如下图(默认需要勾选Use Base Internationalization
):
简体中文
为例,如下图弹出如下对话框,直接点击finish,如下图:
添加语言后效果如下图:
zh-Hans
和zh-Hant
是简体中文
和繁体中文
的缩写。这是标准的缩写。H可大写也可小写。"en"是英语的缩写。ko是韩语的缩写,fr是法语的缩写。其他语言请百度各国语言缩写即可查询。
(一)应用名称
应用名称本地化,是指同一个App的名称,在不同的语言环境下(也就是手机设备的语言设置)显示不同的名称。比如,微信在简体中文环境下App名称显示为
微信
,在英语环境下显示为
1.选中Info.plist,按下键盘上的command + N,选择Strings File(iOS->Resource->Strings File)
必须!!!
是这个名字(因个人电脑设置差异,此处本人电脑没有显示strings后缀名):选中InfoPlist.strings,在Xcode的File inspection(Xcode右侧文件检查器)中点击
Localize
,目的是选择我们需要本地化的语言,如下图:注意:在点击Localize之前,一定要保证我们已经添加了需要本地化的语言,也就是上面配置需要国际化的语言那一步(步骤:project->Info->Localizations,然后点击"+",添加需要国际化/本地化的语言)。
注意:如果我们没有在 PROJECT 中配置需要国际化的语言(project->Info->Localizations,然后点击"+"),上图下拉列表中将只会出现"Base"和"English"选项,English语言是系统默认的语言,其他需要国际化的语言(例如中文简体、法语)必须通过上面的配置本地化语言那一步手动添加。
然后我们发现Xcode右侧的File inspection变成了下图的样式:
Chinese
(就是勾选没有勾选的选项),如下图此时,Xcode左侧的InfoPlist.stirings左侧多了一个箭头,点击箭头可以展开,如下图所示
从上图可以看出,InfoPlist.strings文件下包含了English
、Chinese(Simplified)
这两种语言的文件。
原理:程序启动时,会根据操作系统设置的语言,自动加载InfoPlist.strings文件下对应的语言文件,然后显示应用程序的App名称。
接下来,我们分别用不同的语言给InfoPlist.strings下的文件设置对应的名字。
(1)在InfoPlist.strings(english)中加入如下代码:
// Localizable App Name是App在英语环境下显示的名称:
CFBundleDisplayName = "Localizable App Name";
备注:CFBundleDisplayName可以使用双引号,也可以不使用双引号!
CFBundleDisplayName = "国际化App名称";
修改模拟器语言环境为英文。App名称如下图:划重点~~本地化App名称,其步骤:
1.创建InfoPlist.strings文件
2.在Project的设置中通过点击"+"添加需要本地化的语言。
3.然后在Xcode右侧的File inspection中点击Localize,选中需要本地化App名称的语言。
4.最后在每个语言对应的InfoPlist.strings文件中以key = value
(CFBundleDisplayName = "App名称";)
的形式设置App的名称。
在查看他人文章的时候还说到了下面这种情况,没有遇到,但是也记录一下吧~
(二)info.plist中的权限声明
iOS 10要求用户声明隐私访问用途,而且不能为空,否则将会被拒。解决办法是在Info.plist中添加对应权限。权限提示语配置。下面是一些常见的权限提示的国际化。与App名称的国际化相同,也是在
InfoPlist.strings
文件中
中文:
NSAppleMusicUsageDescription = "App需要您的同意,才能访问媒体资料库";
NSBluetoothPeripheralUsageDescription = "App需要您的同意,才能访问蓝牙";
NSCalendarsUsageDescription = "App需要您的同意,才能访问日历";
NSCameraUsageDescription = "App需要您的同意,才能访问相机";
NSHealthShareUsageDescription = "App需要您的同意,才能访问健康分享";
NSHealthUpdateUsageDescription = "App需要您的同意,才能访问健康更新";
NSLocationAlwaysUsageDescription = "App需要您的同意,才能始终访问位置";
NSLocationUsageDescription = "App需要您的同意,才能访问位置";
NSLocationWhenInUseUsageDescription = "App需要您的同意,才能在使用期间访问位置";
NSMicrophoneUsageDescription = "App需要您的同意,才能访问麦克风";
NSMotionUsageDescription = "App需要您的同意,才能访问运动与健身";
NSPhotoLibraryUsageDescription = "App需要您的同意,才能访问相册";
NSRemindersUsageDescription = "App需要您的同意,才能访问提醒事项";
英文:
NSAppleMusicUsageDescription = "App需要您的同意,才能访问媒体资料库";
NSBluetoothPeripheralUsageDescription = "App需要您的同意,才能访问蓝牙";
NSCalendarsUsageDescription = "App需要您的同意,才能访问日历";
NSCameraUsageDescription = "App需要您的同意,才能访问相机";
NSHealthShareUsageDescription = "App需要您的同意,才能访问健康分享";
NSHealthUpdateUsageDescription = "App需要您的同意,才能访问健康更新";
NSLocationAlwaysUsageDescription = "App需要您的同意,才能始终访问位置";
NSLocationUsageDescription = "App需要您的同意,才能访问位置";
NSLocationWhenInUseUsageDescription = "App需要您的同意,才能在使用期间访问位置";
NSMicrophoneUsageDescription = "App需要您的同意,才能访问麦克风";
NSMotionUsageDescription = "App需要您的同意,才能访问运动与健身";
NSPhotoLibraryUsageDescription = "App需要您的同意,才能访问相册";
NSRemindersUsageDescription = "App需要您的同意,才能访问提醒事项";
(三)代码中字符串
所谓字符串本地化,就是指App内的字符串在不同的语言环境下显示不同的内容。比如,"主页"这个字符串在中文语言环境下显示
主页
,在英语环境下显示home
。
其实字符本地化和App名称本地化过程如出一辙,只是创建的文件名成不一样(连同后缀一起,文件名必须!!!!
是Localizable.strings
),其他步骤完全相同。
和应用名称本地化一样,首先需要command + N,选择iOS -> Resource -> Strings File
NSLocalizedString(key, comment)
这个宏根据Key获取对应的字符串,然后赋值给代码中的字符串。
// NSLocalizedString(key, comment) 本质
// NSlocalizeString 第一个参数是内容,根据第一个参数去对应语言的文件中取对应的字符串,第二个参数将会转化为字符串文件里的注释,可以传nil,也可以传空字符串@""。
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
代码中使用如下:Tips:
1.作为key
的那种语言的Localizable.strings文件中可以不添加Key-Value。
原因:系统根据某个key
去获取对应的字符串时,如果没有找到,那么就会以key作为value返回。So,如果我们在Localizable.strings(Chinese,Simplified)文件中没有添加"第一页" = "第一页";
那么在Chinese简体的环境下第一页的title最终显示会是第一页
。
2.切换语言无需在模拟器中设置,只需要在Xcode中进行如下设置:
Edit->Scheme->Run->Arguments Passed On Launch ->-AppleLanguages (语言代码)。例如,我们模拟器此时虽然是英语,如果通过上述步骤设置为zh-Hans
,那么语言环境将会变为汉语,如下图⚠️⚠️关于AppleLanguages它的使用:
-AppleLanguages (zh-Hans)
括号里可以跟语言的全称或简写,比如西班牙文可以是Spanish,也可是国家简写es。
特别注意-AppleLanguages后有一个【空格】。
多人开发下,如何避免冲突❓
项目开发中,独立开发的还是少数。经常会有多人开发的情况,这种情况,如果多人同时操作本地化文件,极有可能会存在冲突。另一方面,我们又不希望自己的本地化文件受到对方的污染。
也就是说,我们不希望对方操作我们的本地化文件。但是上面介绍的代码中字符串的本地化是使用的是默认的文件名Localizable
,因为启动程序时,系统将根据语言加载相应的文件得到其对应的字符串文件,这个字符串可以通过系统将NSLocalizedString中的宏生成名为“Localizable.strings”的文件。
那么如何让系统加载我们自己命名的本地化文件而非系统默认的Localizable.strings呢?
这就是NSLocalizedStringFromTable(<#key#>, <#tbl#>,<#comment#>)
的用处。
也就是说,如果你的strings文件名字不是Localizable
而是自定义的话,如DongHae.strings,那么你就得使用`NSLocalizedStringFromTable这个宏来读取本地化字符串。
// key:系统根据key取字符串
// tbl:自定义strings文件的名字
// comment:可以不传
NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)
这样就可以避免多人开发的一些冲突。
(四)图片本地化(两种方式)
方式一:与本地化代码中的字符串一样,通过
NSLocalizedString(key,comment)
来获取相应的字符串,然后根据这个字符串再获取图片。(给图片命名的时候,区分中英文)
NSString *imageName = NSLocalizedString(@"icon", nil);
UIImage *image = [UIImage imageNamed:imageName];
self.imageView.image = image;
方式二:与添加InfoPlist和Localizable的方法相同。具体实现步骤如下:
- 将图片(
button_进入_sel.png
)拖入工程中,选中图片,展开Xcode右侧的File Inspection,点击Localize,这里注意:Localize选择与图片显示的环境相同。即如果拖入的是英文环境下显示的图片,Localize的时候就选择English。如图:
这里继续,选中图片(button_进入_sel.png
),右击->show in Finder,可以看到,图片(button_进入_sel.png
)被添加到了zh-Hans.lproj的文件夹中。
1⃣️右击图片文件->show in FinderLocalize
的时候选的是Base
),现在只需要给Base.lproj和en.lproj文件夹中添加一个名字也为button_进入_sel.png
的图片(对应相应的环境哦)button_进入_sel.png
下方,图片左侧就会出现一个可以展开的小三角.
- 然后,右击
button_进入_nor.png
->show in Finder,我们发现在Base.Iproj文件中多了一个名为button_进入_nor.png
的图片,如下图:
PlanA:1⃣️选中图片,展开Xcode右侧的File Inspection,将它的Localization的没有勾选的选中。
比如说,我要修改英文环境下的图片:
PlanB:1⃣️右击图片文件->show in Finder
Localize
的时候选的是Base
),现在只需要给zh-Hans.lproj和en.lproj文件夹中添加一个名字也为button_进入_sel.png
的图片(对应相应的环境哦)button_进入_sel.png
下方,图片左侧就会出现一个可以展开的小三角.控制器中添加代码:
NSString *imageName = NSLocalizedString(@"button_进入_sel", nil);
UIImageView *startImgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
startImgView.center = CGPointMake(showLbl.center.x, showLbl.center.y+100);
[self.view addSubview:startImgView];
运行程序:英文环境下效果~
其他语言环境,操作步骤完全相同。都是在对应的.lproj文件夹下添加同名的图片,然后把图片拖放到Xcode中。
未完待续......
(七)pch文件的创建及配置
Command+N快捷键,然后选择PCH文件-->Next
感谢学习连接~:
https://blog.csdn.net/kakulukia/article/details/80101058
https://www.jianshu.com/p/7ba4994304d2
https://www.jianshu.com/p/88c1b65e3ddb