我已经阅读了一些关于 iOS 的 i18n/l10n 工具和流程的教程,并且对我所看到的感到非常惊讶。似乎没有一种可靠的方法可以将面向用户的字符串从目标 C 文件中外部化。我错过了什么吗?
问题描述:存在将英文字符串直接放入 .m 文件的趋势,Apple 文档似乎鼓励这样做。虽然这在 Android 中也是可能的,但至少在 Android 中,外部化字符串和非外部化字符串之间存在明显区别。另一方面,在 iOS 中,调用字符串的代码往往如下所示:
NSLocalizedString(@"There was an error loading the image.", nil)
在这种情况下,“加载图像时出错。” 是此字符串资源的键。因此,如果我想在其他地方再次引用相同的字符串,我们必须再次编写如下代码:
NSLocalizedString(@"There was an error loading the image.", nil)
但是现在我必须确保这两个字符串的拼写相同,并且没有编译时检查来帮助我确认。我可以编写一个名为 createErrorString 的辅助函数,但这并不好玩。我可以替换“加载图像时出错”。使用像“ERROR_IMAGE_LOAD”这样更明智的键,但这似乎不是一种常见的做法,Apple 似乎不鼓励这种明智的行为。以下是他们的文档所述:
“开发应用程序时的一个常见约定是使用与用于开发应用程序的语言中的值相同的键名。”
看起来 Apple 建议您将完整的英文字符串放入源代码中。因此,我必须设法说服我的同事反对苹果的指导。
现在我已经在源代码中获得了所有这些面向用户的英文字符串(或键),Apple 包含了一个名为 genstrings 的工具,它可以解析 .m 文件,并输出一个 Localizable.strings 文件,然后我可以将其发送出去用于翻译。如果您只打算让您的应用程序本地化一次,这可能会奏效,但在我们公司,本地化是一个持续的迭代过程。查看 Apple 文档的建议:
“对于后续运行,最好在运行 genstrings 之前保存当前字符串文件的副本。然后您可以区分新旧版本以确定哪些字符串已添加到(或更改)到您的项目中。然后您可以使用此信息更新字符串文件的任何已本地化版本,而不是替换这些文件并再次本地化它们。”
这似乎不太好。在 Android 和 Windows8 中,您曾经国际化您的源代码树,从那一刻起,您的外部化字符串在它们所属的 xml 文件中拥有;在 iOS 中,它们属于源代码(有点),然后被一些疯狂的工具制成一些中间文件(或者是吗?)。Localizable.strings 文件是中间文件还是应该提交到 git 中 - 我们仍在我公司讨论这个问题。
(据我所知,这只是一个开始。在 xib-land 中,90% 的面向用户的字符串都存在于此,l10n 似乎也存在一种效率低下的机制。Wil Shipley 的文章详细描述了这一点.)
有没有人对在 iOS 中外部化字符串的好方法有任何建议?我的主要问题涉及objective-C 字符串,但也非常感谢有关xib 文件的答案。谢谢!