Qt翻译和git的最佳实践

时间:2015-01-29 17:06:38

标签: git qt merge localization internationalization

今天我尝试合并一个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

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

其他工具(如gettext)不会出现此问题,因为它们不存储行号。

在Qt中有哪些避免这个问题的好方法?

4 个答案:

答案 0 :(得分:9)

来自lupdate手册页:

  

-locations {absolute | relative | none}

     

指定/覆盖源代码引用在ts文件中的保存方式。默认值为absolute

因此,请使用 lupdate -locations none 来消除TS文件中的所有行号。使用 lupdate -locations relative 来减少行号的流失:现在,行号的更改只会影响每次更改后的第一个字符串,如果您使用{{1},这可能是可接受的折衷方案在源窗口打开的情况下。

我的偏好是只使用linguist提交源控制版本。每当我需要行号时,我在本地运行-locations none以生成具有绝对位置的临时版本。确保你不提交临时的!

答案 1 :(得分:4)

一种可能的解决方案(在an answer to "Merge translation files (.ts) with existing .ts files"中提到)是使用lconvert。当这被引入时,在Qt 4.5:

  

新的lconvert过滤器工具有助于文件格式之间的转换,并可用于对可翻译字符串集合执行其他转换。

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

 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文件中所有行引用的方法。

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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

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

然后运行lupdate命令来修复rong数字行。