【问题标题】:Localized project with several targets with localized app names具有多个目标的本地化项目,具有本地化的应用程序名称
【发布时间】:2023-03-29 19:30:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 有什么理由不简单地在 Xcode 项目中使用脚本构建阶段从包含所有共享本地化和目标特定文件的共享文件中以编程方式创建 InfoPlist.strings需要不同的字符串(应用程序名称)?

标签: ios xcode localization dry info-plist


【解决方案1】:

我在一个 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 +-- 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 会自动为您执行此操作)

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

【讨论】:

  • 我相信我试过了,但没有奏效。也许我做错了什么……我打算这个周末再试一次。
  • 它现在似乎对我有用......使用你的答案。谢谢。
【解决方案2】:

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

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

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

  5. 将文件夹添加到目标指定为您的项目中的每个文件夹正确(且唯一!)目标:

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

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

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

【讨论】:

  • 该方法似乎与接受的答案中描述的相同,但有很好的分步说明。谢谢!
【解决方案3】:

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

还是我没看懂问题?

【讨论】:

  • 嗯,我就是这么做的。将 InfoPlist.strings 文件放在自己的组和自己的文件夹中。 localizable.string 文件在所有目标之间共享。
  • 每个 InfoPlist.strings 是否都是相应目标的成员?当您检查构建的目标时,各种 InfoPlist.strings 文件是否具有适当的本地化?
  • plutil 命令是否验证 .strings 文件是否有效?
  • 没有检查,但是由于应用程序本地化了应用程序名称,并且如果我在 Info.plist 中更改它,应用程序确实会切换默认语言,我怀疑plutil 不会抱怨。跨度>
  • 那我一定是误解了这个问题。我认为问题在于您的应用名称未成功本地化。有什么问题?
【解决方案4】:

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

【讨论】:

  • 谢谢你的回答......但再次......我不相信这能解决我的问题。我既不需要在应用程序中设置语言,也不应该将所有内容保存在同一个文件中,因为这将违反 DRY。不过,我不太明白你说的determine the files containing the information to have their own domain是什么意思?
  • example1.com.php、example2.net.php 等用于域命名的元文件,如果您将信息保存在单独的文件中。我最终建议的唯一一件事是如果出现问题保存在元文件中,则主备用值。
  • 好吧...我认为我们彼此误解了。这不是一个网络项目。
【解决方案5】:

我一直在为我的应用程序这样做。

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

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

我正在使用 Xcode 4.3。步骤:

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

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

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

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

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

【讨论】:

  • 感谢您的回复。我确实使用了不同的 InfoPlist.strings 文件,但是当我这样做时“忘记”了 Localizable.strings 文件。 InfoStrings.plist 文件对于每个目标(共 5 个)存在一次,但它是一个不同的文件。 localizable.strings 也是如此,但每个目标都是同一个文件。你搞定了吗?
  • 我的经验是 localizable.strings 对我来说是一样的。换句话说,它也是“支持文件”下的一个文件,其中有一个带有许多可本地化字符串文件的箭头。
  • 是的,但是将两者结合起来(至少我)会遇到问题。它将只使用两者之一,并且它会更喜欢 InfoString... 或者至少在我看来是这样。
  • 我想说的是我目前正在从事一个项目,其中 infoPlist.strings 和 Localizable.strings 都以这种方式工作。
  • 是的,但是该项目是否有针对不同应用的多个目标?
【解决方案6】:

试试看iTunesConnect_DeveloperGuide

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

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

【讨论】:

  • 请解释一下 iTunes Connect 本地化与让两个不同的 .strings 文件在应用程序中工作有何关系?
  • 这是另一个解决方案,它不使用两个不同的 .strings
  • 这不是一个解决方案,iTunes connect 是用于将应用程序发布到应用程序商店并在应用程序商店上维护应用程序的门户,它与应用程序本身或其内容完全无关......来自在上传时验证应用程序......当然。
猜你喜欢
  • 2013-05-07
  • 1970-01-01
  • 2012-01-25
  • 2020-01-07
  • 2017-01-26
  • 2017-03-10
  • 2023-04-08
  • 2023-03-25
  • 2020-08-08
相关资源
最近更新 更多