Терминология
В данной статье мы называем значения языкового атрибута такие, как 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. Мы опишем новый реестр ниже.
Большинство языковых тэгов состоят из двух- или трёхбуквенного субтэга. Часто за ним следует субтэг региона, состоящий из двух букв или трёх цифр. RFC 5646 также разрешает использование ещё нескольких субтэгов, если это необходимо. Это будет кратко рассмотрено в следующем разделе, в том числе диалект, написание, вариант языка, расширение и частное использование субтэгов.
Золотое правило при создании языкового тэга заключается в том, чтобы держать тэги, как можно более короткими.
Избегайте региона, написания или других субтэгов, если они не предоставляют полезную и необходимую информацию. Например, используйте ja
для японского, а не ja-JP
,
до тех пор, пока нет определенной причины указать, что это японский, используемый в Японии, а не где-то ещё.
Примеры:
Код | Язык | Субтэги (subtag) |
---|---|---|
en |
английский | язык |
mas |
масаи | язык |
fr-CA |
канадский французский | язык + регион |
es-419 |
испанский, используемый в Латинской Америке | язык + регион |
zh-Hans |
китайский, использующий упрощенное написание | язык + написание |
HTML и XML также предоставляют возможность предотвратить наследование языка использованием пустой строки, то есть xml:lang="".
По сути, это говорит: "Я не хочу ассоциировать какой-либо язык с этой информацией".
В оставшейся части этой статьи содержатся дополнительные сведения о том, как создавать языковые теги.
Некоторые из ключевых разниц между RFC 5646 и более ранними спецификациями, такими, как RFC 3066:
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 регистр не важен.
Как отмечено выше, раньше вам приходилось обращаться к различным ISO стандартам для поиска субтэгов, но сегодня вы можете найти все субтэги в одном месте. Реестр IANA registry поначалу выглядит сложным в сравнении со списками ISO кодов, но он достаточно прост, как только вы поймёте его структуру.
Реестр это длинный текстовый файл. Для поиска языкового субтэга, ищите по названию языка на английском. Если мы ищем 'French' (французский), мы найдём такую запись:
Заметьте, что тип этой записи language
. То, что мы ищем, это код с меткой Subtag
, который имеет значение fr
.
Таким же образом вы можете искать другие тэги. Например, чтобы найти тэг fr-CA
(канадский французский), вам необходимо искать Canada
(Канада), и убедиться, что вы нашли тэг типа region
(регион).
Однако есть несколько дополнительных вещей, которые нужно учитывать при выборе субтэгов. К примеру, вам следует избегать субтэгов, которые описаны в реестре, как избыточные или устаревшие, также вам необходимо использовать субтэги вариантов в сочетании с другими определенными субтэгами. Для получения большей информации о выборе субтэгов, читайте Выбор языкового тэга.
Есть также неофициальная удобная утилита для поиска по реестру.
Следующий раздел предоставит вам больше информации о конкретных субтэгах.
Субтэги языка
en
ast
Читайте подробнее в BCP 47:
Все языковые тэги должны начинаться с субтэга основного языка.
Примеры простых языковых тэгов включают:
en
(английский)ast
(астурийский - в ISO списках нет двухбуквенного кода для астурийского)Эти коды взяты из ISO 639 и поддерживаются актуальными.
Из-за того, что RFC 3066 не предоставлял список валидных субтэгов, а просто ссылался на ISO 639, есть некоторая путаница в том, как поступать, если список ISO кодов содержит и двух- и трёхбуквенный код (а иногда и более, чем трёхбуквенный). Сегодня все валидные субтэги перечислены в едином реестре IANA registry, который принимает только одно значение из ISO списков для каждого языка. Если двухбуквенный ISO код доступен, то только он один будет в реестре. Иначе - только трёхбуквенный код. Это сделано для упрощения.
Когда RFC 5646 был опубликован, свыше 7,000 новых ISO 639-3 трёхбуквенных кодов были добавлены в Subtag Registry.
Это пример основного субтэга основного языка для испанского es
в реестре:
Хотя коды регистронезависимы, они обычно пишутся в нижнем регистре, но это просто соглашение.
Мы будем ссылаться на субтэги диалектов, как extlang. Субтэг extlang
всегда должен идти после субтэга основного языка, он должен быть единственным и идти до всех других субтэгов.
Примеры языковых тэгов, включающих субтэги диалектов:
zh-yue
(кантонский диалект китайского)ar-afb
(арабский диалект Персидского залива)Комбинация язык + диалект предоставлена для отображения устаревших форм языковых тегов, однако, есть единый субтэг для каждой комбинации языка + диалекта. Следует использовать этот языковой субтэг вместо сочетания языка и диалекта там, где это возможно.
Например, используйте yue
, а не zh-yue
для кантонского диалекта, и afb
вместо ar-afb
для арабского диалекта Персидского залива.
Субтэги диалекта вседа состоят из 3 букв. Каждая extlang
запись в реестре содержит поле Prefix
которая определяет язык, идущий перед субтэгом диалекта. Записи также включают поле Preferred-Value
которое обозначает эквивалентный языковой тэг.
Это пример кода для арабского диалекта Персидского залива, afb
, в реестре:
Языковые ветви Субтэги основных языков, которые используются совместно с субтэгами диалекта также известны, как языковые ветви, и охватывают несколько языков, уточненных диалектными субтэгами. Субтэг языковой ветви может быть использован сам по себе, но без какого-либо соглашения о контексте его использования он не обязательно точен в достаточной степени.
Например, zh
означает китайский, но этот код охватывает множество китайских диалектов, зачастую взаимонепонятных. Когда zh
используется сам по себе, то это обычно используется для обозначения преобладающего языка в охватываемом диапазоне, хотя это явно не указано в BCP 47.
Например, условно считается, что zh
обозначает преобладающую форму китайского языка - путунхуа (Mandarin). Там, где нужна абсолютная точность, используйте cmn
, если это не нарушает функциональную совместимость. Однако, если вы используете zh
для представления языка, который не является путунхуа, например, диалект Хакка, то лучше использовать более конкретный код (в данном случае, hak
).
С другой стороны, zh-Hans
в общем смысле использует zh
. Это удобный способ описать письменность упрощенного китайского, так как китайский использует одинаковую письменность вне зависимости он диалекта читателя.
Субтэги письменности
zh-Hans
az-Latn
Читайте подробнее в BCP 47:
Примеры языковых тэгов, включающих в себя субтэги письменности:
zh-Hans
(упрощенный китайский)az-Latn
(азербайджанский, записанный латиницей - так как азербайджанский может быть записан и на основе арабского письма)Субтэг письменности был впервые представлен в RFC 4646. Субтэги были взяты из списка кодов ISO 15924 и поддерживаются соответственно ему.
В языковом тэге может быть только один субтэг письменности, и он должен следовать сразу же за субтэгом языка или диалекта. Он всегда состоит из 4 букв.
Следует использовать субтэг письменности только тогда, когда необходимо подчеркнуть это различие. Как писал соавтор RFC 4646 Эддисон Филлипс: "Для практически любого контента, который не использует субтэг письменности сегодня, остается лучшей практикой не использовать его и в будущем".
Если вы специально хотите указать, что контент не является письменным, то для этого есть специальный субтэг. Например, вы можете использовать en-Zxxx
чтобы обозначить, что англоязычная аудиозапись не является письменным контентом.
В общем-то многие записи субтэгов в реестре не рекомендуют использовать тэги письменности, указывая поле Suppress script
. Подобное поле есть в примере с испанским выше, которое означает, что обычно испанский записывается латиницей и, что субтэг Latn
, как правило не должен быть указан после тэга es
.
Это пример записи реестра для кириллической записи, Cyrl
, которую использует, например, русский язык:
Хотя в целом, маловероятно, что вам нужно будет указывать письменность при использовании языковых тэгов, есть одна или две ситуации о которых нужно знать. Одним из подобных примеров является китайский язык.
Существует множество китайских диалектов, часто взаимно непонятных носителям, но все эти диалекты записаны либо с помощью упрощенного китайского письма, либо с помощью традиционного.
Люди обычно хотят обозначить, то текст является упрощенным либо традиционным, но, до недавлего времени не было способа сделать это.
Люди выли вынуждены использовать что-то вроде zh-CN
(обозначающее китайский, используемый в Китае)
для указания упрощенного китайского даже в Сингапуре, и zh-TW
(обозначающее китайский, используемый на Тайване) для традиционного китайского. (Другие люди, также используют zh-HK
для традиционного китайского). Доступность zh-Hans
и zh-Hant
для письменного китайского в упрощенном и традиционном виде должно улучшить
согласованность и точность, и уже сегодня это широко применяется, хотя, конечно, вы можете использовать и старые тэги в каких-то случаях для совместимости.
Субтэги регионов
en-GB
es-005
zh-Hant-HK
Читайте подробнее в BCP 47:
Примеры языковых тэгов, включающих субтэги региона:
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
:
Субтэги вариантов
sl-nedis
sl-IT-nedis
de-CH-1901
Читайте подробнее в BCP 47:
Значения субтэгов вариантов используются для объявления диалектов или вариаций письменности, которые еще не охвачены комбинациями субтэгов языка, письменности и региона. Субтэг варианта должен появляться после субтэгов языка, письменности или региона, при этом субтэги письменности и региона являются необязательными.
Маловероятно, что вам потребуется использовать субтэги вариантов, если только вы не работаете в специализированной сфере.
TСледующие примеры помогут вам понять, что делаеют субтэги вариантов.
sl-nedis
(надижский диалект словенского языка)sl-rozaj
(рожанский диалект словенского языка)sl-IT-nedis
(определенный вариант надижского диалекта словенского языка, используемый в Италии)de-CH-1901
(вариант немецкой орфографии времён реформы 1901 года, как указано, в Швейцарии)Это пример из реестра, демонстрирующий код для надижского диалекта словенского языка, nedis
:
В реестре эти субтэги связаны с конкретными языками (и вероятно, дополнительными субтэгами, расположенными между ними и субтэгами основного языка) с помощью поля 'Prefix'.
Пример с nedis
, показанный выше, должен быть использован только для словенского языка.
Если вам нужно выразить конкретный диалект или особенность письменности, которая в данный момент недоступна, вам следует предложить субтэг или субтэги варианта для включения в реестр, используя процедуру регистрации исложенную в RFC 5646.
Субтэги расширений
de-DE-u-co-phonebk
Субтэги частного использования
en-US-x-twain
Читайте подробнее в BCP 47:
Если вы чувствуете, что вам действительно необходимо использовать эти субтэги, то вам лучше обратиться к спецификации, а не к данной статье.
Субтэги расширения и частного использования представлены однобуквенным тэгом или 'синглтоном'. Организация может предложить синглтон для расширения. Его предполагаемое использование должно быть описано в 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:
Устаревшие тэги - это особный случай, предоставленный для обратной совместимости. Это субтэги, зарегистрированные до RFC 4646, которые не могут быть полностью составлены из субтэгов текущего реестра или не следуют синтаксису, определённому для языковых тэгов.
Избыточные тэги - это тэги собранные из последовательности субтэгов, и зарегистрированные до RFC 4646, которые могут быть собраны из отдельных субтэгов текущего реестра. Они остаются в реестре по большей части по причине 'исторического интереса'.
Многие устаревшие тэги были заменены в реестре субтэгами или комбинациями субтэгов. Такие устаревшие тэги обычно содержат поле Preferred-Value
, которое указывает на то, что вам лучше было бы использовать именно это значение. Например, следующий пример устаревшего тэга показвает, что лучше использовать субтэг языка jbo
вместо art-lojban
.
Сопоставление различных языковых тэгов важно для множества приложений. В соответствии с 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 и связанные с Интернетом спецификации используют языковые тэги:
lang
, атрибуте XML xml:lang
, а также в hreflang
.Accept-Language
и Content-Language
.switch
.Обратите также внимание на то, что языковая информация может быть присоединена к таким объектам, как изображения и вложенные аудио-файлы.
Приступаете к работе? Язык в Сети
Ссылки по теме, Создание HTML и CSS
Ссылки по теме, Создание XML
Ссылки по теме, Создание SVG
Ссылки по теме, Разработка схем