增量本地化如何运作?

时间:2011-12-06 14:36:13

标签: ios cocoa localization xib ibtool

我正在尝试构建我的第一个本地化应用程序。我使用NSLocalizedString(用于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),那么“旧”文件在几次提交之前,增量文件是diff和path / to / new.xib是新生成的xib文件。 mod.nib对我来说是一个谜。有谁能解释我这是如何工作的?另外 - 如果没有以前的版本可用,我该如何开始xib的本地化(即不进行增量,而是初始本地化)?

2 个答案:

答案 0 :(得分:12)

我认为他们选择的术语,尤其是--incremental-file,会引起混淆。我们的想法是你有两种语言(源和目标)的旧版xib,并且你已经在源语言中更改了它,并希望更新目标语言版本以匹配。

我们举一个例子。您以前使用英语(源语言)的home.xib,并有人将其翻译为法语(目标语言)。您已经开发了一个新功能,现在您已经有了英文版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指定将要创建的新法国xib
  • mod.xib指定新的英文xib

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

答案 1 :(得分:3)

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

<强>用法:

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