Призначення мови в HTML

Аудиторія: шифрувальники XHTML/HTML (використовуючи редактори або скрипти), розробники скриптів (PHP, JSP, і т.д.), Менеджери веб-проектів, і ті, хто хоче краще зрозуміти, як призначити мову тексту на Веб-сторінці.

Примітка: Зміни були внесені до написаного англійською мовою оригіналу, так як цей документ був переведений. Дивіться журнал змін.

Питання

Як можна встановити мову контенту на вашій HTML сторінці?

Швидка відповідь

Завжди використовуйте мовний атрибут в html тезі для того, щоб призначити за замовчуванням мову тексту на сторінці. Коли сторінка містить контент на іншій мові, то потрібно додати мовний атрибут до елементу, який оточує цей контент.

Використовуйте атрибут lang для сторінок, які обслуговуються як HTML, та атрибут xml:lang для сторінок, які обслуговуються як XML. Для багатомовних документів XHTML 1.x та HTML5 використовуйте разом обидва атрибути.

Використовуйте мовні теги з Мовного Subtag Реєстру IANA.

Details

Основи

Завжди використовуйте мовний атрибут в html елементі. Він успадковується всіма іншими елементами, і тому встановлюватиме в елементі head документу мову для тексту за замовчуванням.

Зверніть увагу, що ви повинні використовувати елемент html, а не елемент body, оскільки елемент body не поширюється на текст в header (заголовку) документа.

Якщо у вас на сторінці є контент на іншій мові, ніж та, яка призначена в html елементі, то використовуйте мовні атрибути в елементах, що оточують цей контент. Це дозволить вам по-різному його стилізувати або обробити.

У деяких частинах коду у вас можуть виникнути проблеми. Якщо у вас є багатомовний текст в елементі title , ви не можете розмічати його різними мовами, тому що атрибут title дозволяє тільки символи - не розмітку. Те ж саме стосується тексту в атрибутах. На даний момент немає хорошого вирішення цієї проблеми.

Вибір правильного атрибуту

Якщо ваш документ - HTML (тобто обслуговується як text/html), то для того щоб встановити мову документа або фрагмента тексту використовуйте атрибут lang. Наприклад, далі показано як встановити Французьку мову мовою за замовчуванням:

<html lang="fr">

Якщо XHTML 1.x або багатомовні сторінки обслуговуються як text/html, то кожного разу, коли ви хочете встановити мову використовуйте разом обидва атрибути lang та xml:lang . Атрибут xml:lang - стандартний спосіб визначення інформації про мову в форматі XML. Переконайтеся, щоб значення обох атрибутів були однаковими.

<html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">

Насправді атрибут xml:lang не є корисним для обробки файлів як HTML, але він приймає значення атрибуту lang кожного разу, коли ви обробляєте або обслуговуєте документ як XML. Атрибут lang дозволяється синтаксисом XHTML, і його можуть розпізнати браузери. Проте, при використанні інших XML-парсерів (таких, як функція lang() в XSLT) ви не можете бути впевнені, що атрибут lang розпізнають.

Якщо ви обслуговуєте вашу сторінку як XML (тобто використовуєте такий MIME тип, як application/xhtml+xml), то вам не потрібний атрибут lang. Достатньо буде тільки атрибуту xml:lang.

<html xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">

What if element content and attribute values are in different languages?

Occasionally the language of the text in an attribute and the element content are in different languages. For example, at the top right corner of this article there are links to translated versions of this page. The link text shows the language of the target page using the language of the target page, but an associated title attribute contains a hint in the language of the current page:

Screen snap showing a tooltip containing the word 'Spanish' popping up from the document text 'Español'.

If your code looks as follows, the language attributes would actually indicate that not only the content but also the title attribute text is in Spanish. This is obviously incorrect.

 Bad code. Don't copy!

<a lang="es" title="Spanish" href="qa-html-language-declarations.es">Español</a>

Instead, move the attribute containing text in a different language to another element, as shown in this example, where the span element inherits the default en setting of the html element.

<span title="Spanish"><a lang="es" href="qa-html-language-declarations.es">Español</a></span>

Що робити, якщо немає ніяких елементів, куди можна було б додати ваш атрибут?

Якщо ви хочете вказати мову деякого контенту, але немає розмітки навколо нього, то навколо контенту використовуйте такі елементи, як span або div. Ось приклад XHTML 1.0, що обслуговується як text/html:

<p>Китайською це буде <span lang="zh-Hans">中国科学院文献情报中心</span>.</p>

Вказівка ​​мовних значень

Щоб переконатися, що всі клієнтські додатки розпізнають ту мову, яку ви маєте на увазі, ви повинні слідувати стандартному підходу при наданні значення мовному атрибуту. Крім того, необхідно вирішити, як стандартним способом звертатися до таких діалектних відмінностей між мовами, як різниця між Американською Англійською та Британською Англійською, які суттєво розходяться з точки зору правопису і вимови.

Правила для створення значень атрибуту мови описуються специфікацією IETF, яку називають BCP 47. На додаток до вказівки як використовувати такі прості мовні теги, як en для Англійської або fr для Французької мови, BCP 47 описує як складати мовні теги, які дозволяють вказувати регіональні діалекти, скрипти та інші варіанти, які пов'язані з цією мовою.

BCP 47 містить набори мов та кодів країн ISO, але одночасно з тим ще й виходить за їх рамки. Щоб знайти відповідні коди ви повинні звіритися з Мовним Subtag Реєстром IANA.

Щоб поверхнево, але досить повно ознайомитися з синтаксисом BCP 47 тегів, читайте Мовні теги в HTML та XML. Щоб вибрати потрібний мовний тег із багатьох можливих тегів і комбінацій, дивіться Вибір мовного тегу.

Additional information

Вказівка metadata про мову аудиторії

Якщо ви хочете створити metadata, що описують мову цільової аудиторії сторінки, а не мову певного діапазону тексту, то зробити це можна змусивши сервер відправляти інформацію в HTTP заголовок Content-Language. Якщо ваша цільова аудиторія говорить на декількох мовах, то заголовок HTTP дозволяє використовувати список мов, який розділений комами.

Ось приклад заголовку HTTP який призначає, щоб ресурс був сумішшю Англійської, Хінді та Панджабі:

Content-Language: en, hi, pa

Зверніть увагу, що такий підхід не є ефективним, якщо ваша сторінка буде доступною з жорсткого диску, CD диску або інших несерверних місць. В даний час не має широко розповсюдженого методу використання цього виду metadata всередині сторінки.

У минулому багато людей використовували елемент meta із атрибутом http-equiv встановленим у Content-Language. Через давню плутанину і непослідовну реалізацію цього елементу, специфікація HTML5 зробила його невідповідним в HTML, так що ви більше не повинні його використовувати.

Для зворотної сумісності, HTML5 описує алгоритм, за яким мову контенту за замовчуванням за певних умов можна вгадати з HTTP або meta Content-Language інформації. Однак, це лише запасний механізм для випадків, коли мовний атрибут не використовувався в HTML тезі. Якщо ви використовували мовний атрибут в html тезі, що потрібно робити завжди, то наведені дії не потрібні.

Для додаткової інформації про HTTP та meta Content-Language інформацію дивіться HTTP та meta для мовної інформації.

Ще кілька речей, які не є важливими

Просто про всяк випадок, мабуть, варто згадати ще кілька інших моментів, які не стосуються цієї дискусії.

По-перше, не можливо призначити мову тексту за допомогою CSS.

По-друге, doctype, з якого повинен починатися будь-який HTML або XHTML файл може містити запис, який деякі люди можуть сприйняти за призначення мови. doctype у прикладі, наведеному нижче містить текст EN, який означає 'English' (Англійська). Однак, це показує мову schema (схеми), яка пов'язана з цим документом – вона не має нічого спільного з мовою самого документу.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

По-третє, іноді люди вважають, що інформація про мову може бути взята з кодування символів. Тим не менш, кодування символів не дозволяє однозначно ідентифікувати мову: має бути взаємно-однозначна відповідність між кодуванням і мовою щоб виведення працювало, але немає жодної такої відповідності. Наприклад, одне кодування символів може використовуватися для багатьох мов, так кодуванням Latin 1 (iso-8859-1) можна кодувати Французьку та Англійську мови, а також багато інших мов. Крім того, кодування символів може змінюватися в межах однієї мови, наприклад, Арабська може використовувати такі кодування, як 'Windows-1256' або 'ISO-8859-6' або 'UTF-8'.

All these encoding examples, however, are nowadays moot, since all content should be authored in UTF-8, which covers all but the rarest of languages in a single character encoding.

Це ж саме стосується і напрямку тексту. Як і у випадку із кодуваннями та мовою, не завжди є однозначна відповідність між мовою і скриптом, і як результат із спрямованістю. Наприклад, Азербайджанська мова може бути написана із використанням як скриптів, які вирівнюються справа наліво так і скриптів, які вирівнюються зліва направо, і код мови az може бути актуальним для обидвох випадків. Крім того, розмітка напрямку тексту, яка використовується з вбудованим текстом застосовує ряд різних значень до тексту, у той час як мова є простого перемикачем, який не потрібний для цих завдань.