前言
不知道大家有没有发现,我们平常在App Store下应用的时候,有一些App,明明是一个中文的App,不管是App名字、介绍图、描述等等都是中文的,而且下载之后打开一看,App里面也只支持中文。
但是在商店介绍页的【语言】列表,显示该App支持的语言是却是【英文】。是不是感觉很违和,甚至很Low?
比如下面的这个游戏(这货排在了免费游戏排行榜第二,权游IP的力量很强大啊)就是这样。
再看下微信就比较正常,基本上支持啥语言就有啥语言。
苹果是如何判断App支持的语言列表的?
现在的问题是,苹果是根据什么来知道该App支持什么语言,进而在这里显示出来的?
相信很多人都会不假思索地说在苹果开发者后台。
但是,我翻了好几圈没找到对应的设置……
这个问题困扰了我很久,直到我在Stack Overflow上面看到了这个答案
https://stackoverflow.com/questions/1887590/what-controls-the-list-of-supported-languages-of-an-iphone-app-in-itunes/4146668#4146668
摘抄答案如下:
I used a technical support incident to ask this question of Apple directly. Here is the answer:
"The list of languages supported by the app, as shown in the iTunes store screenshot you sent, is automatically determined by inspecting the submitted application bundle. Typically, this comes from the .lproj folders in a bundle, as the process (and iOS) use this to determine what languages the application can support. However, it is also possible to provide your own localization support system in the application without using .lproj folders (although this is typically much more work) -- in this scenario, the list of supported languages is specified in the application's plist file, via the CFBundleLocalizations key. See the following docs (and the guide linked to in the docs) for more info on this:
http://developer.apple.com/library/ios/#documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html%23//apple_ref/doc/uid/TP40009249-109552-TPXREF111 "
也就是说,这个显示是由ipa包来决定的。首先苹果会从上传到开发者后台的ipa包里面找.lproj文件夹,如果找到了,就根据这些文件夹支持的语言来确定。如果没有这些文件夹,那么就去找Info.plist文件的CFBundleLocalizations
这个key的设置。
对各种情况进行测试
上面的哥们的答案是苹果回复的,算是官方答案。但是我在实际上测试的时候发现,情况并没有这么简单。
除了上面说的.lproj文件和CFBundleLocalizations之外,还有两个东西是需要考虑的。
一个是比较特殊的.lproj文件,这个文件的名字是base.lproj,本身并不属于任何的一种语言(为什么要说这个,因为在我们使用默认的模板创建一个App的时候,系统默认就是有这个文件的,不然你创建一个App,然后打包看下ipa包里面的内容?)。
另外一个就是Info.plist里面的CFBundleDevelopmentRegion这个key,这个创建App的时候系统会默认设置的。
以下是我对这几个参数做测试的一些记录。
-
.lproj文件
指是ipa包里面的.lproj文件夹 -
CFBundleDevelopmentRegion
代表的是CFBundleDevelopmentRegion这个key设置的值 -
CFBundleLocalizations
这个key代表的是CFBundleLocalizations设置的值 -
显示结果
这个代表的就是最终的结果了
这里有几点可以了解下:
-
.lproj文件是如何设置的?
大概设置的位置在这里,点下“+”就能添加一种新的语言了。
-
修改了之后如何快速知道设置.lproj文件有没有生成?
编译了之后,直接在Products目录上面右键->Show In Finder就能打开编译好的app文件了,里面能找到你想要的(注意每次修改之前最好删除这个文件,不然可能会有缓存)
-
如何知道最终的结果?难道需要上架了之后才能知道?
如果这么搞我得被人打屎.......
其实不需要这么麻烦,稍加留意你就会发现,当你将ipa包上传到苹果开发者后台之后,找到对应的构建版本,滑到最后面,你会看到下面的这些信息,其中,本地化版本显示的信息跟用户在AppStore的介绍页上面显示的语言列表是一致的。所以,想要知道结果的话,把ipa包上传到开发者后台,然后看下这里显示什么就知道了。
结论
从我的测试结果可以得出来以下几个结论(结合我之前的一些经验):
- App Store介绍页中显示的语言列表的设置是由App决定的,跟苹果开发者后台(App Store Connect)并没有什么关系。
- 主要跟ipa包根目录中的的
.lproj文件
,Info.plist文件中配置的CFBundleLocalizations的值
以及CFBundleDevelopmentRegion的值
有关。 - 不管什么情况下,优先级排序是
.lproj文件
>CFBundleLocalizations的值
>CFBundleDevelopmentRegion的值
- base.lproj这个特殊的.lproj文件需要配合CFBundleDevelopmentRegion这个key的值才能最终确定语言的类型。比如base.lproj+CFBundleDevelopmentRegion=en-US相当于en.lproj
可选方案
所以,我们在实际使用中就可以利用这些结论进行设置了
- 一种比较好的方案就是从
.lproj文件
下手,有多少种语言就设置多少个.lproj文件
。这样也比较合理,因为对Info.plist和Storyboard文件设置多语言的话是需要使用这种方式的。具体如何设置这里不做讲解。大概设置的位置在这里
- 对于单语言的App来说,因为在默认的情况下系统会自动创建base.lproj文件,所以我们只要设置CFBundleDevelopmentRegion为指定的语言就可以了。比如简体中文直接设置成zh-CN。
- 对于没有.lproj文件的App来说,单语言的话直接设置CFBundleDevelopmentRegion这个值就OK
- 如果要设置多语言,但是又不想使用.lproj文件设置,那么设置CFBundleLocalizations这个key的值就是一个比较好的方案了。这个key的值是一个数组来说,要设置什么就设置什么,比较方便。
- 对于Unity游戏来说,因为生成的Xcode工程文件本身是没有.lproj文件的,所以想要设置什么语言,直接添加CFBundleLocalizations这个key,然后设置值就可以了。
语言标识
知道了如何设置,还剩下一个问题,CFBundleDevelopmentRegion和CFBundleLocalizations有哪些值可以供我们设置呢?
-
CFBundleDevelopmentRegion
这个Xcode内置了一些值,这些基本上够用了。
可以看出,基本上是属于 语言标识+地区标识这样子的配合。具体的话可以看下苹果文档里面关于CFBundleDevelopmentRegion的介绍,里面有关于这个key的值的标准。
另外,CFBundleDevelopmentRegion默认值为$(DEVELOPMENT_LANGUAGE),那么DEVELOPMENT_LANGUAGE的语言是在哪里设置的呢?这个可以看下这篇文章。 -
CFBundleLocalizations
这个key Xcode本身也有内置的值,直接设置就好了。
基本上就是遵循ISO 639-1和ISO 639-2语言标准了。具体可以看下苹果文档关于CFBundleLocalizations的介绍以及苹果关于语言代号的介绍
参考
stackoverflow关于AppStore语言显示列表显示的答案
苹果文档里面关于CFBundleDevelopmentRegion的介绍
苹果文档关于CFBundleLocalizations的介绍
苹果关于语言代号的介绍
Xcode8.3 修改默认开发语言(Development Language)