Установить запасной перевод языка Symfony - PullRequest
0 голосов
/ 11 ноября 2019

Я должен перевести письмо на многих языках. Но для некоторой версии этого проекта некоторые языковые стандарты не существуют.

Требования: : если в проекте не существует языкового стандарта, используйте английский.

Проблема:что по умолчанию переводчик использует FR как запасной вариант:

framework:
   translator:      { fallbacks: ["%locale%"] }

Так что, когда я пытаюсь перевести язык на несуществующий языковой стандарт, он переводится на французский вместо английского.

Есть лиспособ проверить, доступна ли локаль перед переводом?

РЕДАКТИРОВАТЬ : Откат на английский используется только для одного конкретного случая

РЕДАКТИРОВАТЬ 2 :

{{ 'contact.prefix' | trans }}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

Может быть, кому-то понадобится мое решение, потому что я думаю, что писать скучно

{{ message|trans(arguments = [], domain = null, locale = null) }}

Для каждого перевода.

Во-первых, я создал службу, чтобы проверить, переводится ли дляДоступен данный языковой стандарт:

use Symfony\Component\HttpKernel\KernelInterface;

class LocaleChecker
{
    const TRANSLATE_FILE_PATTERN = 'mail.%s.yml';

    /**
     * @var KernelInterface
    */
    private $storage;

    public function __construct(KernelInterface $kernel)
    {
        $this->storage = $kernel;
    }

    /**
     * @param string $locale
     *
     * @return bool
     */
    public function isLocaleExist(string $locale)
    {
        $filename = sprintf(self::TRANSLATE_FILE_PATTERN, $locale);
        $path = sprintf('%s%s', $this->storage->getTranslationsDir(), $filename);

        return file_exists($path);
    }
}

Затем я создал расширение ветки, чтобы выполнить эту работу за меня:

<?
use FrontBundle\Service\Translate\LocaleChecker;
use Symfony\Component\Translation\TranslatorInterface;

class FallbackEnglishExtension extends \Twig_Extension
{
    /**
     * @var LocaleChecker
     */
    private $localeChecker;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    public function __construct(LocaleChecker $localeChecker, TranslatorInterface $translator)
    {
        $this->localeChecker = $localeChecker;
        $this->translator = $translator;
    }

    public function getFilters()
    {
        return [
            new \Twig_Filter('trans_mail', [$this, 'translate']),
        ];
    }

    /**
     * @param string $translateKey
     * @param string $locale
     *
     * @return string
     */
    public function translate(string $translateKey, string $locale = 'en_EN')
    {
        if ($this->localeChecker->isLocaleExist($locale)) {
            return $this->translator->trans($translateKey, [], 'mail', $locale);
        }

        return $this->translator->trans($translateKey, [], 'mail', $locale);
    }
}
0 голосов
/ 11 ноября 2019

Расширение Twig trans имеет несколько параметров

{{message | trans (arguments = [], domain = null, locale = null)}}

https://symfony.com/doc/current/reference/twig_reference.html#trans

Таким образом, я бы проверил local в ветке в начале моего шаблона электронной почты и, если это не 'valide', я бы принудительно установил английский, используя локальный параметр расширения trans

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...