是否有一种很好的方法可以将面向用户的字符串从客观C文件中外部化?

时间:2013-02-15 01:25:49

标签: ios localization

我已经阅读了一些有关i18n / l10n的iOS工具和流程的教程,并且对我所看到的内容感到不愉快。似乎没有一种可靠的方法可以将面向用户的字符串从客观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似乎也是一种效率低下的机制。{{3} }详细描述了这一点。)

有没有人对在iOS中外部化字符串的好方法有任何建议?我的主要问题涉及Objective-C字符串,但是关于xib文件的答案也将非常受欢迎。谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

2)如果您忘记将字符串放入该语言文件中,则无法找到它,然后显示该键,当然这看起来很奇怪。否则与苹果推荐,如果关键是英语单词,它看起来“只有英语”,但不会更糟。

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

答案 1 :(得分:1)

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

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

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

对于目标C NLS,我使用FrédéricSagnes围绕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项目中。