Bonjour à vous !
C'est un topic très intéressant car, par une question anodine, il pose un problème assez complexe et compliqué : celui de l'internationalisation de l'information sur Internet. Comme certaines questions et affirmations reviennent assez régulièrement, j'ai cru bon de rédiger ce petit mémo à l'intention des débutants et, pourquoi pas, des personnes un peut plus expérimentées en manque d'inspiration. Il ne fera probablement pas autorité en la matière, mais il pourrait servir lorsqu'on ne sait pas par où commencer, ou lorsque l'on a oublié comment ça marche. J'émets le voeu pieu qu'il coupe également court à la diffusion d'informations erronées, c'est pourquoi tous vos commentaires ou correctifs sont les bienvenus !
Les listes collées-postées plus haut partent d'intentions louables, mais elles relèvent plutôt de cadeaux empoisonnés. Elles ne répondent pas pleinement à la question posée et, en plus, ne sont de loin pas correctes. Voici pourquoi :
Le w3c ( http://www.w3.org/International/O-HTML-tags )stipule que la langue utilisée dans les documents HTML doit être spécifiée avec l'attribut "lang", que dans les documents XML on doit se servir de l'attribut "xml:lang" et enfin que dans le cas du XHTML on doit stipuler les deux attributs. Jusque là on est d'accord. Mais le w3c dit également, que :
- les codes pour les langues et les pays sont définis dans le document RFC 3066 ( http://www.ietf.org/rfc/rfc3066.txt ), lui-même basé sur deux autres documents :
- ISO-639 donnant la liste complète des langues codifiées sur 2 et 3 lettres minuscules ( http://lcweb.loc.gov/standards/iso639-2/langcodes.html ); allez voir ce dernier lien, le nom des langues est bilingue anglais/français. Lorsqu'un code de langue apparaît à la fois sous un codage en 2 caractères et sous un codage en 3 caractères, c'est le code sur 2 caractères qui DOIT être utilisé.
- ISO-3166 établissant la liste complète des pays codifiés sur 2 caractères majuscules. Cette liste existe en anglais ( http://www.iso.org/iso/fr/prods-se [...] t-en1.html ) et en français ( http://www.iso.org/iso/fr/prods-se [...] t-fr1.html ).
Déjà à ce point on remarque que les listes précitées ne remplissent pas ces critères et ne sont donc pas conformes :
- une liste est donnée comme étant en français, mais la Suisse y figure en anglais. Même chose pour d'autre pays : South Africa, Spain, etc.
- le document ISO-3166 donne une traduction française de tous les pays, et cette traduction tient compte des accents, et non une des listes.
- une des listes donne les codes de pays en minuscules, alors que ISO-3166 les mentionnent en majuscules. Au final, minuscules et majuscules ne donnent pas la même valeur numérique, à travers un protocole par exemple.
Notez que l'importance de la capitalisation concerne les codes et non les libellés. On peut écrire france, FRANCE ou France.
Mais il y a autre chose qui n'est pas correct, et cela tient du raisonnement. L'auteur du topic demande une liste de pays dans leur langue d'origine. Cela risque d'être compliqué à réaliser, impossible même, car un document ne peut être codé qu'avec un seul jeu de caractères à la fois. Il sera donc impossible d'afficher France en français et Chine en chinois, car pour la France on utilise couramment le jeu de caractères ISO-8859-1 et pour la Chine ça dépend de la région dans laquelle on se trouve. Certains diront qu'il y a Unicode. Oui, mais c'est pour l'instant très (très !) loin de fonctionner correctement sur toutes les plateformes : ce n'est donc pas une solution envisageable pour une efficacité immédiate. Ce qui ne veut pas dire qu'on est démuni.
On peut, par exemple, récupérer le contenu de Accept-language du protocole HTTP dans l'en-tête de la requête de page. De cette manière, on sait quelle est la langue de l'interface de l'utilisateur. Ca permet de dégrossir le terrain et d'afficher, par exemple, plusieurs variantes de la page dans des jeux de caractères et des langues différents.
Si l'on tient à récupérer à la fois la langue et le pays du visiteur, il va falloir que notre liste en tienne compte. Ce qui écarte hélas toutes celles données plus haut. Pour cela, on peut implémenter complètement les recommandations du w3c et construire une liste en conséquence. Mais il faudra tenir compte d'un certain nombre de possibilités : par exemple, l'anglais américain n'est pas le même que l'anglais du Royaume Uni, et en Suisse il y a 4 régions linguistiques officielles. Le w3c nous dit, toujours dans le document cité plus haut ( http://www.w3.org/International/O-HTML-tags ) sur la base du RFC 3066 que :
- l'on combine le tag du langage et du pays comme suit : xx-YY, où xx est la langue et YY le pays (tout ceci est sensible à la casse). Nous aurons donc par exemple :
- Pour la France : fr-FR
- Pour le Canada Français : fr-CA
- Pour la Suisse Romande : fr-CH
- Pour la Suisse Allemande : de-CH
- etc.
- on peut ne spécifier que la langue, par exemple : fr
A partir de ce qui précède, on a :
- présenté au visiteur une page qu'il est en mesure de comprendre sans lui avoir demandé quoi que ce soit (pas dans toutes les langues, certes, mais pour les cas "exotiques" il est acceptable de montrer une page en anglais).
- présenté une liste qui combine la langue et le pays adéquat, ce qui peut se stocker très efficacement dans une base de données par exemple et a l'immense avantage d'être normalisée.
On pourrait améliorer encore la solution en présentant directement 2 listes : celle des langues et celle des pays. Flexibilité ultime, on pourrait donc tenir compte d'un visiteur parlant arabe et vivant en France.
Pour tout ceci, n'oubliez pas qu'aujourd'hui sur Internet :
- il n'y a qu'une seule organisation qui fait foi pour les codes internationaux (pays et langues), c'est l'ISO
- il n'y a qu'un document qui explique comment combiner tout ça, c'est le RFC 3066
- il n'y a enfin qu'une seule organisation qui explique comment il faut utiliser tout ça sur Internet, c'est le w3c
- tout le reste n'est que perte de temps (à tenter de récupérer des listes douteuses sur Internet et à participer ainsi activement à le rendre propriétaire)
Donc, à vos signets ! Que cela soit dans votre boîte à outils ! Rappelez-vous aussi que ces recommendations évoluent et s'adaptent. Il est donc nécessaire d'y jeter un oeil de temps à autre.
Il est clair que les documents mentionnés plus haut ne sont pas utilisés que pour des documents HTML, XML ou XHTML. Ce sont les mêmes listes qui sont utilisées dans le cadre du protocole HTTP (en-têtes Accept-Language et Content-Language), mais aussi pour CSS et XSL. Evidemment que de nombreuses bases de données et applications en tiennent également compte. Respecter ces normes en les appliquant rigoureusement, c'est éviter de faire du travail de singe où l'on se retrouve un jour à devoir corriger des pages de code, implémenter un composant pour être compatible avec une autre partie de son propre site qui a été réalisé avec une humeur différente l'année précédente, etc. C'est un gage de sérieux et de réutilisabilité future. Enfin, c'est respecter le visiteur/client qui prend le temps de vous lire ou d'utiliser l'un de vos produits.
S'il y en quelques-uns parmi vous qui trouvent tout cela un peu compliqué, il existe une autre solution fort simple, et qui s'appuie moins fortement sur ce qui a été dit jusqu'ici. Il s'agit d'utiliser tout simplement des images de drapeaux en première page du site, un pour chaque pays ou zone à qui l'on souhaite s'adresser. Pas de problème de jeu de caractères. Plus large prise en compte des nationalités dès le départ. Et on peut affiner à souhait :
- on récupère l'information dans le querystring (vous l'avez deviné, on aura assigné à chaque drapeau un code de pays ISO ). L'image aussi porte le nom de ce code pour bien faire les choses !
- on peut spécifier au dessous de chaque drapeau une langue disponible (là aussi en utilisant un code de langue ISO )
- avec la 2ème proposition, on récupère à la fois le pays et la langue dans le querystring, et on recompose un couple langue-pays conforme aux recommandations du w3c, avec les qualités précédement décrites.
Voilà !
Edit : - correction des liens
Message édité par Yttrium le 18-07-2003 à 15:13:56