2013-04-05 3 views
7

In Symfony/Twig, potrei usare i tag usando percentuali nel mio blocco tradotto. Per esempio:Utilizzare i segnaposti nella traduzione usando i tag

Hello {{nickname}} 

sarebbe diventato

{% trans %}Hello %nickname%{% endtrans %} 

Questo funziona come previsto. L'array con segnaposto che ho passato a Twig, viene automaticamente mappato su% placeHolder%. Nessun lavoro extra coinvolto. Quindi, questo funziona con il mio array PHP dall'essere controllore:

Array('nickname' => 'rolandow') 

Quando voglio usare il soprannome all'interno del blocco di traduzione, tutto quello che devo fare è lo circondano con percentuali%. Sfortunatamente, questo non sembra funzionare quando lo passo a trans.

Ora mi piacerebbe tradurre un intero blocco di testo, usando i tag. Non riesco a capire come posso usare i tag nella mia traduzione. Quindi, il mio ramoscello sarebbe simile a questa:

{{ say.hello|trans }} 

E la mia traduzione snippet

<trans-unit id="1"> 
    <source>say.hello</source> 
    <target>Hello %nickName%, how are you doing today? lots-of-text-here</target> 
</trans-unit> 

ho ottenuto che funziona utilizzando questo nel mio modello, ma ci si sente come fare le cose due volte. Ora ho bisogno di mettere di nuovo la matrice di segnaposto nella funzione trans. Per esempio:

{{ say.hello|trans('%nickName%' : nickName) }} 

Se voglio usare altri tag che sono date a ramoscello nel mio controller, ho bisogno di passare loro al traduttore pure. Non posso semplicemente passare l'array completo in qualche modo?

+0

Sei in realtà la costruzione di una matrice come '$ tags = array ('% soprannome%' => 'luke') 'nel tuo controller? Se è così puoi semplicemente fare '{{say.hello | trans (tag)}}' – Luke

+0

Oppure dichiarare la variabile 'tags' usando la parola chiave' set' Twig. – eagleoneraptor

+0

@Luke, no la matrice è come array ('nickname' => 'luke'). Questo è in realtà il mio punto, sembra una codifica ridondante per scorrere attraverso l'array e aggiungere le percentuali. Speravo che ci fosse un modo migliore per farlo. Realizzo ora che fare questo nel controller è un posto molto migliore rispetto al modello. – rolandow

risposta

1

Ci sono diverse domande qui, quindi copriamole.

1) Il comportamento di Twig non è come una query di Doctrine, in cui ogni parametro deve essere limitato. È possibile passare un array contenente parametri non utilizzati a trans, quindi se non si desidera specificare {'key': 'value', 'key2': 'value2'...} nel filtro, passare semplicemente l'intero array (esempio: | trans(array)). Questo è il punto @Luke.

2) È possibile tradurre blocchi di testo utilizzando diversi metodi, il più semplice è {% set %}. Il tag {% set %} può essere utilizzato in due modi:

  • {% set var = expression %} o {% set var1, var2 = expression1, expression2 %} è il modo più conosciuto e utilizzato: basta mettere un po 'di valore all'interno di una o più variabili.

  • {% set var %} blocco di testo {% endset %} consente di impostare un intero blocco di testo all'interno di tale variabile. Ciò è utile se si desidera inserire tale blocco in un filtro (ad esempio, escape o nel tuo caso, trans).

Quindi, per tradurre un blocco di testo, si farà qualcosa di simile:

{% set variable %} 
block to translate %placeholder% 
{% endset %} 
{{ variable | trans(array) }} 

In ogni caso, non vedo alcun interesse di tradurre un intero isolato in una sola volta: usiamo | trans generalmente dopo una proprietà (come ad esempio say.hello), e non riesco a immaginare il tuo file di traduzione xlf/yml con un tale disegno. Se vuoi utilizzare il traduttore solo per soddisfare i segnaposto, usa Twig come scritto per quel lavoro :-)

3) Informazioni sulla sostituzione di placeholder con %placeholder% nelle chiavi del tuo parametro parametri: il punto di Twig è: mettere cosa vuoi come segnaposto. In tal modo, se la frase tradotta contiene più %, è possibile utilizzare $something$, #something# o anche something come segnaposto.

Se le chiavi dell'array non contengono quelle %, è necessario aggiungerle, non è possibile scegliere. Se vuoi davvero farlo su un file Twig, puoi creare una macro che farà il lavoro per te e inserirla in un file che importi nel tuo layout di base.

Qualcosa di simile:

{% macro trans_pct(property, params) %} 
    {% set newParams = [] } 
    {% if params %} 
    {% for key, value in params %} 
     {% set newParams['%' ~ key ~ '%'] = value %} 
    {% endfor %} 
    {% endif %} 
    {{ property | trans(newParams) }} 
{% endmacro %} 

e quindi utilizzarlo con {{ _self.trans_pct('hello.say', array) | trim }}.

Note:

  • _self è il modello cui è memorizzato il macro (vedi la documentation per maggiori dettagli).

  • trim viene utilizzato perché ho scritto la macro con rientro e interruzioni di riga (che è più pulito da leggere). Questi spazi sono, di default, stampati.

+0

Grazie per la tua risposta esaustiva. L'interesse di tradurre un intero blocco potrebbe essere con una dichiarazione di non responsabilità, un messaggio di aiuto o un piè di pagina e-mail. Perché anche la grammatica cambia, richiederebbe un intero blocco tradotto. Il mio punto è come descrivi in ​​3: non ho il% nel mio array. Quando uso {% trans%} non ho bisogno di aggiungerli, quindi speravo di poter usare Twig allo stesso modo quando si passa con | trans. – rolandow

1

{{say.hello | trans ('% soprannome%': 'rolandow')}}