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.
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 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.
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:
<p title="French (français)">Bonjour</p>
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:
XML DTDs wymagają, aby każdy element używający xml:lang
jako atrybutu był deklarowany w DTD
XML Schema wymaga aby deklarować i importować xml namespace zanim użyje się xml:lang
(i inne wartości xml namespace)
RELAX NG deklaruje xml namespace, jak w XML, co sprawaia, że dodatkowa deklaracja jest niepotrzebna.
BCP 47, Tags for the Identifying Languages Specifies how to use language tags in xml:lang
values.
Language tags in HTML and XML Describes how to use language tags.
Related links, Authoring XML