<!--
!
! Some notes to the DTD:
!
! The location element is set as optional
! The userdata element is set as optional
! The vanished message type was introduced
!
-->
<!--
! 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; >