Qt ts文件(Translation Source file:翻译源文件)是Qt框架中用于存储翻译文本和相关上下文信息的一种特定格式文件,它是Qt Linguist(语言家)工具使用的基础。Qt Linguist是Qt开发工具包中的一个应用程序,专门用于本地化和国际化Qt应用程序。
Qt ts文件的结构
Qt ts文件是基于XML格式的文本文件,用于存储翻译文本和相关的上下文信息。这种格式使得翻译人员能够清晰地看到原文、上下文和翻译内容,便于进行准确的翻译工作。
文件声明
Qt ts文件通常以XML声明开始,指定了文件的版本和编码方式。
cpp
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<?xml version="1.0" encoding="UTF-8"?>声明了这是一个XML文件,使用UTF-8编码。
<!DOCTYPE TS>指定了文档类型为TS。
<TS version="2.1" language="zh_CN">标签则包含了TS文件的版本号和语言代码【1】。
【1】:language属性的值为相应语言的BCP 47标签代码。BCP47是一种标签格式的建议标准,这个标准定义了一种语言标签的特定格式,通常用于软件国际化和语音识别等领域。一个BCP 47语言标由多个子标记组成,这些子标记通过连字符(-)分隔【2】
子标记的类型和顺序通常遵循以下规则:
- 语言代码 (Language):通常是定义的两个或三个字母的代码,代表一种语言。例如,zh代表中文,en代表英文。
- 脚本代码 (Script):可选,定义的四个字母代码,用于表示书写系统。例如,Hans代表简体中文(汉字简化字形),Hant代表繁体中文(汉字传统字形)。
- 地区代码 (Region):可选,定义的两个字母代码,或者UN M.49标准中的三位数字代码,用于表示特定的地理区域或国家。例如,CN代表中国大陆,US代表美国。
示例:
zh:表示中文(不特定于简体或繁体)。
zh-Hans:表示简体中文。
zh-Hant:表示繁体中文。
zh-CN:表示中国大陆使用的中文(默认为简体中文)。
en-US:表示美国英语。
【2】:按照BCP 47的严格规范,应该使用短横线(-)而不是下划线()。在实际的Qt .ts文件中,你可能会看到语言代码和国家/地区代码之间使用下划线()作为分隔符的情况,特别是在language属性中。在这种情况下,尽管它可能不会影响Qt工具(如Qt Linguist)的正确解析,但最好还是按照BCP 47的规范,将其更改为使用短横线(-)来分割。
上下文(context)
在Qt ts文件中,可以定义多个上下文(context),用于将翻译字符串分组到相关的逻辑部分中。虽然这不是必需的,但它有助于翻译人员更好地理解字符串的用途和上下文环境。然而,在标准的Qt ts文件中,上下文通常是通过<context>标来指定的,而不是直接作为XML结构的一部分。
消息(Message)
<message>标签是Qt ts文件中最核心的部分,它包含了需要翻译的字符串及其相关信息。每个<message>标签都包含以下子元素:
- location (可选):指定了源代码中字符串的位置,包括文件名和行号,有助于翻译人员查找原始字符串。
- source :包含原始(未翻译)的字符串。
- translation :包含翻译后的字符串。在初始的ts文件中,这个元素可能是空的,等待翻译人员填写。
- comment (可选):提供关于字符串的额外信息或注释,帮助翻译人员理解字符串的用途或上下文。
- numerusforms (可选):当字符串包含可变的数字部分时,可以使用此元素来提供不同数量下的翻译选项。
cpp
<context> //上下文
<name>MainWindow</name> //上下文名称
<message> //消息
<location filename="mainwindow.ui" line="14"/>
<source>打开文件</source>
<translation>Open File</translation>
</message>
<!-- 其他消息 -->
</context>
<!-- 其他上下文 -->
/* 在这个例子中,<context>标签的<name>属性指定了上下文的名称为"MainWindow",它表示这个上下文中
* 的字符串都与主窗口相关。在<context>标签内部,<message>标签定义了需要翻译的字符串"打开文件"及
* 其翻译"Open File"。
*/
使用lupdate工具生成.ts文件
参见链接:Qt使用lupdate工具生成.ts文件-CSDN博客
注意事项
- Qt ts文件的结构相对简单,主要围绕<message>标签展开。
- 上下文(context)通常通过<context>标签指定,而不是作为XML结构的一部分。
- 在编辑Qt ts文件时,应确保使用UTF-8编码,以避免编码问题。
- Qt Linguist是编辑Qt ts文件的推荐工具,它提供了直观的界面来查看、编辑和管理翻译字符串。
- Ts文件不会被包含进Qt应用程序,通过ts文件编译生成的qm文件会被包含进Qt应用程序中。
ts文件举例
cpp
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>frmrecordreplay</name>
<message>
<location filename="frmlocalsetting/frmrecordreplay.ui" line="14"/>
<source>Form</source>
<translation type="unfinished">Form</translation>
</message>
<message>
<location filename="frmlocalsetting/frmrecordreplay.cpp" line="252"/>
<source>Begin play record</source>
<translation type="unfinished">Begin play record</translation>
</message>
<message>
<location filename="frmlocalsetting/frmrecordreplay.cpp" line="259"/>
<location filename="frmlocalsetting/frmrecordreplay.cpp" line="287"/>
<source>Stop playback control request</source>
<translation type="unfinished">Stop playback control request</translation>
</message>
<message>
<location filename="frmlocalsetting/frmrecordreplay.cpp" line="278"/>
<source>Continue playback control request</source>
<translation type="unfinished">Continue playback control request</translation>
</message>
</context>
<context>
<name>frmtelbookbase</name>
<message>
<location filename="frmtelbook/frmtelbookbase.ui" line="14"/>
<source>Form</source>
<translation type="unfinished">Form</translation>
</message>
<message>
<location filename="frmtelbook/frmtelbookbase.ui" line="73"/>
<source>TextLabel</source>
<translation type="unfinished">TextLabel</translation>
</message>
<message>
<location filename="frmtelbook/frmtelbookbase.cpp" line="27"/>
<source>Are You Delete It ?</source>
<translation type="unfinished">Are You Delete It ?</translation>
</message>
</context>
<context>
<name>frmtelwidgetbase</name>
<message>
<location filename="frmtelwidget/frmtelwidgettbase.ui" line="32"/>
<source>Form</source>
<translation type="unfinished">Form</translation>
</message>
</context>
</TS>