Globe of letters, (c) Seahen, GFDL http://commons.wikimedia.org/wiki/File:Globe_of_letters.svgTout d'abord, il faut se débarrasser de préjugés : pour faire un blog avec plusieurs langues, il faut faire plusieurs blogs et utiliser la fonctionnalité multiblogs de dotclear. Alors oui, au premier abord on a l'impression de faire un truc sale, qu'il faudra dupliquer les réglages, etc.

Oui, c'est vrai. Mais en échange, quelle simplicité par la suite !

Installation basique

Dans ce tutoriel, on va imaginer un blog en trois langues : Français, Anglais, Espagnol. En premier lieu, on va configurer trois virtual hosts, mais après, on configurera la content-negotiation pour avoir une vraie détection du langage sur le même virtual host.

Voici donc ma configuration Apache :

<VirtualHost *:80>
  ServerName www.grisbi.org
  ServerAlias fr.grisbi.org en.grisbi.org es.grisbi.org
  DocumentRoot /var/www/grisbi.org/dotclear
</VirtualHost>

Comment faire pour avoir un blog de langue différente en fonction du virtualhost ? On va faire simple, une seule installation de dotclear sera faite. Par contre, on va créer trois blogs dans dotclear avec chacun un ID différent: fr pour le Français, en pour l'Anglais et es pour l'Espagnol. Pour se faire, on va dans l'onglet « Liste des blogs, » on en crée un et dans les paramètres du blog on modifie le champ Identifiant du blog.

Configuration de l'ID d'un blog

Dans le fichier de configuration d'Apache, on ajoute les lignes suivantes:

SetEnvIf Host "fr.grisbi.org" DC_BLOG_ID=fr
SetEnvIf Host "en.grisbi.org" DC_BLOG_ID=en
SetEnvIf Host "es.grisbi.org" DC_BLOG_ID=es

Et bim, dotclear sera capable en fonction de la valeur de cette variable d'environnement d'utiliser l'un ou l'autre de ces blogs. En clair, le blog fr pour le virtualhost fr.grisbi.org, etc.

Il ne reste plus qu'à mettre des jolis drapeaux en haut de la page pour naviguer d'un site à l'autre.

Utilisation de la content negotiation.

Tout ça c'est bien joli, mais si je veux faire un site www.grisbi.org qui reconnaisse les réglages du navigateur, quitte à ajouter des drapeaux pour les gens qui veulent une autre version ? C'est très simple, on va se baser sur la content-negotiation qui fait partie de la norme HTTP. Passons les détails, mais le navigateur doit normalement envoyer au serveur une chaîne qui contient la liste des langages acceptés. C'est là qu'on va faire un traitement un peu porcin, mais qui marche !

Dans mon fichier de configuration d'Apache, j'ai les lignes suivantes juste avant les précédentes:

SetEnvIf Accept-Language "^$" DC_BLOG_ID=en
SetEnvIf Accept-Language "en" DC_BLOG_ID=en
SetEnvIf Accept-Language "es" DC_BLOG_ID=en
SetEnvIf Accept-Language "fr" DC_BLOG_ID=fr
SetEnvIf Accept-Language "^en" DC_BLOG_ID=en
SetEnvIf Accept-Language "^es" DC_BLOG_ID=en
SetEnvIf Accept-Language "^fr" DC_BLOG_ID=fr

On regarde donc si la variable Accept-Language du navigateur contient la chaîne en, fr, es et en fonction de l'ordre des directives //SetEnvIf// on spécifie le blog a afficher.

Faites l'essai, ça marche ! Alors on pourrait sans doute faire un traitement plus propre de cette chaîne (notamment, mieux gérer l'ordre), voir si on était courageux, développer une extension Dotclear qui fait ce travail. Mais l'un dans l'autre, cela fait ce qu'on veut pour un blog ayant peu de langues.

Si quelqu'un a des astuces dans cette même logique, je suis preneur !

Défauts de la méthode

J'en vois un, c'est qu'on ne lie pas pour le moment les billets des blogs entre eux. Par exemple, impossible lorsque l'utilisateur clique sur un drapeau pour changer de langue de le rediriger vers la version de l'article en cours dans une autre langue. Pour celà, je réfléchis à une solution, il faudrait rajouter par exemple un champ particulier à l'article et l'afficher dans la template associé au drapeau. SI je trouve l'astuce, je rajouterai un commentaire ici.