|
关于IPA中App名称多语言配置及其显示的探讨
sander
三七互娱技术团队
三七互娱技术团队 三七互娱(上海)科技有限公司 三七互娱技术中心 65篇内容
2024年08月26日 18:00
广东
01前言将同一个游戏包游戏发行到海外的多个地区时,因为语言不同,一般游戏都需要将App名称本地化。一般的处理方案是:通过配置Info.plist的文件中CFBundleDevelopmentRegion的值来配置默认语言,然后将Info.plist中CFBundleDisplayName的值设置为默认语言的App名称。接着在Xcode->ROJECT->Localizations配置多语言,添加InfoPlist.strings多语言配置文件,进而配置不同语言的CFBundleDisplayName的值。在最近对接游戏时发现了个奇怪的问题,就是在Info.plist文件的CFBundleDisplayName的值设置为中文名称的情况下,在设备中切换多种不同的系统语言进行测试,App的显示名称却一直都不显示中文。于是引出当前的文章,在CFBundleDisplayName这个Key配置了多语言的情况下,不同的多语言配置及CFBundleDevelopmentRegion设置在不同的系统语言下,App名称的显示规律是怎样的?02plutil命令转换.strings文件格式先介绍一些有用的技巧(骚操作)。做过iOS多语言的人都清楚,在对Info.plist文件中的值进行本地化的话,在IPA包中会生成对应的语言的.lproj后缀的文件夹,里面会有InfoPlist.strings文件。如上图所示,InfoPlist.strings文件打开后一般都是一堆乱码(英文除外)。因为打成IPA包后,这个文件会是二进制格式。InfoPlist.strings文件有3种格式,XML格式、JSON格式和二进制格式。其中,XML格式其实就是Plist文件格式。XML格式和JSON格式字符串都是可以正常阅读并修改的。可以通过MacOS系统自带的plutil命令将InfoPlist.strings文件转换成XML格式和JSON格式,进而查看和修改里面的内容。比如上面的例子,我们通过以下命令可将InfoPlist.strings文件转换成xml格式。执行命令后没有报错,打开InfoPlist.strings看一下,已经转换成XML格式了,并且没有出现乱码的情况。plutil命令可以将InfoPlist.strings文件在XML、JSON、二进制格式之间相互转换。命令如下(注意分别为xml1、json、binary1):转换成XML格式和JSON格式之后,可以通过PlistBuddy和plutil命令修改内容,也可以手动修改。经过测试,目前确认XML格式和二进制格式都是可以正常上传到商店的,而JSON格式上传成功后会报错(构建不成功,苹果会发邮件通知)。建议修改完后将格式改为二进制格式,跟正常打包后的格式一致。03测试记录由于我们分析的是IPA包,所以我们测试时是通过修改IPA包的内容后再重签成IPA包后安装到设备上测试。在重签的时候,可以直接添加对应的lproj文件夹,然后在里面添加InfoPlist.strings文件,就可以将Info.plist文件本地化了。这种本地化的操作其实比直接在Xcode中处理更加方便。以下是通过重签的方案修改Info.plist文件中CFBundleDevelopmentRegion的值和根目录中lproj文件夹及其内容,重签打成IPA包安装在iPad上,通过修改成不同的系统语言来查看App的显示名称,将测试结果汇成一个表格。04测试结论总结下上述测试得出的结论:1.没有多语言的情况下(无.lproj文件夹),显示Info.plist文件中CFBundleDisplayName的值(实际上是先读CFBundleDisplayName,若无则读CFBundleName)。2.只有一个lproj,且CFBundleDevelopmentRegion的设置跟lproj设置一致,则显示lproj设置的本地化名称。3.只有一个lproj,但CFBundleDevelopmentRegion的设置跟lproj设置不一致,系统语言为lproj时显示lproj设置的值,其他语言显示Plist文件中CFBundleDisplayName的值。4.多个lproj且有英文的情况下,有对应语言则显示对应语言,无则显示默认的英文lproj的值。不会显示Plist文件中 CFBundleDisplayName 的值,也不会跟随 CFBundleDevelopmentRegion 的设置。5.多个lproj但无英文的情况下,有对应语言则显示对应语言,无则显示一个默认的lproj的值。但是这个默认lproj的规则暂不清楚,但跟CFBundleDevelopmentRegion的设置无关。不会显示Plist文件中 CFBundleDisplayName 的值。总结通过plutil命令将IPA包中本地化文件(.strings后缀)文件转换成XML格式后可查看并修改其内容,故本地化文件也可以通过重签来做修改。当研发的IPA只有一个lproj的情况下,要特别留意CFBundleDevelopmentRegion的配置和Plist文件中CFBundleDisplayName的值,因为CFBundleDevelopmentRegion跟lproj配置不一致时,会去读取Plist文件中CFBundleDisplayName的值。理论上其他的值也一样。当研发的IPA有多个lproj的时候,有对应语言则显示对应语言,无则显示一个默认的lproj的值。但是这个默认lproj的规则暂不清楚(本次测试无法得出结论)。最终的值跟CFBundleDevelopmentRegion和Plist文件中的CFBundleDisplayName无关。(ps:理论上默认lproj应该是CFBundleDevelopmentRegion所配置的语言才对的。但在测试中发现这种情况下CFBundleDevelopmentRegion并没有起作用)。参考macOS: 使用新版plutil命令操作Plist文件更方便(https://www.ius7.com/a/381)苹果文档:CFBundleDevelopmentRegion (https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundledevelopmentregionlanguage=objc)iOS开发 - 超强大全自动定位,多语言文件错误(https://www.jianshu.com/p/4b117404d5d6)END三七互娱技术团队扫码关注 了解更多
|
|