TranslationServiceProvider

El TranslationServiceProvider provee un servicio para traducir tu aplicación a diferentes idiomas.

Parámetros

  • translator.domains (optional): Una asignación de dominios/regiones/mensajes. Este parámetro contiene los datos traducidos de todos los idiomas y dominios.
  • locale (opcional): La región para el traductor. Lo más probable es que desees establecer este basándote en algún parámetro de la petición. Predeterminada a en.
  • locale_fallback (opcional): La región de reserva para el traductor. Esta se utiliza cuando la configuración regional actual no tiene ningún conjunto de mensajes. Predeterminada a en.

Servicios

  • translator: Una instancia de Translator, utilizada para traducir.
  • translator.loader: Una instancia de una implementación de la LoaderInterface del traductor, predeterminada a un ArrayLoader.
  • translator.message_selector: Una instancia de MessageSelector.

Registrando

$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.*"
}

Uso

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:

  • /en/hello/igor regresará Hello igor.
  • /de/hello/igor regresará Hallo igor.
  • /fr/hello/igor regresará Bonjour igor.
  • /it/hello/igor regresará Hello igor (debido a la reserva).

Peculiaridades

Silex\Application\TranslationTrait añade los siguientes atajos:

  • trans: Traduce el mensaje suministrado.
  • transChoice: Traduce el mensaje de elección dado escogiendo una traducción de acuerdo a un número.
$app->trans('Hello World');

$app->transChoice('Hello World');

Recetas

Archivos de idioma basados en YAML

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;
}));

Archivos de idioma basados en XLIFF

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.

Accediendo a las traducciones en las plantillas Twig

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 %}
Bifúrcame en GitHub