今天我尝试合并一个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中有哪些避免这个问题的好方法?
答案 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)
如果您使用ours
或theirs
策略合并(请参阅MERGE STRATEGIES
章节中的{{3}}),您将获得两个分支的所有翻译:
git merge branch1 -X theirs
git merge branch2 -X theirs
然后运行lupdate
命令来修复rong数字行。