Reputation: 4876
I have done the following checklist:
Though in my twig template file,
{{ 'message'|trans }}
never translates.
Where can I look next in order to make translations work?
Is there any chance that Doctrine Translatable Extension that I am using generates some kind of conflicts?
Upvotes: 17
Views: 51129
Reputation: 924
Have you enabled the Translator service in your config file?
framework:
translator: { fallbacks: en }
The language catalogue is created in your cache folder irrespective of whether your translator is enabled or not.
Did you try translating in your controller?
$trans = $this->get('translator')->trans('message');
Upvotes: 25
Reputation: 4527
This helped me to get it worked, since clearing the cache also didn't help.
Symfony 4.6.2:
Try this command to update translation files:
php bin/console translation:update --dump-messages --force de
(Source: https://symfony.com/doc/current/translation.html#configuration)
Upvotes: 1
Reputation: 17944
According to the Symfony Translations Documentation page, if you are not using a Service Container for your translation purpose, these are simple steps to go:
Enable and configure Symfony's translation service.
YAML
framework:
translator: { fallbacks: [en] }
PHP
$container->loadFromExtension('framework', array(
'translator' => array('fallbacks' => array('en')),
));
Abstract strings (i.e. "messages") by wrapping them in calls to the Translator ("Basic Translation").
public function indexAction()
{
$translated = $this->get('translator')->trans('Symfony is great');
return new Response($translated);
}
Create translation resources/files for each supported locale that translate each message in the application.
Symfony looks for message files (i.e. translations) in the following default locations:
app/Resources/translations
directory;app/Resources/<bundle name>/translations
directory;the Resources/translations/
directory inside of any bundle.
Translation File Name
The filename of the translation files is also important: each message file must be named according to the following path: domain.locale.loader (e.g. filename: navigation.en.xlf
):
domain: An optional way to organize messages into groups (e.g. admin
, navigation
or the default messages
) - see Using Message Domains;
locale: The locale that the translations are for (e.g. en_GB, en, etc); loader: How Symfony should load and parse the file (e.g. xlf, php, yml, etc).
The loader can be the name of any registered loader. By default, Symfony provides many loaders, including:
xlf
: XLIFF file;php
: PHP file;yml
: YAML file.
The choice of which loader to use is entirely up to you and is a matter of taste. The recommended option is to use xlf
for translations.
Determine, set and manage the user's locale for the request and optionally on the user's entire session.
Clear the cache:
php bin/console c:c
The Translation Process
To actually translate the message, Symfony uses a simple process:
Upvotes: 6
Reputation: 1671
Just faced the same issue and fixed it by $this->get('translator')->setLocale('fr');
in the controller action. I fixed it by adding {_locale}
in the route path.
Upvotes: 0
Reputation: 2634
In Symfony 3.0 I had to clear the cache:
php bin/console cache:clear
I see you already did that, maybe it helps other like me.
Upvotes: 26
Reputation: 350
I could use one of the translations, but not the other and didn't know why. If you have troubles with translations also, read this.
First, standard checklist:
php app/console cache:clear
command.$this->getRequest()->setLocale('en');
in Controller, also you may try to use $this->get('translator')->trans('Some message');
directly in your Controller.Watch out for BOM
in the translated file. The translator who translates the yml file used UTF8 which is OK, but editor he used leaved BOM at the beginning of the file. This is dangerous probably because of PHP's UTF8 BOM bug as it adds few invisible characters to first section of your file.
Btw, debugging your translations may be very helpful, too.
Upvotes: 8
Reputation: 8915
I can already answer your 2 questions:
1: you can look at
https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L97 https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Translation/Translator.php#L174
2: If you're talking about gedmo doctrine extensions, or Knplabs DoctrineBehaviors, no, there is no way it conflicts with symfonys's translator. These are 2 independant pieces.
Upvotes: 0
Reputation: 12033
Try to specify domain. If you not specify domain by default it a messages.
{{ 'message'|trans({}, 'some_domain') }}
Then translations can be found in
For example some_domain.fr.yml
. Last step is to configure your locale. You can get current locale from request with $request->getLocale()
P.S. try to rm -r app/cache
to make sure that the cache is deleted
Upvotes: 18