2013-04-05 9 views
7

W Symfony/Twig, mógłbym używać znaczników, używając procentów w przetłumaczonym bloku. Na przykład:Użyj symboli zastępczych w tłumaczeniu przy użyciu znaczników

Hello {{nickname}} 

staną

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

to działa zgodnie z oczekiwaniami. Tablica z symbolami zastępczymi, które przekazuję do Twig, jest automatycznie odwzorowywana na% placeHolder%. Brak dodatkowej pracy. Tak to działa z mojego tablicy PHP od istoty Kontroler:

Array('nickname' => 'rolandow') 

Kiedy chcę użyć pseudonimu wewnątrz bloku translacji, wszystko co musisz zrobić, to otaczają go w procentach%. Niestety, wydaje się, że to nie działa, gdy przekazuję go do trans.

Teraz chciałbym przetłumaczyć cały blok tekstu za pomocą tagów. Nie rozumiem, jak mogę wykorzystać tagi w tłumaczeniu. Więc moja gałązka będzie wyglądać mniej więcej tak:

{{ say.hello|trans }} 

I moje tłumaczenie snippet

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

mam to działa za pomocą tego w moim szablonu, ale czuje się jak robić rzeczy dwa razy. Teraz muszę ponownie umieścić tablicę symboli zastępczych w funkcji trans. Na przykład:

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

Jeśli chcę używać innych znaczników, które są podane na gałązka w moim kontrolera, muszę przekazać je do tłumacza, jak również. Nie mogę po prostu przekazać kompletnej tablicy?

+0

Czy rzeczywiście buduje tablicę jak '$ tagów = array ('% nick%' => "luke") w twoim kontrolerze? Jeśli tak, możesz po prostu zrobić '{{say.hello | trans (tags)}}' – Luke

+0

Lub zadeklarować zmienną 'tags' używając słowa kluczowego Twig' set'. – eagleoneraptor

+0

@Luke, nie tablica jest jak tablica ("pseudonim" => "luke"). To jest rzeczywiście mój punkt, wydaje się, że nadmiarowe kodowanie przebiega przez tablicę i dodaje wartości procentowe. Miałem nadzieję, że jest lepszy sposób na zrobienie tego. Zdaję sobie sprawę, że teraz robienie tego w kontrolerze jest o wiele lepszym miejscem niż w szablonie. – rolandow

Odpowiedz

1

Jest tu kilka pytań, więc omówmy je.

1) Zachowanie się Twig nie przypomina zapytania Doctrine, w którym każdy parametr musi być ograniczony. Możesz przekazać tablicę zawierającą nieużywane parametry do trans, więc jeśli nie chcesz określać {'key': 'value', 'key2': 'value2'...} dla filtra, po prostu przeprowadź całą tablicę (przykład: | trans(array)). To jest punkt @Luke.

2) Możesz tłumaczyć blok tekstu na kilka sposobów, najprostszym jest {% set %}. Znacznik {% set %} można stosować na dwa sposoby:

  • {% set var = expression %} lub {% set var1, var2 = expression1, expression2 %} jest najbardziej znany i stosowany sposób: wystarczy umieścić jakąś wartość wewnątrz jednej lub kilku zmiennych.

  • {% set var %} blok tekstu pozwala ustawić cały blok tekstu wewnątrz tej zmiennej. Jest to przydatne, jeśli chcesz umieścić ten blok w filtrze (np. escape lub w twoim przypadku trans).

więc tłumaczyć blok tekstu, zrobisz coś takiego:

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

W każdym razie, nie widzę żadnego zainteresowania tłumaczenia cały blok w jednym czasie: używamy | trans ogólnie po właściwości (np. say.hello) i nie wyobrażam sobie pliku tłumaczenia xlf/yml z takim projektem. Jeśli chcesz użyć translatora tylko po to, aby spełnić warunki zastępcze, po prostu użyj Twig, ponieważ jest napisane dla tego zadania :-)

3) O zamianie placeholder przez %placeholder% w twoich kluczach tablicowych parametrów: punktem Twig jest: put what chcesz jako symbol zastępczy. W ten sposób, jeśli przetłumaczone zdanie zawiera kilka numerów: %, można użyć $something$, #something# lub nawet something jako symbolu zastępczego.

Jeśli twoje klucze tablicy nie zawierają tych %, musisz je dodać, nie masz żadnego wyboru. Jeśli naprawdę chcesz to zrobić na pliku Twig, możesz utworzyć makro, które wykona zadanie za Ciebie i umieści je w pliku importowanym w układzie podstawowym.

Coś jak:

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

a następnie używać go z {{ _self.trans_pct('hello.say', array) | trim }}.

Uwagi:

  • _self jest szablon, gdzie jest przechowywana makro (patrz documentation więcej szczegółów).

  • trim jest używany, ponieważ napisałem makro z wcięciem i podziałem wierszy (to czystsze do odczytania). Te spacje są domyślnie drukowane.

+0

Dziękujemy za wyczerpującą odpowiedź. Zainteresowanie tłumaczeniem całego bloku może być spowodowane zastrzeżeniem, komunikatem pomocy lub stopką e-mail. Ponieważ zmieni się również gramatyka, wymagałoby to całego przetłumaczonego bloku. Chodzi mi o to, jak opisujesz w punkcie 3: nie mam% w mojej tablicy. Kiedy używam {% trans%} nie muszę ich dodawać, więc miałem nadzieję, że mogę użyć Twig w taki sam sposób, gdy przechodzę z | trans. – rolandow

1

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

Powiązane problemy