web-dev-qa-db-fra.com

Les traductions de Symfony ne fonctionnent pas

J'ai fait la liste de contrôle suivante:

  1. fichier de traduction créé en respectant le format domain.lang.loader
  2. cache effacé
  3. vérifié que le catalogue de langues est créé dans le dossier cache

Bien que dans mon fichier de modèle twig,

{{ 'message'|trans }}

ne traduit jamais.

Où puis-je chercher ensuite pour que les traductions fonctionnent?

Y a-t-il une chance que Doctrine Translatable Extension que j'utilise génère une sorte de conflit?

15
Michael

Dans Symfony 3.0, j'ai dû vider le cache:

php bin/console cache:clear

Je vois que tu l'as déjà fait, peut-être que ça aide d'autres comme moi.

23
zuzuleinen

Avez-vous activé le service Translator dans votre fichier de configuration ??

framework:
    translator: { fallback: en }

Le catalogue de langues est créé dans votre dossier de cache, que votre traducteur soit activé ou non.

Avez-vous essayé de traduire dans votre contrôleur ??

$translatedMessage = $this->get('translator')->trans('message');
23
Ankit Khedekar

Essayez de spécifier le domaine . Si vous ne spécifiez pas de domaine par défaut, il s'agit d'un message.

{{ 'message'|trans({}, 'some_domain') }} 

Ensuite, les traductions peuvent être trouvées dans

  • le répertoire racine du noyau/le répertoire Resources/translations;
  • le répertoire racine du noyau/Resources/bundle name/translations directory;
  • le répertoire Ressources/traductions/du bundle.

Par exemple some_domain.fr.yml. La dernière étape consiste à configurer vos paramètres régionaux. Vous pouvez obtenir les paramètres régionaux actuels à partir de la demande avec $request->getLocale()

P.S. essayez de rm -r app/cache pour vous assurer que le cache est supprimé

15
Alexey B.

Je pouvais utiliser l'une des traductions, mais pas l'autre et je ne savais pas pourquoi. Si vous avez également des problèmes avec les traductions, lisez ceci.

Tout d'abord, liste de contrôle standard:

  • Assurez-vous vous avez activé et configuré le traducteur .
  • Assurez-vous que la traduction est au bon endroit et suit convenction de nommage appropriée (domaine (messages par défaut) .lang_code.file_format).
  • Vider le cache à l'aide de la commande php app/console cache:clear.
  • Essayez d'appeler manuellement $this->getRequest()->setLocale('en'); dans le contrôleur, vous pouvez également essayer d'utiliser $this->get('translator')->trans('Some message'); directement dans votre contrôleur.
  • Si cela ne fonctionne toujours pas, assurez-vous que la nomenclature n'est pas dans votre fichier traduit. C'était mon cas.

Attention à BOM dans le fichier traduit. Le traducteur qui traduit le fichier yml a utilisé UTF8, ce qui est correct, mais l'éditeur a utilisé la nomenclature à feuilles au début du fichier. Ceci est dangereux probablement à cause de bogue UTF8 BOM de PHP car il ajoute quelques caractères invisibles à la première section de votre fichier.

Btw, débogage de vos traductions peut également être très utile.

7
Jakub Krol

Selon la page de documentation de Symfony Translations , si vous n'utilisez pas Conteneur de service à des fins de traduction, voici les étapes simples à suivre:

  1. Activer et configurer le service de traduction de Symfony.

    • YAML

      framework:
          translator: { fallbacks: [en] }
      
    • PHP

      $container->loadFromExtension('framework', array(
          'translator' => array('fallbacks' => array('en')),
      ));
      
  2. Chaînes abstraites (c'est-à-dire "messages") en les enveloppant dans des appels au traducteur (" Traduction de base ").

    public function indexAction()
    {
        $translated = $this->get('translator')->trans('Symfony is great');
    
        return new Response($translated);
    }
    
  3. Créer des ressources/fichiers de traduction pour chaque paramètre régional pris en charge qui traduit chaque message dans l'application.

    Symfony recherche les fichiers de messages (c'est-à-dire les traductions) dans les emplacements par défaut suivants:

    • les app/Resources/translations répertoire;
    • les app/Resources/<bundle name>/translations répertoire;
    • les Resources/translations/ répertoire à l'intérieur de n'importe quel bundle.

      Nom du fichier de traduction

      Le nom de fichier des fichiers de traduction est également important: chaque fichier de message doit être nommé selon le chemin suivant: domaine . locale . chargeur (par exemple nom de fichier: navigation.en.xlf):

      • domaine: une façon facultative d'organiser les messages en groupes (par exemple admin, navigation ou la valeur par défaut messages) - voir tilisation des domaines de message ;

      • paramètres régionaux: paramètres régionaux pour lesquels les traductions sont effectuées (par exemple en_GB, en, etc.); chargeur: comment Symfony doit charger et analyser le fichier (par exemple xlf, php, yml, etc.).

      • Le chargeur peut être le nom de tout chargeur enregistré. Par défaut, Symfony fournit de nombreux chargeurs, notamment:

        • xlf: [~ # ~] xliff [~ # ~] fichier;
        • php: [~ # ~] php [~ # ~] fichier;
        • yml: [~ # ~] yaml [~ # ~] fichier.

          Le choix du chargeur à utiliser dépend entièrement de vous et est une question de goût. L'option recommandée est d'utiliser xlf pour les traductions .

  4. Déterminez, définissez et gérez les paramètres régionaux de l'utilisateur pour la demande et facultativement sur toute la session de l'utilisateur .

  5. Vider le cache:

    php bin/console c:c
    

Le processus de traduction

Pour traduire réellement le message, Symfony utilise un processus simple:

  • Les paramètres régionaux de l'utilisateur actuel, qui sont stockés sur la demande, sont déterminés;
  • Un catalogue (par exemple, une grande collection) de messages traduits est chargé à partir des ressources de traduction définies pour les paramètres régionaux (par exemple fr_FR). Les messages provenant des paramètres régionaux de secours sont également chargés et ajoutés au catalogue s'ils n'existent pas déjà. Le résultat final est un grand "dictionnaire" de traductions.
  • Si le message se trouve dans le catalogue, la traduction est renvoyée. Sinon, le traducteur renvoie le message d'origine.
6
Pmpr

Je peux déjà répondre à vos 2 questions:

1: vous pouvez regarder

https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L97https://github.com/ symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.phphttps://github.com/symfony/symfony/blob/master/src/Symfony/Component/ Translation/Translator.php # L174

2: Si vous parlez des extensions gedmo doctrine, ou Knplabs DoctrineBehaviors, non, il n'y a aucun moyen que cela entre en conflit avec le traducteur de symfonys. Ce sont 2 pièces indépendantes.

0
Florian

Je viens de faire face au même problème et je l'ai résolu par $this->get('translator')->setLocale('fr'); dans l'action du contrôleur. Je l'ai corrigé en ajoutant {_locale} dans le chemin de l'itinéraire.

0
R Sun

Cela m'a aidé à le faire fonctionner, car l'effacement du cache n'a pas aidé non plus.

Symfony 4.6.2:

Essayez cette commande pour mettre à jour les fichiers de traduction:

php bin/console translation:update --dump-messages --force de

(Source: https://symfony.com/doc/current/translation.html#configuration )

0
AlexioVay