TS 文件格式用于 Qt Linguist 的描述是通过 XSD presented below, which we include for your convenience. Be aware that the format may change in future Qt releases.
<?xml version="1.0" encoding="utf-8"?>
<!--
!
! Some notes to the XSD:
!
! The location element is set as optional since it was introduced first in Qt 4.2.
! The userdata element is set as optional since it was introduced first in Qt 4.4.
! The vanished message type was introduced first in Qt 5.2.
!
-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- value contains decimal (e.g. 1000) or hex (e.g. x3e8) unicode encoding of one char -->
<xs:element name="byte">
<xs:complexType>
<xs:attribute name="value" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<!--
! Type used in order to escape byte entities not allowed in an xml document
! for instance, only #x9, #xA and #xD are allowed characters below #x20.
-->
<xs:complexType name="byte-type" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="byte" />
</xs:choice>
</xs:complexType>
<!--
! extra-something should be described as extra-* but wildcard is not valid in XSD. No better solution found.
! extra elements may appear in TS and message elements. Each element may appear
! only once within each scope. The contents are preserved verbatim; any
! attributes are dropped. Currently recognized extra tags include:
! extra-po-msgid_plural, extra-po-old_msgid_plural
! extra-po-flags (comma-space separated list)
! extra-loc-layout_id
! extra-loc-feature
! extra-loc-blank
-->
<xs:element name="extra-something" type= "byte-type"/>
<xs:element name="TS">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="extra-something" />
<xs:element minOccurs="0" maxOccurs="1" ref="dependencies" />
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="context" />
<xs:element ref="message" />
</xs:choice>
</xs:sequence>
<xs:attribute name="version" type="xs:string" />
<xs:attribute name="sourcelanguage" type="xs:string" />
<xs:attribute name="language" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="context">
<xs:complexType>
<xs:sequence>
<xs:element ref="name" />
<xs:element minOccurs="0" maxOccurs="1" ref="comment" />
<xs:element minOccurs="1" maxOccurs="unbounded" ref="message"/>
</xs:sequence>
<xs:attribute name="encoding" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="dependencies">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" ref="dependency" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="dependency">
<xs:complexType>
<xs:attribute name="catalog" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="name" type= "byte-type"/>
<!-- This is "disambiguation" in the (new) API, or "msgctxt" in gettext speak -->
<xs:element name="comment" type= "byte-type"/>
<!-- Previous content of comment (result of merge) -->
<xs:element name="oldcomment" type= "byte-type"/>
<!-- The real comment (added by developer/designer) -->
<xs:element name="extracomment" type= "byte-type"/>
<!-- Comment added by translator -->
<xs:element name="translatorcomment" type= "byte-type"/>
<xs:element name="message">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="location" />
<xs:element minOccurs="0" maxOccurs="1" ref="source" />
<xs:element minOccurs="0" maxOccurs="1" ref="oldsource" />
<xs:element minOccurs="0" maxOccurs="1" ref="comment" />
<xs:element minOccurs="0" maxOccurs="1" ref="oldcomment" />
<xs:element minOccurs="0" maxOccurs="1" ref="extracomment" />
<xs:element minOccurs="0" maxOccurs="1" ref="translatorcomment" />
<xs:element minOccurs="0" maxOccurs="1" ref="translation" />
<xs:element minOccurs="0" maxOccurs="1" ref="userdata" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="extra-something" />
</xs:sequence>
<xs:attribute name="id" type="xs:string" />
<xs:attribute default="no" name="numerus">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="yes" />
<xs:enumeration value="no" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<!--
! If the line is omitted, the location specifies only a file.
!
! location supports relative specifications as well. Line numbers are
! relative (explicitly positive or negative) to the last reference to a
! given filename; each file starts with current line 0. If the filename
! is omitted, the "current" one is used. For the 1st location in a message,
! "current" is the filename used for the 1st location of the previous message.
! For subsequent locations, it is the filename used for the previous location.
! A single TS file has either all absolute or all relative locations.
-->
<xs:element name="location">
<xs:complexType>
<xs:attribute name="filename" type="xs:string" />
<xs:attribute name="line" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="source" type= "byte-type"/>
<!-- Previous content of source (result of merge) -->
<xs:element name="oldsource" type= "byte-type"/>
<!--
! The following should really say one byte-type or several
! numerusform or lengthvariant elements.
-->
<xs:element name="translation">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="byte" />
<xs:element ref="numerusform" />
<xs:element ref="lengthvariant" />
</xs:choice>
<!--
! If no type is set, the message is "finished".
! Length variants must be ordered by falling display length.
! variants may not be yes if the message has numerus yes.
-->
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="unfinished" />
<xs:enumeration value="vanished" />
<xs:enumeration value="obsolete" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute default="no" name="variants">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="yes" />
<xs:enumeration value="no" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<!-- Deprecated. Use extra-something -->
<xs:element name="userdata" type="xs:string" />
<!--
! The following should really say one byte-type or several
! lengthvariant elements.
! Length variants must be ordered by falling display length.
-->
<xs:element name="numerusform">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="byte" />
<xs:element ref="lengthvariant" />
</xs:choice>
<xs:attribute default="no" name="variants">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="yes" />
<xs:enumeration value="no" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="lengthvariant" type= "byte-type"/>