Symfony2 перевод массива yaml и петли ветки

Я пытаюсь, чтобы веточка преобразовать массив из файла перевода

// messages.en.yml

termsAndConditions:
title: Terms and Conditions
paragraph:
- Paragraph text...blah blah...1
- Paragraph text...blah blah...2
- Paragraph text...blah blah...3
- Paragraph text...blah blah...n

// termandconditions.html.twig

// пытался…

{% for i in range(1,termsAndConditions.paragraph|length) -%}
<p>{% trans %}termsAndConditions.paragraph. {{ i }}{% endtrans %}</p>
{%- endfor %}

// и попробовал …

{% for i in range(1,termsAndConditions.paragraph|length) -%}
<p>{{ 'termsAndConditions.paragraph.' ~ i ~ |trans }}</p>
{%- endfor %}

4

Решение

Вам нужно использовать пары keys: values заставить вещи работать:

// messages.en.yml
termsAndConditions:
title: Terms and Conditions
paragraph:
1: Paragraph text...blah blah...1
2: Paragraph text...blah blah...2
3: Paragraph text...blah blah...3
4: Paragraph text...blah blah...n

Также и в связи с тем, что вы хотите использовать переменную для вашего перевода, доступ к переводу осуществляется следующим образом. {{('termsAndConditions.paragraph.'~i)|trans }},

Я жестко закодировал 4 вместо termsAndConditions.paragraph|length, Не совсем уверен, что вы можете получить к нему доступ из шаблона веточки …

// termsandconditions.html.twig
{% for i in range(1,4) -%}
<p>{{('termsAndConditions.paragraph.'~i)|trans}}</p>
{%- endfor %}

Он должен работать. Надеюсь, поможет.

ОБНОВИТЬ

termsAndConditions.paragraph|length не имеет смысла, если вы не определили в шаблоне переменную или не внедрили переменную через контроллер.

Решения

Решение 1. В вашем контроллере зайдите на yaml и получите количество переводов, затем передайте его в шаблон и все.

Решение 2. Создать сервис и внедрить translator Служба этому. В контроллере создайте метод, который рассчитывает количество элементов конкретного key, Внедрить службу переводчика лучше, чем читать yaml напрямую, поскольку он кэширует каталог, когда читает его.

Решение 3. То же, что 2, но создание фильтра веток. Я собираюсь пойти на это, так как это кажется довольно забавным.

Решение 3

Давайте начнем с создания расширения:

namespace Acme\DemoBundle\Twig\Extension;

class TransLengthExtension extends \Twig_Extension
{
private $translator;

public function __construct($translator) {
$this->translator = $translator;
}public function getFilters()
{
return array(
new \Twig_SimpleFilter('translength', array($this, 'translengthFilter')),
);
}

public function translengthFilter($id, $domain = null)
{
if (null === $domain) {
$domain = 'messages';
}

$i = 0;
$g = $this->translator->getMessages();
foreach($g["messages"] as $key => $message) {
if(substr( $key, 0, strlen($id) ) === $id ) {
$i++;
}
}

return $i;
}

public function getName()
{
return 'acme_extension';
}
}

Как вы можете видеть выше, он вычисляет количество вхождений $ id в каталоге переводов. Переводчик заботится о локали, загружает соответствующий каталог и так далее. Он также кэширует результаты, что действительно хорошо с точки зрения производительности.

Зарегистрируйте сервис, вводящий переводчик и регистрирующий как расширение ветки:

services:
acme.twig.acme_extension:
class: Acme\DemoBundle\Twig\Extension\TransLengthExtension
arguments:
- "@translator"tags:
- { name: twig.extension }

Теперь в вашем шаблоне:

{% set end = 'termsAndConditions.paragraph'|translength %}
{% for i in range(1,end) -%}
<p>{{('termsAndConditions.paragraph.'~i)|trans}}</p>
{%- endfor %}

Надеюсь, поможет.

5

Другие решения

Для этого есть фильтр веточек — ключи

{% for keyname in yml_tree_nodes|keys %}
0

По вопросам рекламы [email protected]