【问题标题】:How to override translator in symfony 5.2如何在 symfony 5.2 中覆盖翻译器
【发布时间】:2021-02-26 15:27:44
【问题描述】:

我正在尝试覆盖 Symfony 5.2 中的翻译器类。我试过这个:

# config/services.yaml
services:
    # ....
    App\Translator:
    decorates: translator

还有这个(App\Translator 实现 TranslatorInterface):

# config/services.yaml
services:
    # ....
    App\Translator:
        arguments:
            $translator: '@translator'

    Symfony\Contracts\Translation\TranslatorInterface: '@App\Translator'

这两种方法在 PHP 代码中都运行良好,但是在 twig 的开发模式下,翻译服务仍然是 DataCollectorTranslator。所以在树枝模板中,翻译服务仍然没有被覆盖。我该如何解决?

【问题讨论】:

  • 根据您发布的代码,您在 services.yaml 中定义了两个 App\Translator 服务?第二个定义将覆盖第一个。您应该只有第一个负责将原始翻译器注入您的装饰器服务。此外,已经定义了一个 TranslatorInterface 别名,所以我认为您不需要定义一个。
  • 不,这是创建装饰器的两种不同尝试。在这两种情况下,在开发模式下的 twig 模板中,翻译服务仍然没有被覆盖(仍然是 DataCollectorTranslator)。

标签: symfony


【解决方案1】:

我可能不理解这个问题。如果某些东西在一种模式下工作但在另一种模式下不起作用,那么有时只需删除 var/cache 目录并使用 bin/console cache:clear 构建一个新的缓存可能会起作用。

装饰服务有时会有点有趣。我创建了一个新的 5.2 项目,然后添加:

# src/Translation/Translation.php
namespace App\Translation;

use JetBrains\PhpStorm\Pure;
use Symfony\Component\Translation\MessageCatalogueInterface;
use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Contracts\Translation\LocaleAwareInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Bundle\FrameworkBundle\Translation\Translator as BaseTranslator;

class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface
{
    // Uses PHP8 constructor promotion
    public function __construct(private BaseTranslator $translator)
    {
    }
    #[Pure]
    public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string
    {
        //return $this->translator->trans($id,$parameters,$domain,$locale);
        return strtoupper($id); // Verify calling this class
    }
    public function getCatalogue(string $locale = null): MessageCatalogueInterface
    {
        return $this->translator->getCatalogue($locale);
    }
    #[Pure]
    public function getLocale(): string
    {
        return $this->translator->getLocale();
    }
    public function setLocale(string $locale)
    {
        $this->translator->setLocale($locale);
    }
}

# config/services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\Translation\Translator:
        decorates: translator

# index.html.twig
<li>{{  'Hello' | trans }}</li>

您可以忽略 Pure 的东西以及一些 PHP8 的东西。我也将其用作 PHP8 测试。

但这一切似乎都像宣传的那样工作。

【讨论】:

  • 我不知道它是什么。也许它真的是一个缓存。或工作周结束。你是对的。谢谢!
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多