34

我已经搜索了GoogleStackOverflow,但仍然没有明确的答案来简单自动化地执行此操作,但情况如下:

  1. 我有一个包含 1000 个字符串的应用程序,这些字符串本地化为 en、fr、de、es 等。
  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 个字符串。

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

Linguan (v1.1.3)虽然大多数时候它是一个可爱的工具,但它开始成为另一种意义上的工具。它合并了更改,但某些字符串在合并时没有正确匹配,因此每次它执行 Scan Sources 时,它都会创建 100 个新的重复键以及我所追求的 10 个字符串,因此它正在做更多的工作。

FileMergegenstrings如下所示,尝试在输出文件的新旧版本之间进行比较。输出的genstrings字符串按字母顺序排序,因此 10 个字符串分散在 1000 个中,这意味着有 200 个差异需要查看。它一直匹配 the/*...*/和 the"..." = "..."并说 the...已更新。它尚未更新,只是转移到文件中的新位置。越来越像我将不得不编写一个自定义工具。

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 文件,而且我缺乏使用新密钥更新其他语言文件的方法。这对于我没有英语单词作为键和 genstrings 轰炸我 的情况很有"welcome_message" = "Welcome!""welcome_message" = "welcome_message"

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

Traducto Pro似乎在与 XCode 集成并提取字符串并将事物合并在一起方面做得很好。但在完全翻译之前,不可能从中取回任何东西,因此您被迫使用他们的翻译服务。

当然,这个功能之前已经实现过。Apple 如何将其应用程序本地化?

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

Python Script update_strings.py:Stackoverflow最终推荐了一个相关问题,并且这个答案中的 python 脚本使用 NSLocalizedString 的最佳实践看起来很有希望......

对其进行了测试,如果您有重复的评论条目(预计单行评论),它在其当前形式(2013 年 5 月 31 日)中不处理多行评论。

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

4

4 回答 4

8

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


通过Homebrew安装BartyCrouch :

brew install bartycrouch

或者,通过Mint安装它:

mint install Flinesoft/BartyCrouch

逐步更新您的Localizable.strings文件:

$ bartycrouch update

这将完全符合您的要求。


为了您的 Storyboards/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

除了增量更新您的 Storyboards/XIBs 字符串文件之外,这还将确保您的Localizable.strings文件使用代码中新添加的键保持更新NSLocalizedString,并显示重复键或空值的警告。

确保在GitHub 上查看BartyCrouch 以获取更多信息。

于 2016-05-06T16:56:33.393 回答
1

如果您有以前版本的 genstrings,那么新旧版本之间的“差异”就可以解决问题

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

于 2013-05-29T09:21:37.663 回答
1

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

插件的字符串生成功能运行genstringsibtool --export-strings-file选定的源/IB文件,新文件将自动添加到项目和目标中,新字符串将合并到带有注释的现有文件中。

它只会为基础语言生成/更新字符串,但您可以利用插件的其他功能通过 OneSky 平台自动导出和导入翻译,该平台对众包项目是免费的。

于 2014-06-06T04:31:07.247 回答
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 您可以快速查看此示例表以了解可能的情况。

于 2016-10-13T05:47:13.707 回答