8 Informazioni sulla lingua e sulla 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à dell'informazione sulla direzione del testo
    3. Impostare la direzione del testo incorporato
    4. Scavalcare l'algoritmo bidirezionale: l'elemento BDO
    5. Riferimenti ai caratteri per la direzionalità e il controllo d'unione
    6. L'effetto dei fogli di stile sulla bidirezionalità

Questa sezione del documento tratta due importanti argomenti 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]
Queto attributo specifica la lingua di base dei valori di attributo per un elemento e del contenuto testuale. Il valore predefinito di questo attributo è "sconosciuto".

Informazioni sulla lingua specificate attraverso l'attributo lang possono essere utilizzate da un interprete per controllare la visualizzazione 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 sia rilevante per un dato attributo dipende dalla sintassi e dalla semantica dell'attributo e dall'operazione interessata.

L'intento dell'attributo lang è quello di permettere agli interpreti di visualizzare contenuti più significativi basati sulla pratica culturale consolidata per una data lingua. Questo non implica che gli interpreti debbano rendere caratteri che siano atipici per una particolare lingua in modi meno significativi; gli interpreti devono fare del loro meglio per rendere tutti i caratteri, senza badare al valore specificato da lang.

Per esempio, se i caratteri dall'alfabeto greco appaiono nel bel mezzo di un testo in inglese:

<P><Q lang="en">I suoi super-poteri erano il risultato di 
radiazioni-&gamma;,</Q> egli spiegò.</P>

un interprete (1) dovrebbe tentare di rendere il contenuto inglese in un modo appropriato (ad es., nella sua gestione delle virgolette) e (2) deve fare del suo meglio per rendere γ anche se non è un carattere inglese.

Si prega di consultare il paragrafo sui caratteri non visualizzabili per le informazioni correlate.

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 e l'informazione 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 consistono in un codice primario e in eventuali serie vuote di sottocodici:

        language-code = codice-primario ( "-" sottocodice )*

Qui ci sono alcuni esempi di codici di lingua:

I codici primari biletterali sono riservati per le abbreviazioni di lingua [ISO639]. I codici biletterali 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).

Qualsiasi sottocodice biletterale si intende essere un codice di paese [ISO3166].

8.1.2 Ereditarietà dei codici di lingua

Un elemento eredita l'informazione sul codice di lingua in accordo al seguente ordine di precedenza (dalla più alta alla più bassa):

In questo esempio, la lingua primaria del documento è il francese ("fr"). Un paragrafo è stato dichiarato essere in spagnolo ("es"), dopo di questo la lingua primaria torna ad essere il francese. Il seguente paragrafo include una frase giapponese ("ja") incorporata, dopo di questa la lingua primaria torna 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 francese interrotto da <EM lang="ja">un po' di 
         giapponese</EM>il francese ricomincia qui...
</BODY>
</HTML>
Nota. Le celle di tabella possono ereditare i valori lang non quella precedente, ma dalla prima in uno span. Si prega di consultare il paragrafo 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 considerato dall'interprete come una gerarchia di segnali piuttosto che come un singolo segnale. Quando un interprete aggiusta la visualizzazione per accordarsi all'informazione sulla lingua (diciamo, comparando i codici lingua dei fogli di stile con i valori lang), dovrebbe sempre preferire un riscontro esatto, ma dovrebbe anche considerare sufficiente la corrispondenza dei codici primari. Così, se il valore dell'attributo lang per "en-US" è impostato per l'elemento HTML, un interprete dovrebbe preferire informazioni di stile che corrispondano prima a "en-US", e poi al valore più generico "en".

Nota. Le gerarchie dei codici di lingua non garantiscono che tutti gli idiomi con un prefisso comune saranno intesi da quelli correnti in uno o più di quelle lingue. Essi permettono ad un utente di richiedere questa comunanza quando 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 di un testo direzionalmente neutrale (cioè, testo che non ha ereditato direzionalità come definita nella [UNICODE]) e nella direzionalità delle tabelle. Possibili valori:
  • LTR: testo o tabella da-sinistra-a-destra.
  • RTL: testo o tabella da-destra-a-sinistra.

In aggiunta allo specificare la lingua di un documento con l'attributo lang, gli autori possono aver necessità di specificare la direzionalità di base (da-sinistra-a-destra o da-destra-a-sinistra) di porzioni di testo di un documento, di una struttura tabellare, etc. Ciò viene fatto con l'attributo dir.

La specifica [UNICODE] assegna direzionalità ai caratteri e definisce un (complesso) algoritmo per determinare la direzionalità appropriata del testo. Se un documento non contiene un carattere da-destra-a-sinistra visualizzabile, un interprete conforme non è obbligato ad applicare l'algoritmo bidirezionale di [UNICODE]. Se un documento contiene caratteri da-destra-a-sinistra, e se l'interprete visualizza questi caratteri, l'interprete deve utilizzare l'algoritmo bidirezionale.

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

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

piuttosto che utilizzare i corrispondenti Unicode:

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

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

L'attributo dir è ereditato e può essere scavalcato. Si prega di consultare il paragrafo sull'ereditarietà dell'informazione sulla direzione del testo per i dettagli.

8.2.1 Introduzione all'algoritmo bidirezionale

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

Considerare il testo dell'esempio appresso:

  english1 HEBREW2 english3 HEBREW4 english5 HEBREW6

I caratteri in questo esempio (e in tutti gli esempi relativi) sono immagazzinati nel computer nel modo in cui sono visualizzati qui: il primo carattere nella riga è la "e", il secondo la "n", e l'ultimo il "6".

Supporre che la lingua dominante del documento che contiene questo paragrafo sia l'inglese. Ciò significa che la direzione di base è da-sinistra-a-destra. La presentazione corretta 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 un po' di testo ebraico. Per ottenere la corretta presentazione non occorre nessuna marcatura addizionale dal momento che i frammenti ebraici sono correttamente rovesciati dagli interpreti che applicano l'algoritmo bidirezionale.

Se, d'altro canto, la lingua dominante del documento fosse l'ebraico, la direzione di base sarebbe da-destra-a-sinsitra. La corretta presentazione perciò sarebbe:

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 incorporate in inglese sono state appropriatamente rovesciate dall'algoritmo bidirezionale.

8.2.2 Ereditarietà dell'informazione sulla direzione del testo

L'algoritmo bidirezionale Unicode richiede una direzione testuale di base per blocchi di testo. Per specificare la direzione di base di un elemento a livello blocco, impostare 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 blocco, rimane operante per tutta la durata dell'elemento e per tutti gli elementi a livello blocco annidati. Impostando l'attributo dir in un elemento annidato si scavalca il valore ereditato.

Per impostare la direzione testuale di base per un intero documento, porre l'attributo dir sull'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>...di nuovo testo da-destra-a-sinsitra...</P>
</HTML>

Elementi in linea, dall'altro lato, non ereditano l'attributo dir. Ciò significa che un elemento in linea senza un attributo dir non apre un livello aggiuntivo di incorporamento rispetto all'algoritmo bidirezionale. (Qui, un elemento viene considerato a livello blocco o in linea in base alla sua presentazione predefinita. Notare che gli elementi INS e DEL possono essere a livello 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 incorporati in accordo alla loro direzionalità ereditata (come illustrato dagli esempi precedenti). Comunque, in generale solo un livello di incorporamento può essere preso in considerazione. Per ottenere livelli aggiuntivi di cambi direzionali d'incorporamento dovete far uso dell'attributo dir in un elemento in linea.

Considerare lo stesso esempio testuale di prima:

english1 HEBREW2 english3 HEBREW4 english5 HEBREW6

Supporre che la lingua dominante del documento che contiene il paragrafo sia l'inglese. Inoltre, la suddetta frase in inglese contiene una sezione in ebraico che si estende da HEBREW2 fino a HEBREW4 e la sezione in ebraico contiene una citazione in inglese (english3). La presentazione desiderata del testo è questa:

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

Per ottenere due cambi di direzione incorporati, dobbiamo fornire informazioni addizionali, che otteniamo delimitando esplicitamente il secondo incorporamento. In questo esempio, usiamo l'elemento SPAN e l'attributo dir per marcare il testo:

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

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

Utilizzare i marcatori HTML di direzionalità con caratteri Unicode. Gli autori e i progettisti di software di authoring dovrebbere badare al fatto che possono sorgere conflitti se l'attributo dir è utilizzato in elementi in linea (compreso BDO) in simultanea con i corrispondenti caratteri d'impaginazione [UNICODE]. Dovrebbero essere impiegati preferibilmente l'uno o l'altro in maniera esclusiva. Il metodo di marcatura offre una migliore garanzia di integrità strutturale del documento e allevia alcuni problemi quando si compone del testo HTML bidirezionale con un editor di solo testo, ma qualche software potrebbe essere più agevolato nell'impiego di caratteri [UNICODE]. Se entrambi i metodi vengono utilizzati, grande cura dovrebbe essere posta nell'assicurare un corretto annidamento della marcatura e dell'incorporamento direzionale oppure scavalcarli, altrimenti i risultati di visualizzazione sono imprevedibili.

8.2.4 Scavalcare l'algoritmo bidirezionale: l'elemento BDO

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

Tag iniziale: richiesto, Tag finale: richiesto

Definizioni degli attributi

dir = LTR | RTL [CI]
Questo attributo obbligatorio specifica la direzione di base del contenuto testuale dell'elemento. Questa direzione scavalca l'inerente direzionalità dei caratteri come definiti 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 bastano per gestire i cambi di direzione incorporati. Comunque, possono verificarsi alcune situazioni in cui l'algoritmo bidirezionale si risolve in visualizzazioni scorrette. L'elemento BDO permette agli autori di sovrapporre l'algoritmo bidirezionale per frammenti selezionati di testo.

Considerare un documento contenente lo stesso testo di prima:

english1 HEBREW2 english3 HEBREW4 english5 HEBREW6

ma supponete che questo testo sia stato già messo in ordine visuale. Una ragione per ciò potrebbe essere che lo standard MIME ([RFC2045], [RFC1556]) favorisce l'ordine visuale, cioè, che le sequenze di caratteri da-destra-a-sinistra siano inserite da-destra-a-sinistra nel flusso di byte. In una e-mail, quanto sopra riportato potrebbe essere ricomposto, comprese le interruzioni di riga, così:

english1 2WERBEH english3
4WERBEH english5 6WERBEH

Questo entra in conflitto con l'algoritmo bidirezionale [UNICODE], perché quell'algoritmo dovrebbe invertire 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 è scavalcare l'algoritmo bidirezionale mettendo lo stralcio e-mail in un elemento PRE (per conservare le interruzioni di riga) e ciascuna riga in un elemento BDO, il cui attributo dir è impostato su 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 produrrà la presentazione desiderata:

english1 2WERBEH english3
4WERBEH english5 6WERBEH

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

Gli autori possono anche impiegare i caratteri speciali Unicode per scavalcare l'algoritmo bidirezionale -- LEFT-TO-RIGHT OVERRIDE (202D) o RIGHT-TO-LEFT OVERRIDE (esadecimale 202E). Il carattere POP DIRECTIONAL FORMATTING (esadecimale 202C) termina entrambe le imposizioni bidirezionali.

Nota. Ricordare che possono sorgere conflitti se l'attributo dir è utilizzato su elementi in linea (compreso BDO) in contemporanea con i corrispondenti caratteri d'impaginazione [UNICODE].

Bidirezionalità e codifica di carattere In accordo a [RFC1555] e a [RFC1556], esistono speciali convenzioni per l'uso di valori di 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) determina codifica visuale, "ISO-8859-8-i" determina bidirezionalità implicita, e "ISO-8859-8-e" determina bidirezionalità esplicita.

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

Il valore "ISO-8859-8" implica che il documento è strutturato visivamente, disimpiegando alcune marcature (come TABLE con allineamento a destra e nessuna interruzione di riga) per assicurare una visualizzazione razionale su interpreti precedenti che non gestiscono la bidirezionalità. Questi documenti non sono conformi alle presenti specifiche. Se necessario, possono essere modificati per conformarsi alle presenti specifiche (e allo stesso tempo visualizzando correttamente sugli interpreti precedenti) tramite l'aggiunta di marcatura BDO dove necessaria. Contrariamente a ciò che si dice in [RFC1555] e in [RFC1556], ISO-8859-6 (arabo) non è un ordinamento visuale.

8.2.5 Riferimenti ai caratteri per la direzionalità e il controllo d'unione

Poiché a volte sorgono ambiguità sulla direzionalità di certi caratteri (ad es., la punteggiatura), la specifica [UNICODE] include dei caratteri per abilitare la propria risoluzione. Inoltre, Unicode include alcuni caratteri per controllare il comportamento dell'unione dove questa sia necessaria (ad es., alcune situazioni con le lettere arabe). HTML 4.0 include riferimenti ai caratteri per questi caratteri.

Il seguente stralcio di DTD presenta alcune entità direzionali:

   <!ENTITY zwnj CDATA "&#8204;"--=larghezza zero non-unente-->
   <!ENTITY zwj  CDATA "&#8205;"--=larghezza zero unente-->
   <!ENTITY lrm  CDATA "&#8206;"--=segno da-sinistra-a-destra-->
   <!ENTITY rlm  CDATA "&#8207;"--=segno da-destra-a-sinistra-->

L'entità zwnj è utilizzata per bloccare l'unione in contesti in cui l'unione ricorre ma non dovrebbe. L'entità zwj fa l'opposto; forza l'unione dove non ricorre ma dovrebbe. Per esempio, la lettera araba "HEH" è usata per abbreviare "Hijri", il nome del sistema del calendario islamico. Poiché la forma isolata di "HEH" sembra la cifra cinque per com'è impiegata nella scrittura araba (basata su cifre indiane), per prevenire la confusione di "HEH" come una cifra cinque alla fine di un anno, si utilizza la forma iniziale di "HEH". Comunque, non c'è contesto seguente (cioè, una lettera che unisce) al quale la "HEH" può unirsi. Il carattere zwj fornisce quel contesto.

In maniera simile, nei testi persiani, ci sono casi in cui una lettera che normalmente si unirebbe a quella seguente in una connessione corsiva non dovrebbe farlo. Si utilizza il carattere zwnj per impedire l'unione in tali casi.

Gli altri caratteri, lrm e rlm, si impiegano per forzare la direzionalità di caratteri neutrali ad essa. Per esempio, se delle doppie virgolette si pongono 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 nessuna larghezza e nessuna proprietà di interruzione di riga. Si prega di consultare [UNICODE] per maggiori dettagli.

I glifi di caratteri rovesciati. In generale, l'algoritmo bidirezionale non rovescia i glifi dei caratteri ma li lascia intatti. Un'eccezione sono i caratteri come le parentesi (vedere [UNICODE], tabella 4-7). In casi in cui si desidera il rovesciamento, per esempio per i geroglifici egiziani, i bustrofedici greci, o effetti di disegno speciali, ciò dovrebbe essere controllato con gli stili.

8.2.6 L'effetto dei fogli di stile sulla bidirezionalità

In generale, impiegando i fogli di stile per cambiare la resa visiva di un elemento da livello blocco a in linea o viceversa è semplice. Comunque, poiché l'algoritmo bidirezionale si basa sulla distinzione in linea/a livello blocco, dev'essere posta una cura speciale durante la trasformazione.

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

Quando un elemento di blocco che non possiede un attributo dir viene trasformato nello stile di un elemento in linea da un foglio di stile, la presentazione che ne risulta dovrebbe essere equivalente, in termini di composizione bidirezionale, alla composizione ottenuta dall'aggiunta esplicita di un attributo dir (assegnato il valore ereditato) all'elemento trasformato.