介绍
lconvert 是 Qt 的 Linguist 工具链的一部分。 它可以用于转换和过滤翻译数据文件的独立工具。
用法:
1
| lconvert [options] <infile> [<infile>...]
|
支持以下文件格式:
- qm:编译后的 Qt 翻译
- pot:GNU Gettext 本地化模板文件
- qph:Qt Linguist 短语手册
- ts:Qt 翻译源
- po:GNU Gettext 本地化文件
- xlf:XLIFF 本地化文件
如果指定了多个输入文件,它们将被合并以后文件的翻译优先。
选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| -H
-help 帮助
-i <infile>
-input-file <infile>
指定输入文件。 如果 <infile> 可能以破折号开头。
该选项可以多次使用来合并输入。
可以是“-”(标准输入),用于管道中。
-o <outfile>
-output-file <outfile>
指定输出文件。 默认为“-”(标准输出)。
-if <informat>
-input-format <format>
指定后续 <infile> 的输入格式。
格式是根据文件名自动检测的,默认为“ts”。
-of <outformat>
-output-format <outformat>
指定输出格式。见 -if。
-drop-tags <regexp>
写入 TS 或 XLIFF 文件时删除命名的额外标签。
可以重复指定。
-drop-translations
删除现有翻译并将状态重置为“未完成”。
注意:这意味着 --no-obsolete。
-source-language <language>[_<region>]
指定/覆盖源字符串的语言。 如果未指定且文件尚未命名
则默认为 POSIX 。
-target-language <language>[_<region>]
指定/覆盖翻译的语言。
如果未指定此选项并且文件内容名称还没有语言,则将从文件名猜测目标语言。
-no-obsolete
删除过时的消息。
-no-finished
删除已完成的消息。
-no-untranslated
删除未翻译的消息。
-sort-contexts
按字母顺序对输出 TS 文件中的上下文进行排序。
-locations {absolute|relative|none}
覆盖源代码引用在 TS 文件中的保存方式。
默认是绝对的。
-no-ui-lines
从 UI 文件的引用中删除行号。
-verbose
详细一点
长选项也可以仅用一个前导破折号来指定。
|
返回值:
- 0 表示成功
- 1 命令行解析失败
- 2 读取失败
- 3 写入失败
用例
假设有如下 ts 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>MainWindow</name>
<message>
<location filename="mainwindow.ui" line="14"/>
<source>MainWindow</source>
<translation>主窗口</translation>
</message>
<message>
<location filename="mainwindow.ui" line="21"/>
<source>按钮</source>
<translation>按钮</translation>
</message>
<message>
<location filename="mainwindow.ui" line="28"/>
<source>按钮2</source>
<translation></translation>
</message>
<message>
<location filename="mainwindow.cpp" line="16"/>
<location filename="mainwindow.cpp" line="25"/>
<source>English text</source>
<translation>英文文本</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="14"/>
<location filename="mainwindow.cpp" line="20"/>
<source>Chinese text</source>
<translation>中文文本</translation>
</message>
</context>
</TS>
|
去掉UI文件的行号
1
| lconvert lan_zh.ts -no-ui-lines -o lan_zh_n.ts
|
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>MainWindow</name>
<message>
<location filename="mainwindow.ui"/>
<source>MainWindow</source>
<translation>主窗口</translation>
</message>
<message>
<location filename="mainwindow.ui"/>
<source>按钮</source>
<translation>按钮</translation>
</message>
<message>
<location filename="mainwindow.ui"/>
<source>按钮2</source>
<translation></translation>
</message>
<message>
<location filename="mainwindow.cpp" line="16"/>
<location filename="mainwindow.cpp" line="25"/>
<source>English text</source>
<translation>英文文本</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="14"/>
<location filename="mainwindow.cpp" line="20"/>
<source>Chinese text</source>
<translation>中文文本</translation>
</message>
</context>
</TS>
|
可以看到,仅是.ui
文件的行号被去掉了,而代码里的行号并没有去掉。
去掉行号
可以使用 -locations none
参数将 ts 中 location
去掉,就没有行号了
1
| lconvert -locations none lan_zh.ts -o lan_zh_n.ts
|
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>MainWindow</name>
<message>
<source>MainWindow</source>
<translation>主窗口</translation>
</message>
<message>
<source>按钮</source>
<translation>按钮</translation>
</message>
<message>
<source>按钮2</source>
<translation></translation>
</message>
<message>
<source>English text</source>
<translation>英文文本</translation>
</message>
<message>
<source>Chinese text</source>
<translation>中文文本</translation>
</message>
</context>
</TS>
|
弊端:Qt linguist 工具将无法查看对应的源码位置。