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 теги:

Зазначимо також, що інформацію про мову можна приєднати до таких об'єктів, як зображення та включених аудіо файлів.