Используйте заполнители в переводе с помощью тегов

В Symfony/Twig я мог использовать теги, используя проценты в моем переведенном блоке. Например:

Hello {{nickname}}

станет

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

Это работает, как и ожидалось. Массив с заполнителями, который я передаю в Twig, автоматически сопоставляется с %placeHolder%. Никаких дополнительных работ. Итак, это работает с моим PHP-массивом из контроллера:

Array('nickname' => 'rolandow')

Когда я хочу использовать псевдоним внутри блока перевода, все, что мне нужно сделать, это окружить его процентами %. К сожалению, это не работает, когда я передаю его trans.

Теперь я хотел бы перевести целый блок текста, используя теги. Я не могу понять, как я могу использовать теги в своем переводе. Итак, моя ветка будет выглядеть примерно так:

{{ say.hello|trans }}

И мой фрагмент перевода

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

Я заработал, используя это в своем шаблоне, но мне кажется, что нужно делать что-то дважды. Теперь мне нужно снова поместить массив заполнителей в функцию trans. Например:

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

Если я хочу использовать другие теги, которые даны twig в моем контроллере, мне также нужно передать их транслятору. Разве я не могу как-то просто передать полный массив?


person rolandow    schedule 05.04.2013    source источник
comment
Вы действительно строите массив, подобный $tags = array('%nickname%'=>'luke'), в своем контроллере? Если это так, вы можете просто сделать {{ say.hello|trans(tags) }}   -  person Luke    schedule 05.04.2013
comment
Или объявите переменную tags, используя ключевое слово Twig set.   -  person eagleoneraptor    schedule 05.04.2013
comment
@ Люк, нет, массив похож на массив («псевдоним» => «люк»). Это на самом деле моя точка зрения, это похоже на избыточное кодирование для запуска массива и добавления процентов. Я надеялся, что есть лучший способ сделать это. Теперь я понимаю, что делать это в контроллере гораздо лучше, чем в шаблоне.   -  person rolandow    schedule 16.04.2013


Ответы (1)


arrow_upward
1
arrow_downward

Здесь есть несколько вопросов, поэтому давайте рассмотрим их.

1) Поведение Twig не похоже на запрос Doctrine, где каждый параметр должен быть ограничен. Вы можете передать массив, содержащий неиспользуемые параметры, в trans, поэтому, если вы не хотите указывать {'key': 'value', 'key2': 'value2'...} в фильтре, просто передайте весь массив (пример: | trans(array)). Это точка @Luke.

2) Блок текстов можно перевести несколькими способами, самый простой {% set %}. Тег {% set %} можно использовать двумя способами:

  • {% set var = expression %} или {% set var1, var2 = expression1, expression2 %} — самый известный и используемый способ: вы просто помещаете какое-то значение в одну или несколько переменных.

  • {% set var %} блок текста {% endset %} позволяет вам установить весь блок текста внутри этой переменной. Это полезно, если вы хотите поместить этот блок в фильтр (например, escape или, в вашем случае, trans).

Итак, чтобы перевести блок текста, вы сделаете что-то вроде:

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

В любом случае, я не вижу смысла переводить весь блок за один раз: мы обычно используем | trans после свойства (например, say.hello), и я не могу представить ваш файл перевода xlf/yml с таким оформлением. Если вы хотите использовать переводчик только для заполнения заполнителей, просто используйте Twig, поскольку он написан для этой работы :-)

3) О замене placeholder на %placeholder% в ключах вашего массива параметров: точка Twig: поместите то, что вы хотите, в качестве заполнителя. Таким образом, если ваше переведенное предложение содержит несколько %, вы можете использовать $something$, #something# или даже something в качестве заполнителя.

Если ключи вашего массива не содержат этих %, вам нужно добавить их, у вас нет выбора. Если вы действительно хотите сделать это в файле Twig, вы можете создать макрос, который сделает эту работу за вас, и поместить его в файл, который вы импортируете в свой базовый макет.

Что-то типа :

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

А затем используйте его с {{ _self.trans_pct('hello.say', array) | trim }}.

Примечания :

  • _self — это шаблон, в котором хранится макрос (подробнее см. в документации) .

  • trim используется, потому что я написал макрос с отступами и разрывами строк (так удобнее читать). Эти пробелы по умолчанию печатаются.

person Alain Tiemblo    schedule 06.05.2013
comment
Спасибо за исчерпывающий ответ. Интерес к переводу всего блока может быть связан с заявлением об отказе от ответственности, справочным сообщением или нижним колонтитулом электронного письма. Поскольку грамматика также меняется, для этого потребуется целый переведенный блок. Моя точка зрения такова, как вы описываете в 3: у меня нет% в моем массиве. При использовании {% trans %} мне не нужно их добавлять, поэтому я надеялся, что смогу использовать Twig таким же образом при передаче с помощью |trans. - person rolandow; 13.05.2013