Live geek or die tryin'

Silex: Le Service De Traduction Et Les Templates Twig

Silex est un micro-framework basé sur les composants de Symfony 2 grâce auquel je suis entrain de développer une sorte de vCard ou page d’accueil (faute de meilleur terme).

Parmi ses nombreuses fonctionnalités: La traduction. Bien qu’elle soit très facile à implémenter, la méthode n’est décrite nulle part sur la doc.
Heureusement, sinon je n’aurais rien à poster sur ce blog.

Trêve de plaisanteries, voici sans attendre comment implémenter la traduction avec Silex.

Déclarer les traductions

Dans un répertoire src/locales/ créez autant de fichiers yml que de langues désirées.

Exemple de fichiers:

en.yml:

  hello:      Hello
  about_me:   About me
  contact_me: Contact me

fr.yml:

hello:      Bonjour
about_me:   A propos de moi
contact_me: Contactez-moi

Déclarer le service TranslationServiceProvider dans votre app.php

$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'locale'                    => LiveGeekUtil::getClientLanguage(),
    'locale_fallback'           => 'en',
    'translation.class_path'    => __DIR__.'/vendor/Symfony/Component',
));

locale indique la langue utilisée.
locale_fallback indique la langue utilisée si notre application ne supporte pas la langue donnée dans locale.

Notez que j’ai utilisé une méthode statique pour récupérer la langue du navigateur du visiteur. La voici:

public static function getClientLanguage() {
    $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    return substr($langs[0], 0, 2);
}

Indiquer à l’application où se trouvent vos fichiers de langue:

$app['translator.messages'] = array(
    'fr' => __DIR__.'/../src/locales/fr.yml',
    'en' => __DIR__.'/../src/locales/en.yml'
);

Charger le composant qui lit les fichiers yml

PHP ne comprennant pas les fichiers YAML, on utilise le composant YAML de Symfony;

$app['autoloader']->registerNamespace('Symfony', __DIR__.'/../vendor/Symfony/src');
$app['translator.loader'] = new Symfony\Component\Translation\Loader\YamlFileLoader();

Déclarer SymfonyBridgesServiceProvider

Ce service fait la liaison entre la traduction et les templates Twig.

$app->register(new Silex\Provider\SymfonyBridgesServiceProvider(), array(
    'symfony_bridges.class_path' => __DIR__.'/vendor/Symfony/Component',
));

Et voilà.

A partir de maintenant, affichez le texte dans vos templates grâce aux balises Twig {% trans %}, ceux-ci seront automatiquement traduits dans la langue du navigateur de votre utilisateur, du moment qu’elle soit supportée.

{% trans %}contact_me{% endtrans %}

Liens utiles:

Bon courage et amusez-vous bien avec Silex! :)

Comments