Языковые тэги в HTML и XML

IANA Language Subtag Registry

Subtag search tool

BCP 47

Целевая аудитория: XHTML/HTML кодеры, веб-программисты (PHP, JSP, и т. д.), разработчики схем (DTDs, XML Schema, RelaxNG, и т. д.), XSLT разработчики, менеджеры веб-проектов, исполнители стандартов и каждый, кому необходимо понимание того, как создавать языковые тэги, используя BCP47.

Обзор

Терминология

В данной статье мы называем значения языкового атрибута такие, как fr-CA языковым тэгом. Части fr и CA называются субтэгами (subtag) в случаях, если они являются частями тэга. Если имеются ввиду элементы списков стран или языков ISO, fr и CA называются кодами.

Языковые тэги используются для обозначения языка текста или других элементов в HTML и XML документах. Используйте lang атрибут для указания языковых тэгов в HTML и xml:lang атрибут для XML

В обоих случаях информация о языке наследуется элементами, дочерними по отношению к тем, в которых находится указанный атрибут, до тех пор, пока в дочернем элементе не будет указан другой язык (таким же образом).

RFC - это то, что IETF называет спецификациями. Каждый RFC имеет уникальный номер. К сожалению, невозможно определить, читая RFC 1766 или RFC 3066, что эти спецификации устарели и заменены другими спецификациями.

Синтаксис языковых тэгов был установлен IETF в BCP 47. BCP означает 'Best Current Practice' (Лучшая практика на сегодня) и яаляется постоянным именем для целой серии RFC, чьё число изменяется по мере их обновления. Последняя RFC, описывающая синтаксис языковых тэгов, это RFC 5646, Tags for the Identification of Languages, она является обновлением RFC 4646, 3066 и 1766.

Раньше вам нужно было искать субтэги обращаясь к спискам кодов различных ISO стандартов, но сегодня вы можете найти все субтэги в IANA Language Subtag Registry. Мы опишем новый реестр ниже.

Примечание! Если вам нужно пошаговое руководство по выбору языкового тэга, вам следует читать Выбор языкового тэга. Здесь далее следует обзор более продвинутого уровня синтаксиса и концепций, относящихся к языковым тэгам, как описано в BCP 47.

Большинство языковых тэгов состоят из двух- или трёхбуквенного субтэга. Часто за ним следует субтэг региона, состоящий из двух букв или трёх цифр. RFC 5646 также разрешает использование ещё нескольких субтэгов, если это необходимо. Это будет кратко рассмотрено в следующем разделе, в том числе диалект, написание, вариант языка, расширение и частное использование субтэгов.

Золотое правило при создании языкового тэга заключается в том, чтобы держать тэги, как можно более короткими. Избегайте региона, написания или других субтэгов, если они не предоставляют полезную и необходимую информацию. Например, используйте ja для японского, а не ja-JP, до тех пор, пока нет определенной причины указать, что это японский, используемый в Японии, а не где-то ещё.

Примеры:

Код Язык Субтэги (subtag)
en английский язык
mas масаи язык
fr-CA канадский французский язык + регион
es-419 испанский, используемый в Латинской Америке язык + регион
zh-Hans китайский, использующий упрощенное написание язык + написание

HTML и XML также предоставляют возможность предотвратить наследование языка использованием пустой строки, то есть xml:lang="". По сути, это говорит: "Я не хочу ассоциировать какой-либо язык с этой информацией".

В оставшейся части этой статьи содержатся дополнительные сведения о том, как создавать языковые теги.

Создание языковых тэгов

Некоторые из ключевых разниц между RFC 5646 и более ранними спецификациями, такими, как RFC 3066:

  1. есть только одно место поиска валидных субтэгов - новый IANA registry
  2. субтэги имеют фиксированную позицию и длину, что делает более простым сопоставление языковых тэгов
  3. теперь есть больше гибкости вокруг потенциальных компонентов языкового тэга.

RFC 3066 по существу позволял вам составлять языковые теги, которые были либо кодом языка, либо кодом языка и кодом страны, либо одним из небольшого числа специально зарегистрированных значений в IANA language tag registry.

RFC 5646 обслуживает больше типов субтэгов и позволяет комбинировать их различными способами. Хотя может показаться, что это усложняет жизнь, но по факту выбор языковых тэгов остаётся таким же простым, однако, если вам нужны дополнительные мощности, то это будет доступно вам. Фактически, для большинства людей RFC 5646 должен сделать жизнь проще несколькими способами - например, есть только одно место, где вам нужно искать валидные субтэги.

Хотя RFC 5646 предоставляет дополнительные возможности для создания языковых вариаций, он также охватывает все тэги, которые были валидными ранее. Так, что если вы использовали RFC 1766, RFC 3066 или RFC 4646 нет необходимости вносить какие-либо изменения в ваши тэги.

Список ниже демонстрирует различные типы субтэгов, которые доступны. Мы рассмотрим, как они работают в следующих разделах.

language-extlang-script-region-variant-extension-privateuse

Язык, диалект, письменность, регион, вариант, расширение, частное использование.

Записи в реестре следуют определенным соглашениям в отношении верхнего и нижнего регистра букв. Например, языковые тэги в нижнем регистре, буквенные субтэги региона - в верхнем, тэги написания начинаются с заглавной буквы. Это только договоренность! Когда вы используете эти субтэги вы вольны делать это, как вам нравится, до тех пор, пока вы не ограничены правилами системы, с которой работаете. В языковой разметке HTML и XML регистр не важен.

Использование субтэгов (subtag) реестра

Как отмечено выше, раньше вам приходилось обращаться к различным ISO стандартам для поиска субтэгов, но сегодня вы можете найти все субтэги в одном месте. Реестр IANA registry поначалу выглядит сложным в сравнении со списками ISO кодов, но он достаточно прост, как только вы поймёте его структуру.

Реестр это длинный текстовый файл. Для поиска языкового субтэга, ищите по названию языка на английском. Если мы ищем 'French' (французский), мы найдём такую запись:

%%
Type: language
Subtag: fr
Description: French
Added: 2005-10-16
Suppress-Script: Latn
%%

Заметьте, что тип этой записи language. То, что мы ищем, это код с меткой Subtag, который имеет значение fr.

Таким же образом вы можете искать другие тэги. Например, чтобы найти тэг fr-CA (канадский французский), вам необходимо искать Canada (Канада), и убедиться, что вы нашли тэг типа region (регион).

Однако есть несколько дополнительных вещей, которые нужно учитывать при выборе субтэгов. К примеру, вам следует избегать субтэгов, которые описаны в реестре, как избыточные или устаревшие, также вам необходимо использовать субтэги вариантов в сочетании с другими определенными субтэгами. Для получения большей информации о выборе субтэгов, читайте Выбор языкового тэга.

Есть также неофициальная удобная утилита для поиска по реестру.

Следующий раздел предоставит вам больше информации о конкретных субтэгах.

Субтэг основного языка

Субтэги языка

en
ast

Читайте подробнее в BCP 47:

2.2.1 Primary Language Subtag

4.1 Choice of Language Tag

4.1.1 Tagging Encompassed Languages

Все языковые тэги должны начинаться с субтэга основного языка.

Примеры простых языковых тэгов включают:

  • en (английский)
  • ast (астурийский - в ISO списках нет двухбуквенного кода для астурийского)

Эти коды взяты из ISO 639 и поддерживаются актуальными.

Из-за того, что RFC 3066 не предоставлял список валидных субтэгов, а просто ссылался на ISO 639, есть некоторая путаница в том, как поступать, если список ISO кодов содержит и двух- и трёхбуквенный код (а иногда и более, чем трёхбуквенный). Сегодня все валидные субтэги перечислены в едином реестре IANA registry, который принимает только одно значение из ISO списков для каждого языка. Если двухбуквенный ISO код доступен, то только он один будет в реестре. Иначе - только трёхбуквенный код. Это сделано для упрощения.

Когда RFC 5646 был опубликован, свыше 7,000 новых ISO 639-3 трёхбуквенных кодов были добавлены в Subtag Registry.

Это пример основного субтэга основного языка для испанского es в реестре:

%%
Type: language
Subtag: es
Description: Spanish
Description: Castilian
Added: 2005-10-16
Suppress-Script: Latn
%%

Хотя коды регистронезависимы, они обычно пишутся в нижнем регистре, но это просто соглашение.

Субтэг диалекта

Субтэги диалекта

zh-yue
ar-afb

Читайте подробнее в BCP 47:

2.2.2 Extended Language Subtags

4.1.2 Using Extended Language Subtags

Мы будем ссылаться на субтэги диалектов, как extlang. Субтэг extlang всегда должен идти после субтэга основного языка, он должен быть единственным и идти до всех других субтэгов.

Примеры языковых тэгов, включающих субтэги диалектов:

  • zh-yue (кантонский диалект китайского)
  • ar-afb (арабский диалект Персидского залива)

Комбинация язык + диалект предоставлена для отображения устаревших форм языковых тегов, однако, есть единый субтэг для каждой комбинации языка + диалекта. Следует использовать этот языковой субтэг вместо сочетания языка и диалекта там, где это возможно. Например, используйте yue, а не zh-yue для кантонского диалекта, и afb вместо ar-afb для арабского диалекта Персидского залива.

Субтэги диалекта вседа состоят из 3 букв. Каждая extlang запись в реестре содержит поле Prefix которая определяет язык, идущий перед субтэгом диалекта. Записи также включают поле Preferred-Value которое обозначает эквивалентный языковой тэг.

Это пример кода для арабского диалекта Персидского залива, afb, в реестре:

%%
Type: extlang
Subtag: afb
Description: Gulf Arabic
Added: 2009-07-29
Preferred-Value: afb
Prefix: ar Macrolanguage: ar
%%
			

Языковые ветви Субтэги основных языков, которые используются совместно с субтэгами диалекта также известны, как языковые ветви, и охватывают несколько языков, уточненных диалектными субтэгами. Субтэг языковой ветви может быть использован сам по себе, но без какого-либо соглашения о контексте его использования он не обязательно точен в достаточной степени.

Например, zh означает китайский, но этот код охватывает множество китайских диалектов, зачастую взаимонепонятных. Когда zh используется сам по себе, то это обычно используется для обозначения преобладающего языка в охватываемом диапазоне, хотя это явно не указано в BCP 47. Например, условно считается, что zh обозначает преобладающую форму китайского языка - путунхуа (Mandarin). Там, где нужна абсолютная точность, используйте cmn, если это не нарушает функциональную совместимость. Однако, если вы используете zh для представления языка, который не является путунхуа, например, диалект Хакка, то лучше использовать более конкретный код (в данном случае, hak).

С другой стороны, zh-Hans в общем смысле использует zh. Это удобный способ описать письменность упрощенного китайского, так как китайский использует одинаковую письменность вне зависимости он диалекта читателя.

Субтэг письменности

Субтэги письменности

zh-Hans
az-Latn

Читайте подробнее в BCP 47:

2.2.3 Script Subtag

4.1 Choice of Language Tag

Примеры языковых тэгов, включающих в себя субтэги письменности:

  • zh-Hans (упрощенный китайский)
  • az-Latn (азербайджанский, записанный латиницей - так как азербайджанский может быть записан и на основе арабского письма)

Субтэг письменности был впервые представлен в RFC 4646. Субтэги были взяты из списка кодов ISO 15924 и поддерживаются соответственно ему.

В языковом тэге может быть только один субтэг письменности, и он должен следовать сразу же за субтэгом языка или диалекта. Он всегда состоит из 4 букв.

Следует использовать субтэг письменности только тогда, когда необходимо подчеркнуть это различие. Как писал соавтор RFC 4646 Эддисон Филлипс: "Для практически любого контента, который не использует субтэг письменности сегодня, остается лучшей практикой не использовать его и в будущем".

Если вы специально хотите указать, что контент не является письменным, то для этого есть специальный субтэг. Например, вы можете использовать en-Zxxx чтобы обозначить, что англоязычная аудиозапись не является письменным контентом.

В общем-то многие записи субтэгов в реестре не рекомендуют использовать тэги письменности, указывая поле Suppress script. Подобное поле есть в примере с испанским выше, которое означает, что обычно испанский записывается латиницей и, что субтэг Latn, как правило не должен быть указан после тэга es.

Это пример записи реестра для кириллической записи, Cyrl, которую использует, например, русский язык:

%%
Type: script
Subtag: Cyrl
Description: Cyrillic
Added: 2005-10-16
%%

Хотя в целом, маловероятно, что вам нужно будет указывать письменность при использовании языковых тэгов, есть одна или две ситуации о которых нужно знать. Одним из подобных примеров является китайский язык. Существует множество китайских диалектов, часто взаимно непонятных носителям, но все эти диалекты записаны либо с помощью упрощенного китайского письма, либо с помощью традиционного. Люди обычно хотят обозначить, то текст является упрощенным либо традиционным, но, до недавлего времени не было способа сделать это. Люди выли вынуждены использовать что-то вроде zh-CN (обозначающее китайский, используемый в Китае) для указания упрощенного китайского даже в Сингапуре, и zh-TW (обозначающее китайский, используемый на Тайване) для традиционного китайского. (Другие люди, также используют zh-HK для традиционного китайского). Доступность zh-Hans и zh-Hant для письменного китайского в упрощенном и традиционном виде должно улучшить согласованность и точность, и уже сегодня это широко применяется, хотя, конечно, вы можете использовать и старые тэги в каких-то случаях для совместимости.

Субтэг региона

Субтэги регионов

en-GB
es-005
zh-Hant-HK

Читайте подробнее в BCP 47:

2.2.4 Region Subtag

4.1 Choice of Language Tag

Примеры языковых тэгов, включающих субтэги региона:

  • en-GB (британский английский)
  • es-005 (южно-американский испанский)
  • zh-Hant-HK (традиционный китайский Гонконга)

Субтэг региона RFC 3066 получил свои значения из ISO 3166 кодов стран. Эти двухбуквенные коды до сих пор доступны в новом реестре, но реестр также перечисляет списки UN M.49 кодов регионов, из 3 цифр. Преимущество этих кодов в том, что они представляют нечто большее, чем просто страны. Например, группы переводчиков одно время хотели объявить свои аккуратно созданные переводы, как испанский Латинской Америки, а не Испании или какой-либо конкретной страны. С RFC 5646 это возможно; подходящий языковой тэг - es-419.

В языковом тэге может быть только один субтэг региона, и он должен идти после субтэга языка, диалекта и письменности. Это двухбуквенный код, или состоящий из 3 цифр. Вы можете подставлять тэг региона сразу за языковым субтэгом, например en-US.

И снова, вы должны использовать субтэг региона, только там, где необходимо обозначить это различие. До тех пор, пока вам не нужно указывать, что речь идет именно об итальянском, на котором говорят именно в Италии, используйте тэг it для итальянского, а не it-IT. Это же справедливо для всех других комбинаций.

Это примеры из реестра, демонстрирующие коды для Австрии, AT, и Северной Африки, 015:

%%
Type: region
Subtag: AT
Description: Austria
Added: 2005-10-16
%%
Type: region
Subtag: 015
Description: Northern Africa
Added: 2005-10-16
%%

Субтэги вариантов

Субтэги вариантов

sl-nedis
sl-IT-nedis
de-CH-1901

Читайте подробнее в BCP 47:

2.2.5 Variant Subtags

4.1 Choice of Language Tag

Значения субтэгов вариантов используются для объявления диалектов или вариаций письменности, которые еще не охвачены комбинациями субтэгов языка, письменности и региона. Субтэг варианта должен появляться после субтэгов языка, письменности или региона, при этом субтэги письменности и региона являются необязательными.

Маловероятно, что вам потребуется использовать субтэги вариантов, если только вы не работаете в специализированной сфере.

TСледующие примеры помогут вам понять, что делаеют субтэги вариантов.

  • sl-nedis (надижский диалект словенского языка)
  • sl-rozaj (рожанский диалект словенского языка)
  • sl-IT-nedis (определенный вариант надижского диалекта словенского языка, используемый в Италии)
  • de-CH-1901 (вариант немецкой орфографии времён реформы 1901 года, как указано, в Швейцарии)

Это пример из реестра, демонстрирующий код для надижского диалекта словенского языка, nedis:

%%
Type: variant
Subtag: nedis
Description: Natisone dialect
Description: Nadiza dialect
Added: 2005-10-16
Prefix: sl
%%

В реестре эти субтэги связаны с конкретными языками (и вероятно, дополнительными субтэгами, расположенными между ними и субтэгами основного языка) с помощью поля 'Prefix'. Пример с nedis, показанный выше, должен быть использован только для словенского языка.

Если вам нужно выразить конкретный диалект или особенность письменности, которая в данный момент недоступна, вам следует предложить субтэг или субтэги варианта для включения в реестр, используя процедуру регистрации исложенную в RFC 5646.

Субтэги расширения и частного использования

Субтэги расширений

de-DE-u-co-phonebk

Субтэги частного использования

en-US-x-twain

Читайте подробнее в BCP 47:

2.2.7 Private Use Subtags

2.2.6 Extension Subtags

4.1 Choice of Language Tag

Если вы чувствуете, что вам действительно необходимо использовать эти субтэги, то вам лучше обратиться к спецификации, а не к данной статье.

Субтэги расширения и частного использования представлены однобуквенным тэгом или 'синглтоном'. Организация может предложить синглтон для расширения. Его предполагаемое использование должно быть описано в RFC (спецификация IETF). Синглтон добавляется в реестр после успешного прохождения ревью. Синглтон x зарезервирован для частного использования. Допускается множество субтэгов после синглона, но они все должны быть длиной 8 символов и меньше.

Расширения субтитров позволяют расширять языковой тэг. Например, субтэг расширения u зарегистрирован организацией Unicode Consortium для добавления информации о поведении языка или локали. Многие идентификаторы локали требуют дополнительных "настроек" или опций для конкретных значений внутри языка, культуры, региона или других вариантов. Это расширение предоставляет механизм для использования дополнительных настроек языковых тэгов для общей подстановки.

Например, следуюющее указывает на то, что порядок сортировки "телефонная книга" должен быть использован приложением, что отсортированные данные в этом документе отсортированы в соответствии с этой сортировкой.

  • de-DE-u-co-phonebk

Расширение u- определено в RFC 6067, который ссылается на Unicode Consortium's Common Locale Data Repository (CLDR). Оно не определено в BCP 47.

Субтэги частного использования отсутствуют в реестре субтэгов, они выбираются и поддерживаются по частному соглашению между сторонами.

Поскольку эти субтэги имеют смысл только в частных соглашениях и не могут использоваться повсеместно в Интернете, следует использовать их с большой осторожностью и избегать, когда это возможно.

Следующий пример может быть использован для американского английского, но только в рамках закрытого сообщества. За пределами этого частного соглашения нельзя полагаться на его смысл.

  • en-US-x-twain

Устаревшие и избыточные субтэги

Читайте подробнее в BCP 47:

2.2.8 Grandfathered and Redundant Registrations

Устаревшие тэги - это особный случай, предоставленный для обратной совместимости. Это субтэги, зарегистрированные до RFC 4646, которые не могут быть полностью составлены из субтэгов текущего реестра или не следуют синтаксису, определённому для языковых тэгов.

Избыточные тэги - это тэги собранные из последовательности субтэгов, и зарегистрированные до RFC 4646, которые могут быть собраны из отдельных субтэгов текущего реестра. Они остаются в реестре по большей части по причине 'исторического интереса'.

Многие устаревшие тэги были заменены в реестре субтэгами или комбинациями субтэгов. Такие устаревшие тэги обычно содержат поле Preferred-Value, которое указывает на то, что вам лучше было бы использовать именно это значение. Например, следующий пример устаревшего тэга показвает, что лучше использовать субтэг языка jbo вместо art-lojban.

%%
Type: grandfathered 
Tag: art-lojban 
Description: Lojban 
Added: 2001-11-11 
Deprecated: 2003-09-02 
Preferred-Value: jbo 
%%

Сопоставление языковых тэгов

Сопоставление различных языковых тэгов важно для множества приложений. В соответствии с BCP 47 en может быть использован для совпадения с en-GB. Например, следующий css-код окрашивает весь английский текст в красный в браузерах, поддерживающих псевдо-атрибут :lang.

:lang(en) { color: red; }

В следующем коде текст, объявленный, как lang="en-GB", будет красным.

<p>En janvier, toutes les boutiques de Londres affichent des panneaux 
<span lang="en-GB">SALE</span>, mais en fait ces magasins sont bien propres!</p>

С другой стороны, при следующем css:

:lang(en-GB) { color: red; }

слово 'SALE' не будет красным.

<p>En janvier, toutes les boutiques de Londres affichent des panneaux 
<span lang="en">SALE</span>, mais en fait ces magasins sont bien propres!</p>

При наличии дополнительных тэгов RFC 5646, сопоставление становится слегка более сложным. Кроме того, его компаньон, RFC 4647 Matching of Language Tags описывает более, чем один подход к сопоставлению тэгов. Сопоставление будет описано более подробно в одной из следующих статей.

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

Языковые тэги для HTML были впервые формально определены в RFC 2070 Ф. Йерджо и другими: Internationalization of the Hypertext Markup Language. RFC 2070 был включён в HTML 4 и реклассифицирован как исторический.

Обратите внимание, что были внесены изменения в коды языков ISO. В 1989 iw, in и ji были удалены и заменены на he, id и yi. Более новый ISO код страны cs, используемый для Чехословакии, стал использоваться для отображения Сербии и Черногории. Подобные изменения могут привести к путанице при чтении кодов через длительные промежутки времени. Новый IANA subtag registry позволяет тэгам быть устаревшими и заменёнными новыми тэгами, но он никогда не удалит или изменит значение субтэга. Ожидается, что списки ISO также будут следовать подобным правилам в будущем.

Многие другие W3C и связанные с Интернетом спецификации используют языковые тэги:

Обратите также внимание на то, что языковая информация может быть присоединена к таким объектам, как изображения и вложенные аудио-файлы.