2013-01-10 24 views
5

ho questa situazione:Riferimento di traduzione all'interno di un'altra traduzione

unit: 
    sqkm: Square Kilometers 

my_translation: Size is %size% ## I want to append the value of unit.sqkm here ## 

Esiste un modo per fare riferimento alla traduzione del unit.sqkm all'interno della chiave my_translation?

Modifica: Si noti che so come posso farlo tramite ramoscello. La mia domanda è: c'è un modo per farlo nei file di traduzione.

+1

Hai trovato un modo per fare con i tuoi file di traduzione? – crmpicco

risposta

1

È possibile utilizzare valori tradotti all'interno di altre traduzioni.

{{ 'paragraph' | trans({ '%size%': 3, '%unit%': 'unit' | trans()}) }} 

Dove unit sé è un'altra chiave per una traduzione. Il file di traduzione però potrebbe essere la seguente:

paragraph: Size is %size% %unit% 
unit: Square Kilometers 
+1

Grazie per la risposta, ma voglio farlo nei miei file di traduzione, non nella vista. – smoove

+0

@devsheeep Questo è utile per ottenere lo stesso risultato tramite Twig, tuttavia l'OP ha richiesto una soluzione per i file di traduzione. – crmpicco

1

Nel modello Ramoscello, provate questo:

{{ 'my_translation' | trans({'%size%': size, 'unit.sqkm' : ('unit.sqkm'|trans)}) }} 
+0

Grazie per la tua risposta, ma voglio farlo nei miei file di traduzione, non nella vista. – smoove

1

ho esteso Symfony Tanslator per questo:

<?php 

namespace Bundle\Program\Translation; 

use Symfony\Bundle\FrameworkBundle\Translation\Translator as BaseTranslator; 

class Translator extends BaseTranslator 
{ 
    /** 
    * Uses Symfony Translator to translate, but enables referencing other translations via @@[email protected]@ 
    */ 
    public function trans($id, array $parameters = array(), $domain = null, $locale = null) 
    { 
     $text = parent::trans($id, $parameters, $domain, $locale); 

     $translations = []; 

     $delimiter = "@@"; 
     $strLen = strlen($delimiter); 
     $pos = strpos($text, $delimiter); 

     while ($pos !== false) { 
      $startsAt = $pos + $strLen; 
      $endsAt = strpos($text, $delimiter, $startsAt); 
      $translations[] = $delimiter . substr($text, $startsAt, $endsAt - $startsAt) . $delimiter; 
      $pos = strpos($text, $delimiter, $endsAt + $strLen); 
     } 

     foreach ($translations as $translation) { 
      $translationTrim = str_replace($delimiter, '', $translation); 
      $text = str_replace($translation, $this->trans($translationTrim, $parameters, $domain, $locale), $text); 
     } 

     return $text; 
    } 
} 

Quindi sostituire il traduttore Symfony classe tramite parametri:

parameters: 

    translator.class: Bundle\Program\Translation\Translator 

Ora puoi fare riferimento ad altre traduzioni tramite @@ other.translation @@ INSIDE il tuo file yml.