Language тэги в HTML и XML

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

Обзор

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

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

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

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

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

Синтаксис language тега определяется IETF's BCP 47. BCP означает 'Самая Лучшая Нынешняя Практика', и является постоянным названием для серии RFCs , чьи номера меняются, как только они обновляются. Последний RFC, описывающий синтаксис language тега это RFC 5646, Теги для Идентификации Языков и он отменяет действие старых RFCs 4646, 3066 и 1766.

Чтобы найти subtags вы использовали списки кодов в различных стандартах ISO, но теперь вы можете найти все subtags в IANA Language Subtag Реестре. Мы опишем новый реестр ниже.

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

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

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

Приклади:

Код Язык Subtags
en Английский language
mas Масаи language
fr-CA Французский, который используется в Канаде language+region
es-419 Испанский, который используется в Латинской Америке language+region
zh-Hans Китайский написанный с упрощенным скриптом language+script

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

Далее в статье приводится дополнительная даталь о том, как построить language тэги.

Построение language тэгов

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

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

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

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

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

Ниже приведен список различных типов доступных subtag. Через них мы будем нарабатывать наше направление и в следующих разделах рассмотрим как они используются.

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

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

Использование subtag реестра

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

Реестр представляет собой длинный текстовый файл. Чтобы найти language subtag, ищите на Английском языке страницу по названию того языка. Если мы ищем 'French' (Французский), мы найдем такую ​​запись:

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

Обратите внимание, что тип этой записи - language(язык). То что вы ищете это код обозначенный Subtag, что указывает на значение fr.

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

Однако, есть несколько дополнительных вещей, которые вы должны иметь в виду при выборе subtags. Например, Вы должны избегать subtags, которые описаны в реестре как redundant (избыточный) или deprecated (неодобрений), и вы должны использовать вариантные subtags в сочетании с некоторыми другими предложенными subtags. Дополнительные сведения о выборе subtags, читайте Выбор language тэга.

Richard Ishida также создал удобный инструмент для поиска по реестре.

Следующие разделы расскажут вам подробнее о специфических subtags.

Главный language subtag

Language subtags

en
ast

Подробнее читайте в BCP 47 спецификации:

2.2.1 Главный Language Subtag

4.1 Выбор Language Тэга

4.1.1 Настройка Охватываемых Языков

Все language тэги должны начинаться с главного language subtag.

Примеры простых language-only (только языковых) language тэгов включают:

Эти коды происходят и относятся к языковым кодам ISO 639.

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

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

Это пример главного language subtag для Испанского языка, es, в реестре:

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

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

Расширенный language subtag

Extlang subtags

zh-yue
ar-afb

Подробнее читайте в BCP 47 спецификации:

2.2.2 Расширенные Language Subtags

4.1.2 Использование Расширенных Language Subtags

Мы будем называть расширенные language subtags как extlang subtags. Перед extlang subtag всегда должен стоять специфический главный language subtag, он может быть только один в language тэге, и он стоит перед любыми другими subtags.

Примеры language тэгов, включающие extlang subtags:

Комбинации language+extlang предоставляются для размещения устаревших форм language тэгов, но, есть один language subtag доступен для каждой комбинации language+extlang. Там где это возможно следует использовать тот language subtag, а не сочетание language+extlang. Например, если можете, то используйте yue, а не zh-yue для Кантонского и afb, а не ar-afb для Gulf Arabic (диалект Арабского языка).

Extlang subtags всегда состоят из трех букв. Каждый extlang запись в реестре содержит поле Prefix которое определяет язык, и должен стоять перед extlang subtag. Также записи содержат поле Preferred-Value, указывающее equivalent (эквивалентный) language тэг.

Это пример extlang кода для Gulf Arabic, afb, в реестре:

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

Macrolanguages (макроязыки) Главные language subtags, используемые с extlang subtag известны, как macrolanguages ​​(макроязыки), охватывают ряд языков с более конкретными главными language subtags. Macrolanguage subtag может быть использован сам по себе, но если есть любое соглашение о его значении в контексте где он используется, то он не обязательно является достаточно точным.

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

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

Скриптовый subtag

Скриптовые subtags

zh-Hans
az-Latn

Подробнее читайте в BCP 47 спецификации:

2.2.3 Скриптовый Subtag

4.1 Выбор Language Тэга

Примеры language тэгов, включающие скриптовый subtags:

Скриптовый subtag был впервые представлен в RFC 4646. Subtags происходят и относятся к спискам скриптовых кодов ISO 15924.

Только один скриптовый subtag может появиться в language тэге, и он должен следовать сразу за language или любым extlang subtag. Он всегда содержит четыре буквы.

Вы должны использовать скриптовые тэги только, когда они необходимы, чтобы отметить различие, которое вам нужно. Как соавтор RFC 4646, Addison Phillips, пишет, "Практически любой контент, который не использует скриптовый тэг сегодня, имеет хороший шанс не использовать его и в будущем".

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

В действительности, многие записи language subtag в реестре настоятельно не рекомендуют использования скриптовых тэгов, включив поле Suppress script (запрет скрипта). Такое поле содержится выше в Испанском примере, что указывает то, что Испанский написан с использованием Латинского скрипта, и поэтому Latn subtag не должен быть использован с es.

Этот пример показывает запись реестра для Кириллицы, Cyrl, что используется для Русского языка:

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

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

Региональный subtag

Региональные subtags

en-GB
es-005
zh-Hant-HK

Подробнее читайте в BCP 47 спецификации:

2.2.4 Региональный Subtag

4.1 Выбор Language Тэга

Примеры language тегов, включающих региональные subtags содержат:

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

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

Еще раз: вы должны использовать региональные subtags только, если они необходимы, чтобы сделать различие, что вам нужно. Разве только вам нужно специально подчеркнуть, что вы говорите о Итальянском котором говорят в Италии, то вы должны использовать для Итальянского 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
%%

Вариантные subtags

Вариантные subtags

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

Подробнее читайте в BCP 47 спецификации:

2.2.5 Вариантные Subtags

4.1 Выбор Language Тэга

Вариантные subtags - значения, что используются для обозначения диалектов или скриптовых вариаций, еще не охваченных комбинациями language, скриптового и регионального subtag. Вариантные subtags должны появляться после каких-либо language, скриптовых или региональных subtags, но скриптовые и региональные subtags не должны им предшествовать.

Если вы работаете в специализированной области, то маловероятно, что вам нужно будет использовать вариантные subtags.

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

Этот пример из реестра показывает код для Nadiza - диалекта Словенского языка, nedis:

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

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

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

Subtags расширения и частного использования

Subtags Расширения

de-DE-u-co-phonebk

Subtags Частного Использования

en-US-x-twain

Подробнее читайте в BCP 47 спецификации:

2.2.7 Subtags Частного Использования

2.2.6 Subtags Расширения

4.1 Выбор Language Тэга

Если вы чувствуете, что вам действительно нужно использовать эти subtags, вам стоит прочитать спецификацию, а не эту статью.

Subtags расширения и частного использования представлены однобуквенным тегом, или 'singleton' (одиночка (шаблон проектирования)). Организация может предложить singleton для расширения. Это назначение должно быть описано RFC (IETF спецификация). Singleton добавят в реестр, если он успешно пройдет просмотр. Singleton x зарезервирован для частного использования. Несколько subtags допустимые после singleton, однако, как и для всех subtags, они должны содержать не более 8 символов.

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

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

Расширение u- определенное в RFC 6067, что указывает на Unicode Consortium's Common Locale Data Repository (CLDR) для детальной информации о subtags сопровождающих его. Это не определено BCP 47.

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

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

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

Одобренные и избыточные subtags

Подробнее читайте в BCP 47 спецификации:

2.2.8 Одобренные и Избыточные Регистрации

Grandfathered (одобренные) тэги - особые случаи, внедренные для совместимости. Это тэги, которые были зарегистрированы в RFC 4646, который не мог полностью состоять из subtags в текущем реестре, или не вписывается в синтаксис, что в настоящее в время определен для language тегов.

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

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

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

Согласование language тэгов

Согласование различных language тэгов очень важно для ряда приложений. Согласно BCP 47 можно сказать, что en соответствует en-GB. Например, следующий код CSS окрашивает весь Английских текст в красный цвет в браузерах, поддерживающих pseudo-attribute (псевдо атрибут) :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 Согласование Language Тэгов, описывает несколько возможных подходов для согласования. Согласование будет описано в другой статье.

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

Language тэги для HTML были впервые официально определены в RFC 2070, F. Yergeau, и другими. Интернационализация Языка Разметки Гипертекста. RFC 2070 был включен в HTML 4, и его реклассифицировали как исторический.

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

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

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