translations language component change php symfony translation

php - language - symfony4 translations



Personalización avanzada de traducciones en Symfony2 (3)

AFAIK, el componente Traductor no lo admite.

Pero si desea el mismo tipo de comportamiento, puede hacerlo anulando el servicio del traductor.

1) Anular el servicio

# app/config/config.yml parameters: translator.class: Acme/HelloBundle/Translation/Translator

Primero, puede establecer el parámetro que contiene el nombre de la clase del servicio en su propia clase configurándolo en app/config/config.yml . FYI: https://github.com/symfony/FrameworkBundle/blob/master/Resources/config/translation.xml

2) Extienda la clase de traductor proporcionada por el symfony framework bundle . FYI: https://github.com/symfony/FrameworkBundle/blob/master/Translation/Translator.php

3) Sobrescriba la función trans que es proveedor por translator component . https://github.com/symfony/Translation/blob/master/Translator.php

¡Espero que esto ayude!

Tengo un proyecto Symfony2 y estoy usando un componente de traducción para traducir texto. Tengo todas las traducciones en archivo yml como tal

translation-identifier: Translated text here

Traducir texto se ve así de Twig

''translation-identifier''|trans({}, ''domain'')

La cuestión es que, en algunos casos, me gustaría tener dos textos diferentes para la misma traducción ( no para la pluralización ). Así es como me gustaría que funcione:

  1. Defina dos textos en el archivo yml para las traducciones que necesitan tener textos diferentes. Cada uno tendría su propio sufijo único

    translation-identifier-suffix1 translation-identifier-suffix2

  2. Defina una regla global que defina qué sufijo se debe elegir. Psuedocode a continuación:

    public function getSuffix() { return rand(0, 10) < 5 ? ''-suffix1'' : ''-suffix2''; }

  3. Twig (y PHP) se verían igual; yo seguiría especificando solo el identificador sin sufijo. El traductor agregaría el sufijo al identificador e intentará encontrar una coincidencia. Si no hubiera coincidencia, trataría de encontrar una coincidencia nuevamente sin sufijo.


Aquí está la clase de traductora extendida en caso de que alguien la necesite

<?php namespace Acme/HelloBundle/Translation; use Symfony/Bundle/FrameworkBundle/Translation/Translator as BaseTranslator; use Symfony/Component/Translation/MessageSelector; use Symfony/Component/DependencyInjection/ContainerInterface; class Translator extends BaseTranslator { const SUFFIX_1 = ''_suffix1''; const SUFFIX_2 = ''_suffix2''; private $suffix; public function __construct(ContainerInterface $container, MessageSelector $selector, $loaderIds = array(), array $options = array()) { parent::__construct($container, $selector, $loaderIds, $options); $this->suffix = $this->getSuffix($container); } public function trans($id, array $parameters = array(), $domain = ''messages'', $locale = null) { if ($locale === null) $locale = $this->getLocale(); if (!isset($this->catalogues[$locale])) $this->loadCatalogue($locale); if($this->suffix !== null && $this->catalogues[$locale]->has((string) ($id . $this->suffix), $domain)) $id .= $this->suffix; return strtr($this->catalogues[$locale]->get((string) $id, $domain), $parameters); } private function getSuffix($container) { return rand(0, 10) < 5 ? self::SUFFIX_1 : self::SUFFIX_2; } } ?>


A partir de Symfony 3, la respuesta de Venu ya no funciona completamente, ya que el parámetro translator.class ya no se usa.

Para cargar su clase de traducción personalizada, ahora necesita crear un pase de compilación.

<?php namespace Acme/HelloBundle/DependencyInjection/Compiler; use Acme/HelloBundle/Translation/Translator; use Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface; use Symfony/Component/DependencyInjection/ContainerBuilder; class TranslatorOverridePass implements CompilerPassInterface { public function process(ContainerBuilder $container) { $container->getDefinition(''translator.default'')->setClass(Translator::class); } }

Y este pase de compilador debe agregarse al contenedor.

<?php namespace Acme/HelloBundle; use Acme/HelloBundle/DependencyInjection/Compiler/TranslatorOverridePass; use Symfony/Component/DependencyInjection/ContainerBuilder; use Symfony/Component/HttpKernel/Bundle/Bundle; class AcmeHelloBundle extends Bundle { public function build(ContainerBuilder $container) { $container->addCompilerPass(new TranslatorOverridePass()); } }