<!--
 !
 ! Some notes to the DTD:
 !
 ! 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.
 !
  -->
<!--
 ! Macro 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.
 -->
<!ENTITY % evilstring '(#PCDATA | byte)*' >
<!ELEMENT byte EMPTY>
<!-- value contains decimal (e.g. 1000) or hex (e.g. x3e8) unicode encoding of one char -->
<!ATTLIST byte
          value CDATA #REQUIRED>
<!--
 ! This element wildcard is no valid DTD. No better solution available.
 ! 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
  -->
<!ELEMENT extra-* %evilstring; >
<!ELEMENT TS (defaultcodec?, extra-**, dependencies?, (context|message)+) >
<!ATTLIST TS
          version CDATA #IMPLIED
          sourcelanguage CDATA #IMPLIED
          language CDATA #IMPLIED>
<!-- The encoding to use in the QM file by default. Default is ISO-8859-1. -->
<!ELEMENT defaultcodec (#PCDATA) >
<!ELEMENT context (name, comment?, (context|message)+) >
<!ATTLIST context
          encoding CDATA #IMPLIED>
<!ELEMENT dependencies (dependency+) >
<!ATTLIST dependency
          catalog CDATA #IMPLIED>
<!ELEMENT name %evilstring; >
<!-- This is "disambiguation" in the (new) API, or "msgctxt" in gettext speak -->
<!ELEMENT comment %evilstring; >
<!-- Previous content of comment (result of merge) -->
<!ELEMENT oldcomment %evilstring; >
<!-- The real comment (added by developer/designer) -->
<!ELEMENT extracomment %evilstring; >
<!-- Comment added by translator -->
<!ELEMENT translatorcomment %evilstring; >
<!ELEMENT message (location*, source?, oldsource?, comment?, oldcomment?, extracomment?, translatorcomment?, translation?, userdata?, extra-**) >
<!--
 ! If utf8 is "true", the defaultcodec is overridden and the message is encoded
 ! in UTF-8 in the QM file. If it is "both", both source encodings are stored
 ! in the QM file.
  -->
<!ATTLIST message
          id CDATA #IMPLIED
          utf8 (true|false|both) "false"
          numerus (yes|no) "no">
<!ELEMENT location EMPTY>
<!--
 ! 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.
  -->
<!ATTLIST location
          filename CDATA #IMPLIED
          line CDATA #IMPLIED>
<!ELEMENT source %evilstring;>
<!-- Previous content of source (result of merge) -->
<!ELEMENT oldsource %evilstring;>
<!--
 ! The following should really say one evilstring macro or several
 ! numerusform or lengthvariant elements, but the DTD can't express this.
  -->
<!ELEMENT translation (#PCDATA|byte|numerusform|lengthvariant)* >
<!--
 ! 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.
  -->
<!ATTLIST translation
          type (unfinished|vanished|obsolete) #IMPLIED
          variants (yes|no) "no">
<!-- Deprecated. Use extra-* -->
<!ELEMENT userdata (#PCDATA)* >
<!--
 ! The following should really say one evilstring macro or several
 ! lengthvariant elements, but the DTD can't express this.
 ! Length variants must be ordered by falling display length.
  -->
<!ELEMENT numerusform (#PCDATA|byte|lengthvariant)* >
<!ATTLIST numerusform
          variants (yes|no) "no">
<!ELEMENT lengthvariant %evilstring; >
