xml:lang w schematach dokumentów XML

Pytania

Kiedy należy stosować xml:lang, a kiedy definiować własny element lub atrybut przekazujący wartość języka w schematach dokumentów XML (DTD)?

Czasami dokumenty zawierają w sobie szereg różnych języków. Czasami język jest przekazywany jako dane lub jako metadata do elementów będących poza dokumentem. Ponieważ zastosownia te posiadają podobny format, dweloperzy schematów często mają problem, czy powinno się zastosować xml:lang, czy zdefiniować własny element lub atrybut odnoszący się do języka.

Na przykład: w XHTML 1.0 istnieje atrybut hreflang w elemencie a oraz xml:lang (lub atrybut lang w przypadku HTML 4.0) dla treści elementu:

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

Atrybut xml:lang opisuje język zawarty w elemencie ("Click for German"), podczas gdy atrybut hreflang jest metadaną, w tym przypadku opisującą język treści, do której prowadzi odnośnik.

Odpowiedź

Kiedy stosować xml:lang

Treść, która jest bezpośrdnio powiązana z dokumentem XML (zawarta w dokumencie lub uważana za część dokumentu po przetworzeniu) powinna używać atrybutu xml:lang określającego język. Atrybut ten powinnien być zarezerwowany do określenia języka treści dostarczanej przez autora.

Atrybut xml:lang jest zdefiniowany przez XML 1.0 jako atrybut używany do określania języka treści elementu HTML, włącznie z tekstem i innym typem treści (np: obrazy i pliki dźwiękowe), który znajduje się w elemencie. Wartość xml:lang odnosi się do podelementów, jak również do atrybutów powiązanych z elementem i podelementami (chociaż stosowanie języka naturalnego w atrybutach nie jest najlepszą praktyką). Wartością atrybutu xml:lang jest znacznik języka zdefiniowany przez RFC 3066 lub wersje późniejsze.

Np.: xml:lang w elemencie t:

<t xml:lang="pl"> 
   Ten tekst jest zawarty w elemencie 't'.Zastosowanie  atrybutu
   xml:lang wskazuje język, po to, żeby np.: zastosować odpowiednią 
   czcionkę lub słownik podczas przeglądania dokumentu. Gdyby nie 
   było atrybutu xml:lang, można mieć problemy z osadzonom treścią 
   taką jak np.: fraza <span xml:lang="fr">C'est la vie</span>, 
   która jest napisana w innym języku. 
</t>

Poniższy przykład pokazuje jak xml:lang jest zastosowany w innym przypadku:

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

Kiedy stosować własny element lub atrybut

Kiedy wartość języka jest atrybutem lub metadaną treści, która jest z poza dokumentu, nie należy stosować xml:lang. W takich przypadkach informacje na temat języka mogą być zachowane w dokumencie, ale informacje te nie odnoszą się do treści samego dokumentu XML (w tym obrazów, które są przetwarzane jako część dokumentu). W takim przypadku należy zdefiniować element lub atrybut inną nazwą, nie stosując atrybutu xml:lang. Wartość elementu lub atrybutu powinna stosować BCP 47 (lub wersje późniejsze) tak jak w przypadku xml:lang.

Oto kilka przykładów:

Powodem, dla którego należy stworzyć własny element (lub atrybut) jest przekazanie języka jako wartości (jako części struktury danych lub metadanych na temat dokumentu zewnętrznego) a nie do określenia języka konkretnego kawałka tekstu. Unikanie użycia xml:lang do opisu wartości dotyczących języka dokumentów zewnętrznych pozwala autorom na uniknięcie problemów związanych z etykietowaniem przetwarzanych treści.

Na przykład: dokument XML może wyglądać następująco:

<item type="DVD"> 
  <title xml:lang="fr">Cyrano de Bergerac</title>    
  <!-- wskazuje na język tytułu filmu -->
  <runningTime value="137" />                        
  <!-- język nie ma znaczenia w tym przypadku -->
  <dialogue>en</dialogue>                            
  <!-- wskazuje na język dialogów -->
  <subtitles track="1" language="zh-Hant" />         
  <!-- pokazuje napisy w chińskim -->
  <subtitles track="2" language="zh-Hans" /> 
</item>

W powyższym przykładzie atrybut the xml:lang przekazuje informacje na temat języka tekstu, który pojawia się w dokumencie. Element dialogue i atrybut language są zdefiniowane w schemacie dokumentów XML i pokazują język odpowiedni dla danych pozycji.

Dodatkowe informacje

Ważnym jest aby pamiętać, że xml:lang ma swój zasięg: elementy niższego rzędu dziedziczą atrybut języka. Można wykorzystać to w wielu przypadkach (bez umieszczania zbędnych znaczników na każdym elemencie). Na przykład: dobrą praktyką jest umieszczanie xml:lang w elemencie html na początku dokumentu XHTML i używać go jedynie wtedy, gdy zmienia się język dokumentu. Więcej informacji na ten temat w artykule: Language tags in HTML and XML.

Stosowanie xml:lang na atrybucie jest problematyczne, ponieważ nie można:

  1. określić więcej niż jednego języka w atrybucie 'title'
    <p title="French (français)">Bonjour</p>
  2. oddzielić języka używanego w atrybucie od języka używanego w elemencie.

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

Proszę zauważyć, że trzy języki schematów (XML DTD, XML Schema oraz RELAX NG) różnią się co do tego, czy użytkownik powinien zdefiniować xml:lang zanim zacznie go stosować jako atrybut. W szczególności: