Disabling the translations for the test environment with Symfony
Published on 2023-01-31 • Modified on 2023-01-31
This snippet shows how to disable the translations for the test environment with Symfony. The goal is to test the translation codes instead of the translated text for a given locale. It makes the test more robust as they won't break if a given translation is modified. You can use the following service that decorates the default translator
service. The config is in the yaml
property in a HEREDOC
block, so you can copy/paste it. It is a simple version: it handles only the translation codes, not the parameters.
<?php
declare(strict_types=1);
namespace App\Translator;
use Symfony\Component\Translation\MessageCatalogueInterface;
use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Contracts\Translation\LocaleAwareInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Disable translations in the test env.
*
* @see https://jolicode.com/blog/how-to-properly-manage-translations-in-symfony
*/
final class NoTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface
{
public string $yaml;
/**
* @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator
*/
public function __construct(
private readonly TranslatorInterface $translator,
) {
$this->yaml = <<<HEREDOC
when@test:
services:
// Disable the translations to test on codes instead of the translated text
App\Translator\NoTranslator:
decorates: translator
arguments:
- '@App\Translator\NoTranslator.inner'
HEREDOC;
}
/**
* We don't test parameters for now. My advice would be: don't test parameters
* until you have to fix a related bug reported or if you use them a lot.
*
* @param array<mixed> $parameters
*/
public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string
{
// to find EasyAdmin translations codes, uncomment this
// if ($domain === 'EasyAdminBundle') {
// dump($id);
// }
return $id;
}
/**
* @return array<MessageCatalogueInterface>
*/
public function getCatalogues(): array
{
return $this->translator->getCatalogues();
}
public function getCatalogue(?string $locale = null): MessageCatalogueInterface
{
return $this->translator->getCatalogue($locale);
}
public function setLocale(string $locale): void
{
$this->translator->setLocale($locale);
}
public function getLocale(): string
{
return $this->translator->getLocale();
}
}
More on the web Random snippet