我已经阅读了一些有关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文件的答案也将非常受欢迎。谢谢!
答案 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项目中。