0

我已经阅读了一些关于 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 文件的答案。谢谢!

4

2 回答 2

2

我发现建议将键命名为英语字符串也很奇怪。
我命名键,值例如“Menu1SettingsTitle”=“设置”。
我不需要 genstrings 工具,只需手动外部化。
不,字符串文件不是中间步骤,它们应该在 git 中。

然而,通过这种方法,我注意到了三个缺点:
1)我检测到重复的名称,但可以将其移动到字符串的公共部分,如“取消、删除”

2)如果你忘记在那个语言文件里放一个字符串,就找不到了,然后显示key,当然看起来很奇怪。否则苹果推荐,如果关键是英文单词,它看起来“只有英文”但不会更糟。

3)如果总是留下英文而不是“Menu1SettingsTitle”,翻译过程会更容易。为了解决这个问题,我在上面发表了评论,但不知道翻译服务是否会对此感到满意。

于 2013-02-15T01:45:10.130 回答
1

经过几个小时的搜索,我决定使用两种不同的方法:一种用于情节提要,另一种用于 .m 文件中的文本。结果是两个文件 Localizable.strings 用于 Objective C 文本和国际化故事板。

update_storyboard_strings.sh 可以自动从故事板中提取可翻译的字符串并更新字符串文件。源代码(由 mikezang 提供)可以在以下位置找到:

http://forums.macrumors.com/showpost.php?p=16060008&postcount=4

对于目标 C NLS,我在 Frédéric Sagnes 的 xcode-tools 周围使用了另一个脚本: https ://github.com/ndfred/xcode-tools

为了获得所需的结果,我必须为每种语言调用它:

python scripts/xcode-tools/update_strings.py --import=MyProject/Base.lproj/Localizable.strings MyProject/Base.lproj/Localizable.strings

python scripts/xcode-tools/update_strings.py --import=MyProject/de.lproj/Localizable.strings MyProject/de.lproj/Localizable.strings

现在将两者都放在一个脚本中,并将其作为最后一个构建阶段添加到您的 Xcode 项目中。

于 2014-05-21T21:03:16.277 回答