2013-03-21 19 views
7

Mam projekt Symfony2 i używam komponentu Translation do tłumaczenia tekstu. Mam wszystkie tłumaczenia w yml pliku jak takZaawansowane dostosowywanie tłumaczeń w Symfony2

translation-identifier: Translated text here 

Przekładając tekst wygląda jak ten z Twig

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

Rzecz w tym, w niektórych przypadkach, że chciałby mieć dwa różne teksty do samego tłumaczenia (nie dla pluralizacji). Oto jak chciałbym go do pracy:

  1. Określ dwa teksty w yml pliku tłumaczeń, które muszą mieć różne teksty. Każdy będzie miał swój własny unikalny przyrostek

    translation-identifier-suffix1 
    
    translation-identifier-suffix2 
    
  2. zdefiniować globalnego regułę, która będzie określić, które powinny być wybrane przyrostek. Psuedocode poniżej:

    public function getSuffix() { 
        return rand(0, 10) < 5 ? '-suffix1' : '-suffix2'; 
    } 
    
  3. Gałązka (i PHP) będzie wyglądać tak samo - Chciałbym jeszcze tylko podać identyfikator bez przyrostka. Translator powinien następnie dołączyć sufiks do identyfikatora i spróbować znaleźć dopasowanie. Jeśli nie będzie pasować, spróbuje ponownie znaleźć dopasowanie bez sufiksu.

Odpowiedz

9

AFAIK, składnik Tłumacza nie obsługuje tego.

Ale jeśli chcesz tego samego rodzaju zachowania, możesz to zrobić, zastępując usługę tłumacza.

1) Przestawianie usługę

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

pierwsze, można ustawić parametr posiadający nazwę klasy na usługę do swojej własnej klasy, ustawiając go w app/config/config.yml. FYI: https://github.com/symfony/FrameworkBundle/blob/master/Resources/config/translation.xml

2) Przedłuż klasę tłumaczeń pod warunkiem symfony framework bundle. FYI: https://github.com/symfony/FrameworkBundle/blob/master/Translation/Translator.php

3) nadpisywania funkcji trans który Provider translator component. https://github.com/symfony/Translation/blob/master/Translator.php

Mam nadzieję, że to pomoże!

+0

Dzięki, mam to działa –

+0

Dziękuję. Mi to pasuje. – bharatesh

+0

To już nie działa z Symfony 3. Aby znaleźć inne rozwiązanie, spójrz poniżej. – Markus

5

Oto rozszerzona klasa tłumacz w przypadku ktokolwiek potrzebuje

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

    } 

?> 
2

Jak Symfony 3, odpowiedź Venu już nie działa zupełnie, jako parametr translator.class nie jest już używana.

Aby załadować niestandardową klasę translatora, musisz teraz utworzyć przepustkę kompilatora.

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

Ta przepustka kompilatora musi zostać dodana do kontenera.

<?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()); 
    } 
} 
+2

Alternatywnie możesz również udekorować istniejącego tłumacza: https://symfony.com/doc/current/service_container/service_decoration.html – Markus