如何翻译 Symfony 3 形式?

问题描述 投票:0回答:3

翻译树枝模板中的内容似乎简单明了:我运行

bin/console translation:update
来填充翻译文件。问题是它似乎忽略了表单。

创建实体、存储库和表单/类型后,我在树枝模板中使用

{{ form_row(form.field) }}
来绘制表单元素。

是否有关于如何自定义和翻译表单标签、占位符和错误消息的完善实践?

我必须使用

form_label
form_widget
而不是
form_row
来自定义标签吗?

symfony twig symfony-forms symfony-3.3
3个回答
1
投票

您可以在此处创建一个名为

forms.es.yml
的文件,您可以将西班牙语翻译成西班牙语,并在您的表单中将其链接起来,如下所示:

//LoginType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('email',
            EmailType::class,
            [
                'translation_domain' => 'forms', //It's translate the label
                'constraints' => [
                    new Email([
                        'message' => 'email'
                    ])
                ]
            ]
        )
        ->add('password',
            RepeatedType::class,
            [
                'type' => PasswordType::class,
                'invalid_message' => 'cliente.password_not_equal',
                'first_options' => ['label' => 'cliente.password'],
                'second_options' => ['label' => 'cliente.repeat_password'],
                'translation_domain' => 'forms', //Here is again
                'constraints' => [
                    new NotBlank([
                        'message' => 'not_blank'
                    ])
                ]
            ]
        )
        ->add('current_uri', HiddenType::class);
}

它从 symfony 2 开始工作。

另一种方法是在你的树枝中,仅打印小部件并翻译标签:

//index.html.twig
<label> 
   {{'form.email'|trans({})}}
   {{ form_widget('form.email') }} //It only prints the input tag
</label>

这是一种简单的方法,但可重复使用性较差。


0
投票

按照文档中的说明翻译表单错误 https://symfony.com/doc/current/validation/translations.html

您需要带有键/值对的 validators.lang_used.format 文件。然后将密钥传递给消息密钥的断言验证。

关于实体

// src/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    /**
     * @Assert\NotBlank(message="author.name.not_blank")
     */
    public $name;
}

关于表单创建

$form = $this->createFormBuilder()
    ->setMethod('GET')
    ->add('email', TextType::class, [
        'constraints' => [
            new NotBlank(['message' => 'error.not_blank']),
        ],
        'label' => 'label.email-domain'
    ])
    ->getForm();

要翻译标签,只需将键传递给“标签”,键需要以 label 为 live on messages.* 文件前缀。

翻译视图上的纯文本(键/值在消息.* 文件中定义)

{{ 'save_button'|trans }}

有关翻译示例,请参阅https://github.com/symfony/demo查找实体定义、视图文件和表单类型


0
投票

@Koronos 的解决方案还不错,但我建议我的,因为在 @Koronos 解决方案中,您必须在每个表单输入上一遍又一遍地重复 'translation_domain' => 'forms' 。为了摆脱这个问题,这是我的解决方案,在控制器或任何我初始化表单对象的地方(Symfony 6.0.0的代码示例):

<?php

#[Route('/admin/clients/update/{id}', name: 'client_update')]
public function update(Request $request, int $id): Response
{
    $client = $this->clientRepository->find($id);

    $form = $this->createForm(ClientFormType::class, $client, ['translation_domain' => 'forms']);
    
    // do other actions here
}

之后,我只需要在表单类中的每个表单输入上配置标签,描述翻译键。这是 2023 年和 Symfony 6 的答案 - 如果它在 Symfony 3 上不起作用,请不要投票否决。

© www.soinside.com 2019 - 2024. All rights reserved.