<?xml version = "1.0" encoding = "utf-8"?>
<?xml-stylesheet href="/pool/rng_ht.xslt" type="application/xml"?>
<!-- file KLEIDER/web/src/localization/skeleton.rng -->
<!--
  "http://herbaer.de/xmlns/20150106/skeleton"
  2015 Herbert Schiemann <h.schiemann@herbaer.de>
  Borkener Str. 167, 46284 Dorsten, Germany
  Diese Datei ist unter der GPL verfügbar.
  Jede Gewährleistung ist ausgeschlossen.

  Das Schema folgt den folgenden Richtlinien:
  - Jedes Attribut und jedes Element wird in einem
    <define>-Element spezifiziert
  - Jedes <define>-Element spezifiziert höchstens ein Attribut oder Element
  - Die Namen der Muster ("Pattern"), die ein Attribut spezifizieren,
    beginnen mit "att_".
  - Die Namen der Muster, die ein Element spezifizieren,
    beginnen mit "el_".
  - Die Dokumentation ist in den define-Elementen enthalten und benutzt
    DocBook-XML-artige Markierungen des Namensraums
    http://herbaer.de/xmlns/20051201/doc
-->
<grammar
  xmlns    = "http://relaxng.org/ns/structure/1.0"
  xmlns:d  = "http://herbaer.de/xmlns/20051201/doc"
  ns       = "http://herbaer.de/xmlns/20150106/skeleton"
  xmlns:sk = "http://herbaer.de/xmlns/20150106/skeleton"
>

<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>skeleton.rng</title>
  <subtitle>Markierungen zu übersetzbaren Inhalten</subtitle>
  <date>2015-01-06</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<d:para>
Ein XML-Dokument, das übersetzt werden soll,
wird mit zusätzlichen Markierungen angereichert.
Die zusätzlichen Markierungen kennzeichnen die zu übersetzenden Inhalte.
Aus dem erweiterten Dokument ("Gerüst") kann eine XLIFF-Datei erstellt werden.
Aus der übersetzten XLIFF-Datei und dem Gerüst kann eine übersetzte Version
des ursprünglichen Dokuments erstellt werden.
Dieses Dokument beschreibt die zusätzlichen Markierungen.
</d:para>

<start>
  <ref name = "el_lang"/>
  <ref name = "el_attribute"/>
  <ref name = "el_contents"/>
  <ref name = "el_part"/>
  <ref name = "att_sk_chk"/>
  <ref name = "att_sk_wrap"/>
</start>

<define name = "anything">
  <d:para>
Beliebiger Inhalt
  </d:para>
  <zeroOrMore>
    <choice>
      <element>
        <anyName/>
        <ref name="anything"/>
      </element>
      <attribute>
        <anyName/>
      </attribute>
      <text/>
    </choice>
  </zeroOrMore>
</define><!-- anything -->

<define name = "foreign_att">
  <d:para>
Attribute anderer XML-Namensräume
  </d:para>
  <zeroOrMore>
    <attribute>
      <anyName>
        <except>
          <nsName ns = ""/>
          <nsName ns = "http://herbaer.de/xmlns/20150106/skeleton"/>
        </except>
      </anyName>
    </attribute>
  </zeroOrMore>
</define><!-- foreign_att -->

<define name = "foreign_el">
  <d:para>
Elemente anderer XML-Namensräume
  </d:para>
  <zeroOrMore>
    <element>
      <anyName>
        <except>
          <nsName ns = "http://herbaer.de/xmlns/20150106/skeleton"/>
        </except>
      </anyName>
      <ref name = "anything"/>
    </element>
  </zeroOrMore>
</define><!-- foreign_el -->

<define name = "el_lang">
  <d:para>
Das Element <d:tag class = "element">lang</d:tag> bezeichnet ein Attribut,
das die Sprache bezeichnet.
Im übersetzten Dokument müssen sie die Zielsprache angeben.
Der Inhalt ist der Wert des Attributs (Quellsprache).
Das Attribut <d:tag class = "attribute">name</d:tag> gibt den Namen
des Attributs an.
  </d:para>
  <element name = "lang">
    <ref name = "foreign_att"/>
    <ref name = "att_name"/>
    <data type = "string"/>
  </element>
</define><!-- el_lang -->

<define name = "att_name">
  <d:para>
Der Name eines Attributs
  </d:para>
  <attribute name = "name">
    <data type = "string"/>
  </attribute>
</define><!-- att_name -->

<define name = "el_attribute">
  <d:para>
Das Element <d:tag class = "element">attribute</d:tag> bezeichnet ein Attribut,
dessen Wert zu übersetzen ist.
Das Attribut <d:tag class = "attribute">name</d:tag> nennt den Namen des Attributs,
der Inhalt ist der Wert des Attributs im Quelldokument
(der zu übersetzende Wert).
Der einzige sinnvolle Wert des Attributs <d:tag class = "attribute">class</d:tag>
ist hier <d:literal>text</d:literal>.
  </d:para>
  <element name = "attribute">
    <ref name = "foreign_att"/>
    <ref name = "att_name"/>
    <ref name = "att_xliffid"/>
    <optional>
      <ref name = "att_class"/>
    </optional>
    <text/>
  </element>
</define><!-- el_attribute -->

<define name = "att_xliffid">
  <d:para>
Eindeutige Kennung eines Textausschnitts
  </d:para>
  <attribute name = "xliffid">
    <data type = "word"/>
  </attribute>
</define><!-- att_xliffid -->

<define name = "att_class">
  <d:para>
Klassifiziert einen Textabschnitt des Quelldokuments bezüglich der Übersetzung.
  </d:para>
  <d:variablelist>
    <d:varlistentry>
      <d:term><d:literal>text</d:literal></d:term>
      <d:listitem>
        <d:para>
Einfacher zu übersetzender Text, der nicht weiter untergliedert ist.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>struct</d:literal></d:term>
      <d:listitem>
        <d:para>
Der zu übersetzende Text enhält markierte Ausschnitte.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>move</d:literal></d:term>
      <d:listitem>
        <d:para>
Die Markierung des Textinhalts kann beliebig innerhalb des Elternelements verschoben werden,
solange die Reihenfolge der Markierungen erhalten bleibt.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>fix</d:literal></d:term>
      <d:listitem>
        <d:para>
Der Textinhalt ist wörtlich zu übernehmen (nicht zu übersetzen),
z.B. eine E-Mail-Adresse oder eine URL.
        </d:para>
      </d:listitem>
    </d:varlistentry>
  </d:variablelist>
  <attribute name = "class">
    <choice>
      <value>text</value>
      <value>struct</value>
      <value>move</value>
      <value>fix</value>
    </choice>
  </attribute>
</define>

<define name = "el_contents">
  <d:para>
Der Inhalt eines Elements.
Immer wenn ein Element ein Attribut enthält, das die Sprache angibt,
oder ein Attribut oder Inhalt, der zu übersetzen ist,
wird der Inhalt in ein <d:tag class = "element">contents</d:tag>-Element
gepackt.
  </d:para>
  <element name = "contents">
    <ref name = "att_class"/>
    <optional>
      <ref name = "att_unit"/>
    </optional>
    <optional>
      <ref name = "att_wrap"/>
    </optional>
    <ref name = "att_xliffid"/>
    <ref name = "att_lang"/>
    <ref name = "foreign_att"/>
    <choice>
      <interleave>
        <text/>
        <ref name = "foreign_el"/>
      </interleave>
      <interleave>
        <oneOrMore>
          <ref name = "el_part"/>
        </oneOrMore>
        <ref name = "foreign_el"/>
      </interleave>
    </choice>
  </element>
</define><!-- el_contents -->

<define name = "att_unit">
  <d:para>
Das Attribut kennzeichnet zu übersetzende Texteile,
die nicht Teil eines umfassenden zu übersetzenden Textteils sind.
("Units" im Sinne von XLIFF).
  </d:para>
  <attribute name = "unit">
    <value>unit</value>
  </attribute>
</define><!-- att_unit -->

<define name = "att_wrap">
  <d:para>
Das Attribut zeigt an, dass das Elternelement
im Quelldokument ein einziges Kindelement "einhüllt".
  </d:para>
  <attribute name = "wrap">
    <value>wrap</value>
  </attribute>
</define><!-- att_wrap -->

<define name = "att_lang">
  <d:para>
Die Sprache eines Textteils im Quelldokument.
  </d:para>
  <attribute name = "lang">
    <data type = "string"/>
  </attribute>
</define><!-- att_lang -->

<define name = "el_part">
  <d:para>
Manche Elemente im Quelldokument zerlegen den Inhalt des Elternelements
in Abschnitte. Das ist übel, aber historisch so verwachsen.
Die Abschnitte, die eine solche Zerlegung erzeugt,
sind in <d:tag class = "element">part</d:tag>-Elementen enthalten.
  </d:para>
  <element name = "part">
    <ref name = "att_class"/>
    <ref name = "att_xliffid"/>
    <ref name = "att_lang"/>
    <ref name = "foreign_att"/>
    <interleave>
      <text/>
      <ref name = "foreign_el"/>
    </interleave>
  </element><!-- part -->
</define>

<define name = "att_sk_chk">
  <d:para>
Das Attribut <d:tag class = "attribute">sk:chk</d:tag>
gibt die "Erstklassifizierung" eines Elements an:
  </d:para>
  <variablelist xmlns = "http://herbaer.de/xmlns/20051201/doc">
    <varlistentry>
      <term><literal>s</literal></term>
      <listitem>
        <para>
Das Element trennt den Inhalt des Elternelements
in Teile, die getrennt übersetzt werden (können).
        </para>
      </listitem>
    </varlistentry>
    <varlistentry>
      <term><literal>t</literal></term>
      <listitem>
        <para>
Der Inhalt des Elements einschließlich seiner Kindelemente ist zu übersetzen.
        </para>
      </listitem>
    </varlistentry>
    <varlistentry>
      <term><literal>l</literal></term>
      <listitem>
        <para>
Der Inhalt des Elements ist eine unveränderliche Zeichenkette,
(ein Name oder eine URL).
        </para>
      </listitem>
    </varlistentry>
    <varlistentry>
      <term><literal>m</literal></term>
      <listitem>
        <para>
Der Inhalt des Elements kann direkt im Elternelement erscheinen,
und das Element selbst kann mit leerem Inhalt verschoben werden,
solange die Reihenfolge der "verschiebbaren" Elemente erhalten bleibt.
        </para>
      </listitem>
    </varlistentry>
  </variablelist>
  <attribute name = "sk:chk">
    <choice>
      <value>s</value>
      <value>t</value>
      <value>l</value>
      <value>m</value>
    </choice>
  </attribute>
</define><!-- att_sk_chk -->

<define name = "att_sk_wrap">
  <d:para>
Das Attribut <d:tag class = "attribute">sk:wrap</d:tag>
in einem Fremdelement zeigt an,
dass das Element im Quelldokument ein einziges Kindelement
"umhüllt".
  </d:para>
  <attribute name = "sk:wrap">
    <value>wrap</value>
  </attribute>
</define>

</grammar>
<!-- end of file KLEIDER/web/src/localization/skeleton.rng -->
