Dichiarare il linguaggio in HTML

Domanda

Come dovrei impostare la lingua del contenuto della mia pagina HTML?

Risposta rapida

Usa sempre un attributo di lingua sul tag html per dichiarare la lingua predefinita del testo nella pagina. Quando la pagina contiene contenuti in un'altra lingua, aggiungi un attributo di lingua a un elemento che circonda quel contenuto.

Usa l'attributo lang per le pagine servite come HTML, e l'attributo xml:lang per le pagine servite come XML. Per i documenti poliglotti XHTML 1.x e HTML5, utilizza entrambi allo stesso tempo.

Utilizza i tag di lingua dal file IANA Language Subtag Registry. Puoi trovare i sottotag usando lo strumento non ufficiale Language Subtag Lookup tool.

Utilizza elementi innestati per occuparti del contenuto e attribuire valori che sono in lingue diverse allo stesso elemento.

Dettagli

Le basi

Usa sempre un attributo di lingua sull'elemento html. Questo è ereditato da tutti gli altri elementi, e quindi imposterà un linguaggio predefinito per il testo nell'elemento head documento.

Tieni in conto che dovresti usare l'elemento html piuttosto che l'elemento body, poiché l'elemento body non copre il testo all'interno dell'elemento head del documento.

Se hai un contenuto nella pagina in una lingua diversa da quella dichiarata nell'elemento html, usa gli attributi della lingua sugli elementi che circondano quel contenuto. Questo ti permetterà di eseguire uno stile o un'elaborazione diversa.

In alcune parti del codice potrebbe esserci un problema. Se hai un testo multilingue nell'elemento title, non puoi marcare parti del testo per lingue diverse perché l'attributo title permette solo caratteri - nessun markup. Lo stesso vale per più lingue nei valori degli attributi. Al momento non esiste una buona soluzione a questo problema.

Scegliere l'attributo giusto

Se il documento è HTML (cioè servito come text/html), usa l'attributo lang per impostare la lingua dell'attributo o un'area di testo. Per esempio, a seguire l'impostazione del francese come lingua predefinita:

<html lang="fr">

Quando si servono pagine XHTML 1.x o poliglotti come text/html, usa entrambi gli attributi lang e il xml:lang insieme ogni volta che vuoi impostare la lingua. L'attributo xml:lang è il modo più ricorrente per identificare le informazioni sulla lingua in XML. Assicurati che i valori per entrambi gli attributi siano identici.

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

L'attributo xml:lang in realtà non è utile per gestire il file come HTML, ma sostituisce l'attributo lang ogni volta che elabori o servi il documento come XML. L'attributo lang è consentito dalla sintassi di XHTML, e può anche essere riconosciuto dai browser. Quando si usano altri parser XML, tuttavia (come la funzione lang() in XSLT) non puoi fare affidamento sul riconoscimento dell'attributo lang.

Se si serve la pagina come XML (cioè usando un tipo MIME come application/xhtml+xml+xml), non avrai bisogno dell'attributo lang. L'attributo xml:lang sarà sufficiente.

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

E se il contenuto dell'elemento e i valori degli attributi sono in lingue diverse?

A volte la lingua del testo in un attributo e il contenuto dell'elemento sono in lingue diverse. Ad esempio, nell'angolo in alto a destra di questo articolo ci sono i link delle versioni tradotte di questa pagina. Il testo del link mostra la lingua della pagina di destinazione che utilizza la lingua della pagina di destinazione, ma un attributo associato title contiene un suggerimento nella lingua della pagina corrente:

Screen snap che mostra un tooltip contenente la parola 'Spagnolo' che appare dal testo del documento 'Español'.

Se il codice ha il seguente aspetto, gli attributi della lingua indicano che non solo il contenuto, ma anche il testo dell'attributo title è in spagnolo. Questo è ovviamente sbagliato.

Codice sbagliato. Non copiare!

<a lang="es" title="Spanish" href="qa-html-language-declarations.es">Español</a>

Invece, sposta l'attributo contenente testo in una lingua diversa a un altro elemento, come mostrato in questo esempio, dove l'elemento span eredita l'impostazione predefinita en dell'elemento html.

<span title="Spanish"><a lang="es" href="qa-html-language-declarations.es">Español</a></span>

E se non ci sono elementi a cui appendere il tuo attributo?

Se si desidera specificare la lingua di alcuni contenuti ma non vi è alcun markup intorno, utilizzare un elemento come span or div attorno al contenuto.

Ecco un esempio:

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

Scegliere i valori della lingua

Per essere sicuri che tutti gli agenti riconoscano quale lingua si intende, è necessario seguire un approccio standard quando si forniscono i valori degli attributi della lingua. È inoltre necessario considerare come fare riferimento in modo standard alle differenze dialettali tra le lingue, come per esempio tra l'inglese americano e quello britannico, che divergono significativamente in termini di ortografia e pronuncia.

Le regole per la creazione dei valori degli attributi del linguaggio sono descritte da una specifica IETF chiamata BCP 47. Oltre a specificare come usare semplici tag lingua, come en per l'inglese o fr per il francese, BCP 47 descrive come comporre i tag di lingua che permettono di specificare dialetti regionali, script e altre varianti relative a quella lingua.

Il BCP 47 incorpora, ma va oltre, gli insiemi ISO di codici di lingua e codici paese. Per trovare i codici pertinenti si consiglia di consultare la sezione IANA Language Subtag Registry.

Per un'introduzione leggera ma abbastanza approfondita alla sintassi dei tag BCP 47, consulta Tag linguistici in HTML e XML. Per un maggior supporto nella scelta della lingua giusta tra le molteplici combinazioni di tag e combinazioni, vedi Scegliere un tag di lingua.

Ulteriori informazioni

Specificare i metadati sulla lingua del pubblico

Puoi creare metadati che descrivono la lingua del pubblico di una pagina, piuttosto che la lingua di una specifica gamma di testo, facendo in modo che il server invii le informazioni nell'intestazione HTTP Content-Language. Se il pubblico a cui ci si rivolge parla più di una lingua, l'intestazione HTTP consente di utilizzare un elenco di lingue separate da virgole.

Ecco un esempio di un'intestazione HTTP che specifica che la risorsa è un mix di inglese, hindi e punjabi:

Content-Language: en, hi, pa

Tieni in conto che questo approccio non è efficace se si accede alla pagina mediante un disco rigido, un disco o un`altra posizione non basata su server. Attualmente non esiste un modo ampiamente riconosciuto di usare questo tipo di metadati all'interno della pagina.

In passato molte persone hanno usato un elemento meta con l'attributo http-equiv impostato su Content-Language. Per evitare problemi (confusione e implementazioni incoerenti di questo elemento), la specifica HTML5 ha reso questo elemento non conforme in HTML, motivo per cui non dovrebbe piú essere usato.

Per la retrocompatibilità, HTML5 descrive un algoritmo con il quale la lingua predefinita del contenuto può essere identificata dall'HTTP o meta Content-Language informazioni in determinate condizioni. Questo è, tuttavia, solo un meccanismo di ripiego per i casi in cui non è stato usato nessun attributo di lingua sul tag html. Se hai usato l'attributo della lingua sul tag html, come dovresti sempre, tali soluzioni sono irrilevanti.

Per informazioni su Content-Language in HTTP e in meta elementi vedi HTTP e meta per informazioni sulla lingua.

Vari punti irrilevanti

Per sicurezza e a dover di completezza, vale la pena menzionare alcuni punti che non non sono del tutto pertinenti a questa discussione.

In primo luogo, non è possibile dichiarare la lingua del testo utilizzando i CSS.

In secondo luogo, il DOCTYPE che dovrebbe avviare qualsiasi file HTML può contenere ciò che ad alcune persone sembra una dichiarazione di lingua. Il DOCTYPE nell'esempio qui sotto contiene il testo EN, che sta per 'English'. Questo, tuttavia, indica la lingua dello schema associato a questo documento - non ha nulla a che fare con la lingua del documento stesso.

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

In terzo luogo, a volte si presume che le informazioni sul linguaggio naturale possano essere dedotte dalla codifica dei caratteri. Tuttavia, una codifica dei caratteri non consente di identificare univocamente un linguaggio naturale: per far funzionare questa inferenza deve esserci una mappatura uno-a-uno tra codifica e linguaggio, e non ce n'è uno. Per esempio, una codifica a carattere singolo potrebbe essere usata per molte lingue, ad esempio il latino 1 (ISO-8859-1) potrebbe codificare sia il francese che l'inglese, così come molte altre lingue. Inoltre, la codifica dei caratteri può variare in una singola lingua, ad esempio l'arabo potrebbe utilizzare codifiche come 'Windows-1256' o 'ISO-8859-6' o 'UTF-8'.

Tutti questi esempi di codifica, tuttavia, sono oggi irrilevanti, poiché tutti i contenuti dovrebbero essere scritti in UTF-8, che copre tutte le lingue, tranne le più rare, in una singola codifica a caratteri.

Lo stesso vale per la direzione del testo. Come per le codifiche e il linguaggio, non sempre esiste una mappatura uno-a-uno tra linguaggio e script, e quindi la direzionalità. Per esempio, l'Azerbaigian può essere scritto sia in arabo da destra a sinistra (arabo) che da sinistra a destra (latino o cirillico), e il codice della lingua az può essere rilevante per entrambi. Inoltre, il markup della direzione del testo usata con il testo in linea applica al testo una gamma di valori diversi, mentre la lingua è un semplice interruttore che non è all'altezza dei compiti richiesti.