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:
Defina dos textos en el archivo
yml
para las traducciones que necesitan tener textos diferentes. Cada uno tendría su propio sufijo únicotranslation-identifier-suffix1 translation-identifier-suffix2
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''; }
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());
}
}