Spécifier la langue d’un document (X)HTML

Openweb.eu.org > Articles  > Spécifier la langue d’un document (X)HTML

Abstract

Entre les attributs HTML, les éléments meta et les en-têtes HTTP, les moyens de spécifier la ou les langue(s) d’une page Web ne manquent pas. Mais la pratique montre l’existence de deux besoins bien différents en la matière : il importe de différencier langue primaire d’une ressource Web et langue de traitement d’un contenu, et d’utiliser à bon escient les outils à notre disposition pour les indiquer.

Article

De nombreuses sources encouragent les auteurs à préciser la langue de leur document : les directives d'accessibilité, les bonnes pratiques qualités, les spécifications (X)HTML , les conseils pour l'internationalisation, l'optimisation du reférencement, etc. Le plus souvent, cette démarche semble d'autant plus simple que le document est rédigé dans une langue unique, ou comporte tout au plus quelques citations dans une autre langue. Cependant, même dans ces cas simples, ce sont en fait deux notions bien distinctes qui sont à l'oeuvre : les langues primaires de la ressource et les langues de traitement de son contenu. Toutes deux répondent à des problématiques opérationnelles différentes, que nous allons analyser ici. Nous pourrons alors déterminer quelles sont les techniques appropriées pour communiquer efficacement ces deux types d'informations aux agents utilisateurs, en précisant également les normes de codification des langues qui assureront la pertinence de ces informations.

Pourquoi spécifier la langue ?

Les informations de langue sont couramment jugées utiles à de multiples points de vue.

Par exemple, il est possible de servir un contenu différent à un utilisateur « à la demande », en fonction de la configuration de son client Web : on peut donc prévoir plusieurs versions linguistiques d'un même document et délivrer ce contenu en fonction des préférences de chaque utilisateur. L'ensemble de ces versions forme une ressource unique, caractérisée par la liste des langues dans lesquelles elle est disponible.

De même, il peut s'agir de faciliter et d'améliorer la précision du référencement d'une ressource dans des bases de données documentaires, dans des annuaires ou auprès de moteurs de recherche. Là encore, plusieurs langues peuvent éventuellement être associées à une seule ressource, afin d'indiquer que celle-ci est disponible pour différents publics linguistiques.

Dans ces deux premiers cas, l'information de langue ne porte donc pas nécessairement sur une langue unique. Elle donne d'autre part une indication globale sur la ressource Web prise dans son ensemble, et non sur le détail de son contenu.

Dans d'autres cas, en revanche, c'est à l'intérieur même du document que l'on va rencontrer des changements de langue d'une section à une autre, chaque section étant caractérisée par une langue unique. L'agent utilisateur devra alors être informé de ces changements, afin de restituer le contenu de la façon la plus juste et la plus compréhensible possible. Ce sera le cas, par exemple, dans les contextes suivants:

  • Les navigateurs vocaux (IBM Home Page Reader 3.+, EmacSpeak, le futur Opera 8), ainsi que les lecteurs d'écrans (Jaws 5+, Windows-Eyes) doivent déterminer dans quelle langue le synthétiseur vocal doit travailler pour adapter la prononciation de manière à rendre compréhensibles tous les termes lus. Les informations de langue leur permettront de passer d'une langue à l'autre à la volée lors de la lecture, sans intervention de l'utilisateur ;
  • Les correcteurs orthographiques doivent déterminer quel dictionnaire utiliser pour les différents termes présentés dans les documents qui leur sont soumis. Là encore, la précision avec laquelle les changements de langue seront indiqués influera fortement sur la qualité du résultat ;
  • Les traducteurs ont des besoins similaires, pour déterminer quels termes doivent être traduits et en quelle langue : il est inutile de traduire des termes déjà signalés dans la langue cible ;
  • Les navigateurs graphiques peuvent avoir à fournir une présentation spécifique d'un contenu selon sa langue : choix d'une police de caractères, de l'orientation gauche-droite ou inversement, voire d'autres styles mettant en valeur un passage dans une langue donnée.

Cette fois, l'information de langue est contextuelle, et porte à chaque fois sur une langue unique : un terme à prononcer, à traduire ou à corriger appartient à une langue et à une seule.

Ce rapide examen de quelques cas courants nous montre donc que nous avons besoin de délivrer deux types d'informations de langue bien distinctes. Il est temps à présent de les définir précisément.

Langue primaire et langue de traitement

La langue primaire du document constitue en fait une métadonnée. Elle renseigne sur le document « pris comme un tout », et non sur telle ou telle partie de son contenu. Malgré l'ambiguïté de la norme HTML4.01 sur ce point, cette information n'est pas destinée au traitement du contenu, mais à celui de la page en tant que ressource Web, lorsqu'il s'agit par exemple d'adresser une version linguistique à l'utilisateur en fonction de ses préférences (autrement dit une représentation de la ressource parmi celles disponibles), ou d'indexer une ressource selon une langue de référence. On peut retenir comme règle que la ou les langues primaires du document désignent la ou les langues du public visé.

La langue de traitement du contenu, en revanche, est une donnée contextuelle qui va permettre aux agents utilisateurs de traiter le contenu de manière correcte. Ce contenu n'a qu'une seule langue de traitement, quel que soit ce dernier (synthèse vocale, affichage, traduction, etc.)

Prenons quelques exemples pour bien percevoir la nature de cette distinction :

  • Un même article est publié dans deux versions linguistiques (autrement dit, deux représentations de la même ressource) : l'une est en français et l'autre en anglais. Cet article cite sans le traduire un auteur espagnol. Notre article a donc deux langues primaires : le français et l'anglais. L'indication de celles-ci devra permettre à un moteur de recherche de présenter notre article dans ses résultats, que l'utilisateur ait coché l'option « Rechercher les pages en français » ou « Rechercher les pages en anglais », et de l'ignorer en revanche s'il ne cherche que des documents en allemand. Enfin, le fait que l'article comporte une citation en espagnol ne le rend pas pertinent dans les recherches citées ci-dessus, mais ce changement de langue devra être signalé à un traducteur automatique : cette information doit donc être précisée à un autre niveau que les précédentes ;
  • Une page d'accueil est bilingue, avec deux sections identiques, l'une en anglais et l'autre en français : cette page d'accueil a également deux langues primaires, l'anglais et le français. Elle devient pertinente aux yeux d'un moteur de recherche aussi bien pour un utilisateur francophone qu'anglophone. Par ailleurs, lors de sa lecture par une synthèse vocale, l'application utilisée devra basculer d'une langue à l'autre au bon moment. Là encore, et bien qu'il s'agisse toujours des mêmes langues, ces informations linguistiques doivent être précisées à des niveaux différents
  • Une page d'un site francophone cite des sources anglo-saxonnes sans les traduire : sa langue primaire reste le français, car elle ne s'adresse pas à un public non francophone. Elle comporte cependant deux langues de traitement successives au fil du contenu. Si un lecteur anglo-saxon fait appel à un traducteur automatique, seules les sections en français devront être prises en compte et traitées par celui-ci ;
  • L'article que vous lisez actuellement n'existe que dans une seule version linguistique (le français) et ne comporte pas de citations dans une autre langue: sa langue primaire est identique à sa langue de traitement unique. Il reste utile, même dans ce cas, de préciser ces deux informations afin que la page soit correctement indexée par un moteur de recherche et puisse être correctement lue par un lecteur d'écran, ou traduite automatiquement.

Cette distinction étant à présent établie, quels sont les moyens appropriés pour préciser ces deux informations ?

Quelles techniques sont à notre disposition pour transmettre les différentes informations de langue ?

Plusieurs mécanismes distincts permettent de transmettre une information de langue concernant un contenu HTML : l'en-tête HTTP envoyée par le serveur, les éléments de metadonnées contenus dans la page, et enfin les attributs lang et xml:lang qui sont également indiqués dans le document lui-même.

  • L'en-tête HTTP Content-Language : cette donnée est gérée et envoyée au niveau même du serveur. Le champ d'en-tête HTTP est défini dans HTTP1.1 en ces termes :

    Le champ d'entête-entité Content-Language décrit la ou les langue(s) naturelle(s) du public visé par l'entité incluse. Il faut noter que ceci pourrait ne pas correspondre à toutes les langues utilisées dans le corps de l'entité.

    Content-Language  = "Content-Language" ":" 1#language-tag

    [...] Le rôle essentiel de Content-Language est de permettre à un utilisateur d'identifier et de différencier des entités en fonction de ses propres préférences linguistiques. Ainsi, si le contenu du corps de l'entité est destiné uniquement à un public comprenant le danois, le champ approprié sera Content-Language: da

    Lorsqu'aucun champ Content-Language n'est spécifié, l'indication donnée par défaut est que ce contenu est destiné à tous les publics, quelque-soit leur langue. Ceci peut signifier soit que l'expéditeur ne considère pas ce contenu comme étant propre à quelque langue naturelle que ce soit, soit qu'il ignore à quel public linguistique il est destiné.

    Plusieurs langues PEUVENT être énumérées pour des publics multiples. Par exemple, une reproduction du "Traité de Waitangi", présentée simultanément dans les versions originales en maori et en anglais, fera appel à Content-Language: mi, en

    Cependant, le seul fait que plusieurs langues soient présentes dans une entité n'induit pas que celle-ci soit destinée à un public multilingue. Par exemple, une initiation pour débutants du type "Première leçon de latin" serait clairement destinée à un public francophone. Dans un tel cas, le champ Content-Language approprié ne précisera que la valeur "fr".

  • La métadonnée <meta http-equiv="Content-Language"> : cette information permet d'indiquer dans le document la même information que celle transmise dans l'entête HTTP.
  • Les attributs lang et xml:lang : Ces informations sont indiqués dans le document lui-même pour les différents éléments (X)HTML qui le composent. Les valeurs possibles de l'attribut lang sont définies par la spécification HTML4.01 sous la forme :

    La valeur de l'attribut lang est un code de langue qui identifie une langue parlée, écrite, ou utilisée d'une manière ou d'une autre pour la communication d'informations entre personnes.

Pour déterminer quels outils conviennent pour préciser respectivement langue primaire et langue de traitement, la clé est le fait que la langue de traitement du contenu est unique, alors que les langues primaires ne le sont pas nécessairement. Or :

  • En-tête HTTP Content-Language et meta autorisent la mention de plusieurs langues;
  • les attributs lang et xml:lang n'admettent qu'une valeur unique.

Nous pouvons donc adopter à partir de ce constat des règles de bonnes pratiques simples.

Comment spécifier la ou les langues primaires d'un document

La ou les langues primaires d'une ressource seront indiquées via l'entête HTTP Content-Language :

Content-Language: fr
Content-Language: fr,en

Cette information sera reproduite via un élément meta :

  • La traditionnelle meta http-equiv="Content-Language" content="fr" />
  • Eventuellement complétée par une meta plus spécifique, telle que, par exemple, le Dublin Core qui définit la <meta name="DC.Language" scheme="RFC3066" content="fr" />.

Ceci garantit la permanence de l'information, que le document soit consulté en ligne ou après enregistrement local.

Notons que si plusieurs langues primaires doivent être indiquées, elles sont séparées dans tous les cas par des virgules, les espaces n'étant pas significatifs :

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

Spécifier la langue de traitement d'un contenu

L'élément html étant l'élément racine de tout document HTML, tout ce qu'il contient hérite par défaut de la valeur de ses attributs lang et/ou xml:lang. Tout le contenu de la page (title et autres meta compris) sera donc réputé être dans la langue ainsi indiquée, sauf précision contraire. On écrira donc :

  • En HTML (type de contenu text/html) :

    <html lang="fr">
  • En XHTML traité en tant que HTML (type de contenu text/html) :

    <html lang="fr" xml:lang="fr" ...>
  • En XHTML traité en tant que XML (type de contenu application/xhtml+xml) :

    <html xml:lang="fr" ... >

Si une section quelconque du contenu a une langue différente, il suffit de l'indiquer dans les attributs lang et xml:lang de son élément conteneur. Par exemple, pour une citation en anglais dans un document en français :

  • En HTML (type de contenu text/html) :

    <q lang="en">...</q>
  • En XHTML traité en tant que HTML (type de contenu text/html) :

    <q lang="en" xml:lang="en">...</q>
  • En XHTML traité en tant que XML (type de contenu application/xhtml+xml) :

    <q xml:lang="en">...</q>

Rappelons que l'attribut xml:lang est l'équivalent XML de l'attribut HTML lang. Pour des raisons de compatibilité, la spécification XHTML conseille d'utiliser simultanément les deux attributs lorsqu'on tire profit de la nature hybride du XHTML1.0 (à la fois HTML et XML) pour le servir avec le type de contenu text/html.

Les attributs lang et xml:lang peuvent être utilisés pour tous les éléments HTML, à l'exception de :

  • applet, base, basefont, br, param et frameset pour lesquels il serait dénué de sens ;
  • frame, script, et iframe. Dans ces cas, la langue de traitement du contenu inclus dans un cadre ou généré par un script ne peut être déclarée qu'à l'intérieur du document incorporé ou du code produit par le script, et non au niveau du document parent.

En l'absence d'un balisage spécifique et/ou d'attributs lang - xml:lang valides pour le conteneur (iframe par exemple), les éléments génériques div et span permettent de préciser un changement de langue en regroupant plusieurs éléments :

<div lang="en">
   <p>...</p>
   <ul>
      <li>...</li>
      <li>...</li>

   </ul>
</div>

Enfin, les attributs lang et xml:lang s'appliquent aussi bien au contenu des éléments (X)HTML qu'à celui de leurs attributs, comme le montre cet exemple donné pour l'élément link par la spécification HTML4.01 :

<link lang="en"
title="english version"
type="text/html"
rel="alternate"
hreflang="en"
href="http://example.org/english_doc.html">

Par défaut, la langue d'un attribut XHTML est donc celle de son élément. Il est impossible de préciser que la langue du contenu d'un attribut est différente de celle de l'élément concerné. Ceci concernerait concrètement par exemple :

<q lang="en" title="Ici, une information français">
Some english text
</q>

On évitera donc ce type de conflit en rédigeant dans la même langue le contenu de l'élément et celui de ses attributs.

Quel standard adopter pour la désignation des langues ?

La spécification HTML4.01 fait actuellement référence à la norme RFC1766 pour la désignation des langues. Celle-ci a cependant été actualisée par la norme RFC3066 qui doit donc être prise comme référence.

Concrètement, on utilisera un code de langue ISO639, du type en (anglais). Alors que ISO639-1 limitait à deux caractères les codes de langues, (soit 676 langues au plus), ISO639-2 étend à 3 le nombre de caractères des codes de langues (soit 17 576 codes possibles). Pour maintenir la compatibilité des documents antérieurs à ISO639-2 et garantir l'unicité des codes de langues utilisés, RFC3066 fixe les règles suivantes :

  • Pour certaines langues, dont le français, ISO639 propose simultanément un code à 2 caractères et un ou deux codes à 3 caractères. On doit alors utiliser uniquement le code à deux caractères : fr, et non les codes bibliographiques (fre) et terminologiques (fra) à 3 caractères ;
  • Pour d'autres langues, comme l'écossais, il n'existe pas de code à 2 caractères. On utilisera alors le code à 3 caractères: sco (il n'y a dans ce cas qu'un seul code à 3 caractères disponible).
  • Lorsqu'une langue a à la fois un code ISO et un code défini par l'IANA sous la forme i-foo, seul le code ISO doit être utilisé. Le code IANA est alors considéré comme déprécié. C'est le cas par exemple pour le klingon, qui ne doit pas être désigné par i-klingon, mais par son code ISO tlh.

Dans tous les cas, il est indispensable de consulter le tableau de référence des codes ISO639 tenu à jour par la Bibliothèque du Congrès des Etats-Unis, qui en a officiellement la charge.

Ce code de langue peut être éventuellement suivi d'un ou plusieurs codes secondaires de pays (ISO3166), séparés par un tiret, du type en-US (anglais - Etats-Unis). Ce mécanisme est cependant d'une portée limitée, car il ne permet pas d'indiquer de nombreuses variantes linguistiques régionales (l'espagnol latino-américain exemple).

L'ensemble de ces codes sont indifférents à la casse selon RFC3066. ISO639 recommande (sans en faire une obligation) l'écriture des codes de langue en minuscules, tandis que l'usage est d'utiliser des majuscules pour les codes de pays.

D'autre part, certains auteurs sont parfois tentés de créer leurs propres codes de langue, ou de détourner le mécanisme de spécification de la langue pour faire référence à des données non linguistiques. Il s'agit fréquement d'une indication d'un langage de programmation, du type lang="PHP". Ces détournements sont dénués de sens : HTML4.01 précise en effet clairement que les langages informatiques sont explicitement exclus des codes de langue.

Notons enfin que deux codes de langues génériques, mul (Multilingue) et und (Langue indéterminée) n'ont pas lieu d'être utilisés en (X)HTML. RFC3066 précise en effet que :

  • mul ne doit pas être utilisé lorsque le protocole concerné autorise l'utilisation d'une série de codes linguistiques, ce qui est le cas de l'en-tête HTTP Content-Language (comme indiqué ci-dessus, les valeurs doivent alors être séparées par des virgules) ;
  • und ne doit pas être utilisé lorsqu'il est possible d'omettre la mention de la langue, ce qui est le cas en (X)HTML. Notons à ce propos qu'en XHTML traité en tant que XML, un attribut vide xml:lang="" signifie qu'aucune langue n'est attribuable à l'élément concerné, annulant de ce fait la langue spécifiée à un niveau supérieur.

À propos de cet article

Vos commentaires

  • reduction Le 12 août 2012 à 06:16

    Merci à Laurent & Elie pour cet article qui résume bien comment spécifié la langue des pages en XHTML, car on fini par s’y perdre avec toutes les formules et versions existantes. ;)

  • Jeromeweb Le 10 novembre 2012 à 15:47

    Merci de cet article très complet, je viens d’apprendre que l’on peut mélanger 2 langues primaires dans la balise meta http-equiv="Content-Language"
    Ca répond à ma problématique qui durait depuis plusieurs mois
    Merci beaucoup !!

  • Adrien Le 1er mars 2013 à 06:48

    Merci pour ce tutoriel, j’ai enfin réussi à afficher des accents dans les titres de mes articles :-)

  • xavier Le 25 mars 2013 à 10:46

    Merci, je commence à y voir plus clair !

  • Suisses Le 2 avril 2013 à 00:05

    Le document est très bien rédigé et permet de bien comprendre les différences entre les normes. Juste un peu déçu qu’il n’y ait pas une mise à jour avec l’introduction de la norme HTML5.

  • Philippe Le 28 mai 2013 à 18:37

    Je ne savais pas que l’on pouvait spécifier la langue au sein même d’un contenu, ailleurs que dans l’en-tête. Merci pour cet article très clair et complet.

  • julien Le 9 novembre 2014 à 13:45

    bonjour,

    est ce que ceci est valable pour les langues, ou bien cela ne sert à rien ?

    meta http-equiv="Content-Type" content="text/html ; charset=iso-8859-1"
    meta http-equiv="Content-Language" lang="fr, fr-CA" content="fr, fr-CA"

    de même que

    meta http-equiv="Content-Type" content="text/html ; charset=iso-8859-1"
    meta http-equiv="Content-Language" lang="en-US, en-GB" content="en-US, en-GB"

    merci

  • Laurent Le 16 janvier 2015 à 22:49

    Bonsoir,
    Super le tuto, merci.
    Est-ce qu’on peut se passer du PHP pour afficher la langue en fonction du pays depuis lequel on consulte la page ?
    Merci

  • Jean Le 14 avril 2019 à 01:10

    Un grand merci pour ce tuto, je vais justement en avoir besoin pour mon site.

Vos commentaires

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?
Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Suivre les commentaires : RSS 2.0 | Atom