7

我正在尝试构建我的第一个本地化应用程序。我使用 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 的本地化?

4

2 回答 2

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。您显然会创建 xib 的新语言版本(在 XCode 中,您只需将一种语言添加到 xib 的语言列表中,并且会自动创建本地化的 xib)。然后,如果您自己在 Interface Builder 中本地化它们,那么您只需在本地化的 xib 中进行相关更改(文本翻译和任何必要的调整大小)。或者,您可以将 xib 中的文本提取到.strings文件中,对其进行翻译,然后将它们注入到这些 xib 的相关语言版本中。为此,您将再次使用 ibtool,但 with--generate-strings-file用于提取阶段和 with--import-strings-file用于注入阶段。

于 2011-12-08T00:01:43.860 回答
3

我为 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
于 2013-02-11T18:32:45.343 回答