32

理想情况下,这是我想做的:

  1. 使用基本的英语本地化在 Xcode 中设置项目。最终我想要英语,比如说我Localizable.strings和 Storyboards的荷兰语版本
  2. NSLocalizedString使用表单的键将代码中的字符串外部化fooViewController.barLabel,勤奋并为每个键添加适当的上下文注释
  3. 在我的 Storyboard 文件中添加荷兰语本地化
  4. 将 Storyboard 中的特定标签标记为将在运行时设置且不需要翻译的占位符
  5. 为情节提要中需要翻译的标签添加注释
  6. 导出“开发语言”xliff文件(点击项目、编辑器/导出本地化...,选择“仅开发语言”)
  7. 在CounterpartsXliffie 之类的工具甚至基于 Web的工具中打开英文xliff文件
  8. 在键旁边添加实际的英文翻译fooViewController.barLabel,然后重新保存 en.xliff
  9. nl.xliff从原始文件创建一个文件en.xliff并添加荷兰语翻译
  10. 将这两个xliff文件导入 Xcode 并让它.strings为代码中定义的键和情节提要中的键创建荷兰语和英语的适当文件;将新.strings文件提交到我的源存储库
  11. 在我的源代码和情节提要中添加、删除和更改键之后的某个时间点,en.xliff再次导出“开发语言”作为事实来源
  12. 使用当前翻译更新en.xliffnl.xliff文件,使用工具突出显示已添加或删除的键
  13. 将这些xliff文件导入回 Xcode,它会更新.strings文件,然后我可以签入到我的源存储库

这有意义吗?这是一件合理的事情吗?我想是的,但它不起作用。

以下是我遇到的问题:

  • Xcode 不支持第 4 步——该xliff格式可以将键标记为translate=no,但无法在 Xcode 中对其进行注释(理想情况下,Xcode 根本不会导出标记为占位符的键。)
  • Xcode 不支持第 5 步——无法为标签设置翻译器注释。甚至没有办法设置独立于您在情节提要的标签中放置的占位符文本的键,如果您发现在布置视图时使用Lorem Ipsum填充标签很有用,这将是一个巨大的痛苦。
  • 当您进入第 10 步时,Xcode 抱怨en.xliff文件中没有指定目标语言。有一种方法可以在 Counterparts 中更改目标语言(或者至少创建一个将目标语言设置为 的新文件EN),但我找不到任何使用 Xliffie 的方法。
  • en.xliff在尝试使用更新的密钥重新导出文件时,Xcode 告诉我"Localization failed reading "[...]/Supporting Files/en.lproj/Localizable.strings, Please address the issue at file location 782"在哪个字符位置找到了……一个撇号。xliff如果源.strings文件包含撇号, Xcode 无法导出文件。什么在实际的F...?!
  • 第 12 步和第 13 步变得很奇怪,我只是不明白发生了什么。Counterparts 和 Xliffie 都用fooViewController.barLabel英文翻译替换了我原来的密钥,看起来他们试图告诉我我没有英文翻译。在尝试将其导入en.xliffXcode 时,它​​告诉我除了新键之外我没有任何翻译,当我继续操作时,它会从en.lproj/Localization.strings文件中擦除现有的翻译。

这是一团糟。

在无法手动设置键、添加翻译注释或将特定标签标记为不用于翻译的占位符的情况下翻译 Storyboard 中的标签是行不通的。我们已经将每个标签连接到 an@IBOutlet并将其翻译设置为viewDidLoad()with NSLocalizedString

Xcode 在尝试导出.strings包含撇号乞丐信念的文件时窒息。

似乎还有一个潜在的假设,即如果 Xcode 中的“开发语言”是英语,那么开发人员负责英语翻译。我可以想象除了一个人的独立开发者商店之外没有任何背景是真实的。

最后,我似乎也遗漏了一些关于我尝试使用的工具如何构建其工作流程的信息。如果有人能启发我,我将不胜感激。

是否有人设法构建了一个可行的本地化工作流程,其中开发人员不负责对“开发语言”的最终编辑控制,并且.strings签入存储库的文件是事实的来源?

4

1 回答 1

12

我们已经将每个标签连接到@IBOutlet 并使用 NSLocalizedString 在 vi​​ewDidLoad() 中设置它的翻译。

你这样做是对的。严重地。将你的开发过程包裹在它周围,你会比尝试采用 Storyboard 本地化演变成的混乱局面要好得多。

它解决了 pt.4 - 你决定你在Localizable.strings

它解决了 pt.5 - 对于您决定可本地化的所有内容,默认情况下都有注释。现在说实话,XCode7 增加了向资源添加注释的可能性。不要使用它。由于某些只有 Apple 知道的原因,它并不适用于所有类型的资源。您不能注释例如表格页眉和页脚。稍后再谈。

我建议制作自己的NSBundle.localizedStringForKey包装器(宏),它提供value. NSLocalizedString设置value为空字符串,本质上是强制key用作后备翻译内容。在所有已经存在的有问题的宏中,NSLocalizedStringWithDefaultValue除了value所有其他 4 个必需参数之外,您也不想经常使用这些参数。

第 10 步是由于您尝试导入 Base 本地化引起的 - 它是英语的事实并没有任何区别。如果您想“翻译英语”(即专业更正),您必须在 Base 之上添加英语作为另一个独立的本地化。从技术上讲,它归结为 Base xliff 缺失<file target-language><target xml:lang>属性。由于一些类似于你的奇怪的 xliff 混乱,我不得不手动添加一次。你不想这样做:)

重新撇号故障:iOS 本地化是一个虚幻的奇迹花园,但我很确定它不是虚幻的 :) 尝试在一些显示十六进制代码的编辑器中打开文件 - XCode 呈现的内容可能与文件实际包含的内容大不相同。

  1. ...甚至是基于网络的东西

这对我们来说就是Crowdin,它很好地展示了 Apple 的 Storyboard 本地化理念的所有错误。翻译人员需要三件事来专业地完成他们的工作:上下文、上下文和上下文。Apple 似乎认为翻译人员会很乐意安装该应用程序,使用它并提出问题以了解上下文。因为默认情况下, xliff export 中没有人类上下文。现在有了 Xcode7,你可以添加注释,但奇怪的是不是到处都有。即使可以,您的注释也会附加在已经很长的末尾<note>带有机器上下文的字符串 - 可以理解,故事板导入匹配需要,但对翻译者来说无用且阻碍。此外,实际上,翻译者是专业机构或语言爱好者。即使您有幸遇到装备精良的发烧友,或者您为获得额外的客户服务而支付了代理费,您也进入了 Beta Distribution Options 的敌对沙漠。Apple 有趣的 Testflight 转世要么需要翻译者注册为 Apple 开发者,要么等待 Apple 的 beta 审查——这取决于你在应用程序生命的早期需要翻译。

顺便说一句,我喜欢你的博客。有时我也想摆脱我的酸味和错误的疲劳,但从来没有像你这样:)

于 2015-10-07T08:57:47.417 回答