El TranslationServiceProvider provee un servicio para traducir tu aplicación a diferentes idiomas.
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
'locale_fallback' => 'en',
));
Nota
El componente de traducción de Symfony viene en el archivo “gordo” de Silex pero no en el normal. Si estás usando Composer, añádelo como dependencia a tu archivo composer.json:
"require": {
"symfony/translation": "2.1.*"
}
El proveedor Translation ofrece un servicio traductor y usa el parámetro translator.domains:
$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));
});
El ejemplo anterior se traducirá en las siguientes rutas:
Silex\Application\TranslationTrait añade los siguientes atajos:
$app->trans('Hello World');
$app->transChoice('Hello World');
Tener tu traducción en archivos PHP puede ser un inconveniente. Esta receta te muestra cómo cargar traducciones de archivos YAML externos.
En primer lugar, añade los componentes Config y Yaml a tu archivo composer.
"require": {
"symfony/config": "2.1.*",
"symfony/yaml": "2.1.*"
}
A continuación, debes crear las asignaciones de idioma en los archivos YAML. Un nombre que puedes utilizar es locales/en.yml. Sólo haz la asignación en este archivo de la siguiente manera:
hello: Hello %name%
goodbye: Goodbye %name%
Luego, registra el YamlFileLoader en el traductor y añade todos tus archivos de traducción:
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;
}));
Al igual que lo harías con los archivos de traducción YAML, primero te tienes que asegurar de que tienes como dependencia el componente Config de Symfony2 (ve los detalles arriba).
Luego, de igual manera, crea los archivos XLIFF en tu directorio de regiones y agrégalos al traductor:
$translator->addResource('xliff', __DIR__.'/locales/en.xlf', 'en');
$translator->addResource('xliff', __DIR__.'/locales/de.xlf', 'de');
$translator->addResource('xliff', __DIR__.'/locales/fr.xlf', 'fr');
Nota
El cargador XLIFF ya está preconfigurado por la extensión.
Una vez cargado, el proveedor del servicio de traducción está disponible desde las plantillas Twig:
{{ app.translator.trans('translation_key') }}
Además, cuándo utilizas el puente Twig proporcionado por Symfony (ve TwigServiceProvider), te será permitido traducir cadenas a la manera de Twig:
{{ 'translation_key'|trans }}
{{ 'translation_key'|transchoice }}
{% trans %}translation_key{% endtrans %}