Posts Xcode多Target下本地化App名称
Post
Cancel

Xcode多Target下本地化App名称

Target

可能很多人都会有开发多个相似的App的需求,这些相似的App可能也就是名称、BundleID、证书配置不同,其他的功能都基本一样。对于这种情况的处理,一种比较笨的办法就是手动修改 Info.plist 文件中相应的内容,打包完了之后再次修改再打包。这种方法如果只是搞一次也不会麻烦很多,但是如果多搞几次,谁都会觉得烦,况且在修改的过程中还有可能会出错。那有没有什么更好的办法呢?答案是:使用 Target

那么什么是 Target 呢?简单点说,一个 Target 描述了一个产品的属性并且包含了产品所需要的一系列文件。而一个 Project 中就包含多是一个或者多个产品所需要的文件、资源、信息等。所以一个Project可以包含多个 Target,你可以在一个 Target 中对 Project 中包含的文件、资源和信息进行不同的组合从而生成不同的产品。

多Target下本地化App名称

对于单个Target下App名称的本地化比较简单,我这里就不赘述了,我们来看一下多Target下怎么本地化App的名称:

首先创建一个名为 LocalizationDemo 的项目,创建完成之后如下图所示:

Xcode默认创建了一个名为 LocalizationDemo 的 Target,我们修改它的名字为 Product1 并在修改后的名字上点击右键选择 Duplicate 复制一个 Target(在弹出的对话框中选择Duplicate Only),这样就会创建一个名为 Product1 copy的 Target,同时会创建一个名为 Product1 copy-Info.plist 文件,我们将建的 Target 的名字修改为 Product2,结果如下图所示:

这个自动创建的 Product1 copy-Info.plist 文件在 $(SRCROOT)(工程文件.xcodeproj文件所在目录)目录下,而 Info.plist 文件则在 $(SRCROOT)/LocalizationDemo 目录下。为了统一起见,我们把 Product1 copy-Info.plist 文件移动到 $(SRCROOT)/LocalizationDemo 目录下并改名为 Product2-Info.plist,同时修改 Info.plist 文件名为 Product1-Info.plist。结果如下图所示:

由于我们修改了 Info.plist 文件的名称和路径,Xcode表示找不到它了,所以 Identity 那里会出现一个名叫 Choose Info.plist file 的按钮,我们分别点击两个Target中的按钮选择对应的文件,完成之后如下图所示:

现在我们添加需要本地化的语言,这里作为演示就只选择一个简体中文,添加完后效果如图所示:

对于单个Target的App名称的本地化我们只需要在项目中新建一个 InfoPlist.strings 文件对不同的语言设置不同的 CFBundleDisplayName 就可以了。但是这里有个问题就是 InfoPlist.strings 文件的名称是固定的,它不像 Info.plist 文件一样可以用不同的名称,然后在 Build Setting 中给不同的 Target 设置不同的 Info.plist File 路径和名称就可以了。

幸运的是我们可以通过建立多个不同路径下的 InfoPlist.strings 文件来实现对多个 Target 下的App名称进行本地化。我们在 $(SRCROOT)/LocalizationDemo 目录下分别建立 Product1Product2 两个文件夹,分别包含一个 InfoPlist.strings 文件,效果如下图所示:

然后我们分别将两个文件夹添加到项目中来,添加的时候注意勾选对应的Target:

添加完成之后我们分别在两个InfoPlist.strings文件中添加 CFBundleDisplayName = "Product Name"; 对应的名称,结果如下图所示:

然后我们点击右侧的 Localize 按钮分别对两个 InfoPlist.strings 文件进行本地化,勾选需要的语言并修改不同语言下对应的名称,这里我设置 Product1 的英文名为 Product1、中文名为产品1,Product2 的英文名为 Product2、中文名为产品2

到这里我们的目的基本上已经达成了,但是我们运行之前发现虽然改了Target的名称,但是左上角的 Scheme 的名称并没有变化,看起来很不爽。单击 Scheme 名称然后选择 Manage Schemes, 然后修改 LocalizationDemoProduct1Product1 copyProduct2。修改完效果如下图:

All done! 赶紧选择不同的 Scheme 运行一下然后把系统切换到不同的语言看看是不是成功了!

根据本文创建的示例项目我已经上传到了 Github 上,欢迎下载查看:

Multi-TargetLocalizationDemo

This post is licensed under CC BY 4.0 by the author.

检测iOS设备是否连接VPN

嵌套UIScrollView滑动手势冲突的解决

Comments powered by Disqus.