Назначение языка в HTML

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

Примечание: Так как этот документ был переведен, изменения были внесены в написанный английским языком оригинал. Смотрите журнал изменений.

Вопрос

Как можно установить язык контента на вашей HTML странице?

Quick answer

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

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

Используйте языковые тэги с Языкового Subtag Реестра IANA.

Longer answer

Основы

Всегда используйте языковой атрибут в 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">

Что делать, если нет никаких элементов, куда можно было бы добавить ваш атрибут?

Если вы хотите указать язык некоторого контента, но нет разметки вокруг него, то вокруг контента используйте такие элементы, как 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. Чтобы выбрать нужный языковой тэг из многих возможных тэгов и комбинаций, смотрите Выбор языкового тэга.

Указание 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'.

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

Ссылки: