PS:修改设备系统语言方法
设置 -> 通用 -> 语言与地区 -> iPhone 语言
Settings -> General -> Language & Region -> iPhone Language
1. 添加需要国际化的语言
首先,需要添加需要国际化的语言,在 项目 -> Info -> PROJECT -> Localizations ;点击下方的 + 添加:
然后,会弹出选择需要国际化的文件:
主要是选择 storyboard 和我们创建的 .strings 文件(如图1),也可以不选,在需要的地方再勾选,这里是全选;一开始只有两个storyboard文件,是没有.strings文件的(如图2);
这里添加了 简体中文 和 英文;
2. 国际化
2.1. App 名称国际化
首先创建 InfoPlist.strings 文件:右键 -> New File... -> Resource -> Strings File
在下一步命名文件名称的时候,一定要是 InfoPlist ;因为这个文件主要设置系统使用的文字的国际化,例如应用名称;是供系统使用的,如果换了其他的名称,系统是找不到的;
完成后,在文件列表会多出个 InfoPlist.strings 文件,选中该文件后,点击右侧文件属性一栏 Localizations 中的 Localize... ,在弹出的选择框中选择一个待国际化的语言,这时只能选择一个,完成后,再勾选其他的:
如果有多个语言需要国际化,此处是可以展开的:
里面是各个语言对应的国际化文本,在右侧的文件属性 Localization 下,可以选择我们需要国际化的语言,不需要国际化的不勾选即可;
然后在各个语言文件中添加需要国际化的字符:
应用名称对应的key为:CFBundleDisplayName
这个可以在 Info.plist文件中进行查看,但是需要 Open As -> Source Code
然后切换设备语言环境测试一下即可!
2.2. 本地文本/图片国际化
如果是本地项目中使用的文本/图片,需要新建另一个 .strings 文件来进行国际化;同新建 InfoPlist.strings 一样,只不过名称修改为:Localizable,这时会新建一个 Localizable.strings 文件,同样,选中当前文件后,点击右侧文件属性一栏 Localizations 中的 Localize... 添加/勾选需要国际化的语言种类,然后添加相应的文本字符串:
这里也是 key-velue 的形式,根据自己的需求编写即可;
在使用的时候,不能直接使用某个字符串或者图片名称了,需要系统提供的宏定义 NSLocalizedString(key, comment)
这里的 Key,即我们在多语言文本中定义key;comment 说明,可以和key一样,也可以传nil;如果我们定义的 .strings 文件名称不是 Localizable.strings ,而是其他的,例如 myLoca.strings,那么在使用的时候就需要用:
NSLocalizedStringFromTable(key, tbl, comment)
,第二个参数就是我们的.strings 文件名称。
按照上面的设置,我们在使用的时候如下所示,在不同的语言环境下,就会显示不同的内容:
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(100, 100, 100, 100);
label.backgroundColor = [UIColor redColor];
label.text = NSLocalizedString(@"首页", @"首页");
[self.view addSubview:label];
UIImageView *image = [[UIImageView alloc]init];
image.frame = CGRectMake(100, 200, 300, 300);
image.image = [UIImage imageNamed:NSLocalizedString(@"mainImageName", @"mainImageName")];
[self.view addSubview:image];
2.3. 启动图国际化
启动图一般不需要国际化,设置一个通用的即可;但是如果有这个需求,可以按下面的方式进行
启动图的国际化要分两种情况:使用 LaunchScreen.storyboard 和不使用;
使用 LaunchScreen.storyboard 的好处是只需要设置一个最大分辨率的启动图即可适配所有尺寸的设备;如果不使用 LaunchScreen.storyboard ,就需要添加各个设备分辨率的图片,如果没添加,在相应设备上的适配会有很大的问题;所以,一般我们是使用 LaunchScreen.storyboard 来作为启动图的。
使用 LaunchScreen.storyboard
此种情况需要结 InfoPlist.strings 文件,其创建参见第一个知识点;
使用 LaunchScreen.storyboard 需要在 项目 - General - App Icons and Launch Images 中的 Launch Screen File 选择 LaunchScreen.storyboard:
第一步:新建 Launch Screen
先新建两个 Launch Screen 分别命名为:LaunchScreen_en、LaunchScreen_ch,名称自定义!(需要几个语言版本就新建几个)
然后,和设置 LaunchScreen.storyboard 一样,添加一个 UIImageView ,设置全屏显示,添加需要的启动图即可!
第二步:配置 InfoPlist.strings 文件
在 InfoPlist.strings 相应的国际化语言中添加相应的 Launch Screen 名称:
这里的 key:UILaunchStoryboardName 同样可以在Info.plist 文件中 Open As.. -> Source Code 来查看;
然后,切换语言环境,重新运行项目即可查看效果;
如果没效果,需要将已安装的删除,再次运行即可!
不使用 LaunchScreen.storyboard
如果不使用 LaunchScreen.storyboard,就需要准备各个设备尺寸的启动图,添加到项目中
这里需要说明一下,因为不能适配到所有的语言,为防止在使用未国际化的语言时,导致启动图异常,应该设置一套通用的启动图,先将这套添加到项目中,在这套启动图的基础上做下面的操作,然后按照下面的方法,将其他语言环境的启动图添加到相应的文件夹,下面的 Base 选项就是适配所有语言环境的启动图
第一步:准备图片
图片导入后,选中其中一张图片,然后点击右侧属性栏 Localizations 中的 Localize...,在弹出的语言选择框中选择 Base
然后,选择需要国际化的语言,完成后大概是这个样子:
最后给每个添加的图片都做相同的操作,完成后大概是这个样子:
然后,选中任意一个展开后的选择,右键 - Show In Finder
会看到下面这个目录:
其中en.lproj 文件夹下是英文环境的启动图;zh-Hans.lproj 是简体中文环境下的启动图;
将相应的启动图放入对应的文件夹即可,需要注意启动图的名称,一定要和上面添加的名称一致;
第二步:配置 Info.plist 文件
添加完成后,将 Info.plist 使用 Sounce Code 方式打开,添加以下的代码:
<key>UILaunchImages</key>
<array>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_4</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{320,480}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_5</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{320,568}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_6</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{375,667}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_6p</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{414,736}</string>
</dict>
</array>
切换回 Perporty List,大概是这种结构:
添加了几个启动图,就需要添加几个Item;每个 Item 的结构一致;
最后,修改设备的语言,重新启动看下效果即可!
2.4. 其他国际化配置
这里的其他主要是指需要在Info.plist文件添加一些说明文字的情况,例如使用隐私权限:相机、相册、定位等的描述文本的国际化;同样是配置在 InfoPlist.strings 文件中的,这里以使用相机权限为例:
这里的 key 同样可以在 Info.plist 文件中 Open As Source Code 来查看;
2.5. xib/storyboard 国际化
由于项目中一直使用纯代码,很少使用 xib/storyboard,这里给一个xib/storyboard 国际化的文章以供参考 iOS国际化——通过脚本使storyboard,相关信息官方的文章也有介绍https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html
3. 默认语言环境
在国际化的时候,不可能覆盖所有的语言环境,如果软件安装的设备所处的语言环境未在我们国际化的语言中,会默认显示开发语言环境,Xcode 默认开发语言环境在项目 -> Info -> PROJECT -> Localizations 可查看:
对的,你没看错,默认的是 English,所以,如果所处的语言环境未在国际化的范畴,会显示英文;
当然,我们可以强制设置自己软件所处的语言环境,在app 启动的时候,判断当前语言环境是否在我们国际化的范围内,如果不在则设置当前环境为简体中文:
NSArray *languages = [NSLocale preferredLanguages];
// 数组中第一个即为当前的语言
NSString *language = [languages objectAtIndex:0];
// 保存已国际化的语言名称,
// 该值可以将设备切换到该语言环境,然后输出上面的值来获取
NSArray *supportLanguages = @[@"zh-Hans-US", @"en", @"en-US"];
if ([supportLanguages containsObject:language] == NO) {
// 如果不在国际化的语言范围内,则设置为简体中文
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}