The TranslationServiceProvider provides a service for translating your application into different languages.
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
'locale_fallback' => 'en',
));
Note
The Symfony Translation Component comes with the “fat” Silex archive but not with the regular one. If you are using Composer, add it as a dependency to your composer.json file:
"require": {
"symfony/translation": "2.1.*"
}
The Translation provider provides a translator service and makes use of the translator.domains parameter:
$app['translator.domains'] = array(
'messages' => array(
'en' => array(
'hello' => 'Hello %name%',
'goodbye' => 'Goodbye %name%',
),
'de' => array(
'hello' => 'Hallo %name%',
'goodbye' => 'Tschüss %name%',
),
'fr' => array(
'hello' => 'Bonjour %name%',
'goodbye' => 'Au revoir %name%',
),
),
'validators' => array(
'fr' => array(
'This value should be a valid number.' => 'Cette valeur doit être un nombre.',
),
),
);
$app->get('/{_locale}/{message}/{name}', function ($message, $name) use ($app) {
return $app['translator']->trans($message, array('%name%' => $name));
});
The above example will result in following routes:
Silex\Application\TranslationTrait adds the following shortcuts:
$app->trans('Hello World');
$app->transChoice('Hello World');
Having your translations in PHP files can be inconvenient. This recipe will show you how to load translations from external YAML files.
First, add the Symfony2 Config and Yaml components in your composer file:
"require": {
"symfony/config": "2.1.*",
"symfony/yaml": "2.1.*"
}
Next, you have to create the language mappings in YAML files. A naming you can use is locales/en.yml. Just do the mapping in this file as follows:
hello: Hello %name%
goodbye: Goodbye %name%
Then, register the YamlFileLoader on the translator and add all your translation files:
use Symfony\Component\Translation\Loader\YamlFileLoader;
$app['translator'] = $app->share($app->extend('translator', function($translator, $app) {
$translator->addLoader('yaml', new YamlFileLoader());
$translator->addResource('yaml', __DIR__.'/locales/en.yml', 'en');
$translator->addResource('yaml', __DIR__.'/locales/de.yml', 'de');
$translator->addResource('yaml', __DIR__.'/locales/fr.yml', 'fr');
return $translator;
}));
Just as you would do with YAML translation files, you first need to add the Symfony2 Config component as a dependency (see above for details).
Then, similarly, create XLIFF files in your locales directory and add them to the translator:
$translator->addResource('xliff', __DIR__.'/locales/en.xlf', 'en');
$translator->addResource('xliff', __DIR__.'/locales/de.xlf', 'de');
$translator->addResource('xliff', __DIR__.'/locales/fr.xlf', 'fr');
Note
The XLIFF loader is already pre-configured by the extension.
Once loaded, the translation service provider is available from within Twig templates:
{{ app.translator.trans('translation_key') }}
Moreover, when using the Twig bridge provided by Symfony (see TwigServiceProvider), you will be allowed to translate strings in the Twig way:
{{ 'translation_key'|trans }}
{{ 'translation_key'|transchoice }}
{% trans %}translation_key{% endtrans %}