增量本地化如何工作?

我正在尝试构build我的第一个本地化应用程序。 我使用NSLocalizedString转换代码中的所有string(用于使用genstrings工具)。 现在我碰到了ibtool 。 增量本地化如何工作? 关于手册页,我应该写这样的东西:

 $ ibtool --previous-file path/to/prev.xib \ --incremental-file path/to/inc.xib --localize-incremental \ --write path/to/new.xib mod.xib 

我在哪里得到增量文件? 为了我的理解,如果我使用版本控制(git / svn),“旧”文件是在几个提交前,增量文件是差异和path/到/ new.xib是新生产的xib文件。 mod.nib对我来说是一个谜。 任何人都可以解释我是如何工作的? 另外 – 如果没有以前的版本可用(即不增量,但初始本地化),我如何开始xib的本地化?

我认为他们对术语的select,特别是对于--incremental-file ,正在引起混淆。 这个想法是,你有两种语言(源和目标)的xib的旧版本,你已经改变了你的源语言,并希望更新目标语言版本以匹配。

我们来举个例子。 你以前有英文的home.xib(源语言),并有人把它翻译成法文(目标语言)。 你已经开发了一个新的function,你现在有一个更新版本的英文home.xib,你添加了一个UILabel和一个UITextField并移动了东西。 您显示的命令可以帮助您获取法语版本的home.xib更新版本,以便它具有新的UILabel和UITextField,并且可以像英文一样移动。 请注意,您在新UILabel和UITextField中设置的任何文本内容都将以英文添加,然后需要在法文xib中进行翻译(不过,您可以通过添加--import-strings-file并提供翻译来自动执行此操作多一个文件)。

所以如果我们把你给出的命令映射到这个例子:

  • --previous-file path/to/prev.xib指定旧的英文xib
  • --incremental-file path/to/inc.xib指定旧的法语xib
  • --write path/to/new.xib指定将创build新的法国xib
  • mod.xib指定新的英文xib

关于你如何开始这个过程的其他问题,真的取决于你将如何本地化您的xibs。 显然,您将创buildxib的新语言版本(在XCode中,您只需将语言添加到xib的语言列表中,并且会自动创build本地化的xib)。 然后,如果您自己将它们本地化到Interface Builder中,那么您只需在本地化的xib中进行相关的更改(文本翻译和任何必要的大小调整)即可。 或者,您可以将xib中的文本解压缩为.strings文件,将它们翻译并注入到这些xib的相关语言版本中。 为此,您将再次使用ibtool,但将--generate-strings-file用于提取阶段,使用--import-strings-file用于注入阶段。

我为git项目编写了一个脚本,可以自动执行必要的步骤(如上面的答案中所述),以便将更改迁移到其他语言。

用法:

 migrate_changes.sh <target_language> <xib file without ending> 

例:

在对英文xib文件提交更改后,在资源文件夹的根目录下运行该脚本。

 migrate_changes.sh de MyViewController 

资源:

 #!/bin/sh LANG_FROM='en' LANG_TO=$1 XIB_FILE=$2 FROM_FILE=${LANG_FROM}.lproj/${XIB_FILE}.xib PREV_FILE=${LANG_FROM}.lproj/${XIB_FILE}_old.xib TO_FILE=${LANG_TO}.lproj/${XIB_FILE}.xib # checkout old version of xib file git show `git log -2 --format="%H" $FROM_FILE | tail -n 1`:./$FROM_FILE > $PREV_FILE # merge changes ibtool --previous-file $PREV_FILE --incremental-file $TO_FILE --localize-incremental --write $TO_FILE $FROM_FILE # remove previous version rm $PREV_FILE