Symfony表单标签翻译错误

时间:2015-12-27 22:11:42

标签: forms label translation symfony

问题:Symfony工具栏显示缺少的消息,而消息是......好,不会丢失。 似乎{{ form_label(...) }}调用尝试双重翻译消息。例如:

我在app / Resources / translations / messages.en.yml中有以下内容:

...
entity:
    recipe:
        title: translated title
        description: translated description
...

我在FormType(AppBundle)类中有以下内容:

$builder
    ->add('title', TextType::class, ['label' => 'entity.recipe.title'])
    ->add('description', TextareaType::class, ['label' => 'entity.recipe.description']);

并在app / Resources / views模板中:

<div class="title_row">
{{ form_label(form.title) }}
{{ form_widget(form.title, { 
    'attr': {
        'class': 'supertitle',
        'placeholder': 'entity.recipe.title'|trans
    }}) 
}}
{{ form_errors(form.title) }}
</div>


<div class="description_row">
{{ form_label(form.description) }}
{{ form_errors(form.description) }}
{{ form_widget(form.description, { 
    'attr': {
        'class': 'metro',
        'placeholder': 'recipe.describe_your_recipe'|trans
    }}) 
}}
</div>

在这种情况下,Symfony工具栏会显示translated titletranslated description的2条消息。它不是抱怨消息密钥,而是关于已经翻译的消息。好像symfony试图翻译同一个消息两次。

如果我放弃form_labelform_errorsform_widget并将其替换为单个form_row,那么一切正常。

此外,php bin/console debug:trans并未将这些消息显示为缺失。

我使用原始form_div_layout.html.twig对此进行了测试,没有任何自定义设置,但仍显示这些错误。

在form_label块下的该文件中,我找到了:

<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</label>

这没什么特别的?

还试图在Type类中指定translation_domain,没有什么区别。

目前正在使用Symfony 3.0,虽然我认为我在2.8中看到了相同的错误。

有什么想法吗?

感谢 Karolis

1 个答案:

答案 0 :(得分:1)

占位符和标题属性值会在widget_attributes块内自动翻译:

{%- for attrname, attrvalue in attr -%}
    {{- " " -}}
    {%- if attrname in ['placeholder', 'title'] -%}
        {{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
    {%- elseif attrvalue is sameas(true) -%}
        {{- attrname }}="{{ attrname }}"
    {%- elseif attrvalue is not sameas(false) -%}
        {{- attrname }}="{{ attrvalue }}"
    {%- endif -%}
{%- endfor -%}

您所要做的就是从标题和占位符值中删除多余的trans过滤器,即:

{{ form_widget(form.title, { 
    'attr': {
        'class': 'supertitle',
        'placeholder': 'entity.recipe.title'
    }}) 
}}