Je viens de mettre en ligne la version française de Symfonians[1]. J'ai préféré utiliser un sous-domaine pour définir la langue courante plutôt qu'un paramètre supplémentaire dans la requête, car le routing de Symfony implique de le gérer pour chacune des route (ou si y'a une astuce, je suis preneur.)

Ici, je détecte le sous domaine et en fait la langue courante de l'utilisateur au moyen d'un filtre. Pour ceux que ça intéresse, en voici le code :

<?php
class i18nSubdomainFilter extends sfFilter
{
  public function execute($filterChain)
  {
    if ($this->isFirstCall())
    {
      $context = $this->getContext();
      $request = $context->getRequest();
      $host_parts = explode('.', $request->getHost());
      if (count($host_parts) > 2) // We have at least a subdomain
      {
        $subdomain = strtolower($host_parts[0]);
        $enabled_cultures = sfConfig::get('app_cultures_enabled', array());
        if (array_key_exists($subdomain, $enabled_cultures))
        {
          sfConfig::set('sf_current_culture', $subdomain);
          $context->getResponse()->addMeta('language', $subdomain, true);
          $context->getUser()->setCulture($subdomain);
        }
      }
    }
    $filterChain->execute();
  }
}

Notez que je définis la liste des langues disponibles dans le fichier app.yml, pour éviter les blagues et gérer les domaines pour chacun des environnements que j'ai configuré[2] :

prod:
  cultures:
    enabled:
      en:    http://symfonians.net/
      fr:    http://fr.symfonians.net/

L'activation du filtre se fait dans le fichier filters.yml :

i18nSubdomain:
  class:    i18nSubdomainFilter

Et roule ma poule, mon routing reste strictement intact :-)

Notes

[1] 690 chaînes à traduire en deux heures, doit sans doûte rester du débris :p

[2] J'ai dautre part une action qui me permet de rediriger l'utilisateur vers la version traduite de la page courante, mais je vous fais grâce du code.