En-têtes HTTP, élément meta et informations sur la langue

En plus de l’attribut lang (ou xml:lang) du marqueur html, il est possible de trouver des informations concernant la langue dans les éléments meta de l’HTML ou dans les en-têtes HTTP servis avec une page HTML. Nous discutons ici de l’utilité ainsi que de l’utilisation idéale de ces informations pour déclarer une langue dans du contenu HTML.

Cet article aborde plus particulièrement les déclarations de langue dans les en-têtes HTTP et dans les éléments meta. Il ne s’agit pas d’un guide général pour spécifier la langue d’une page HTML. Pour ceci, consultez Déclarer la langue en HTML.

L’élément meta

Vous avez peut-être déjà rencontré un élément meta contenant des informations sur la langue, au sommet d’un fichier HTML. Quelque chose comme ça :

 Mauvais code. Ne pas copier !

<meta http-equiv="content-language" content="de" />

Cette utilisation de la valeur content-language pour l’attribut http-equiv est désapprouvée par la spécification HTML et ne devrait plus être utilisée. À sa place, vous devriez toujours utiliser l’attribut lang du marqueur html pour déclarer la langue principale du texte de la page.

Si vous souhaitez savoir pourquoi cette approche a été désapprouvée, voir ci-après. Pour apprendre comment utiliser l’attribut lang, voir Déclarer la langue en HTML.

En-têtes HTTP

Lorsqu’un serveur vous fournit une page ou une ressource, celui-ci envoie avec elle des informations diverses à son propos (des métadonnées). Il utilise un format que l’on appelle en-têtes HTTP. L’un des éléments de ces métadonnées concerne la langue, comme vous pouvez le voir dans cet exemple qui montre la réponse HTTP qui accompagne cet article.

HTTP/1.1 200 OK
Date: Sat, 23 Jul 2011 07:28:50 GMT
Server: Apache/2
Content-Location: qa-http-and-lang.en.php
Vary: negotiate,accept-language,Accept-Encoding
TCN: choice
P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml"
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Content-Language: en

Et voici un exemple d’en-tête HTTP Content-Language qui déclare une ressource comme étant un mélange d’anglais, d’hindi et de pendjabi. À la différence de l’attribut lang d’un élément HTML, si le public visé utilise plus d’une langue, l’en-tête HTTP vous permet d’utiliser une liste de langues séparées par des virgules.

Content-Language: en, hi, pa

L’en-tête Content-Language est associé à une page donnée grâce à un paramétrage du serveur ou à un script côté serveur. Il est par exemple courant de trouver un en-tête Content-Language dans les métadonnées HTTP quand le serveur héberge plus d’une version d’une ressource, chacune dans une langue différente. Si le serveur utilise l’information dont il dispose à votre sujet pour sélectionner automatiquement une version linguistique donnée (« négociation de contenu »), la version choisie sera identifiée dans l’en-tête HTTP.

L’en-tête HTTP Content-Language peut fournir des données linguistiques utiles relatives à la page où à la ressource que vous demandez, mais la spécification HTTP indique que la finalité de cette information est d’offrir des métadonnées au sujet du public visé, plutôt que d’indiquer la langue du document lui-même. Ces métadonnées peuvent être utilisées pour effectuer des recherches, offrir une version linguistique correcte, gérer l’écoulement des tâches, la classification, etc.

L’information linguistique dans l’en-tête HTTP étant envoyée par le serveur, celle-ci n’est simplement pas à disposition si vous accédez à votre page à partir d’un disque dur, d’une clé USB ou d’un autre système non doté de serveur. Il n’existe pas, à l’heure actuelle, de méthode globalement acceptée pour représenter dans une page ce type de données.

Spécifier la langue de traitement du document

En HTML, l’attribut lang doit être utilisé pour spécifier la langue du contenu du texte de manière à autoriser le navigateur à afficher ou traiter correctement votre contenu (par exemple pour les césures, le style, l’orthographe, etc.) Cet attribut devrait toujours être utilisé dans l’élément html ainsi que dans tous les éléments qui entourent des fragments de contenu dans des langues différentes.

Si vous souhaitez mieux comprendre la différence entre l’utilisation des métadonnées d’un fichier pour identifier le public du document et le paramétrage de la langue utilisée pour traiter le contenu, consultez l’article Types de déclaration de langues.

Pour en savoir plus sur l’utilisation de l’attribut lang, voir Déclarer la langue en HTML.

Déduire la langue d’un texte à partir d’un en-tête HTTP

Si aucune langue n’est déclarée dans le marqueur html, une partie des principaux navigateurs, mais pas tous, reconnaîtront la valeur déclarée dans l’en-tête HTTP et l’utiliseront pour spécifier la langue par défaut du texte de la page. Mais même dans un navigateur qui reconnaît cette valeur, l’information semble être appliquée à certaines fonctions qui ont une incidence sur la langue, mais pas à toutes. La spécification HTML5 indique que s’il n’y pas d’attribut lang dans le marqueur html, et s’il n’y a pas d’élément meta avec l’attribut http-equiv ayant pour valeur Content-Language, et s’il n’y a qu’un marqueur de langue dans la déclaration d’en-tête HTTP, alors un navigateur peut utiliser cette information pour tenter de deviner la langue par défaut du texte de la page.

Cependant il s’agit ici d’un point de détail puisque vous devriez toujours utiliser un attribut de langue dans le marqueur html et que ce marqueur l’emporte sur les informations des en-têtes HTTP. L’en-tête HTTP doit seulement être utilisé pour fournir des métadonnées au sujet du public visé par le document dans son entier, et l’attribut langue dans le marqueur html doit être utilisé pour déclarer la langue par défaut du contenu.

Informations supplémentaires

Les informations contenues dans cette section seront probablement moins utiles, mais sont fournies par souci d’exhaustivité.

Pourquoi il est préférable de ne pas utiliser l’élément meta

L’utilisation de l’élément meta dans l’élément head d’un document avec l’attribut http-equiv ayant pour valeur Content-Language n’est pas mentionnée dans la spécification HTML 4.01. Cependant, et ce depuis longtemps, de nombreux guides informels sur la toile suggèrent son utilisation pour déclarer la langue de votre page HTML, et certains outils de création HTML créent automatiquement ces éléments lorsque vous spécifiez une langue à l’aide de boîtes de dialogues. Voici un exemple qui déclare l’anglais comme langue :

 Mauvais code. Ne pas copier !

<meta http-equiv="Content-Language" content="en">

À la différence des attributs lang et xml:lang, la valeur de l’attribut content peut être une liste de codes de langue séparés par une virgule. L’exemple ci-dessous déclare les langues principales du document comme étant à parts égales l’allemand, le français et l’italien :

 Mauvais code. Ne pas copier !

<meta http-equiv="Content-Language" content="de, fr, it">

Si le nom de l’élément meta n’était pas suffisamment clair, le fait que la valeur accepte plusieurs langues indique que cet élément fournit vraiment des métadonnées au sujet du document. Il est nécessaire d’être spécifique si vous devez indiquer la langue d’une partie d’un texte. Il ne peut s’agir que d’une langue à la fois. L’élément meta est ainsi dans le document un lieu qui fournit des métadonnées au sujet de la langue du public visé par le document dans son ensemble.

Encore récemment, peu de navigateurs faisaient attention à cet élément meta. Plusieurs navigateurs importants ont alors commencé à l’utiliser pour spécifier la langue par défaut du texte du document s’il n’existait pas d’attribut langue dans le marqueur html (ce pour quoi cet attribut du marqueur html est fait). Chaque navigateur ayant sa propre implémentation, le système était peu fiable.

À cause de confusions et d’implémentations non homogènes de ce type de déclarations, le groupe de travail HTML prit la décision en 2011 de rendre non-conformes en HTML les éléments meta contenant un http-equiv dont la valeur était Content-Language. Ceci veut dire que vous ne devriez plus l’utiliser en HTML5 et que, bien que techniquement non illégal dans d’autres types de HTML, il est mieux de ne l’utiliser nulle part.

HTML5 a cependant fait une concession par souci de compatibilité descendante : s’il existe dans le code un élément meta avec un http-equiv ayant pour valeur Content-Language et s’il n’y a pas d’attributs de langue dans le marqueur html, et si l’élément meta a pour valeur un seul code de langue, alors un navigateur peut (sans y être forcé) utiliser cette information pour deviner la langue par défaut du texte de la page. Ceci étant dit, il ne s’agit que de compatibilité descendante et vous ne devriez plus avoir à utiliser cette approche. Utilisez tout simplement un attribut langue sur le marqueur html.

Métadonnées internes au document

Une des implications de l’abandon de l’élément meta en HTML5 pour déclarer la langue est qu’il n’existe aujourd’hui aucune méthode claire pour fournir dans le document des métadonnées à propos du document lui-même. En théorie, une telle méthode serait extrêmement utile pour les systèmes de gestion de contenus, les processus de traduction, et autres. Ce type d’information peut être porté par un en-tête HTTP (comme nous le verrons dans la section suivante), mais des métadonnées internes au document seraient utiles puisque de tels systèmes et procédés ont tendance à fonctionner sur des documents qui ne sont pas envoyés à partir d’un serveur avec un en-tête HTTP.

Une autre approche, telle que RDFa, pourrait dans le futur offrir une manière de représenter ce type d’informations.

La page WHATWG Wiki MetaExtensions fournit une liste détaillée de valeurs qui pourraient être utilisées avec la valeur name de l’élément meta, bien qu’aucune n’ait encore formellement été acceptée. Une de ces valeurs est dc.language, utilisée pour exprimer des informations relatives à la langue à l’aide de la notation Dublin Core.

Ne pas utiliser ceci <meta name="dc.language" content="en">

On ne sait cependant pas si les navigateurs font usage de cette information où encore à quel point ces informations sont utilisées par d’autres applications. La page WATWG recommande que l’attribut lang soit utilisé à la place. Cette recommandation est bonne pour déclarer la langue de traitement du texte, mais n’aborde pas son usage possible comme expression de métadonnées à propos de la page dans son ensemble.