Declaración de idioma en HTML

Audiencia de destino: Los codificadores de XHTML/HTML (que utilizan editores o lenguajes de sistema de escritura), los desarrolladores de sistemas de escritura (PHP, JSP, etc.), los gerentes de proyectos web y cualquiera que necesite una mejor comprensión de cómo declarar el idioma de texto de una página web.

Pregunta

¿Cómo debería establecer el idioma del contenido de mi página HTML?

Respuesta rápida

Siempre utilice un atributo de idioma en la etiqueta html para declarar el idioma predeterminado del texto de la página. Cuando la página tenga contenido en otro idioma, agregue un atributo de idioma a un elemento que rodee dicho contenido.

Utilice el atributo lang para páginas presentadas como HTML, y el atributo xml:lang para páginas presentadas como XML. Para documentos políglotas en XHTML 1.x y HTML5, utilice los dos juntos.

Utilice etiquetas de idioma del Registro de subetiquetas de idioma IANA.

Respuesta extensa

Conceptos básicos

Siempre utilice un atributo de idioma en el elemento html. Esto lo heredan todos los otros elementos y también establecerá un idioma predeterminado para el texto en el elemento head del documento.

Observe que debe utilizar el elemento html en lugar del elemento body, dado que body no incluye el texto en el encabezado del documento.

Si en la página tiene algún contenido en un idioma diferente del declarado en el elemento html, utilice atributos de idioma en elementos que rodeen dicho contenido. Eso le permite aplicarle un estilo diferente o procesarlo de otra manera.

Es posible que en algunas partes de su código tenga problemas. Si tiene un texto plurilingüe en el elemento title, no podrá etiquetar el texto en diferentes idiomas, porque el atributo title sólo permite caracteres, no etiquetas. Lo mismo pasa con el texto en los atributos. No hay una solución efectiva para esto por el momento.

Selección del atributo correcto

Si su documento es HTML (es decir, se presenta como texto/html), utilice el atributo lang para establecer el idioma del documento o de una parte de texto. Por ejemplo, lo siguiente establece el idioma predeterminado en francés:

<html lang="fr">

Al presentar páginas XHTML 1.x o políglotas como texto/html, utilice los atributos lang y xml:lang juntos cada vez que desee configurar el idioma. El atributo xml:lang es la forma estándar de identificar la información sobre el idioma en XML. Asegúrese de que los valores de ambos atributos sean idénticos.

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

En realidad, el atributo xml:lang no es útil para manejar el archivo como HTML, sino que toma el control a partir del atributo lang siempre que usted procese o presente el documento como XML. La sintaxis de XHTML admite el atributo lang y también pueden reconocerlo los navegadores. Sin embargo, al utilizar otros analizadores XML (como la función lang() en XSLT), no puede confiar en que se reconozca el atributo lang.

Si presenta su página como XML (es decir, mediante un tipo MIME como aplicación/xhtml+xml), no necesita el atributo lang. Bastará con el atributo xml:lang.

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

¿Qué sucede si no hay ningún elemento donde colgar su atributo?

Si desea especificar el idioma de algún contenido, pero no hay lenguaje de etiquetas alrededor, utilice un elemento como span o div alrededor del contenido. Aquí mostramos un ejemplo en XHTML 1.0 ejecutado como text/html:

<p>You'd say that in Chinese as <span lang="zh-Hans">中国科学院文献情报中心</span>.</p>

Especificación de valores de idiomas

A fin de asegurarse de que todos los agentes de usuario reconozcan a qué idioma se refiere, deberá seguir un enfoque estándar cuando suministre los valores de atributo. También deberá considerar cómo referirse a las diferencias de dialecto entre idiomas de una manera estándar; por ejemplo, la diferencia entre inglés estadounidense e inglés británico, que varían significativamente en términos de ortografía y pronunciación.

Las reglas para la creación de valores de atributo de idioma se describen mediante una especificación IETF llamada BCP 47. Además de especificar cómo usar etiquetas de idioma simples, como en para inglés o fr para francés, BCP 47 describe cómo componer etiquetas de idiomas que le permitan especificar los dialectos regionales, los métodos de escritura y otras variantes relacionadas con ese idioma.

Las BCP 47 incorporan las normas ISO de idioma y los códigos de país, pero exceden el alcance de éstos. Para buscar códigos relevantes, consulte el Registro de subetiquetas de idioma IANA.

Para obtener una introducción simple pero bastante completa de la sintaxis de etiquetas BCP 47, lea Etiquetas de idiomas en HTML y XML. Para obtener ayuda en la elección de la etiqueta de idioma adecuada de entre las muchas etiquetas y combinaciones posibles, vea Cómo seleccionar una etiqueta de idioma.

Especificación de metadatos sobre el idioma del público

Si desea crear metadatos que describan el idioma del público al cual la página está dirigida en lugar del idioma de un fragmento específico del texto, haga que el servidor envíe la información al encabezado HTTP Content-Language. Si el público al cual dirige la página habla más de un idioma, el encabezado HTTP le permite utilizar una lista de idiomas separados por comas.

El siguiente es el ejemplo de un encabezado HTTP que declara que la fuente es una mezcla de inglés, hindi y punjabi:

Content-Language: en, hi, pa

Observe que este enfoque no es efectivo si accede a su página desde un disco rígido, un disco u otra ubicación no basada en servidor. En la actualidad, no hay un método con aceptación masiva para usar este tipo de metadatos dentro de la página.

En el pasado, mucha gente utilizaba un elemento meta con el atributo http-equiv establecido en Content-Language. Debido a largas confusiones e implementaciones inconsistentes de este elemento, la especificación HTML5 estableció que no se ajustaba al HTML, así que ya no debería usarlo.

Para compatibilidad con versiones anteriores, HTML5 describe un algoritmo mediante el cual puede adivinarse el idioma preestablecido del contenido a partir de la información del HTTP o de meta Content-Language en ciertas condiciones. No obstante, ese es sólo un mecanismo de respaldo para casos en los que no se ha utilizado atributo de idioma en la etiqueta html. Si ha utilizado atributo de idioma en la etiqueta html, como debería hacerlo, dicho mecanismo de respaldo es irrelevante.

Para obtener información sobre el HTTP y el meta Content-Language, consulte HTTP y meta para información de idioma.

Algunas otras cosas irrelevantes

Sólo por si acaso, y para ser más completos, quizá valga la pena mencionar algunos otros puntos que no son relevantes para esta discusión.

En primer lugar, no es posible declarar el idioma del texto mediante CSS.

En segundo lugar, el doctype que debería iniciar cualquier archivo HTML o XHTML puede contener lo que a algunas personas les parece una declaración de idioma. El doctype del ejemplo de abajo contiene el texto EN, que significa "inglés". No obstante, eso indica que el idioma del schema asociado con este documento – no tiene nada que ver con el idioma del documento mismo.

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

En tercer lugar, algunas personas podrían suponer que la información acerca del idioma natural puede inferirse a partir de la codificación de caracteres. Sin embargo, la codificación de caracteres no habilita la identificación inequívoca de un idioma natural: debe haber un mapeo "uno a uno" entre la codificación y el idioma para que esta inferencia funcione, pero no lo hay. Por ejemplo, puede utilizarse una codificación de carácter simple para diversos idiomas, como Latín 1 (iso-8859-1), que puede codificar francés e inglés, así como muchos otros idiomas. Además, la codificación de caracteres puede variar en un idioma simple; por ejemplo, el árabe puede utilizar codificaciones como "Windows-1256" o "ISO-8859-6" o "UTF-8".

Lo mismo ocurre con la dirección del texto. Al igual que con las codificaciones y el idioma, no siempre hay un mapeo "uno a uno" entre idioma y sistema de escritura y, por ende, direccionalidad. Por ejemplo, el Azerbaiyán puede escribirse con sistemas de escritura de derecha a izquierda o de izquierda a derecha, y el código de idioma az puede ser relevante para ambos. Además, la etiqueta de dirección de texto utilizada en texto en línea se aplica a una gran variedad de valores diferentes del texto, mientras que el lenguaje es un simple cambio que no está a la altura de las tareas exigidas.

Referencias: