应用笔记 · 2023年4月14日

iOS开发中App名称、隐私权限描述的多语言本地化

前言

当一个App要发行到多个地区商店的时候,需要处理多语言的问题。比如想要将App发行到香港商店和大陆商店,就需要使用简体中文和繁体中文。本文介绍的是将Info.plist文件里面需要添加多语言的配置进行本地化处理,常见的是App名称和隐私权限描述。让不同的语言的用户的App名称隐私权限描述显示成该种语言的显示。

目标

我们就以简体中文和繁体中文两个语言为例做个demo进行讲解(其他语言同理)。目标如下:

  1. App支持两种语言,分别是简体中文和繁体中文
  2. 默认语言为简体中文(即除繁体中文用户外,其他语言的用户均显示简体中文)
  3. App名称进行多语言处理(隐私权限描述处理也是相同的,不赘述)

也就是说,我们希望App在用户系统语言为繁体中文时,App名称显示的是繁体的 “謙言”,而在系统语言为其他语言(例如简体中文、英文)时显示为简体的“谦言”。

多语言配置

首先创建个demo,名字为PlistLocalizeDemo(名字并不重要)。然后在Info.plist上面添加App名称配置。
key:CFBundleDisplayName ,Type:String, value:谦言
现在运行demo的话,所有的语言情况下,App名称都为谦言

添加App名称配置

 

注1:默认情况下Xcode在Info.plist文件显示时会将系统预置的一些key做简化处理,比如 你看到的 Bundle display name 这个,事实上真实的key为 CFBundleDisplayName。你可以在Plist文件上面 右键-> 选中 Raw Keys & Values ,强制显示为原始的key。
注2:Xcode13 对Info.plist文件做了优化,新创建的工程的Info.plist文件的东西很少。因为Plist文件的设置大部分都移到 TARGETS -> Info 这个设置面板去了。你可以直接在 TARGETS -> Info面板设置,也可以直接在Info.plist文件设置,最终打包时苹果会将两个合并成一个Info.plist文件。当然,建议使用 TARGETS -> Info 面板操作,毕竟大部分系统的设置都在这里,不容易冲突。本demo是直接在 TARGETS -> Info 面板操作的,你也可以直接在info.plist文件上操作,没什么影响。

我们把目光移到TARGETS上面的PROJECT,里面有个Localizations配置。上面有两个配置,一个是Base,一个是EnglishEnglish后面还带有Development Language显示,代表当前默认语言为英文。这是创建demo时系统默认的配置。

PROJECT->Localizations配置

 

接下来我们做以下操作,操作完后就可以将语言配置为简体中文和繁体中文:
1.移除Base配置
2.添加简体中文配置和繁体中文配置
3.将默认语言配置改为简体中文
4.将英文语言配置删掉

移除Base配置

Localizations下面有一个有个勾选框,Use Base Internationalization,我们将其勾选掉,跳出来的弹窗按照默认配置,然后点击Move。这样就将Base的多语言配置移除了(主要是嫌Base这个碍眼)。

勾选掉Use Base Internationalization
选择默认配置就好

 

添加简体中文配置和繁体中文配置

Localizations下面有一个“+”,可以添加各种语言配置。我们选择Chinese, Simplified (zh-Hans),在跳出来的弹窗里面按照默认配置,然后点击Finish,就可以将简体中文语言加上了。然后同样的操作将繁体中文 Chinese, Traditional (zh-Hant) 加上。

添加简体中文语言配置
按照系统默认配置就行

添加后的结果如下图所示:

已经添加了简体中文和繁体中文配置

 

将默认语言配置改为简体中文

这个稍微有点麻烦。默认语言这个其实就是 $(DEVELOPMENT_LANGUAGE)的值,创建demo时默认是英文的。但是Xcode上面找了很久都没发现这个值在哪里配置。后来使用了一个取巧的方法,通过修改.pbxproj文件来进行修改。
关闭Xcode工程,Finder中打开项目的目录,找到 .xcodeproj 文件(我们的demo是PlistLocalizeDemo.xcodeproj),然后 右键->显示包内容,找到project.pbxproj文件,打开文件,搜索developmentRegion,找到
developmentRegion = en;。这个配置就是我们想要找的。
(ps:发现这行下面有个语言数组knowRegions了没?上面有en,zh-Hans,zh-Hant,就是我们在Xcode上面看到的Localizations的配置)。

显示.xcodeproj文件包的内容

 

.pbxproj文件中找到developmentRegion配置

developmentRegion = en;改为developmentRegion = zh-Hans; 。保存(一定要记得保存),再次打开Xcode中工程的PROJECT面板,发现Localizations的配置已经改变了,之前的Development Language是在英文后面的,现在变成简体中文后面了。代表默认语言已经修改为简体中文了。

en修改为zh-Hans
默认语言已经修改为简体中文

 

将英文配置删掉

选中English,点击 “-”,确认之后就删除了英文语言配置。
配置删完了之后,到工程根目录下,查看下以.lproj为后缀的文件(实际上这是个文件夹),按照我们的配置,应该只有zh-Hans.lproj和zh-Hant.lproj,如果有多余的,建议删掉。

删掉英文语言配置
最终的语言配置列表

App名称多语言处理

Info.plist文件的多语言配置需要创建一个InfoPlist.strings文件,对该文件进行多语言处理,最后在各语言的文件中配置上对应的key-value。

创建InfoPlist.strings

菜单栏 File->New->File ,然后搜索 strings,选择 Strings File,名字为InfoPlist.strings。
注:名字是固定为InfoPlist.strings的,使用其他名称无效。

创建strings文件

将InfoPlist.strings文件本地化

选中InfoPlist.strings文件,点击Xcode右边侧栏的Localize...按钮,在弹出的窗口中点击Localize即可。

请注意,是需要对刚才新建的InfoPlist.strings文件进行处理,而不是直接对Info.plist文件进行处理。

 

Localize…按钮

可以看到已经勾选了 Chinese,Simplifiled,我们把Chinese,Tranditional 也勾选上。
回过头看下InfoPlist.strings文件,发现有一个三角按钮,点击后出现了两个文件,分别是InfoPlist.strings(Chinese,Simplifiled)InfoPlist.strings(Chinese,Tranditional),这两个文件就是我们需要的本地化文件。

已本地化的InfoPlist.strings

 

配置上对应的多语言key-value

接下来就是在两个本地化文件里面加上对应的key-value。App显示语言配置的key为CFBundleDisplayName,所以InfoPlist.strings(Chinese,Simplifiled)加上配置"CFBundleDisplayName" = "谦言";InfoPlist.strings(Chinese,Tranditional )文件加上配置 "CFBundleDisplayName" = "謙言";
至此,配置已经完成。

注:如果想要把隐私权限描述也本地化,直接在这两个本地化文件加上对应的key-value就可以了。

运行下看下App的语言,自己切换下系统语言进行测试,基本符合我们的要求。

多语言key-value配置

后言

按照上面的配置,我们期望的多语言配置功能是可以实现的。不过在测试过程中,有两个点需要注意下的。
一是我们上面所说的App名称和隐私权限描述,都是由系统读取的,系统会根据当前用户的系统语言来进行读取显示,跟系统语言相关。有些App里面有做切换语言功能,需要注意App内切换语言的功能无法应用到我们今天说的App名称和隐私权限描述的多语言显示,因为这个是系统自己读取的,我们无法指定。
比如一个系统语言为繁体中文的用户,在App内切换为简体中文,App名称的显示依旧是简体中文的,系统只会根据当前的系统语言来显示。

二是实际上并不完全按照 除繁体中文用户外,其他语言的用户均显示简体中文这个规则来。系统语言配置里面有个数组,实际上系统会按照这个数组从上到下遍历,找到哪个语言就显示哪个语言。比如系统的语言列表为英文、繁体中文、简体中文。那么当前系统语言就为英文。按照我们的想法App名称应该是简体中文的。但是实际上显示的是繁体中文。因为系统在遍历这个数组的时候,先找到了繁体中文,所以就直接拿繁体中文的翻译了。当然了,这个实际上并没多大影响,毕竟绝大部分用户都不会去切换那么多语言。

设置->通用->语言与地区

作者:谦言忘语
链接:https://www.jianshu.com/p/d9f7c7dd01d3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。