Revision control
++ <?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"/>
++ </xs:schema>