xml:lang в схемах XML документа

Вопрос

Когда следует использовать xml:lang и когда нужно определить свой ​​собственный элемент или атрибут для передачи языковых значений в схему XML документа (DTD)?

Иногда документы содержат или включают различные типы естественного речевого контента. В других случаях они необходимы для хранения значения естественного языка в качестве внешних по отношению к документу данных или meta данных. Так как различные приложения используют аналогичные форматы, дизайнеры схем иногда путают, когда они должны использовать xml:lang а, когда определять свой ​​собственный связанный с языком элемент или атрибут.

Например, в XHTML 1.0 есть атрибут hreflang в element a (элементе) и также xml:lang (или lang атрибут, в случае с HTML 4.0) для контента element (елемента) a:

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

Атрибут xml:lang описывает язык, который содержится в element (элементе) a ("Click for German"), в то время как атрибут hreflang это meta данные, в этом случае описывает язык некоторого внешнего по отношению к этой Веб странице контента.

Ответ

Когда использовать xml:lang

Контент, непосредственно связанный с XML документом (или содержится непосредственно в документе или рассматривается как часть документа когда он обрабатывается или предоставляется) должен использовать атрибут xml:lang для указания языка контента. xml:lang имеет резервироваться для авторов контента для непосредственного обозначения любого естественного речевого контента, что они могут иметь.

xml:lang определяется в XML 1.0 как общий атрибут, который может использоваться для определения языка любого контента element (елемента). Сюда включается как текст, который можно прочитать, так и другой контент (такой как встроенные объекты, такие как изображения и звуковые файлы), содержащийся в element (элементе) в котором он появился. Значение xml:lang применяется к любым sub-elements, содержащихся в element (элементе). Это также применяется к значениям атрибута, которые связаны с element и sub-elements (Хотя использование естественного языка в атрибутах это не лучшая идея). Значение атрибута xml:lang - это language тэг, который определяется в BCP 47.

Например, вот xml:lang в element (элементе) t:

<t xml:lang="en"> 
   This is some text contained by the 't' element. The use
   of the xml:lang attribute indicates the language so that, for
   example, the correct font could be applied when rendered or
   the correct spell-checker could be used when proofing the
   document. If we didn't have xml:lang, we might have problems
   with embedded content, such as the phrase <span xml:lang="fr">
   C'est la vie</span>, which is in another language.
</t>

Этот пример показывает, как xml:lang применяется к атрибуту:

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

Когда следует использовать свой ​​собственный element (элемент) или attribute (атрибут)

Когда значение языка - на самом деле является атрибутом или meta данными для некоторого внешнего контента, тогда xml:lang не следует использовать. В этих случаях вы хотите сохранить информацию о языке, но язык непосредственно не относится к содержанию XML документа (или содержит такой контент, как изображения, которые обрабатываются как часть документа). В этом случае вы должны определить элемент или атрибут используя другое название и не следует использовать атрибут xml:lang. Для выбора значения элемента или атрибута следует использовать BCP 47, так же, как для xml:lang.

Некоторые примеры этого могут включать в себя:

Вам следует создать ваш собственный element (элемент) (или attribute (атрибут)) тогда, когда есть необходимость передать значение языка (как часть структуры данных или как meta данные для внешнего документа), а не чтобы указать язык конкретной части контента. Не используйте xml:lang для описания значений внешне языка - это позволит избежать создания проблем для авторов контента, которым необходимо отмечать контент для обработки текстов.

Например, документ XML может выглядеть так:

<item type="DVD"> 
  <title xml:lang="fr">Cyrano de Bergerac</title>    
  <!-- indicates the language of the film title -->
  <runningTime value="137" />                        
  <!-- not language affected -->
  <dialogue>en</dialogue>                            
  <!-- indicates the language of the dialogue -->
  <subtitles track="1" language="zh-Hant" />         
  <!-- this track contains Traditional Chinese subtitles -->
  <subtitles track="2" language="zh-Hans" /> 
</item>

В этом примере атрибут xml:lang передает информацию о естественном языке текста, который появляется в этом документе. Элемент dialogue (диалог) и атрибут language (язык) элемента subtitles (подзаголовки) определены в схеме XML документа и передают значение естественного языка, который с ними связан. Например, он передает информацию, с subtitles (подзаголовки), что написанные на Track (запись) #1 или показанные на Традиционном Китайском языке (zh-Hant).

Кстати говоря

Важно помнить, что xml:lang обладает свойством: элементы более низкого уровня наследуют language attribute (речевой атрибут). Это можно использовать для того, чтобы определить язык для большинства контента (без redundant (избыточных) language тэгов для каждого element (элемента)). Например, это хорошая идея, чтобы разместить xml:lang в свой html element (елемент) в начале своего XHTML документа и использовать его только там где меняется язык текста. Дополнительную информацию смотрите в статье Language тэги в HTML и XML.

Проблематичным является приминення xml:lang к атрибуту - нет никакого способа, чтобы:

  1. определить более чем один язык в title attribute (атрибуте заголовка)

    <p title="French (français)">Bonjour</p>
  2. отделять язык, используемый в attribute (атрибуте) от того, что используется в element (элемент).

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

Обратите внимание, что три языка схем (XML DTD, XML Schema, и RELAX NG) отличаются по вопросу: должен ли пользователь определить xml:lang перед использованием его в качестве attribute (атрибута)? Особенно: