Qt 翻译和 git 的最佳实践

Best practice for Qt translations and git

今天我尝试合并 Qt 项目的两个 git 分支。 两个分支都为它们添加了一些新字符串和新翻译。 现在 Qt 的 lupdate 工具将需要翻译的源文件的行号存储在 .ts 文件中。 正如您可以想象的那样,两个分支的行号不相同,并且当两个翻译文件都已更新时,这会导致数百个这样的合并冲突,对于每个翻译文件:

<<<<<<< HEAD
 +        <location filename="../../src/network/mail/CSmtp.cpp" line="856"/>
=======
+         <location filename="../../src/network/mail/CSmtp.cpp" line="860"/>
>>>>>>> master

您可能会说只使用其中一个版本,然后 运行 再次更新,但这样您会丢失其中一个分支的所有新翻译。

其他工具,如 gettext,没有这个问题,因为它们不存储行号。

在 Qt 中有什么好的方法可以避免这个问题?

一种可能的解决方案(在 an answer to "Merge translation files (.ts) with existing .ts files") is to use lconvert 中提到。在 Qt 4.5 中引入时:

The new lconvert filter tool facilitates conversion between file formats and can be used to perform other transformations on collections of translatable strings.

它涉及一个手动步骤(创建仅包含您要合并的字符串的第二个文件),然后:

 lconvert -i primary.ts secondary.ts -o complete.ts

为了完成最终结果,the answer to "Translation file still working after modifying the source?" 还提到 pylupdate4 your_project.pro 作为一种更新对 ts 文件中行的所有引用的方法。

您也可以使用 -locations none 删除带有 lupdate 的行号。这将消除与行号的任何冲突,但您将丢失源代码中字符串的上下文。对于 .ui 个文件,还有 -no-ui-lines 个参数。

lupdate -locations none -no-ui-lines ...

如果您使用 ourstheirs 策略合并(请参阅 MERGE STRATEGIES 章节中的 git merge doc),您将获得两个分支的所有翻译:

git merge branch1 -X theirs
git merge branch2 -X theirs

然后运行lupdate命令修复错数行

  1. 签入有效的空 TS XML,例如./i18n/myapp_de.ts

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE TS>
    <TS version="2.1">
    </TS>
    
  2. 运行 lupdate -verbose -no-obsolete ./src-folder/ -ts ./i18n/myapp_de.ts 当来源改变时。

  3. 不要问为什么这会很好地创建新的翻译条目和正确的上下文而没有行号,而如果 TS 文件不存在则不会。

来自 lupdate 手册页:

-locations {absolute|relative|none}

Specify/override how source code references are saved in ts files. Default is absolute.

所以用lupdate -locations none去掉TS文件中的所有行号。使用 lupdate -locations relative 减少行号的变动:现在,行号的更改只会影响每次更改后的第一个字符串,如果您使用 linguist 源 window 打开。

我的偏好是只对带有 -locations none 的版本进行源代码控制。每当我需要行号时,我都会在本地 运行 lupdate 生成具有绝对位置的临时版本。请确保您没有提交临时文件!