2015-10-20 125 views
0

我试图在Symfony(2.7)中创建一个自定义表单类型,以便为我的某些表单字段添加help_block(Boostrap 3样式)。在symfony2中翻译自定义表单类型

我跟着这个页面的说明: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']); 
     } 
    } 

} 

而且我的模板覆盖:

{% 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 %} 

在此先感谢您的帮助,

问候

回答

5

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

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

默认的转换域是“消息”,改变加“translation_domain”给你configureOptions

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

当然,那么你需要在正确的地方创建翻译文件:AcmeBundle\Resources\translations

要注意的重要事项: - 当您在AcmeBundle\Resources\translations类似forms.de.yml中创建新的翻译文件时,您需要需要来清除cach即使在发展中。

文档浏览:http://symfony.com/doc/current/reference/forms/types/form.html#translation-domain

+0

我用我的扩展代码更新了我的文章。即使在清除缓存后,我的字段也没有标记为可翻译的。 –

+0

当你使用动态字符串时,你需要在数据库中进行翻译(或者他们来自的地方,比如文件)。翻译文件仅用于* static *翻译。 – nakashu

0

一)设置的地点参数,使翻译config.yml

parameters: 
    locale: en 

framework: 
    #esi:    ~ 
    translator:  { fallbacks: ["%locale%"] } 

二)创建自定义表单类型。我从docs创建了GenderType。

三)扩大使用构造自定义窗体类型以访问翻译和使用翻译器要:

namespace AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Translation\Translator; 

class GenderType extends AbstractType 
{ 
    private $translator; 

    public function __construct(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'choices' => array(
       'm' => $this->translator->trans('user.male'), 
       'f' => $this->translator->trans('user.female'), 
      ) 
     )); 
    } 

    public function getParent() 
    { 
     return 'choice'; 
    } 

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

d)作为服务

// app/config/services.yml 
services: 
    app.form.type.gender: 
     class: AppBundle\Form\Type\GenderType 
     arguments: 
      - @translator.default 
     tags: 
      - { name: form.type, alias: gender } 
创建字段类型

e)建立一个translationfile:

// src/AppBundle/Resources/translations/user.en.yml 
user: 
    creation: Create User 
    gender: Gender 
    male: Male 
    female: Female 

F)扩展您的formType(如UserT YPE)。确保您通过在步骤d中创建的'gender'服务别名来传递字段类型。还为每个字段设置标签translation_domain选项。

// src/AppBundle/Form/UserType.php 
namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use AppBundle\Form\Type\GenderType; 

class UserType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('gender', 'gender', array('label' => 'user.gender', 'translation_domain' => 'user')) 
      // and more fields 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\User' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_user'; 
    } 
} 

g)将trans_default_domain添加到您的树枝模板并翻译您想要翻译的任何内容。例如:

{% extends '::base.html.twig' %} 

{% trans_default_domain 'user' %} 

{% block body -%} 
    <h1>{{ 'user.creation'|trans }}</h1> 

    {{ form(form) }} 

{% endblock %} 
+0

问题是我的帮助文本是动态值(我用扩展代码更新了我的问题),所以我不能使用常规翻译器 –

+0

据我所见,你可以在你的树枝模板中完成与我的树枝示例完全相同的示例。另一种方法是在控制器中翻译help_text并将翻译的文本提供给您的模板。或者我错过了什么? –