具有本地化应用名称的多个目标的本地化项目

时间:2012-05-09 20:42:01

标签: ios xcode localization dry info-plist

我最近将我的5个独立项目合并到一个项目中,以拥有一个共同的代码库。所以现在我有一个项目有5个目标。

每个目标都有相同的文件集,但每个目标不同的某些文件除外(例如Default.png和图标文件等)。 我的应用程序被翻译成7种语言,默认为英语。其他语言包括:瑞典语,荷兰语,德语,法语,波兰语和西班牙语。
现在我还要根据使用的语言翻译应用程序的名称。 例如,对于我的瑞典航空应用程序,该应用程序应该被称为#34; Flyget ARN"在瑞典语中,但对于英语,它应该被称为"航空ARN"。 所有这些都不是问题,因为这是在InfoPlist.string中完成的,但是将其与应用程序的本地化相结合是一个问题。

我最近写了这个问题:Several localizations yet still showing English only并发现我无法合并多个.strings文件。 (见我写的答案)。

所以我的问题如下:
如何从包含多个目标的项目中获得本地化应用程序,并在不出现DRY违规的情况下本地化我的应用程序名称(重复代码)。

更新
这仍然是一个问题,给出的答案并没有解决我的问题。

6 个答案:

答案 0 :(得分:16)

我在一个XCode项目中破解了这个问题,我相信,它解决了你所遇到的同样问题,所以希望这会对你有所帮助。该解决方案包含两个使用相同代码库(具有不同的应用程序名称)构建的目标,这两个目标是完全本地化的,包括应用程序的名称。 (它构建我的免费增值应用程序,名为增长(法语: Croissance ,西班牙语: Crecer )和付费版本,名为 Growth + (法语: Croissance + ,西班牙语: Crecer + )。

我还偶然发现InfoPlist.string个文件(仅包含应用程序的名称)。我通过在我的解决方案中使用子文件夹来解决这个问题,并更改目标以包含来自相关子文件夹的本地化InfoPlist.strings集。具体来说,我有这个结构:


    Root
    +-- en.lproj
    ¦   +-- Localizable.strings
    ¦   +-- SomeXib.xib
    +-- es.lproj
    ¦   +-- Localizable.strings
    ¦   +-- SomeXib.xib
    +-- fr.lproj
    ¦   +-- Localizable.strings
    ¦   +-- SomeXib.xib
    +-- OnlyInAppA
    ¦   +-- en.lproj
    ¦   ¦   +-- InfoPlist.strings
    ¦   +-- es.lproj
    ¦   ¦   +-- InfoPlist.strings
    ¦   +-- fr.lproj
    ¦       +-- InfoPlist.strings
    +-- OnlyInAppB
    ¦   +-- en.lproj
    ¦   ¦   +-- InfoPlist.strings
    ¦   +-- es.lproj
    ¦   ¦   +-- InfoPlist.strings
    ¦   +-- fr.lproj
    ¦       +-- InfoPlist.strings
    +-- AppA.plist
    +-- AppB.plist

我的目标(除了不同的预处理器符号和不同的.plist文件)之间的唯一区别是AppA的构建设置包括OnlyInAppA下的InfoPlist.strings文件,而AppB的构建设置包括OnlyInAppB下的InfoPlist.strings文件。

我个人认为,我使用的命名约定(OnlyInAppA / OnlyInAppB文件夹,AppB / AppB plist文件)非常明显,使其成为一种令人满意的方法。

修改

请参阅这两个XCode 4屏幕截图,了解确切找到目标中更改设置的位置。

  1. 在目标构建设置中,指定了不同的plist文件(注意:当您添加新目标时,XCode会自动为您执行此操作) Build settings screenshot

  2. 在目标构建阶段,在Copy Bundle Resources部分中,从相关的OnlyInAppX子文件夹中选择InfoPlist.strings的版本(请注意此屏幕截图中InfoPlist.strings旁边的灰色文本 - 这将显示不同的另一个目标的位置)。您可以使用+/-按钮将文件替换为预期的文件来实现此目的。 Build phases screenshot

答案 1 :(得分:5)

如果此问题仍然存在:我找到了如何为项目中的每个目标添加多个InfoPlist.string的解决方案。请按照以下步骤操作:

  1. 我假设您已经有多个目标。
  2. 转到Finder中的项目文件夹。
  3. 创建特定于每个目标的文件夹:

    create folders

  4. 在每个文件夹中创建一个InfoPlist.strings文件:

    create files

  5. 为项目中每个文件夹的目标指定正确(且仅限!)目标添加文件夹:

    add folders to targets

  6. 删除每个新目标的原始InfoPlist.strings文件的目标依赖项。

    remove target dependencies for old .strings file

  7. 本地化新的InfoPlist.strings文件:

    localize new files localize new files

  8. 通过更改语言设置来构建目标并进行检查:

    french version english version

答案 2 :(得分:1)

将所有InfoPlist.strings文件保存在不同的路径下。每个人都只是一个目标的成员。

或者我不理解这个问题?

答案 3 :(得分:1)

我有类似的设置,我的相同软件支持多个域,每个域访问各种模块(例如博客,论坛)的完全相同的路径。为了保持每个域的个性,特别是当数据库服务变得不可用时,我将关键信息保留在文件中,基本上是元信息。对于本地化,我会保留一个变量来保留每个站点/项目的默认语言。您可以确定包含信息的文件以拥有自己的域或将所有项目存储在同一文件中,无论是您希望将其用于最终后备,还是只是缺少具有较低权限的任何/每个人的公共选项在你实现这些选项之前(用户能够覆盖语言选项)。

答案 4 :(得分:0)

我一直在为我的应用做这件事。

当我更改手机的默认语言时,它会正确地选取我的每个infoPlist.strings文件中的名称。

但我是从头开始做的。我不知道你是否需要备份以获得你想要的行为。或者从任何本地化文件夹中保存各种infoPlist.strings文件,然后执行以下步骤,然后从以下步骤将当前infoPList.strings文件中的内容重新插入到新创建的文件中。

我正在使用Xcode 4.3。步骤:

1)在info-plist.strings中设置您想要的默认语言字符串。你应该得到一个文件:

first infoPlist.strings file

2)现在,打开文件检查器

enter image description here

3)在最右边的检查员中,您现在可以点击导航器底部的+号:

enter image description here

4)一旦您选择了感兴趣的语言,它们将显示在左侧的项目导航器中,如下所示:

enter image description here

你也可以为Localizable.strings和其他文件(例如以下示例照片中的index.html)执行此操作:

enter image description here

答案 5 :(得分:-3)

尝试查看iTunesConnect_DeveloperGuide

并看到“添加新的本地化”

您可以在此处为每种语言编写本地化应用名称