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

В 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)


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

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