web-dev-qa-db-ja.com

Symfony2クラスフォームの選択オプションを翻訳する

私はSymfony2 Beta3でクラスフォームを次のように使用しています:

namespace Partners\FrontendBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ConfigForm extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('no_containers', 'choice', array('choices' => array(1 => 'yes', 0 => 'no')));
        ...

「はい」と「いいえ」のオプションを翻訳したいのですが、ここでトランスレータの使用方法がわかりません。

29
Sergi

通常どおり翻訳リソースを使用できます。これは私のために働きました:

    $builder->add('sex', 'choice', array( 
        'choices'   => array(
            1 => 'profile.show.sex.male', 
            2 => 'profile.show.sex.female',
        ),
        'required' => false,
        'label'     => 'profile.show.sex.label',
        'translation_domain' => 'AcmeUserBundle'
    ));

次に、バンドルのResources-> translationsディレクトリに翻訳を追加します。

@CptSadfaceからの更新:

symfony 2.7では、choice_label引数を使用して、次のように変換ドメインを指定できます。

'choice_label' => 'typeName',
'choice_translation_domain' => 'messages',

ドメインを指定しないと、オプションは変換されません。

86
bingen

しばらく検索して答えを見つけましたが、最終的にSymfonyがフォームのコンテンツを翻訳する方法を見つけました。あなたのケースで最も簡単な方法は、YAMLまたはXLIFF翻訳ファイルをアプリケーション(例:app/Resources/translations/messages.de.yml)またはバンドルに追加して、「はい」と「いいえ」の翻訳を追加することです。 。これはここで説明されています: http://symfony.com/doc/current/book/translation.html

私の意見では、問題は、カスタム翻訳キーを使用できないように見えることです。 FOSUserBundleの担当者は、この(または同様の)問題を「フォームテーマ」で解決します( http://symfony.com/doc/2.0/cookbook/form/form_customization.html )。次に、翻訳キーとしてフォーム要素IDを使用するための2つの重要なコード行を示します。

https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/views/Registration/register_content.html.twig#L1 / https://github.com/FriendsOfSymfony /FOSUserBundle/blob/50ab4d8fdfd324c1e722cb982e685abdc111be0b/Resources/views/form.html.twig#L4

フォームテーマを追加することで、テンプレートのほとんどすべてのフォームを変更できます。これは、これを行う正しい方法のようです。

(申し訳ありませんが、私は2つ以上のリンクを分割する必要がありました。3つ以上のリンクを投稿するのに十分な評判がありません。悲しいです。)

4
rkallensee

Symfony 2.7では、choice_label引数を使用して、次のように変換ドメインを指定できます:

'choice_label' => 'typeName',
'choice_translation_domain' => 'messages',

ドメインを指定しないと、オプションは変換されません。

3
CptSadface

CptSadfaceの答えは、エンティティの選択を変換するのに役立つものでした。

$builder
    ->add(
        'authorizationRoles',
        null,
        [
            'label' => 'app.user.fields.authorization_roles',
            'multiple' => true,
            'choice_label' => 'name', // entity field storing your translation key
            'choice_translation_domain' => 'messages',
        ]
    );
0