Depuis un certain temps, certaines pages de mon site sont disponibles en anglais (bon, il faut que je traduise celles qui ne le sont pas quand j'aurais deux minutes). Il y avait tout de même deux points qui m'embêtaient.

Le premier est de permettre l'accès aux deux langues par un petit lien. Mais comment structure le site ? Est-ce mieux d'avoir http://www.vuntz.net/en/page/, http://www.vuntz.net/page/en/, http://www.vuntz.net/page/index.en.php, http://www.vuntz.net/page/index.php.en ? Le choix est important car il est préférable de toujours garder les mêmes adresses. J'aurais tendance à pencher vers http://www.vuntz.net/en/page/ mais cela ne colle pas trop avec la structure des fichiers. Et je traîne donc des pieds...

Le second point était que toutes les pages de mon journal étaient en français car la version actuelle de DotClear ne permet pas d'adapter la langue de la page à la personne qui la regarde. Après avoir eu droit à une ou deux petites remarques (but what does 'Merci d'écrire dans un Français correct et lisible' mean?), je me suis attelé à la tâche. Comme tout le monde devrait le savoir, la négociation de la langue utilisée a lieu par l'intermédiaire de HTTP_ACCEPT_LANGUAGE. Avec une fonction toute simple en PHP, on peut récupérer la valeur, et en fonction de celle-ci utiliser un fichier au lieu d'un autre.

Concrètement, mon fichier template.php contient :

<?php
require_once ("i18n.php");
$zen_lang = get_language ();
if ($zen_lang == "french") {
	include ("template.fr.php");
} else {
	include ("template.en.php");
}
?>

Il suffit de faire de même avec tous les autres fichiers. La fonction get_language() étant définie comme ceci :

// Taken from: http://www-128.ibm.com/developerworks/web/library/wa-apac.html

function get_language()
{
  global $HTTP_ACCEPT_LANGUAGE;
  $language_pages = array(
                      "en"=>"english",
                      "fr"=>"french"
                    );
  $language_default = "english";
  $language_nofound = "english";
  // get preferred languages in the "Accept-Language" header
  if($HTTP_ACCEPT_LANGUAGE == "")
  {
    // no preference set
    return $language_default;
  }
  // form an array of preferred languages
  $accept_language = str_replace(" ", "", $HTTP_ACCEPT_LANGUAGE);
  $languages = explode(",", $accept_language);
  // check for a recognised language
  for($i = 0; $i < sizeof($languages); $i++)
  {
    $pref = explode(";", $languages[$i]);
    if($language_pages[$pref[0]] != "")
    {
      // found a preferred language
      return $language_pages[$pref[0]];
    }
  }
  return $language_nofound;
}

Et voilà, le tour est joué. Il reste quelques petits problèmes (les dates sont en français, les greffons affichent aussi des chaînes en français, etc.), mais rien de grave.