在symfony2中翻译自定义表单类型

Gar*_*eot 0 php forms translation symfony symfony-2.7

我正在尝试在Symfony(2.7)中创建自定义表单类型,以便为我的某些表单字段添加help_block(Boostrap 3样式).

我按照此页面说明操作:http://symfony.com/doc/current/cookbook/form/create_form_type_extension.html

显示没问题,help_block工作正常,但它不可翻译,(dev栏没有显示任何缺失的翻译).所以我的问题是:如何使自定义表单类型可翻译,如标签选项,如果可能,在与表单相同的translation_domain中?

这是扩展代码:

<?php

namespace WIC\MasterBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Add a BootStrap Help block to any form field
 */
class HelpTextExtension extends AbstractTypeExtension
{

    /**
     * Returns the name of the type being extended.
     *
     * @return string The name of the type being extended
     */
    public function getExtendedType() {
        return 'form';
    }

    /**
     * Add the help_text option
     *
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefined(array('help_text'));
        $resolver->setDefault('help', null);
    }

    /**
     * Pass the Help Text to the view
     *
     * @param FormView $view
     * @param FormInterface $form
     * @param array $options
     */
    public function buildView(FormView $view, FormInterface $form, array $options) {
        $view->vars['help_text'] = $form->getConfig()->getAttribute('help_text');
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
        if (array_key_exists('help_text', $options)) {
            $builder->setAttribute('help_text', $options['help_text']);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我的模板覆盖:

{% extends 'bootstrap_3_horizontal_layout.html.twig' %}

{% block form_row -%}
    {% spaceless %}
        <div class="form-group{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">
            {{ form_label(form) }}
            <div class="{{ block('form_group_class') }}">
                {{ form_widget(form) }}
                {{ form_errors(form) }}
                {% if help_text is not null %}
                    <span class="help-block">{{ help_text }}</span>
                {% endif %}
            </div>
        </div>
    {% endspaceless %}
{%- endblock form_row %}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助,

最好的祝福

小智 5

您可以像在其他地方一样添加翻译,只需填写标签即可.

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', 'text', [
            'label' => 'rpr.page.title', // <- any string can be there
        ]);
}
Run Code Online (Sandbox Code Playgroud)

默认翻译域是"邮件",可以将"translation_domain"添加到configureOptions

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
       'data_class'         => 'Acme\Entity\DemoEntity',
       'translation_domain' => 'forms'
    ]);
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要在正确的位置创建翻译文件: AcmeBundle\Resources\translations

需要注意的重要事项: - 当您在AcmeBundle\Resources\translations类似的forms.de.yml中创建新的翻译文件时,即使在开发过程中也需要清除缓存.

docs http://symfony.com/doc/current/reference/forms/types/form.html#translation-domain