Symfony 2:如何翻译@Assert\Callback消息

ffx8fchx  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(127)

我的实体中有一个回叫方法

@Assert\Callback(methods={"isStudentsOK"}) 
....
public function isStudentsOK(ExecutionContext $context)
{
  if ( $this->students->isEmpty())
    $context->addViolationAtSubPath('students', 'Missing students informations', array(), null);
}

我想在我的模板中翻译乐消息。
{{ form_errors(form.student)|trans }}不工作...我有这个

<span class="help-inline">Missing students informations</span>

是虫子吗?我该怎么办?

编辑

我自己找到了答案:
我安装了一个BootstrapBundle,{% block form_errors %}显示在一个span中
我已经覆盖了form_div_layout.html.twig模板。

ikfrs5lh

ikfrs5lh1#

您的代码正在使用|transfilter,所以我假设你使用的是Twig i18n扩展,它又使用了PHP的gettext函数。
如果您的PHP代码生成了消息,您也可以在那里进行翻译:

@Assert\Callback(methods={"isStudentsOK"}) 
....
public function isStudentsOK(ExecutionContext $context)
{
  if ( $this->students->isEmpty())
    $context->addViolationAtSubPath('students', _('Missing students informations'), array(), null);
}

请注意错误消息中的下划线函数,这是PHP中"Trans"过滤器的等价物。

6l7fqoea

6l7fqoea2#

作为Symfony >= 6.2Blog post),您可以直接使用TranslatableMessage类。
你的Assert应该看起来像这样:

use Symfony\Component\Translation\TranslatableMessage;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

#[Assert\Callback]
public function validate(ExecutionContextInterface $context, mixed $payload): void
{
    if ($this->students->isEmpty()) {
        $context->buildViolation(new TranslatableMessage('myEntity.students.empty', [], 'validators'))
                ->atPath('students')
                ->addViolation()
        ;
    }
}

使用Symfony命令bin/console translation:extract --force en
translations/validators.en.xlf中:

<trans-unit id="i3PmZjY" resname="myEntity.students.empty">
   <source>myEntity.students.empty</source>
   <target>Missing students informations</target>
</trans-unit>

相关问题