8 Información sobre el idioma y la dirección del texto

Nota: Este documento es parte de una traducción al castellano de la Recomendación del W3C "HTML 4.01 Specification" (más información). Puede consultar la versión original del mismo. Para cualquier comentario o corrección acerca de la traducción póngase en contacto con el traductor en jrpozo@conclase.net. Gracias por su colaboración.

Véase el Aviso de copyright de la traducción.

Contenidos

  1. Especificación del idioma del contenido: el atributo lang
    1. Códigos de idioma
    2. Herencia de los códigos de idioma
    3. Interpretación de los códigos de idioma
  2. Especificación de la dirección del texto y de las tablas: el atributo dir
    1. Introducción al algoritmo bidireccional
    2. Herencia de la información sobre la dirección del texto
    3. Especificación de la dirección del texto incluido
    4. Anulación del algoritmo bidireccional: el elemento BDO
    5. Referencias de caracteres para el control de la direccionalidad y de la unión
    6. Efecto de las hojas de estilo en la bidireccionalidad

Esta sección del documento trata sobre dos temas importantes que afectan a la internacionalización del HTML: la especificación del idioma (el atributo lang) y de la dirección (el atributo dir) del texto de un documento.

8.1 Especificación del idioma del contenido: el atributo lang

Definiciones de atributos
lang = código de idioma [CI]
Este atributo especifica el idioma base de los valores de los atributos y del texto contenido en un elemento. El valor por defecto de este atributo es desconocido.

La información sobre el idioma especificada por medio del atributo lang puede ser utilizada por un agente de usuario de diferentes formas para controlar la representación. Algunas cosas para las que la información sobre el idioma proporcionada por el autor puede ser útil son las siguientes:

El atributo lang especifica el idioma del contenido del elemento y de los valores de los atributos; el que sea relevante para un atributo dado dependerá de la sintaxis y de la semántica del atributo y de la operación involucrada.

El objetivo del atributo lang es permitir a los agentes de usuario representar el contenido de forma más significativa según la práctica cultural aceptada para un idioma dado. Esto no implica que los agentes de usuario deberían representar los caracteres que no son típicos de un idioma dado de maneras menos significativas; los agentes de usuario deben intentar representar todos los caracteres lo mejor posible, independientemente del valor especificado por lang.

Por ejemplo, si aparecen caracteres del alfabeto griego dentro un texto escrito en español:

<P><Q lang="es">Sus superpoderes son el resultado de las
radiaciones &gamma;,</Q> dijo él.</P>

un agente de usuario (1) debería intentar representar el contenido en español de una manera apropiada (p.ej., en lo que respecta a la puntuación de la cita) y (2) debe intentar representar &gamma; lo mejor posible aunque no sea un carácter español.

Consulte la sección sobre caracteres no representables para información relacionada.

8.1.1 Códigos de idioma

El valor del atributo lang es un código de idioma que identifica un languaje natural hablado, escrito o usado de cualquier modo para la comunicación de información entre personas. Los lenguajes de ordenador están explícitamente excluidos de los códigos de idiomas.

La [RFC1766] define y explica los códigos de idioma que deben ser usados en los documentos HTML.

En pocas palabras, los códigos de idioma consisten en un código principal y una serie posiblemente vacía de subcódigos:

        código-de-idioma = código-principal ( "-" subcódigo )*

Aquí tenemos algunos ejemplos de códigos de idioma:

En la [ISO639] se reservan códigos principales de dos letras para las abreviaturas de los idiomas. Entre estos códigos de dos letras están fr (francés), de (alemán), it (italiano), nl (neerlandés), el (griego), es (español), pt (portugués), ar (árabe), he (hebreo), ru (ruso), zh (chino), ja (japonés), hi (hindi), ur (urdu), y sa (sánscrito).

Se sobreentiende que cualquier código de dos letras es un código de país de [ISO3166].

8.1.2 Herencia de los códigos de idioma

Un elemento hereda la información sobre el código de idioma de acuerdo con el siguiente orden de precedencia (de más alto a más bajo):

En este ejemplo, el idioma principal del documento es el francés ("fr"). Hay un párrafo que se declara como escrito en español ("es"), después del cual el idioma principal vuelve a ser el francés. El párrafo siguiente incluye un frase en japonés ("ja"), después de la cual el idioma principal vuelve a ser el francés.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<HTML lang="fr">
<HEAD>
<TITLE>Un document multilingue</TITLE>
</HEAD>
<BODY>
...Interpretado como francés...
<P lang="es">...Interpretado como español...
<P>...Interpretado de nuevo como francés...
<P>...Texto en francés interrumpido por <EM lang="ja">algo
      en japonés</EM> Aquí vuelve a empezar en francés...
</BODY>
</HTML>
Nota. Las celdas de las tablas pueden heredar los valores los valores de lang no de su padre, sino de la primera celda de un tramo. Consulte la sección sobre herencia de la alineación para más detalles.

8.1.3 Interpretación de los códigos de idioma

En el contexto del HTML, los agentes de usuario deberían interpretar un código de idioma como una jerarquía de símbolos más que como un símbolo independiente. Cuando un agente de usuario ajusta la representación de acuerdo con la información sobre el idioma (por ejemplo, comparando los códigos de idioma de las hojas de estilos y los valores de lang), siempre debería dar prioridad a un emparejamiento exacto, pero también debería considerar suficiente el emparejamiento de códigos principales. Así, si se establece un valor "en-US" para el atributo lang del elemento HTML, un agente de usuario debería preferir en primer lugar la información de estilo correspondiente a "en-US", y a continuación la correspondiente al valor más general "en".

Nota. Las jerarquías de códigos de idioma no garantizan que todos los idiomas con un mismo prefijo serán entendidos por aquellos que dominen uno o más de esos idiomas. Lo que hacen es permitir a un usuario englobar varios idiomas bajo un prefijo común cuando sea el caso para ese usuario.

8.2 Especificación de la dirección del texto y de las tablas: el atributo dir

Definiciones de atributos

dir = LTR | RTL [CI]
Este atributo especifica la dirección base del texto direccionalmente neutro (es decir, texto que no tiene direccionalidad heredada según se define en [UNICODE]) de los contenidos o los valores de los atributos de un elemento. También especifica la direccionalidad de las tablas. Valores posibles:
  • LTR: Texto o tabla de izquierda a derecha (Left-to-right).
  • RTL: Texto o tabla de derecha a izquierda (Right-to-left).

Los autores, además de especificar el idioma de un documento con el atributo lang, pueden necesitar especificar la direccionalidad base (izquierda a derecha o derecha a izquierda) de porciones de texto de un documento, de la estructura de una tabla, etc. Esto se hace con el atributo dir.

La especificación [UNICODE] asigna direccionalidad a los caracteres y define un algoritmo (complejo) para determinar la direccionalidad correcta del texto. Si un documento no contiene un carácter mostrable de derecha a izquierda, no se requiere a un agente de usuario conforme que aplique el algoritmo bidireccional [UNICODE]. Si un documento contiene caracteres de derecha a izquierda, y si el agente de usuario muestra estos caracteres, el agente de usuario debe usar el algoritmo bidireccional.

Si bien Unicode especifica caracteres especiales que tratan con la dirección del texto, HTML ofrece construcciones de código de mayor nivel que hacen lo mismo: el atributo dir (no confundir con el elemento DIR) y el elemento BDO. Así, para expresar un cita en hebreo, es más intuitivo escribir

<Q lang="he" dir="rtl">...una cita en hebreo...</Q>

que la referencias equivalentes en Unicode:

&#x202B;&#x05F4;...una cita en hebreo...&#x05F4;&#x202C;

Los agentes de usuario no deben usar el atributo lang para determinar la direccionalidad del texto.

El atributo dir se hereda y puede ser anulado. Consulte la sección sobre información acerca de la herencia de la dirección del texto para más detalles.

8.2.1 Introducción al algoritmo bidireccional

Los siguientes ejemplos ilustran el comportamiento esperado del algoritmo bidireccional. Intervienen dos idiomas: el inglés, con escritura de izquierda a derecha, y el hebreo, con escritura de derecha a izquierda.

Consideremos el siguiente texto de ejemplo:

  inglés1 HEBREO2 inglés3 HEBREO4 inglés5 HEBREO6

Los caracteres de este ejemplo (y de todos los ejemplos relacionados) se almacenan en el ordenador del modo que se muestra aquí: el primer caracter de la fila es "i", el segudo es "n", y el último es "6".

Supongamos que el idioma predominante del documento que contiene a este párrafo es el inglés. Eso significa que la dirección base es de izquierda a derecha. La presentación correcta de esta línea sería:

inglés1 2OERBEH inglés3 4OERBEH inglés5 6OERBEH
        <------         <------         <------
           H               H               H
---------------------------------------------->
                      I

Las líneas a trazos indican la estructura de la frase: el inglés es el que predomina y hay algunos textos incluidos en hebreo. Para lograr la presentación correcta no se necesita código adicional, ya que los agentes de usuario que apliquen el algoritmo bidireccional invertirán correctamente los fragmentos en hebreo.

En cambio, si el idioma predominante del documento es el hebreo, la dirección base es de derecha a izquierda. La presentación correcta es por tanto:

6OERBEH inglés5 4OERBEH inglés3 2OERBEH inglés1
        ------>         ------>         ------>
           I               I               I
<----------------------------------------------
                       H

En este caso, se ha escrito la frase entera de derecha a izquierda, y las secuencias incluidas en inglés se han invertido apropiadamente con el algoritmo bidireccional.

8.2.2 Herencia de la información sobre la dirección del texto

El algoritmo bidireccional de Unicode obliga a que los bloques de texto tengan una dirección de texto base. Para especificar la dirección base de un elemento en bloque, se establece el atributo dir del elemento. El valor por defecto del atributo dir es "ltr" (left-to-right, texto de izquierda a derecha).

Cuando se establece el atributo dir de un elemento en bloque, éste tiene efecto hasta la finalización del bloque y en cualquier elemento en bloque anidado. Si se establece el atributo dir para algún elemento anidado, se anula en él el valor heredado.

Para establecer la dirección de texto base de un documento completo, se establece el atributo dir del elemento HTML.

Por ejemplo:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<HTML dir="RTL">
<HEAD>
<TITLE>...un título de derecha a izquierda...</TITLE>
</HEAD>
...texto de derecha a izquierda...
<P dir="ltr">...texto de izquierda a derecha...</P>
<P>...de nuevo texto de derecha a izquierda...</P>
</HTML>

Los elementos en línea, por su parte, no heredan el atributo dir. Eso significa que un elemento en línea sin un atributo dir no abre un nivel adicional de inclusión con respecto al algoritmo bidireccional. (Aquí se considera que un elemento está en línea o en bloque según su presentación por defecto. Téngase en cuenta que los elementos INS y DEL pueden estar en bloque o en línea dependiendo de su contexto.)

8.2.3 Especificación de la dirección del texto incluido

El algoritmo bidireccional [UNICODE] invierte automáticamente las secuencias incluidas de caracteres de acuerdo con su direccionalidad inherente (como se ilustra en los ejemplos previos). Sin embargo, en general sólo se puede tener en cuenta un nivel de inclusión. Para lograr niveles adicionales de cambios de dirección por inclusión, debe hacerse uso del atributo dir de un elemento en línea.

Consideremos el mismo texto del ejemplo anterior:

inglés1 HEBREO2 inglés3 HEBREO4 inglés5 HEBREO6

Supongamos que el idioma predominante del documento que contiene a este párrafo es el inglés. Supongamos además que la frase en inglés anterior contiene una sección en hebreo que va desde HEBREO2 hasta HEBREO4, y que la sección en hebreo contiene una cita en inglés (inglés3). La presentación deseada de este texto es por lo tanto:

inglés1 4OERBEH inglés3 2OERBEH inglés5 6OERBEH
                ------>
                   I
        <----------------------
                   H
---------------------------------------------->
                   I

Para lograr dos cambios de dirección por inclusión, debemos proporcionar información adicional, para lo cual delimitamos la segunda inclusión explícitamente. En este ejemplo, utilizamos el elemento SPAN y el atributo dir para dar formato al texto:

inglés1 <SPAN dir="RTL">HEBREO2 inglés3 HEBREO4</SPAN> inglés5 HEBREO6

Los autores también pueden utilizar los caracteres especiales de Unicode para lograr cambios múltiples de dirección por inclusión. Para una inclusión de izquierda a derecha, se rodea el texto incluido con los caracteres LEFT-TO-RIGHT EMBEDDING (inclusión de izquierda a derecha, "LRE", hexadecimal 202A) y POP DIRECTIONAL FORMATTING (fin de formato direccional, "PDF", hexadecimal 202C). Para una inclusión de derecha a izquierda, se rodea el texto incluido con los caracteres RIGHT-TO-LEFT EMBEDDING (inclusión de derecha a izquierda, "RTE", hexadecimal 202B) y PDF.

Uso conjunto del código de direccionalidad de HTML y de los caracteres Unicode. Los autores y los diseñadores de programas de creación deberían tener en cuenta que pueden surgir conflictos si se utilizan al mismo tiempo el atributo dir de los elementos en línea (incluyendo BDO) y los caracteres de formato [UNICODE] correspondientes. Se usará preferiblemente uno u otro sistema exclusivamente. La especificación del formato con HTML ofrece mayores garantías de integridad estructural del documento y evita los problemas que puedan surgir al editar texto bidireccional HTML con un editor de textos sencillo, pero algunos programas pueden ser más aptos para la utilización de los caracteres [UNICODE]. Si se usan ambos métodos, deberían tomarse todas las precauciones para asegurar el anidamiento correcto del código y los caracteres de formato; de otro modo los resultados de la representación son imprevisibles.

8.2.4 Anulación del algoritmo bidireccional: el elemento BDO

<!ELEMENT BDO - - (%inline;)*          -- anular BiDi I18N -->
<!ATTLIST BDO
  %coreattrs;                          -- id, class, style, title --
  lang        %LanguageCode; #IMPLIED  -- código de idioma --
  dir         (ltr|rtl)      #REQUIRED -- direccionalidad --
  >

Etiqueta inicial: obligatoria, Etiqueta final: obligatoria

Definiciones de atributos

dir = LTR | RTL [CI]
Este atributo obligatorio especifica la dirección base del texto contenido en el elemento. Esta dirección prevalece sobre la direccionalidad inherente de los caracteres según se define en [UNICODE]. Valores posibles:
  • LTR: Texto de izquierda a derecha (Left-to-right).
  • RTL: Texto de derecha a izquierda (Right-to-left).

Atributos definidos en otros lugares

En general, el algoritmo bidireccional y el atributo dir son suficientes para controlar los cambios de direccionalidad por inclusión. Sin embargo, a veces pueden darse casos en que el algoritmo bidireccional produce una presentación incorrecta. El elemento BDO permite a los autores desactivar el algoritmo bidireccional para fragmentos de texto específicos.

Consideremos un documento que contenga el mismo texto que antes:

inglés1 HEBREO2 inglés3 HEBREO4 inglés5 HEBREO6

pero supongamos que este texto ya ha sido puesto en su orden visual. Una razón para ello podría ser que los estádares MIME ([RFC2045], [RFC1556]) recomiendan el orden visual, es decir, que las secuencias de caracteres de derecha a izquierda se inserten de derecha a izquierda en el flujo de caracteres. En un mensaje de correo electrónico, se podría dar el siguiente formato al texto anterior, incluyendo saltos de línea:

inglés1 2OERBEH inglés3
4OERBEH inglés5 6OERBEH

Esto generaría un conflicto con el algoritmo bidireccional [UNICODE], ya que el algoritmo invertiría 2OERBEH, 4OERBEH, y 6OERBEH una segunda vez, mostrando las palabras en hebreo de izquierda a derecha en lugar de derecha a izquierda.

La solución en este caso es anular el algoritmo de bidireccionalidad colocando el extracto del mensaje de correo en un elemento PRE (para conservar los saltos de línea) y cada línea en un elemento BDO, cuyo atributo dir sea igual a LTR:

<PRE>
<BDO dir="LTR">inglés1 2OERBEH inglés3</BDO>
<BDO dir="LTR">4OERBEH inglés5 6OERBEH</BDO>
</PRE>

Esto le dice al algoritmo bidireccional "¡Déjame de izquierda a derecha!" y produce la presentación deseada:

inglés1 2OERBEH inglés3
4OERBEH inglés5 6OERBEH

El elemento BDO debería utilizarse en aquellos casos en que fuera preciso un control absoluto del orden de las secuencias (p.ej., números de referencia multi-lenguaje). El atributo dir es obligatorio para este elemento.

Los autores también pueden usar los caracteres especiales Unicode para anular el algoritmo bidireccional -- LEFT-TO-RIGHT OVERRIDE (anular izquierda a derecha, 202D) o RIGHT-TO-LEFT OVERRIDE (anular derecha a izquierda, hexadecimal 202E). El caracter POP DIRECTIONAL FORMATTING (hexadecimal 202C) finaliza ambas anulaciones de bidireccionalidad.

Nota. Recuérdese que pueden surgir conflictos si se usan simultáneamente el atributo dir de los elementos en línea (incluyendo BDO) y los caracteres de formato [UNICODE] correspondientes.

Bidireccionalidad y codificaciones de caracteres. De acuerdo con [RFC1555] y [RFC1556], existen convenciones especiales sobre el uso del parámetro "charset" para indicar el tratamiento de la bidireccionalidad que se hace en el correo MIME, en particular para distinguir entre direccionalidad visual, implícita y explícita. El valor "ISO-8859-8" (para hebreo) indica codificación visual, "ISO-8859-8-i" indica bidireccionalidad implícita, e "ISO-8859-8-e" indica direccionalidad explícita.

Como HTML usa el algoritmo de bidireccionalidad de Unicode, los documentos conformes codificados con la ISO 8859-8 deben ser marcados como "ISO-8859-8-i". Con HTML también es posible el control direccional explícito, pero no puede expresarse con ISO 8859-8, y por tanto no debería utilizarse "ISO-8859-8-e" .

El valor "ISO-8859-8" implica que se ha dado formato visual al documento, utilizando código incorrectamente (como por ejemplo TABLE con alineación a la derecha y sin ajuste automático de líneas) para asegurarse de que los agentes de usuario antiguos que no soportan bidireccionalidad puedan realizar una presentación razonable del documento. Tales documentos no son conformes con la especificación presente. Si es necesario, pueden hacerse conformes con esta especificación (y al mismo tiempo se mostrarán correctamente en agentes de usuario antiguos) añadiendo elementos BDO donde haga falta. Al contrario de lo que se dice en [RFC1555] y en [RFC1556], ISO-8859-6 (Árabe) no se ordena visualmente.

8.2.5 Referencias de caracteres para el control de la direccionalidad y de la unión

Dado que a veces se dan ambigüedades en la direccionalidad de ciertos caracteres (p.ej., los de puntuación), la especificación [UNICODE] incluye caracteres que permiten la resolución apropiada de dichas ambigüedades. Además, Unicode incluye algunos caracteres para controlar el comportamiento de unión y separación de caracteres cuando esto sea necesario (p.ej., algunas situaciones con letras árabes). HTML 4 incluye referencias de caracteres para estos caracteres.

Los siguientes extractos del DTD presentan algunas de las entidades direccionales:

   <!ENTITY zwnj CDATA "&#8204;"--=separador de anchura cero-->
   <!ENTITY zwj  CDATA "&#8205;"--=conector de anchura cero-->
   <!ENTITY lrm  CDATA "&#8206;"--=marca de izquierda a derecha-->
   <!ENTITY rlm  CDATA "&#8207;"--=marca de derecha a izquierda-->

La entidad zwnj (zero width non-joiner) se utiliza para evitar el comportamiento de unión en aquellos contextos en que la unión ocurre pero no debería. La entidad zwj (zero width joiner) hace lo contrario: fuerza la unión cuando no ocurre aunque debería. Por ejemplo, la letra árabe "HEH" se utiliza para abreviar "Hijri", el nombre del sistema de calendario islámico. Como la "HEH" aislada se parece a la escritura manual del dígito árabe cinco (basada en dígitos índicos), para evitar confundir "HEH" con un dígito cinco al final de un año, se usa la forma inicial de "HEH". Sin embargo, no sigue ningún contexto (es decir, una letra de unión) al que pueda unirse la "HEH". El carácter zwj proporciona ese contexto.

Análogamente, en textos persas, hay casos es que una letra que normalmente se uniría a la letra subsiguiente, en escritura cursiva no debería hacerlo. En estos casos se utiliza el carácter zwj para evitar la unión.

Los otros caracteres, lrm y rlm, se usan para forzar la direccionalidad de caracteres de direccionalidad neutral. Por ejemplo, si hay un signo de comillas dobles entre un texto árabe (derecha a izquierda) y otro en latín (izquierda a derecha), la dirección de las comillas no está clara (¿corresponden al texto árabe o al latín?). Los caracteres lrm y rlm tienen propiedad direccional, pero no propiedades de anchura ni de separación de palabras o líneas. Consulte [UNICODE] para más detalles.

Signos de caracteres reflejados. En general, el algoritmo bidireccional no refleja signos de caracteres, sino que los deja intactos. Una excepción a esto son los caracteres tales como los paréntesis (ver [UNICODE], tabla 4-7). En aquellos casos en que se desee reflejar signos, por ejemplo para jeroglíficos egipcios, o en boustrophedon griego, o para efectos especiales de diseño, debería controlarse esto con hojas de estilo.

8.2.6 Efecto de las hojas de estilo en la bidireccionalidad

En general, la utilización de hojas de estilo para cambiar la representación visual de un elemento en bloque a en línea o viceversa no ofrece ninguna dificultad. Sin embargo, debido a que el algoritmo bidireccional se basa en la distinción en línea/en bloque, debe tenerse especial cuidado si se hace esta transformación.

Cuando un elemento en línea que no tiene un atributo dir se transforma mediante una hoja de estilo al estilo de un elemento en bloque, hereda el atributo dir del elemento padre en bloque más cercano que defina la dirección base del bloque.

Cuando un elemento en bloque que no tiene un atributo dir se transforma mediante una hoja de estilo al estilo de un elemento en línea, la presentación resultante debería ser equivalente, en términos de formato de la bidireccionalidad, al formato obtenido añadiendo explícitamente al elemento transformado un atributo dir (igual al valor heredado).