Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: rolandowОтветов: 1

В 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 в моем контроллере, мне также нужно передать их транслятору. Разве я не могу как-то просто передать полный массив?

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

internationalizationsymfonytwig

Ответы

Ответ 1 · рейтинг 1 · Alain Tiemblo

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

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 используется, потому что я написал макрос с отступами и разрывами строк (так удобнее читать). Эти пробелы по умолчанию печатаются.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы