iOS本地化-仅使用新字符串更新Localizable.strings

34

我已经在GoogleStackOverflow上搜索了很久,但仍然没有找到一个简单且自动化的方法来完成以下场景:

  1. 我有一个应用程序,其中包含1000个字符串,分别本地化为en、fr、de、es、it。
  2. 我构建了一个新功能,其中包含10个不同的NSLocalizedString()键。
  3. 我只想将这10个新字符串附加到以下文件的末尾:
    • en.lproj/Localizable.strings
    • fr.lproj/Localizable.strings
    • es.lproj/Localizable.strings
    • de.lproj/Localizable.strings
    • it.lproj/Localizable.strings

genstrings将检索所有1010个不同的字符串。这很麻烦,因为每次更新时我都需要“大海捞针”地找到这10个字符串。

更新 2014年9月19日 -- XCode 6 - Apple 终于发布了对于你的.strings文件进行XLIFF导出和导入的支持 XCode 6有什么新功能?本地化

Linguan (v1.1.3) 虽然它是一个可爱的工具,但大部分时间它正在变成另一种工具。它合并更改,但某些字符串在合并时无法正确匹配,所以每次执行扫描源代码操作时,它都会创建100个新的重复键,以及我需要的10个字符串,这样会增加更多的工作量。

文件合并 如下所建议,尝试在旧版本和新版本的 genstrings 输出文件之间进行差异比较。 genstrings 输出按字母顺序排序,因此在1000个字符串中分散出现的10个字符串意味着需要审查200个差异。它会继续匹配 / * ... * / "..." = "...",并说 ... 已更新。它没有更新,只是在文件中的新位置上移。越来越多的情况看起来像我将不得不编写一个自定义工具。

MacHG + 文件合并 另外一边注意到,由于某种奇怪的原因,不喜欢从本地化工作拷贝中的存储库进行差异比较。左右两个窗格都为空。 更新:事实证明,保存为UTF-16和保存为UTF-8的一些更改集中的变化会影响它执行正确的差异比较。

Bash脚本 + 文件合并 我编写了以下脚本,以帮助在每次添加新的 NSLocalizedString 条目后维护我的英文参考文件:

#LOCALISATION UPDATE SCRIPT
#
#This will create a temporary copy of the current 'en' reference file then generate the 
#latest reference file using the 'genstrings' tool. Finally forcing FileMerge to launch 
#and diff the changes.
#
#Last Updated: 2014-JAN-06
#Author(s): Josh Wilson

clear
#assuming this script is run from $SRCROOT

#Backup Existing 'en' reference
cp "en.lproj/Localizable.strings" "en.lproj/Localizable-src.strings"

#Scan source files for 'NSLocalizableString' macros
genstrings -q -u -o en.lproj Classes/*.{m,mm}
genstrings -q -u -a -o en.lproj Classes/iPad/*.{m,mm}
genstrings -q -u -a -o en.lproj Classes/iPhone/*.{m,mm}

#Force FileMerge to launch and diff the update (NOTE: piping to cat forces GUI to open)
opendiff "en.lproj/Localizable-src.strings" "en.lproj/Localizable.strings" | cat

#Cleanup up temporary file
rm "en.lproj/Localizable-src.strings"

但这只更新了EN文件,我缺少一种方法来更新其他语言文件中的新键。在没有英语单词作为键且genstrings炸弹我的"welcome_message" = "Welcome!""welcome_message" = "welcome_message"的情况下,这个功能非常好。

POEditorhttp://poeditor.com/。这是一个在线工具,订阅后每1000个字符串收费。似乎工作得很好,但如果有一个非订阅式的工具就更好了。

Traducto Pro似乎做了一个不错的工作,与XCode集成并提取字符串并合并它们。但在完全翻译之前,无法从中获取任何内容,因此你被迫使用他们的翻译服务。

肯定已经实现了这个功能。苹果如何使他们的应用程序本地化?

脚本爱好者,我呼唤你!iOS开发已经进行了一段时间,本地化已经很普遍了,肯定现在有成熟的解决方案了吧?

Python脚本 update_strings.py: Stackoverflow最终推荐了一个相关的问题和这个答案中的python脚本Best practice using NSLocalizedString看起来很有前途...

测试了一下,目前版本(2013年5月31日)如果您有重复的注释条目(期望单行注释),它不会处理多行注释。

可能只需要稍微调整一下正则表达式。


2
为了完善您的清单,这里有另一个工具:本地化字符串合并 - Dominique Vial
谢谢您分享您的搜索结果。我之前不知道Traducto Pro这个看起来很棒的工具。我不明白有人为什么会对它有负面评价。如果我的理解是正确的,开发者可以通过手动输入翻译后的字符串来使用他们的翻译服务,也可以选择不使用。 - Dominique Vial
1
并且这里有一个相关问题的链接,位于StackOverflow上。 - Dominique Vial
1
Traducto Pro的主要缺点是我们已经有自己喜欢使用的翻译人员,所以转而使用Traducto的服务不是一个选择。因此,我们需要能够将提取和合并的.strings文件作为可交付物交给我们的翻译人员。感谢您链接其他SO问题并建议其他工具。我们将不得不进行调查。最终,我们使用了POEditor并花了一些钱来使用它。理想情况下,一个非订阅式的工具会是最好的。 - Josh Peak
1
好的,谢谢你的回答。看来Traducto Pro的导出功能真的很有限,也不够强大... 至于我,我使用Linguan,并从自己、同事以及iCanLocalize进行翻译。 - Dominique Vial
很棒的问题(和答案)。我已经尝试了POEditor,它非常好用 - 可以导出翻译差异。 - Ric Santos
4个回答

8
请查看 BartyCrouch,它完美地解决了您的问题。此外,它是开源的积极维护的,并且可以轻松安装和集成到您的项目中。
通过Homebrew安装BartyCrouch:Install BartyCrouch。
brew install bartycrouch

或者,通过Mint安装它:

mint install Flinesoft/BartyCrouch

增量更新您的Localizable.strings文件:

$ bartycrouch update

这将完全符合您的要求。


为了随着时间的推移保持您的Storyboard/XIBs字符串文件更新,我强烈建议添加一个构建脚本(如何添加构建脚本的说明在此处):

if which bartycrouch > /dev/null; then
    bartycrouch update -x
    bartycrouch lint -x
else
    echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi

除了逐步更新你的Storyboard/XIBs Strings文件外,这也会确保你使用NSLocalizedString在代码中新增键时,Localizable.strings文件被更新,并显示重复键或空值的警告。
请务必查看BartyCrouch的GitHub获取更多信息。

我已经不从事iOS开发了,但我正在与我的一位同事合作,确认这是否是一个适当的解决方案,然后再接受。感谢您提供如此详细的答案。 - Josh Peak

1

你可能想查看我的解决方案: SwiftyLocalization

只需几个步骤设置,您就可以在Google电子表格中拥有非常灵活的本地化功能(注释、自定义颜色、高亮、字体、多个工作表等)。

简而言之,步骤如下:Google电子表格--> CSV文件--> Localizable.strings

此外,它还会生成 Localizables.swift,这是一个结构体,充当键检索和解码的接口(尽管您必须手动指定从键解码字符串的方式)。

这为什么很棒?

  1. 您不再需要在各个地方使用明文字符串作为键。
  2. 编译时可以检测到错误的键。
  3. Xcode可以自动完成,因此您可以执行以下操作:
// It's defined as computed static var, so it's up-to-date every time you call. 
// You can also have your custom retrieval method there.

button.setTitle(Localizables.login.button_title_login, forState: .Normal)

该项目使用Google App Script将Sheets转换为CSV,使用Python脚本将CSV文件转换为Localizable.strings。您可以快速查看此示例表格以了解可能性。

1
如果你有先前版本的genstrings,只需对比新旧版本即可完成操作。
编辑:最好使用vimdiff来处理utf-16文件。

genstrings 输出的字符串按字母顺序排序,因此在 1000 个字符串中分散出现的 10 个字符串意味着有 200 处差异需要审核。它一直匹配 /.../ 和 "..." = "...",并说 ... 已更新。实际上,该字符串并没有被更新,只是在文件中移动到了新位置。越来越多的迹象表明我需要编写一个定制工具。 - Josh Peak

1
你可以查看我为OneSky构建的Xcode插件Xcode Plugin,它旨在改进iOS/Mac OSX开发者的本地化工作流程。
插件的字符串生成功能会运行genstringsibtool --export-strings-file来选择源/IB文件,新文件将自动添加到项目和目标中,并将新字符串与注释合并到现有文件中。
它只会为基础语言生成/更新字符串,但您可以利用插件的其他功能来自动化翻译导出和导入到OneSky平台,这对于众包项目是免费的。

不泄露保密协议信息的情况下,我知道苹果正在通过更好地支持本地化来解决XCode 6中的上述问题。无论如何,我会点赞这个答案,因为它看起来是一个很棒的工具,在此期间可以使用。谢谢分享。 - Josh Peak
现在官方发布的消息是,XCode 6支持XLIFF。 - Josh Peak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接