2016-09-21 6 views
1

にフォームを翻訳こんにちは、私は要求カスタムセットのロケール

内の1つのセットが、私は

$tmpLocale = $request->getLocale(); 
$request->setLocale('es'); 
$form = $this->createForm(new DataType()); 
$formView = $form->renderView(); 
$request->setLocale($tmpLocale); 

return $this->render('AppBundle:Data:edit.html.twig', array(
    'data' => $data, 
    'form' => $formView, 
)); 

ような何かをしようとした私は、カスタムロケールに形式を変換したいユースケースを持っていますが、それどのように私はそれを動作させることができますか? このカスタムロケールとして翻訳されるフォームラベルが必要です。

答えて

-1

{%- block form_label -%} 
    {% if label is not same as(false) -%} 
     {# ... #} 
     <label ... >{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain, locale) }}</label> 
    {%- endif -%} 
{%- endblock form_label -%} 

後で、各フォームフィールドのlocaleオプションを使用することができます。

$tmpLocale = $this->get('translator')->getLocale(); 
$this->get('translator')->setLocale('es'); 
$form = $this->createForm(new DataType()); 
$formView = $form->createView(); 
$this->get('translator')->setLocale($tmpLocale); 

これは問題なく動作します。高度なソリューションは必要ありません。

0

を参照してください。その4番目のパラメータはlocaleで、メッセージの翻訳に直接使用できます。 フォームタイプをサービスとして登録し、翻訳者(場合によってはカスタムロケール)を注入し、このロケールを使用して内部のすべてのメッセージを翻訳する必要があります。

+0

これは二重翻訳につながる可能性がありますか? – yceruto

+0

@Yonel「ダブル翻訳」とはどういう意味ですか? –

+0

'...このロケールを使って内部のすべてのメッセージを翻訳します。'ラベルが直接翻訳されている場合は、これを2回作成することができます。 'translation_domain'を' false'に設定して回避する必要があります。 – yceruto

1

フォームラベルの翻訳は、フォームレンダリングで行われます。

Create a new form type extensionとテンプレートレイアウトにlocale変数を渡します:

class FormTypeExtension extends AbstractTypeExtension 
{ 
    public function buildView(FormView $view, FormInterface $form, array $options) 
    { 
     $view->vars['locale'] = $options['locale']; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     // define locale option for each form field. 
     // if null the labels are translates to current locale. 
     $resolver->setDefaults(array('locale' => null)); 
    } 

    public function getExtendedType() 
    { 
     return 'form'; 
    } 
} 

サービス:

services: 
    app.form.extension.locale: 
     class: AppBundle\Form\Extension\FormTypeExtension 
     tags: 
      - { name: form.type_extension, alias: form } 
それはあなたのアプリケーションでの一般的なユースケースであるなら、あなたはラベルを変換することによって動作を無効に検討するかもしれません

trans()を含み、第3のパラメータとしてlocaleを追加する:

:私は翻訳サービスで簡単な変更のロケールでそれをやった

$form->add('name', null, array('locale' => 'es')); 
+0

これは受け入れられる回答である必要があります。 –