翻译树枝模板中的内容似乎简单明了:我运行
bin/console translation:update
来填充翻译文件。问题是它似乎忽略了表单。
创建实体、存储库和表单/类型后,我在树枝模板中使用
{{ form_row(form.field) }}
来绘制表单元素。
是否有关于如何自定义和翻译表单标签、占位符和错误消息的完善实践?
我必须使用
form_label
和 form_widget
而不是 form_row
来自定义标签吗?
您可以在此处创建一个名为
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>
这是一种简单的方法,但可重复使用性较差。
按照文档中的说明翻译表单错误 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查找实体定义、视图文件和表单类型
@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 上不起作用,请不要投票否决。