Sommario
Questa sezione delle specifiche esamina due importanti fattori che influenzano l'internazionalizzazione dell'HTML: la determinazione della lingua (l'attributo lang) e la direzione (l'attributo dir) del testo in un documento.
Le informazioni sulla lingua specificate per mezzo dell'attributo lang possono essere utilizzate da un programma utente per controllare la riproduzione [del documento] in una varietà di modi. Le informazioni sulla lingua fornite dall'autore possono essere d'aiuto in alcune situazioni quali:
L'attributo lang specifica la lingua del contenuto dell'elemento e dei valori di attributo; se ciò sia significativo per un dato attributo dipende dalla sintassi e dalla semantica dell'attributo e dall'operazione coinvolta.
Lo scopo dell'attributo lang è di consentire ai programmi utente di riprodurre il contenuto in un modo più significativo, basato sulle consuetudini culturali accettate per una data lingua. Ciò non significa che i programmi utente dovrebbero riprodurre caratteri atipici per una particolare lingua in modi meno significativi; i programmi utente devono fare il massimo sforzo per riprodurre tutti i caratteri, indipendentemente dal valore specificato per mezzo di lang.
Ad esempio, se dei caratteri dell'alfabeto greco compaiono nel mezzo di un testo inglese:
<P><Q lang="en">Her super-powers were the result of γ-radiation,</Q> he explained.</P>
un programma utente (1) dovrebbe tentare di riprodurre il contenuto in inglese in una forma appropriata (es., nel modo di rappresentare le virgolette) e (2) dovrebbe fare il massimo sforzo per riprodurre la lettera γ, anche se non si tratta di un carattere inglese.
Si consulti la sezione sui caratteri non visualizzabili per informazioni correlate.
Il valore dell'attributo lang è un codice di lingua che identifica una lingua naturale parlata, scritta, o altrimenti usata per la comunicazione di informazioni tra le persone. I linguaggi informatici sono esplicitamente esclusi dai codici di lingua.
[RFC1766] definisce e descrive i codici di lingua che devono essere usati nei documenti HTML.
In breve, i codici di lingua consistono di un codice primario e di una serie presumibilmente vuota di sottocodici:
language-code = primary-code ( "-" subcode )*
Ecco, a titolo di esempio, alcuni codici di lingua:
I codici primari di due lettere sono riservati per abbreviazioni di lingua secondo [ISO639]. I codici di due lettere includono fr (francese), de (tedesco), it (italiano), nl (olandese), el (greco), es (spagnolo), pt (portoghese), ar (arabo), he (ebreo), ru (russo), zh (cinese), ja (giapponese), hi (hindi), ur (urdu) e sa (sanscrito).
Si intende che ogni sottocodice di due lettere è un codice di nazione da [ISO3166].
Un elemento eredita le informazioni del codice di lingua in accordo con il seguente ordine di precedenza (dal più alto al più basso):
Content-Language: en-cockney
In questo esempio la lingua primaria del documento è il francese ("fr"). Si dichiara che un paragrafo è in spagnolo ("es"), dopo del quale la lingua primaria ritorna il francese. Il paragrafo successivo contiene una frase incorporata in lingua giapponese ("ja"), dopo la quale la lingua primaria ritorna il francese.
<!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> ...Interpretato come francese... <P lang="es">...Interpretato come spagnolo... <P>...Interpretato di nuovo come francese... <P>...testo in francese interrotto da <EM lang="ja">del testo in giapponese</EM>Il francese ricomincia qui... </BODY> </HTML>
Nel contesto di HTML, un codice di lingua dovrebbe essere interpretato dai programmi utente come una gerarchia di simboli piuttosto che come un simbolo unico. Quando un programma utente regola la riproduzione in accordo con le informazioni sulla lingua (vale a dire mettendo in relazione i codici di lingua dei fogli di stile con i valori di lang), dovrebbe sempre optare per una corrispondenza esatta, ma dovrebbe anche considerare la corrispondenza dei codici primari come sufficiente. Pertanto, se il valore dell'attributo lang è impostato ad "en-US" per l'elemento HTML, un programma utente dovrebbe preferire le informazioni di stile che corrispondono in primo luogo ad "en-US", poi al valore più generale "en".
Nota. Le gerarchie di codici di lingua non garantiscono che tutte le lingue con un prefisso comune saranno comprese da coloro che parlano una o più di quelle lingue. Consentono ad un utente di richiedere questa comunanza quando essa è vera per quell'utente.
Definizioni di attributo
Oltre a specificare la lingua di un documento per mezzo dell'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 del testo di un documento, di una struttura tabellare, ecc. Ciò viene fatto per mezzo dell'attributo dir.
Le specifiche [UNICODE] assegnano una direzionalità ai caratteri e definiscono un (complesso) algoritmo per determinare la corretta direzionalità di un testo. Se un documento non contiene un carattere da-destra-a-sinistra visualizzabile, un programma utente conforme non ha l'obbligo di applicare l'algoritmo bidirezionale [UNICODE]. Se un documento contiene caratteri da-destra-a-sinistra, e il programma utente visualizza questi caratteri, il programma utente deve usare l'algoritmo bidirezionale.
Benché l'Unicode specifichi dei caratteri speciali che agiscono sulla direzione del testo, l'HTML offre costrutti di marcatura a più alto livello che fanno la stessa cosa: l'attributo dir (da non confondere con l'elemento DIR) e l'elemento BDO. Pertanto, per esprimere una citazione in ebraico, è più intuitivo scrivere:
<Q lang="he" dir="rtl">...una citazione in ebraico...</Q>
piuttosto che utilizzare gli equivalenti riferimenti dell'Unicode:
‫״...una citazione in ebraico...״‬
I programmi utente non devono usare l'attributo lang per determinare la direzionalità del testo.
L'attributo dir è ereditato e può essere sovrascritto. Si consulti per dettagli la sezione sull'ereditarietà delle informazioni di direzione del testo.
Il seguente esempio illustra il comportamento previsto per l'algoritmo bidirezionale. Esso coinvolge l'inglese, che ha una scrittura da-sinistra-a-destra, e l'ebraico, che ha una scrittura da-destra-a-sinistra.
Si consideri il seguente testo di esempio:
inglese1 EBRAICO2 inglese3 EBRAICO4 inglese5 EBRAICO6
I caratteri in questo esempio (ed in tutti gli esempi correlati) sono memorizzati nel calcolatore nella stessa sequenza in cui sono visualizzati qui: il primo carattere nel file è "i", il secondo "n" e l'ultimo "6".
Supponiamo che la lingua predominante del documento contenente questo paragrafo sia l'inglese. Ciò significa che la direzione di base è da-sinistra-a-destra. La corretta presentazione di questa riga sarebbe:
inglese1 2OCIARBE inglese3 4OCIARBE inglese5 6OCIARBE <------- <------- <------- E E E ----------------------------------------------------> I
Le linee tratteggiate rappresentano la struttura della frase: l'inglese è predominante e del testo in ebraico è incorporato. Ottenere la corretta presentazione non richiede alcun codice di marcatura supplementare, poiché i frammenti in ebraico sono invertiti correttamente dai programmi utente che applicano l'algoritmo bidirezionale.
Se, al contrario, la lingua predominante del documento è l'ebraico, la direzione di base è da-destra-a-sinistra. La presentazione corretta è perciò:
6OCIARBE inglese5 4OCIARBE inglese3 2OCIARBE inglese1 -------> -------> -------> I I I <---------------------------------------------------- E
In questo caso l'intera frase è stata presentata come da-destra-a-sinistra e le sequenze in inglese incorporate sono state correttamente invertite dall'algoritmo bidirezionale.
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 di 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 di blocco, esso rimane valido per tutta l'estensione dell'elemento e per ogni elemento a livello di blocco annidato. L'impostazione dell'attributo dir per un elemento annidato sovrascrive 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.01//EN" "http://www.w3.org/TR/html4/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-sinistra...</P> </HTML>
Gli elementi in riga, d'altra parte, non ereditano l'attributo dir. Ciò significa che un elemento in riga senza un attributo dir non apre un livello aggiuntivo di inclusione rispetto all'algoritmo bidirezionale. (Qui un elemento è considerato come a livello di blocco o in riga in base alla sua presentazione predefinita. Si noti che gli elementi INS e DEL possono essere a livello di blocco o in riga a seconda del loro contesto.)
L'algoritmo bidirezionale [UNICODE] inverte automaticamente le sequenze di caratteri incluse in accordo con la loro direzionalità ereditata (come illustrato dai precedenti esempi). Tuttavia, può essere risolto in generale un solo livello di inclusione. Per ottenere livelli aggiuntivi di cambiamenti di direzione incorporati, si deve fare uso dell'attributo dir o di un elemento in riga.
Si consideri il medesimo testo di esempio di prima:
inglese1 EBRAICO2 inglese3 EBRAICO4 inglese5 EBRAICO6
Supponiamo che la lingua predominante del documento contenente questo paragrafo sia l'inglese. Inoltre, la suddetta frase in inglese contiene una sezione in ebraico che si estende da EBRAICO2 fino ad EBRAICO4, e la sezione in ebraico contiene una citazione in inglese (inglese3). La presentazione desiderata del testo è perciò:
inglese1 4OCIARBE inglese3 2OCIARBE inglese5 6OCIARBE -------> I <------------------------- E ----------------------------------------------------> I
Per ottenere due cambi di direzione incorporati bisogna fornire delle informazioni aggiuntive, il che viene fatto delimitando esplicitamente la seconda inclusione. In questo esempio, vengono usati l'elemento SPAN e l'attributo dir per contrassegnare il testo:
inglese1 <SPAN dir="RTL">EBRAICO2 inglese3 EBRAICO4</SPAN> inglese5 EBRAICO6
Gli autori possono servirsi anche di speciali caratteri Unicode per ottenere cambi di direzione multipli incorporati. Per ottenere un'inclusione da-sinistra-a-destra, si racchiuda il testo incorporato tra i caratteri LEFT-TO-RIGHT EMBEDDING ("LRE", esadecimale 202A) e POP DIRECTIONAL FORMATTING ("PDF", esadecimale 202C). Per ottenere un'inclusione da-destra-a-sinistra, si racchiuda il testo incorporato tra i caratteri RIGHT-TO-LEFT EMBEDDING ("RTE", esadecimale 202B) e PDF.
Usare codice di marcatura HTML per la direzionalità insieme con caratteri Unicode. Autori e sviluppatori di programmi autoriali dovrebbero essere informati dei conflitti che possono sorgere se l'attributo dir è usato con elementi in riga (compreso BDO) in modo concorrente ai corrispondenti caratteri di formattazione [UNICODE]. È opportuno usare gli uni con esclusione degli altri e viceversa. Il metodo con la marcatura offre una migliore garanzia di integrità strutturale del documento ed attenua alcuni problemi quando si modifica del testo HTML bidirezionale con un semplice editore di testo, ma alcuni software possono essere più adatti all'uso dei caratteri [UNICODE]. Se entrambi i metodi sono adoperati, una grande attenzione dovrebbe essere esercitata per assicurarsi che l'annidamento del codice di marcatura e l'inclusione o l'annullamento della direzionalità siano corretti; in caso contrario i risultati della riproduzione sono imprevedibili.
<!ELEMENT BDO - - (%inline;)* -- annulla I18N BiDi --> <!ATTLIST BDO %coreattrs; -- id, class, style, title -- lang %LanguageCode; #IMPLIED -- codice di lingua -- dir (ltr|rtl) #REQUIRED -- direzionalità -- >
Marcatore iniziale: obbligatorio, marcatore finale: obbligatorio
Definizioni di attributo
Attributi definiti altrove
L'algoritmo bidirezionale e l'attributo dir sono generalmente sufficienti a gestire i cambiamenti di direzione incorporati. Tuttavia, possono sorgere alcune situazioni in cui l'algoritmo bidirezionale dà luogo ad una presentazione non corretta. L'elemento BDO consente agli autori di escludere l'algoritmo bidirezionale per i frammenti di testo selezionati.
Si consideri un documento contenente il medesimo testo di prima:
inglese1 EBRAICO2 inglese3 EBRAICO4 inglese5 EBRAICO6
ma si assuma che questo testo sia già stato disposto nell'ordine visuale [corretto]. Un motivo per questo può essere che lo standard MIME ([RFC2045], [RFC1556]) favorisce l'ordine visuale, cioè che le sequenze di caratteri da-destra-a-sinistra sono inserite nel flusso di byte da-destra-a-sinistra. In un messaggio di posta elettronica, la suddetta stringa potrebbe essere formattata, spazi inclusi, in questo modo:
inglese1 2OCIARBE inglese3 4OCIARBE inglese5 6OCIARBE
Ciò va in conflitto con l'algoritmo bidirezionale [UNICODE], dal momento che tale algoritmo invertirebbe 2OCIARBE, 4OCIARBE e 6OCIARBE una seconda volta, visualizzando le parole in ebraico da-sinistra-a-destra invece che da-destra-a-sinistra.
La soluzione in questo caso è di annullare l'algoritmo bidirezionale, mettendo il brano stralciato dall'e-mail in un elemento PRE (per conservare le interruzioni di riga) ed ogni riga in un elemento BDO con l'attributo dir impostato a LTR:
<PRE> <BDO dir="LTR">inglese1 2OCIARBE inglese3</BDO> <BDO dir="LTR">4OCIARBE inglese5 6OCIARBE</BDO> </PRE>
Questo dice all'algoritmo bidirezionale "Lasciami da-sinistra-a-destra" e produrrebbe la presentazione desiderata:
inglese1 2OCIARBE inglese3 4OCIARBE inglese5 6OCIARBE
L'elemento BDO dovrebbe essere usato in scenari dove è richiesto l'assoluto controllo sull'ordine della sequenza (es., codici di prodotto multi-lingua). L'attributo dir è obbligatorio per questo elemento.
Gli autori possono usare speciali caratteri Unicode per annullare l'algoritmo bidirezionale -- LEFT-TO-RIGHT OVERRIDE (202D) o RIGHT-TO-LEFT OVERRIDE (esadecimale 202E). Il carattere POP DIRECTIONAL FORMATTING (esadecimale 202C) termina l'uno e l'altro annullamento bidirezionale.
Nota. Si ricordi che possono nascere dei conflitti se l'attributo dir è usato con elementi in riga (incluso BDO) in modo concorrente con i corrispondenti caratteri di formattazione [UNICODE].
Bidirezionalità e codifica dei caratteri. Conformemente a [RFC1555] e [RFC1556], vi sono speciali convenzioni per l'uso di valori del parametro "charset" per indicare il trattamento bidirezionale nella posta MIME, in particolare per distinguere tra direzionalità visuale, implicita ed esplicita. Il valore di parametro "ISO-8859-8" (per la lingua ebraica) denota la codifica visuale, "ISO-8859-8-i" denota la bidirezionalità implicita e "ISO-8859-8-e" denota la direzionalità esplicita.
Poiché l'HTML usa l'algoritmo bidirezionale Unicode, i documenti conformi codificati usando ISO-8859-8 devono essere etichettati come "ISO-8859-8-i". Il controllo direzionale esplicito è possibile anche in HTML, ma non può essere espresso per mezzo di ISO-8859-8, così "ISO-8859-8-e" non dovrebbe essere usato.
Il valore "ISO-8859-8" implica che il documento è formattato visualmente, maltrattando un po' di codice di marcatura (come ad esempio TABLE con allineamento a destra e nessuno scorrimento di riga) per assicurare una visualizzazione congrua sui vecchi programmi utente che non gestiscono la bidirezionalità. Tali documenti non sono conformi alle presenti specifiche. Se necessario, essi possono essere resi conformi alle specifiche correnti (e saranno allo stesso tempo visualizzati correttamente con i vecchi programmi utente) con l'aggiunta della marcatura BDO dove necessario. Contrariamente a ciò che è detto in [RFC1555] e [RFC1556], ISO-8859-6 (arabo) non è un ordinamento visuale.
Poiché talvolta sorgono delle ambiguità riguardo alla direzionalità di certi caratteri (es., la punteggiatura), le specifiche [UNICODE] includono caratteri che consentono la loro corretta risoluzione. Inoltre l'Unicode include alcuni caratteri per il controllo del comportamento di giunzione dove questo è necessario (ad es. in alcune situazioni con le lettere arabe). L'HTML include dei riferimenti a caratteri per questi caratteri.
Il seguente stralcio dalla DTD presenta alcune delle entità direzionali:
<!ENTITY zwnj CDATA "‌"--=non-congiuntore di ampiezza zero--> <!ENTITY zwj CDATA "‍"--=congiuntore di ampiezza zero--> <!ENTITY lrm CDATA "‎"--=contrassegno da-sinistra-a-destra--> <!ENTITY rlm CDATA "‏"--=contrassegno da-destra-a-sinistra-->
L'entità zwnj è usata per bloccare il comportamento di giunzione in contesti in cui la giunzione si verificherà ma non dovrebbe. L'entità zwj agisce in modo contrario: forza la giunzione nei casi in cui non si verificherebbe, ma dovrebbe. Ad esempio, la lettera araba "HEH" è usata come abbreviazione di "Hijri", il nome del sistema di calendario islamico. Poiché la forma isolata di "HEH" ha lo stesso aspetto della cifra cinque come impiegata nella scrittura araba (basata sulle cifre Hindi), allo scopo di evitare di confondere "HEH" con una cifra cinque finale in un anno, viene usata la forma iniziale di "HEH". Tuttavia, non c'è un contesto seguente (cioè una lettera di congiunzione) a cui la "HEH" possa unirsi. Il carattere zwj fornisce quel contesto.
Similmente, nei testi persiani vi sono casi in cui una lettera che normalmente si congiungerebbe alla lettera successiva in una scrittura corsiva collegata, non dovrebbe farlo. Il carattere zwnj è usato per bloccare la congiunzione in tali casi.
Gli altri caratteri, lrm e rlm, sono usati per forzare la direzionalità di caratteri direzionalmente neutri. Per esempio, se un segno di doppie virgolette viene a trovarsi tra una lettera araba (da-destra-a-sinistra) ed una latina (da-sinisistra-a-destra), la direzione delle virgolette non è chiara (stanno virgolettando il testo in arabo o il testo in latino?). I caratteri lrm e rlm hanno una proprietà direzionale ma non hanno proprietà di ampiezza né di interruzione di parola/riga. Si consulti [UNICODE] per maggiori dettagli.
Rappresentazioni grafiche di caratteri in forma riflessa. In generale l'algoritmo bidirezionale non rovescia in forma riflessa le rappresentazioni grafiche di caratteri ma le lascia inalterate. Un'eccezione sono i caratteri quali le parentesi (si veda [UNICODE], tabella 4-7). Nei casi in cui si desidera la forma riflessa, ad esempio per i geroglifici egiziani, per la scrittura bustrofedica greca o per particolari effetti di disegno, ciò dovrebbe essere controllato per mezzo degli stili.
In generale, usare i fogli di stile per modificare la riproduzione visuale di un elemento da a livello di blocco a in riga, e viceversa, è semplice. Tuttavia, dal momento che l'algoritmo bidirezionale poggia sulla distinzione tra in riga/a livello di blocco, una particolare attenzione deve essere posta nella trasformazione.
Quando un elemento in riga che non ha un attributo dir è convertito allo stile di un elemento a livello di blocco da un foglio di stile, esso eredita l'attributo dir dall'elemento di blocco che è suo progenitore prossimo, onde definire la direzione di base del blocco.
Quando un elemento di blocco che non ha un attributo dir è convertito allo stile di un elemento in riga da un foglio di stile, la presentazione risultante dovrebbe essere equivalente, in termini di formattazione bidirezionale, alla formattazione ottenuta con l'aggiunta esplicita dell'attributo dir (assegnato il valore ereditato) all'elemento trasformato.