xml:lang in XML-Dokument-Schemas

Frage

Wann sollte man xml:lang verwenden und wann sollte man ein eigenes Element oder Attribut für Sprachangaben in einem XML-Dokument-Schema (DTD) definieren?

Manchmal enthalten Dokumente Texte in verschiedenen natürlichen Sprachen. In anderen Fällen sollen sie natürliche Sprachen als Daten oder Metadaten über etwas Externes außerhalb des Dokuments angeben. Weil diese verschiedenen Anwendungsfälle ähnliche Formate verwenden, sind sich Schema-Entwickler manchmal nicht sicher, wann sie xml:lang verwenden sollten und wann sie ihr eigenes Element oder Attribut für Sprachangaben definieren sollten.

In XHTML 1.0 bspw. gibt es ein hreflang-Attribut fürs a-Element und auch ein xml:lang-Attribut (bzw. lang für HTML 4.0) für den Inhalt des a-Elements:

<a xml:lang="en" href="xyz" hreflang="de">Click for German</a>

Das xml:lang-Attribut gibt die Sprache innerhalb des a-Elements an („Click for German“), während das hreflang-Attribut Metadaten angibt, in diesem Fall die Sprache eines externen Inhalts außerhalb dieser Webseite.

Antwort

Wann man xml:lang verwenden sollte

Für direkt mit dem XML-Dokument verbundenen Inhalt (der entweder direkt im Dokument enthalten ist oder zu einem Teil des Dokuments wird, wenn dieses verarbeitet oder gerendert wird) sollte man das xml:lang-Attribut zur Angabe der Sprache dieses Inhalts verwenden. xml:lang sollte Inhaltsautoren vorbehalten sein, um jede in ihrem Inhalt vorkommende natürliche Sprache zu kennzeichnen.

xml:lang ist in XML 1.0 als Universalattribut definiert, das zur Angabe der Sprache des Inhalts von beliebigen Elementen verwendet werden kann. Das beinhaltet jeglichen menschenlesbaren Text, aber auch andere Inhalte (bspw. eingefügte Objekte wie Bilder oder Sound-Dateien) in dem Element, für das dieses Attribut gesetzt ist. Der Wert von xml:lang gilt auch für alle Unterelemente des Elements. Er gilt auch für Attributwerte dieses Elements und der Unterelemente. (Die Verwendung natürlicher Sprache in Attributen ist allerdings keine bevorzugte Vorgehensweise.) Der Wert des xml:lang-Attributs ist eine durch BCP 47 definierte Sprachkennzeichnung.

Hier z.B. xml:lang für ein t-Element:

<t xml:lang="de">
   Dies ist ein Text in einem 't'-Element. Es wurde das
   xml:lang-Attribut verwendet, um die Sprache anzugeben,
   damit bspw. die richtige Schriftart zur Darstellung
   oder die richtige Rechtschreibprüfung zur Überprüfung
   des Dokuments verwendet wird. Wenn es xml:lang nicht
   gäbe, würde es Probleme mit eingebettetem Inhalt in
   anderer Sprache geben, wie bspw. <span xml:lang="fr">
   C'est la vie</span>.
</t>

Dieses Beispiel zeigt, wie xml:lang auf ein Attribut wirkt:

<para>Il faut utiliser <abbr title="Simple Object Access Protocol" xml:lang="en">SOAP</abbr></para>

Wann man ein eigenes Element oder Attribut verwenden sollte

Wenn die Sprachangabe ein Attribut oder Metadaten von externem Inhalt ist, dann ist xml:lang nicht geeignet. In diesen Fällen soll Sprachinformation abgelegt werden, wobei sich die Sprache aber nicht direkt auf den Inhalt des XML-Dokuments bezieht (oder eingebundenen Inhalt wie Bilder, die als Teil des Dokuments verarbeitet werden). In diesem Fall sollte man ein Element oder ein Attribut mit einem anderen Namen definieren und nicht das xml:lang-Attribut verwenden. Der Wert des Elements oder Attributs sollte BCP 47 entsprechen, wie bei xml:lang.

Einige Beispiele dafür sind:

Ein eigenes Element (oder Attribut) kreiert man, um die Sprache als Datenwert (als Teil einer Datenstruktur oder als Metadaten über ein externes Dokument) zu vermitteln; nicht, um die Sprache eines speziellen Teils des Dokuments anzugeben. Indem man nicht xml:lang zur Angabe von externen Sprachen verwendet, vermeidet man Probleme für Inhaltsautoren, die auf die Angabe der Sprache des Inhalts zum Zweck der Textverarbeitung angewiesen sind.

Ein XML-Dokument könnte bspw. so aussehen:

<item type="DVD"> 
  <title xml:lang="fr">Cyrano de Bergerac</title>    
  <!-- gibt die Sprache des Filmtitels an -->
  <runningTime value="137" />                        
  <!-- keine Sprache betroffen -->
  <dialogue>en</dialogue>                            
  <!-- gibt die Dialogsprache an -->
  <subtitles track="1" language="zh-Hant" />         
  <!-- diese Spur enthält Untertitel in traditionellem Chinesisch -->
  <subtitles track="2" language="zh-Hans" /> 
</item>

In diesem Beispiel vermittelt das xml:lang-Attribut Informationen über die natürliche Sprache des Texts, der in diesem Dokument vorkommt. Das dialogue-Element und das language-Attribut des subtitles-Elements sind im XML-Dokument-Schema definiert und vermitteln die natürliche Sprache, die mit diesen Elementen verbunden ist. Es vermittelt z.B. die Information, dass die Untertitel auf Spur 1 in traditionellem Chinesisch (zh-Hant) sind.

Übrigens

Es ist wichtig zu bedenken, dass xml:lang einen Geltungsbereich hat: Unterelemente erben das Sprachattribut. Dadurch kann die Sprache für viel Inhalt angegeben werden (ohne redundante Sprachkennzeichnungen für jedes Element). Es ist bspw. empfohlene Vorgensweise, xml:lang für das html-Element am Anfang eines XHTML-Dokuments zu setzen und nur dann erneut zu verwenden, wenn sich die Sprache des Texts ändert. Weitere Informationen gibt der Artikel Sprachkennzeichnungen in HTML und XML.

xml:lang auf ein Attribut anzuwenden ist problematisch, denn man kann nicht:

  1. mehr als eine Sprache im title-Attribut angeben

    <p title="französisch (français)">Bonjour</p>
  2. für das Attribut und für das Element getrennt voneiander verschiedene Sprachen angeben.

    <a title="anglais" href="qa-when-xmllang.en.html" lang="en" xml:lang="en">English</a>

Die drei Schema-Sprachen (XML DTD, XML Schema und RELAX NG) unterscheiden sich darin, ob ein Anwender xml:lang erst definieren muss, bevor er es als Attribut verwendet. Im Einzelnen: