iOS本地化 – 使用新string更新Localizable.strings

我已经search谷歌StackOverflow,并仍然没有明确的答案,一个简单的自动化的方式做到这一点,但这里的情况是:

  1. 我有一个应用程序1000本地化到en,fr,de,es,它的string。
  2. 我构build了一个新的function,使10个明显新的NSLocalizedString()键。
  3. 我只想把这10个新的string添加到文件的末尾:
    • en.lproj / Localizable.strings
    • fr.lproj / Localizable.strings
    • es.lproj / Localizable.strings
    • de.lproj / Localizable.strings
    • it.lproj / Localizable.strings

genstrings将检索所有1010个不同的string。 这是一个痛苦,因为我需要“大海捞针”每次更新时find这10个string。

更新19-SEP-2014 – XCode 6 – 苹果终于发布了对XLIFF导出和导入.strings文件的支持XCode 6有什么新function? 本土化

Linguan(v1.1.3)虽然它是一个可爱的工具,但大多数时候它已经开始成为另一种意义上的工具。 它合并了更改,但某些string在合并时不能正确匹配,所以每次扫描源时,都会创build100个新的重复键以及10个string,因此它正在进行更多的工作。

FileMerge如下build议尝试在新旧版本的genstrings输出文件之间进行区别。 输出的string按字母顺序sorting,所以在1000个string中分散的10个string意味着需要查看200个不同的string。 它始终与/*...*/"..." = "..."匹配,并说...已经更新。 它没有更新,只是转移到文件中的新位置。 越来越多,它看起来像我将不得不写一个自定义工具。

MacHG + FileMerge在一个侧面说明,由于一些奇怪的原因,不喜欢使用Localizable.strings的工作副本做出差异。 左窗格和右窗格都显示为空。 更新:在一些变化集被保存为UTF-16和一些UTF-8正在拧它能够做一个适当的差异的变化。

Bash脚本+ FileMerge我已经写了下面的脚本,以帮助维护我的英文参考文件后每次添加新的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文件,而我缺less用其他语言文件更新新密钥的方法。 对于那些没有英文单词作为关键字的情况,这种情况已经很好了,而且我的"welcome_message" = "Welcome!""welcome_message" = "welcome_message"

POEditor http://poeditor.com/ 。 这是一个基于1000个string的在线工具和订阅。 似乎工作得很好,但如果有一个非订阅的工具,这将是一件好事。

Traducto Pro似乎做了一个与XCode集成并提取string并合并在一起的好工作。 但是直到完全翻译后才能得到任何东西,所以你被迫使用他们的翻译服务。

当然这个function已经实现过了。 苹果如何保持其应用程序本地化?

脚本瘾君子,我呼吁你! iOS开发已经进行了一段时间,本地化也是常有的事,现在肯定有一个成熟的解决scheme呢?

Python脚本 update_strings.py:Stackoverflow终于推荐了一个相关的问题和Python脚本在这个答案使用NSLocalizedString的最佳做法看起来很有希望…

如果您有重复的评论条目(需要单行注释),则以目前的forms(2013年5月31日)对其进行testing并不处理多行注释。

可能只需要调整一下正则expression式。

结帐BartyCrouch ,它完美地解决了你的问题。 它也是开源的积极维护 ,可以很容易地安装和集成到您的项目。


通过Homebrew 安装 BartyCrouch:

 $ brew install bartycrouch 

逐步更新 Localizable.strings文件:

 $ bartycrouch code -p "/path/to/code/directory" -l "/directory/containing/Localizables" -a 

这将做你正在寻找的。


为了保持 Localizable.strings文件不断更新,我强烈build议添加一个构build脚本(有关如何在此添加构build脚本的说明):

 if which bartycrouch > /dev/null; then # Incrementally update all Storyboards/XIBs strings files bartycrouch interfaces -p "$PROJECT_DIR" # Add new keys to Localizable.strings files from NSLocalizedString in code bartycrouch code -p "$PROJECT_DIR" -l "$PROJECT_DIR" -a -s else echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch" fi 

除了增量更新Localizable.strings文件外,还将确保Storyboards / XIBsstring文件保持使用新添加的键更新

确保在GitHub上检出BartyCrouch以获取更多信息。

如果你有以前的版本的genstrings,只是新老之间的“差异”可以做的伎俩

编辑:最好使用vimdiff来处理utf-16文件

您可以查看我为OneSky构build的这个Xcode插件 ,旨在改进iOS / Mac OSX开发人员的本地化工作stream程。

插件的string生成function将genstringsibtool --export-strings-file到选定的源文件/ IB文件,新文件将自动添加到项目和目标中,新string将被合并到现有文件中。

它只会为基础语言生成/更新string,但是您可以利用插件的其他function使用OneSky平台自动进行翻译导出和导入,OneSky平台免费用于众包项目。

你可能想看看我的解决scheme在这里: SwiftyLocalization

只需几个步骤即可完成设置,您可以在Google Spreadsheet(评论,自定义颜色,突出显示,字体,多个工作表等)中进行非常灵活的本地化。

简而言之,步骤是:Google Spreadsheet – > CSV文件 – > Localizable.strings

此外,它还会生成Localizables.swift ,这个结构的作用类似于为您提供密钥检索和解码的接口(您必须手动指定一种从关键字解码String的方式)。

为什么这很棒?

  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脚本将表格 – > CSV Python脚本转换为CSV文件 – > Localizable.strings您可以快速浏览此示例表以了解可能的情况。