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

28

我最近将5个独立的项目合并成一个项目,以获得共同的代码库。因此现在我有一个包含5个目标的项目。

每个目标具有相同的文件集,除了一些文件对于每个目标不同(例如Default.png和图标文件等)。 我的应用程序已翻译为7种语言,英语为默认语言。其他语言包括:瑞典语、荷兰语、德语、法语、波兰语和西班牙语。
现在我也想根据使用的语言来翻译应用程序的名称。 例如,对于我的瑞典航空应用程序,该应用程序应称为“Flyget ARN”,而对于英语应该称为“Aviation ARN”。 所有这些都不是问题,因为这是在InfoPlist.string中完成的,但与应用程序的本地化结合在一起是个问题。

最近我写了这个问题:Several localizations yet still showing English only,并发现我不能组合几个.strings文件。(请参见我编写的答案)。

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

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


你为什么不在Xcode项目中使用脚本构建阶段,从一个包含所有共享本地化的共享文件和一个包含需要不同字符串(应用程序名称)的目标特定文件中编程创建InfoPlist.strings呢? - puzzle
6个回答

20

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

我还遇到了只包含应用程序名称的InfoPlist.string文件。我通过在我的解决方案中使用子文件夹并更改目标以包括相关子文件夹中本地化集合的InfoPlist.strings来解决了问题。具体而言,我有以下结构:

    根目录
    +-- en.lproj
    ¦   +-- Localizable.strings
    ¦   +-- SomeXib.xib
    +-- es.lproj
    ¦   +-- Localizable.strings
    ¦   +-- SomeXib.xib
    +-- fr.lproj
    ¦   +-- Localizable.strings
    ¦   +-- SomeXib.xib
    +-- 仅存在于AppA中
    ¦   +-- en.lproj
    ¦   ¦   +-- InfoPlist.strings
    ¦   +-- es.lproj
    ¦   ¦   +-- InfoPlist.strings
    ¦   +-- fr.lproj
    ¦       +-- InfoPlist.strings
    +-- 仅存在于AppB中
    ¦   +-- 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文件夹,AppA / AppB plist文件)在我个人看来已经足够清晰明了。

编辑:

请查看以下两个XCode 4的截图,以了解更改的设置在目标中的具体位置。

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

  2. 在目标构建阶段中,在“复制Bundle资源”部分中,从相关的OnlyInAppX子文件夹中选择InfoPlist.strings版本(请注意此截图上InfoPlist.strings旁边的灰色文字--另一个目标将显示不同位置)。您可以使用+/-按钮实现此操作,并用所需的文件替换该文件。 Build phases screenshot


我相信我尝试过了,但是没有成功。也许我做错了什么...我打算这个周末再试一次。 - Paul Peelen
现在看起来对我来说好像可以了...使用了你的答案。谢谢。 - Paul Peelen

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


这种方法似乎与被接受的答案中描述的相同,但具有很好的逐步说明。谢谢! - RustamG

3
只需将所有的InfoPlist.strings文件保留在不同的路径下,每个文件只属于一个目标。或者是我没有理解问题的意思?

好的,那就是我所做的。将InfoPlist.strings文件放在它自己的组和文件夹中。localizable.string文件在所有目标之间共享。 - Paul Peelen
每个 InfoPlist.strings 文件都是适当目标的成员吗?当您检查构建的目标时,各种 InfoPlist.strings 文件是否处于适当的本地化位置? - Ken Thomases
plutil 命令是否验证 .strings 文件的有效性? - Ken Thomases
我还没有检查过,但由于该应用程序本地化了应用程序名称,并且如果我在Info.plist中更改默认语言,则应用程序会切换默认语言,因此我认为plutil不会出现问题。 - Paul Peelen
那我一定误解了问题。我以为问题是您的应用程序名称没有成功本地化。问题出在哪里? - Ken Thomases
你理解得很正确。该应用程序无法根据设备的系统设置成功本地化。但是,我可以通过将默认语言设置为支持的语言之一来强制进行本地化,但这样整个应用程序都将使用该语言...而不考虑系统设置。只有应用程序名称设置会根据系统设置更改。 - Paul Peelen

1
我有一个类似的设置,同一软件支持多个域名,每个域名访问各种模块的完全相同路径(例如博客、论坛)。为了保留每个域名的独立性,特别是当数据库服务不可用时,我在文件中保留关键信息,基本上是元信息。对于本地化,我会保留一个变量,保留每个站点/项目的默认语言。您可以确定包含信息的文件具有自己的域名,或者将所有项目存储在同一个文件中,无论哪种方式,您都希望将其用作最终备选方案,或者如果您仅缺少比您更低权限的任何人/每个人的进一步公共选项,直到您实现此类选项(用户能够覆盖语言选项)。

谢谢您的回答...但是...我不认为这解决了我的问题。我既不必在应用程序中设置语言,也不应该将所有内容保存在同一个文件中,因为那将违反DRY原则。然而,我确实不太明白您所说的“确定包含信息的文件具有自己的域”的意思是什么? - Paul Peelen
如果您将信息保存在单独的文件中,针对名为meta的域的文件可以命名为example1.com.php、example2.net.php等。我最终建议的唯一一件事是,在出现问题时将主回退值保存在元文件中。 - John
好的...我想我们之间有些误解。这不是一个网络项目。 - Paul Peelen

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


没错,但是将两者结合起来会出现问题(至少我觉得是这样)。它只会使用其中一个,并且更倾向于使用InfoString...或者至少对我来说是这样看。 - Paul Peelen
我想表达的是,我目前正在一个项目中工作,其中infoPlist.strings和Localizable.strings以这种方式工作。 - john.k.doe
是的,但是这个项目是否有针对不同应用程序的多个目标? - Paul Peelen
正如我之前提到的,该应用程序具有共享代码库,用于构建多个应用程序。如果所有应用程序都相同,我会同意你的观点...但那是毫无意义的。每个应用程序涵盖不同的机场,例如JFK、ARN、BMA、MMX等。这些机场有不同的地图和数据...这就是原因。无论我的原因是什么,这些都是我的要求,我不会“只是因为”而妥协。 - Paul Peelen
您应该仍然能够使用单个文件,在文件信息的目标成员部分,检查每个项的目标。我为我的一个应用程序创建了一个单独的目标,在原始目标中取消了俄语 Info-PList.strings 文件的目标成员(它们不必是相同的名称),然后在第二个目标中,将俄语 Info-Plist.strings 设为唯一属于该目标的文件。您也应该能够使用目标成员选项卡来处理 localizable.strings (或任何其他可本地化资源)。 - john.k.doe
显示剩余3条评论

-3

尝试查看iTunesConnect_DeveloperGuide

并查看“添加新本地化”

在这里,您可以为每种语言编写本地化应用程序名称。


请解释一下iTunes Connect本地化与在应用程序中使用两个不同的.strings文件有什么关系? - Paul Peelen
这里有另一个解决方案,它不使用两个不同的.strings文件。 - CReaTuS
这不是一个解决方案,iTunes Connect 是用于发布应用程序到 App Store 并在其上维护应用程序的门户网站,它与应用程序本身或其内容完全无关...当然,除了上传时验证应用程序之外。 - Paul Peelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接