Передача перевода Symfony в Symfony Webpack Encore - PullRequest
0 голосов
/ 31 января 2019

В Symfony я использую перевод , Twig и Webpack encore компоненты.

Я могу перевести в Twig с веб-интерфейса:

'my_key'|trans

Я использую команду yarn encore dev для генерации app.js, но Компонент перевода PHP он не доступен в Javascript.

У меня есть много вещей, которые нужно перевести в javascript.

Ответы [ 2 ]

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

К сожалению, поскольку JS не обрабатывается PHP и, соответственно, также не Symfony, у вас не будет доступа к компоненту перевода Symfony внутри ваших файлов js.

Обходной путь, который может работать, если у вас нетслишком много переводов, которые вам нужно передать, - это создать объект данных JS внутри шаблона ветки как часть вашего приложения Symfony, а затем получить к нему доступ из ваших файлов js.Примерно так:

# inside your twig template, e.g. index.html.twig
{% block javascripts %}

    const TRANSLATION_MAP = {
        'my_key': "{{ 'some_key '|trans }}",
        'my_other_key': "{{ 'other_key '|trans }}"
    };

    {{ parent() }} # This loads all your js files which can then access the translation map defined above
{% endblock %}

Недостатком этого решения является то, что вы должны решить, какие ключи добавить в карту перевода, не зная, действительно ли они используются, так что это может стать немного неэффективным итяжело следовать.Также вы должны быть осторожны, чтобы ваш переведенный контент был действительным json.Вы можете применить (настраиваемое) экранирование / фильтрацию, чтобы убедиться в этом, но при этом сделать его немного хрупким.

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

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

Вы должны использовать BazingaJsTranslationBundle , который позволяет вам получить доступ к переводам, которые вы предоставили через javascript:

Translator.trans('key', {}, 'DOMAIN_NAME');

Translator.transChoice('key', 1, {}, 'DOMAIN_NAME');
...