8 Informazioni sulla lingua e la direzione del testo

Argomenti

  1. Specificare la lingua del contenuto: l'attributo lang
    1. Codici di lingua
    2. Ereditarietà dei codici di lingua
    3. Interpretazione dei codici di lingua
  2. Specificare la direzione del testo e delle tabelle: l'attributo dir
    1. Introduzione all'algoritmo bidirezionale
    2. Ereditarietà delle informazioni sulla direzione del testo
    3. Impostare la direzione del testo incorporato
    4. Esclusione dell'algoritmo bidirezionale: l'elemento BDO
    5. Referenze al carattere per il controllo della direzionalità e della giunzione
    6. L'effetto dei fogli di stile sulla bidirezionalità

Questa sezione del documento discute due aspetti importanti che riguardano l'internazionalizzazione di HTML: specificare la lingua (l'attributo lang) e la direzione (l'attributo dir) del testo in un documento.

8.1 Specificare la lingua del contenuto: l'attributo lang

Definizioni degli attributi
lang = language-code [CI]
Questo attributo specifica la lingua di base dei valori di attributo e del contenuto testuale di un elemento. Il valore di predefinito di questo attributo è sconosciuto (unknown).

Le informazioni sulla lingua specificate attraverso l'attributo lang possono essere utilizzate da un interprete HTML per controllare la riproduzione in una varietà di modi. Alcune situazioni in cui le informazioni sulla lingua fornite dall'autore possono essere utili includono:

L'attributo lang specifica la lingua del contenuto dell'elemento e dei valori di attributo; se ciò sia rilevante per un dato attributo dipende dalla sintassi e dalla semantica dell'attributo e dall'operazione coinvolta.

Lo scopo dell'attributo lang è quello di permettere agli interpreti HTML di riprodurre in modo più significativo contenuto basato sulle consuetudini culturali consolidate per una data lingua. Questo non implica che gli interpreti HTML debbano riprodurre caratteri che sono atipici per una particolare lingua in modi meno significativi; gli interpreti HTML devono fare del loro meglio per riprodurre tutti i caratteri, indipendentemente dal valore specificato da lang.

Per esempio, se caratteri dall'alfabeto greco appaiono nel mezzo di testo in italiano:

<P><Q lang="it">I suoi super-poteri erano il risultato di 
radiazioni-γ,</Q> egli spiegò.</P>

un interprete HTML (1) dovrebbe tentare di riprodurre il contenuto in italiano in un modo appropriato (e.g., nella sua gestione delle virgolette) e (2) deve fare del suo meglio per riprodurre γ anche se non è un carattere dell'alfabeto italiano.

Si consulti la sezione sui caratteri non visualizzabili per informazioni associate.

8.1.1 Codici di lingua

Il valore dell'attributo lang è un codice di lingua che identifica una lingua naturale parlata, scritta o comunque utilizzata per la comunicazione di informazioni tra persone. I linguaggi informatici sono esplicitamente esclusi dai codici di lingua.

[RFC1766] definisce e spiega i codici di lingua che devono essere utilizzati nei documenti HTML.

In breve, i codici di lingua (language-code) consistono di un codice primario (primary-code) e di una serie possibilmente vuota di sottocodici (subcode):

        language-code = primary-code ( "-" subcode )*

Ecco alcuni esempi di codici di lingua:

I codici primari a 2 lettere sono riservati per abbreviazioni [ISO639] della lingua. I codici a 2 lettere comprendono fr (francese), de (tedesco), it (italiano), nl (olandese), el (greco), es (spagnolo), pt (portoghese), ar (arabo), he (ebraico), ru (russo), zh (cinese), ja (giapponese), hi (hindi), ur (urdu), e sa (sanscrito).

Ogni sottocodice a 2 lettere è interpretato come un codice [ISO3166] di paese.

8.1.2 Ereditarietà dei codici di lingua

Un elemento eredita le informazioni del codice di lingua secondo il seguente ordine di precedenza (in ordine decrescente di priorità):

In questo esempio, la lingua primaria del documento è il francese ("fr"). Un paragrafo viene dichiarato essere in spagnolo ("es"), dopo di che la lingua primaria riprende ad essere il francese. Il paragrafo seguente include una frase incorporata in giapponese ("ja"), dopo di che la lingua primaria riprende ad essere il francese.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
   "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML lang="fr">
<HEAD>
<TITLE>Un document multilingue</TITLE>
</HEAD>
<BODY>
...Interpretato come francese...
<P lang="es">...Interpretato come spagnolo...
<P>...Interpretato ancora come francese...
<P>...Testo in francese interrotto da <EM lang="ja">una      
         porzione di testo in giapponese</EM>Il francese 
         ricomincia da qui...
</BODY>
</HTML>
Nota. Le celle di una tabella possono ereditare i valori lang non dal proprio predecessore, ma dalla prima cella in un raggruppamento. Si consulti la sezione sull'ereditarietà dell'allineamento per i dettagli.

8.1.3 Interpretazione dei codici di lingua

Nel contesto di HTML, un codice di lingua dovrebbe essere interpretato dagli interpreti HTML come una gerarchia di termini piuttosto che come un termine unico. Quando un interprete HTML adatta la riproduzione in base alle informazioni sulla lingua (per esempio, confrontando i codici di lingua dei fogli di stile e i valori lang), dovrebbe sempre prediligere una corrispondenza esatta, ma dovrebbe considerare anche la corrispondenza dei codici primari come sufficiente. Perciò, se il valore dell'attributo lang è impostato a "en-US" per l'elemento HTML, un interprete HTML dovrebbe prediligere informazioni di stile che corrispondano prima a "en-US", e poi al valore più generale "en".

Nota. Le gerarchie dei codici di lingua non garantiscono che tutte le lingue con un prefisso comune possano essere comprese da coloro che sono fluenti in una o più di quelle lingue. Esse di fatto permettono ad un utente di richiedere questa comunanza quando essa sia vera per quell'utente.

8.2 Specificare la direzione del testo e delle tabelle: l'attributo dir

Definizioni degli attributi

dir = LTR | RTL [CI]
Questo attributo specifica la direzione di base del testo direzionalmente neutro (ovverosia, testo che non ha direzionalità inerente secondo la definizione [UNICODE]) e la direzionalità delle tabelle. Valori possibili:
  • LTR: (Left-to-Right) testo o tabella da-sinistra-a-destra.
  • RTL: (Right-to-left) testo o tabella da-destra-a-sinistra.

Oltre a specificare la lingua di un documento tramite l'attributo lang, gli autori possono avere la necessità di specificare la direzionalità di base (da-sinistra-a-destra o da-destra-a-sinistra) di porzioni di un testo di documento, di una struttura tabellare, ecc. Questo viene fatto tramite l'attributo dir.

Le Specifiche [UNICODE] assegnano direzionalità ai caratteri e definiscono un (complesso) algoritmo per determinare la corretta direzionalità del testo. Se un documento non contiene un carattere da-destra-a-sinistra visualizzabile, un interprete HTML conforme non è obbligato ad applicare l'algoritmo bidirezionale [UNICODE]. Se un documento contiene caratteri da-destra-a-sinistra, e se l'interprete HTML visualizza questi caratteri, l'interprete HTML deve utilizzare l'algoritmo bidirezionale.

Sebbene l'Unicode specifichi caratteri speciali che gestiscono la direzione del testo, HTML offre costrutti di marcatura di livello più elevato per fare la stessa cosa: l'attributo dir (da non confondere con l'elemento DIR) e l'elemento BDO. Quindi per esprimere una citazione in lingua ebraica, è più intuitivo scrivere


<Q lang="he" dir="rtl">...una citazione in lingua ebraica...</Q>

piuttosto che la forma equivalente che utilizza le denotazioni Unicode:


&#x202B;&#x05F4;...una citazione ...&#x05F4;&#x202C;

Gli interpreti HTML non devono utilizzare l'attributo lang per determinare la direzionalità del testo.

L'attributo dir è ereditato e può essere scavalcato. Si consulti la sezione sull'ereditarietà dell'informazione sulla direzione del testo per i dettagli.

8.2.1 Introduzione all'algoritmo bidirezionale

L'esempio seguente illustra il comportamento previsto per l'algoritmo bidirezionale. Include l'inglese, una scrittura da-sinistra-a-destra, e l'ebraico, una scrittura da-destra-a-sinistra.

Si consideri il seguente testo di esempio:

  english1 HEBREW2 english3 HEBREW4 english5 HEBREW6

I caratteri in questo esempio (e in tutti gli esempi connessi) sono memorizzati nel computer nel modo in cui sono qui mostrati: il primo carattere nel file è "e", il secondo è "n", e l'ultimo è "6".

Si supponga che la lingua predominante del documento contenente questo paragrafo sia l'inglese. Questo significa che la direzione di base è da-sinistra-a-destra. La corretta presentazione di questa riga sarebbe:

english1 2WERBEH english3 4WERBEH english5 6WERBEH
         <------          <------          <------
            H                H                H
------------------------------------------------->
                       E

Le linee tratteggiate indicano la struttura della frase: l'inglese predomina ed è incorporato del testo ebraico. Ottenere la corretta presentazione non richiede alcuna marcatura addizionale dato che i frammenti in ebraico sono rovesciati correttamente dagli interpreti HTML che applicano l'algoritmo bidirezionale.

Se, d'altra parte, la lingua predominante del documento è l'ebraico, la direzione di base è da-destra-a-sinstra. La corretta presentazione è perciò:

6WERBEH english5 4WERBEH english3 2WERBEH english1
        ------->         ------->         ------->
            E                E                E
<-------------------------------------------------
                       H

In questo caso, l'intera frase è stata presentata come da-destra-a-sinistra e le sequenze in inglese incorporate sono state appropriatamente rovesciate dall'algoritmo bidirezionale.

8.2.2 Ereditarietà delle informazioni sulla direzione del testo

L'algoritmo bidirezionale Unicode richiede una direzione di base del testo per i blocchi di testo. Per specificare la direzione di base di un elemento a livello del blocco, si imposti l'attributo dir dell'elemento. Il valore predefinito dell'attributo dir è "ltr" (testo da-sinistra-a-destra).

Quando l'attributo dir è impostato per un elemento a livello del blocco, esso rimane operante per la durata dell'elemento e per ogni elemento a livello del blocco annidato. Impostare l'attributo dir in un elemento annidato scavalca il valore ereditato.

Per impostare la direzione di base del testo per un intero documento, si imposti l'attributo dir nell'elemento HTML.

Per esempio:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
   "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML dir="RTL">
<HEAD>
<TITLE>...un titolo da-destra-a-sinistra...</TITLE>
</HEAD>
...testo da-destra-a-sinistra...
<P dir="ltr">...testo da-sinistra-a-destra...</P>
<P>...ancora testo da-destra-a-sinsitra...</P>
</HTML>

Gli elementi in linea, d'altra parte, non ereditano l'attributo dir. Questo significa che un elemento in linea senza un attributo dir non apre un livello aggiuntivo di incorporamento in relazione all'algoritmo bidirezionale. (Qui, un elemento è considerato a livello del blocco o in linea in base alla sua presentazione predefinita. Si noti che gli elementi INS e DEL possono essere a livello del blocco o in linea a seconda del loro contesto.)

8.2.3 Impostare la direzione del testo incorporato

L'algoritmo bidirezionale [UNICODE] rovescia automaticamente le sequenze di caratteri incorporate in accordo alla loro inerente direzionalità (come illustrato dagli esempi precedenti). Comunque, in generale solo un livello di incorporamento può essere risolto. Per ottenere livelli ulteriori di cambi di direzione incorporati si deve far uso dell'attributo dir in un elemento in linea.

Si consideri lo stesso testo di esempio di prima:

english1 HEBREW2 english3 HEBREW4 english5 HEBREW6

Si supponga che la lingua predominante del documento contenente questo paragrafo sia l'inglese. Inoltre, la precedente frase in inglese contiene una porzione in ebraico che si estende da HEBREW2 ad HEBREW4 e la porzione in ebraico contiene una citazione in inglese (english3). La presentazione desiderata del testo è quindi:

english1 4WERBEH english3 2WERBEH english5 6WERBEH
                 ------->
                    E
         <-----------------------
                    H
------------------------------------------------->
                    E

Per ottenere due cambi di direzione incorporati, si deve fornire informazione aggiuntiva, il che viene fatto delimitando il secondo incorporamento in maniera esplicita. In questo esempio, si usa l'elemento SPAN e l'attributo dir per marcare il testo:

english1 <SPAN dir="RTL">HEBREW2 english3 HEBREW4</SPAN> english5 HEBREW6

Gli autori possono utilizzare anche caratteri speciali Unicode per ottenere cambi di direzione incorporati multipli. Per ottenere un incorporamento da-sinistra-a-destra, si circoscriva il testo incorporato con i caratteri LEFT-TO-RIGHT EMBEDDING ("LRE", valore esadecimale 202A) e POP DIRECTIONAL FORMATTING ("PDF", valore esadecimale 202C). Per ottenere un incorporamento da destra-a-sinistra, si circoscriva il testo incorporato con i caratteri RIGHT-TO-LEFT EMBEDDING ("RTE", valore esadecimale 202B) e PDF.

Utilizzare la marcatura HTML di direzionalità con i caratteri Unicode. Gli autori e i progettisti di software per l'authoring dovrebbere essere consapevoli che possono sorgere conflitti se l'attributo dir è usato in elementi in linea (incluso BDO) simultaneamente ai corrispondenti caratteri [UNICODE] di formattazione. Preferibilmente si dovrebbero impiegare o l'uno o gli altri in maniera esclusiva. Il metodo che utilizza la marcatura offre una migliore garanzia di integrità strutturale del documento ed allevia alcuni problemi quando si compone testo HTML bidirezionale con un semplice editore di testo, ma qualche software potrebbe essere più adatto all'uso di caratteri [UNICODE]. Se vengono utilizzati entrambi i metodi, si deve porre particolare cura nell'assicurare un corretto annidamento di marcatura e di incorporamento o scavalcamento direzionale, altrimenti i risultati della riproduzione sono imprevedibili.

8.2.4 Esclusione dell'algoritmo bidirezionale: l'elemento BDO

<!ELEMENT BDO - - (%inline;)*          -- esclusione di I18N BiDi -->
<!ATTLIST BDO
  %coreattrs;                          -- attributi id, class, style, title --
  lang        %LanguageCode; #IMPLIED  -- codice di lingua --
  dir         (ltr|rtl)      #REQUIRED -- direzionalità --
  >

Tag di inizio: obbligatorio, Tag di fine: obbligatorio

Definizioni degli attributi

dir = LTR | RTL [CI]
Questo attributo obbligatorio specifica la direzione di base del contenuto testuale dell'elemento. Questa direzione scavalca la direzionalità inerente dei caratteri come definita in [UNICODE]. Valori possibili:
  • LTR: testo da-sinistra-a-destra .
  • RTL: testo da-destra-a-sinistra.

Attributi definiti altrove

L'algoritmo bidirezionale e l'attributo dir generalmente sono sufficienti per gestire i cambi di direzione incorporati. Comunque, si posso verificare alcune situazioni in cui l'algoritmo bidirezionale si risolve in presentazioni non corrette. L'elemento BDO permette agli autori di disattivare l'algoritmo bidirezionale per selezionati frammenti di testo.

Si consideri un documento contenente lo stesso testo di prima:

english1 HEBREW2 english3 HEBREW4 english5 HEBREW6

ma si assuma che questo testo sia già stato disposto nell'ordine visuale. Una ragione per questo può essere che lo standard MIME ([RFC2045], [RFC1556]) predilige l'ordine visuale, ovverosia, che le sequenze di caratteri da-destra-a-sinistra vengono inserite da-destra-a-sinistra nel flusso di byte. In un messaggio di posta elettronica, l'esempio sopra riportato potrebbe essere formattato, incluse le interruzioni di riga, come:

english1 2WERBEH english3
4WERBEH english5 6WERBEH

Questo è in contrasto con l'algoritmo bidirezionale [UNICODE], perché quell'algoritmo invertirebbe 2WERBEH, 4WERBEH, e 6WERBEH una seconda volta, mostrando le parole ebraiche da-sinistra-a-destra invece che da-destra-a-sinistra.

La soluzione in questo caso è escludere l'algoritmo bidirezionale mettendo lo stralcio del messaggio di pota elettronica in un elemento PRE (per conservare le interruzioni di riga) e mettendo ciascuna riga in un elemento BDO il cui attributo dir è impostato a LTR:

<PRE>
<BDO dir="LTR">english1 2WERBEH english3</BDO>
<BDO dir="LTR">4WERBEH english5 6WERBEH</BDO>
</PRE>

Questo dice all'algoritmo bidirezionale "Lasciami da-sinistra-a-destra!" e produrrebbe la presentazione desiderata:

english1 2WERBEH english3
4WERBEH english5 6WERBEH

L'elemento BDO dovrebbe essere utilizzato negli scenari in cui è richiesto un controllo assoluto sull'ordine di sequenza (ad es., codici di prodotti multi-lingua). L'attributo dir è obbligatorio per questo elemento.

Gli autori possono anche usare caratteri Unicode speciali per escludere l'algoritmo bidirezionale -- LEFT-TO-RIGHT OVERRIDE (202D) o RIGHT-TO-LEFT OVERRIDE (esadecimale 202E). Il carattere POP DIRECTIONAL FORMATTING (esadecimale 202C) termina tutti e due le esclusioni bidirezionali.

Nota. Si ricordi che possono sorgere conflitti se l'attributo dir viene usato negli elementi in linea (incluso BDO) simultaneamente ai corrispondenti caratteri [UNICODE] di formattazione.

Bidirezionalità e codifica dei caratteri Secondo[RFC1555] e [RFC1556], ci sono convenzioni speciali per l'utilizzazione dei valori del parametro "charset" per indicare un trattamento bidirezionale nella posta MIME, in particolare per distinguere fra direzionalità visuale, implicita ed esplicita. Il valore di parametro "ISO-8859-8" (per l'ebraico) denota codifica visuale, "ISO-8859-8-i" denota bidirezionalità implicita, e "ISO-8859-8-e" denota bidirezionalità esplicita.

Poiché HTML usa l'algoritmo di bidirezionalità Unicode, i documenti conformi codificati utilizzando l'ISO 8859-8 devono essere etichettati come "ISO-8859-8-i". Un controllo direzionale esplicito è possibile anche con HTML, ma non può essere espresso con ISO 8859-8, perciò "ISO-8859-8-e" non dovrebbe essere utilizzato.

Il valore "ISO-8859-8" implica che il documento è formattato in modo visuale, abusando di alcune marcature (quali TABLE con allineamento a destra e senza ritorno a capo automatico a fine riga) per assicurare una ragionevole visualizzazione sugli interpreti HTML più vecchi che non gestiscono la bidirezionalità. Questi documenti non sono conformi alle presenti Specifiche. Se necessario, possono essere resi conformi alle presenti Specifiche (e allo stesso tempo sarebbero visualizzati correttamente sugli interpreti HTML più vecchi) aggiungendo la marcatura BDO dove necessario. Contrariamente a quanto viene detto in [RFC1555] e in [RFC1556], ISO-8859-6 (arabo) non è un ordinamento visuale.

8.2.5 Referenze al carattere per il controllo della direzionalità e della giunzione

Poiché a volte sorgono ambiguità circa la direzionalità di alcuni caratteri (e.g., la punteggiatura), le Specifiche[UNICODE] includono caratteri per consentire la loro appropriata risoluzione. Inoltre, Unicode include alcuni caratteri per controllare il comportamento di giunzione dove questo è necessario (e.g., alcune situazioni con le lettere arabe). HTML 4.0 include referenze al carattere per questi caratteri.

Il seguente stralcio di DTD presenta alcune delle entità direzionali:

   <!ENTITY zwnj CDATA "&#8204;"--=carattere non-congiungente di ampiezza zero-->
   <!ENTITY zwj  CDATA "&#8205;"--=carattere congiungente di ampiezza zero-->
   <!ENTITY lrm  CDATA "&#8206;"--=indicatore direzione da-sinistra-a-destra-->
   <!ENTITY rlm  CDATA "&#8207;"--=indicatore direzione da-destra-a-sinistra-->

L'entità zwnj è utilizzata per bloccare il comportamento di giunzione nei contesti in cui la giunzione si verificherebbe ma non dovrebbe. L'entità zwj fa l'opposto; forza la giunzione dove non si verificherebbe ma dovrebbe. Per esempio, la lettera araba "HEH" è usata per abbreviare "Hijri", il nome del sistema di calendario islamico. Poiché la forma isolata di "HEH" ha l'apparenza della cifra cinque come è impiegata nella scrittura araba (basata su cifre Indo), per prevenire la confusione di "HEH" con una cifra cinque terminale in un anno, viene utilizza la forma iniziale di "HEH". Tuttavia non c'è un contesto seguente (ovverosia, una lettera di giunzione) al quale la "HEH" può congiungersi. Il carattere zwj fornisce tale contesto.

Analogamente, nei testi persiani vi sono casi in cui una lettera, che normalmente si congiungerebbero a quella seguente, in una connessione corsiva non dovrebbe farlo. Il carattere zwnj viene utilizzato per impedire la giunzione in tali casi.

Gli altri caratteri, lrm e rlm, vengono utilizzati per forzare la direzionalità dei caratteri direzionalmente neutri. Per esempio, se un segno di doppie virgolette si trova tra una lettera araba (da-destra-a-sinistra) ed una latina (da-sinistra-a-destra), la direzione delle virgolette non è chiara (si sta virgolettando il testo arabo o quello latino?). I caratteri lrm e rlm possiedono una proprietà direzionale ma non hanno proprietà di ampiezza e di interruzione di parole/righe. Si consulti [UNICODE] per maggiori dettagli.

Glifi di carattere riflessi. In generale, l'algoritmo bidirezionale non produce immagini riflesse dei glifi di carattere ma li lascia intatti. Un'eccezione sono i caratteri quali le parentesi (si veda [UNICODE], tabella 4-7). Nei casi in cui si desidera produrre immagini riflesse, per esempio per i geroglifici egiziani, i bustrofedici greci, o effetti di disegno speciali, ciò dovrebbe essere controllato tramite gli stili.

8.2.6 L'effetto dei fogli di stile sulla bidirezionalità

In generale, usare fogli di stile per cambiare la riproduzione visuale di un elemento da livello blocco a in linea, o viceversa, è immediato. Comunque, poiché l'algoritmo bidirezionale si basa sulla distinzione in linea/a livello blocco, si deve fare particolare attenzione durante la trasformazione.

Quando un elemento in linea che non ha un attributo dir viene trasformato nello stile di un elemento a livello del blocco da un foglio di stile, esso eredita l'attributo dir dall'elemento di tipo blocco suo più immediato progenitore per definire la direzione di base del blocco.

Quando un elemento di tipo blocco che non possiede un attributo dir viene trasformato nello stile di un elemento in linea da un foglio di stile, la presentazione risultante dovrebbe essere equivalente, in termini di formattazione bidirezionale, alla formattazione ottenuta aggiungendo esplicitamente un attributo dir (assegnato col valore ereditato) all'elemento trasformato.