Компонент переводчика с веткой транс - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь перевести мои шаблоны веток с помощью Symfony Translator Component и файлов .mo. Раньше я использовал расширение i18n, но хотел более надежный подход, так как обработка локали для переводов в Windows - это кошмар.

Эти функции класса готовят перевод и шаблон:

/**
 * Constructor.
 *
 * @param string $template_dir 
 * @param string $locale
 * @param string $locale_path
 */
public function __construct($template_dir, $locale, $locale_path)
{

    $loader = new Twig_Loader_Filesystem($template_dir);
    $this->parser = new TemplateNameParser();
    $this->template = new \Twig_Environment($loader);
    $this->translator = new Translator($locale);
    $this->translator->addLoader('mo', new \Symfony\Component\Translation\Loader\MoFileLoader());
    $this->translator->addResource('mo', $locale_path, $locale);
    $this->template->addExtension(new TranslationExtension($this->translator));

}
/**
 * Render template.
 */
public function render($name,$parameters=[]) {
    return $this->template->loadTemplate($name,$parameters)->render();
}

Тогда у меня есть этот шаблон:

<h1>{% trans 'Hello World!' %}</h1>

который выдает эту ошибку:

Uncaught Twig_Error_Syntax: неожиданный токен. Твиг искал ключевое слово "with", "from" или "into".

Что я получаю, потому что я не добавляю расширение Twig_Extensions_Extension_I18n в среду веток. Если я это сделаю, тексты в функциях trans не будут переведены, потому что я не использую фильтр, как должен. Чтобы это работало, мне нужно использовать транс-фильтр, например, так: {{ 'Some text'|trans }}.

Есть ли способ заставить перевод работать с {% trans 'Some text' %} вместо {{ 'Some text'|trans }}? Например, я могу добавить пользовательскую функцию trans где-нибудь в цепочке?

Примечание: Я знаю, что {% trans %}Some text{% endtrans %} работает, но все мои шаблоны уже используют этот синтаксис {% trans 'Some text' %}, и я хотел бы избежать необходимости переписывать все.

1 Ответ

0 голосов
/ 11 января 2019

Проблема, похоже, связана с несовместимыми версиями ветки и переводчика Symfony. Но я не уверен, что это все.

В моем случае я решил проблему в долгосрочной перспективе, написав простой скрипт для замены неправильного синтаксиса на правильный в каждом файле шаблона.

foreach (glob("your_template_path/*/*/*.twig") as $filename) {

    $content = file_get_contents($filename);

    $content = preg_replace_callback('/{% trans "[\s\S]+?" %}/',function($matches) {
        $text = str_replace(['{% trans','%}','"'],'',$matches[0]);
        return '{% trans %}'.trim($text).'{% endtrans %}';
    },$content);
    $content = preg_replace_callback('/{% trans \'[\s\S]+?\' %}/',function($matches) {
        $text = str_replace(['{% trans','%}',"'"],'',$matches[0]);
        return '{% trans %}'.trim($text).'{% endtrans %}';
    },$content);

    file_put_contents($filename,$content);

}

Может быть, это кому-то поможет.

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