Navigation

Related Articles

Back to Latest Articles

LexikTranslationBundle, pour éditer vos traductions avec Symfony2


cedric
LexikTranslationBundle, pour éditer vos...

Bonjour à tous, voici le premier bundle Symfony2 made in Lexik, j’ai nommé LexikTranslationBundle. Le but de ce bundle est simple, pouvoir gérer le contenu des fichiers de traduction (xliff, yml, php) via la base de données afin de faciliter l’édition les traductions sans avoir à mettre le nez dans le code source du projet.

Pourquoi utiliser la base de données ?

En effet, pourquoi utiliser la base de données au lieu d’éditer directement les fichiers de traduction ? Lorsque votre site sera en production des modifications pourront être faites grâce à l’interface d’édition, cependant les développeurs seront potentiellement amenés à ajouter de nouvelles traductions dans les fichiers. Donc si on édite directement les fichiers de traduction un problème risque de se présenter: lors des mises en ligne, comment ajouter les nouvelles traductions sans perdre les modifications faites depuis l’interface d’édition ? (sans compter le fait que Apache devra avoir les droits en écriture sur les fichiers).
C’est pour cela que nous avons choisi de charger les traductions en base de données. De cette façon l’administrateur du site peut modifier les traductions à son gré et les développeurs peuvent à tout moment ajouter de nouvelles entées dans les fichiers.

Fonctionnement

Le bundle redéfinit le service de traduction de Symfony (translator) et fournit un loader pour charger les traductions depuis la base de données.
Les traductions présentes en base de données sont chargées en dernier, elles prennent donc le dessus sur les traductions des fichiers xliff, yml ou php. Le bundle fournit aussi une interface d’édition et d’ajout de traductions avec une intégration de jqGrid 4.2.0.
L’ajout de traduction dans la base de données se fait soit par l’interface, soit en ligne de commande avec une tâche qui va importer vos fichiers de traduction dans la base de données.

Utilisation

Lors de votre développement créez vos fichiers de traductions au moins pour une langue (la langue par défaut du site par exemple). Ensuite lancez la tâche d’import pour ajouter les nouvelles traductions en base de données. Une fois importées les traductions sont éditables dans l’interface, vous pouvez donc modifier les traductions pour toutes les langues gérées par le bundle.
Une traduction n’est éditable que si elle est présente dans la base de données, donc si vous ajoutez de nouvelles entées dans vos fichiers de traduction il faudra relancer la tache d’import.

Note: lors de la modification d’une traduction via l’interface il sera nécessaire de cliquer sur le bouton « invalidate cache » afin de prendre en compte le changement de la traduction (surtout en environnement de production).

Installation et configuration

L’installation se fait comme pour tous les autres bundle Symfony2 à l’aide des fichiers deps et deps.lock.
Au niveau de la configuration il vous faudra au minimum définir la langue par défaut (fallback_locale) et les langues que le bundle doit gérer (managed_locales), comme ci-dessous :

# app/config/config.yml
lexik_translation:
    fallback_locale:  fr
    managed_locales:  [fr, en]

Il est aussi possible de configurer certaines classes utilisées par le bundle dans le cas où vous souhaitez redéfinir des éléments (entité et/ou service).

Pour plus de détail sur cette partie je vous invite à lire la doc sur le dépot Github.

Show Comments (5)

Comments

  • Eric

    Top ce bundle, ce sera très utile à toute la communauté !

    • Article Author
  • PunKeel

    J’aime.
    Je vais sûrement suivre ce projet 🙂

    • Article Author
  • etoileweb

    Merci pour le bundle que je trouve génial. Mais j’ai quelques problèmes. L’exportation marche sans problème. Mais c’est l’importation qui pose quelques difficultés. Une fois la tache renvoie « No translation’s files in database », une autre fois « No translations to export » et autre fois encore « Output file: C:/wamp/www/Project/app/..\C:/wamp/www/Project/app/Resources/translations/messages.fr.yml
    21 translations to export: « Warning: file_put_contents(C:/wamp/www/Project/app/..\C:/wamp/www/Project/app/Resources/translations/messages.f
    r.yml): failed to open stream: Invalid argument in C:\wamp\www\Project\vendor\lexik\translation-bundle\Lexik\Bundle\TranslationBundle\Tra
    nslation\Exporter\YamlExporter.php line 22″ ».
    Il y a sans doute une procédure propre d’importation des traductions que je ne maîtrise pas. Pourriez vous m’aider ? merci.

    • Article Author
  • cedric

    @etoileweb Salut, je pense que l’erreur que tu as viens du fait que les dernières version du bundle ne stocke plus les path des fichers en absolut mais en relatif par rapport au kernel.root_dir.
    Si ton kernel.root_dir est « C:/wamp/www/Project/app/ » alors la colonne « path » de la table « lexik_translation_file » devrait contenir des path de la forme :
    – pour un fichier de traduction qui serait dans app/ : « Resources/translations »
    – pour un fichier de traduction qui serait un bundle de ton projet : « ../src/MySuperBundle/Resources/translations »

    • Article Author
  • etoileweb

    Merci d’avoir répondu. Voici un exemple d’un chemin dans la colonne path: « ..\C:wampwwwProjetvendorsonata-projectadmin-bundleSonataAdminBundle/Resources/translations », et pour mon dossier app : « ..\C:/wamp/www/Benin/app/Resources/translations ». Les chemins ont mal écrits, en commençant par « ..\ » et avec des « / » manquants dans le premier par exemple. Si je dois suivre ta réponse, je dois corriger toutes les entrées manuellement ?

    • Article Author

Recevez nos articles