Как предотвратить автоматическое экранирование веток японских символов? - PullRequest
2 голосов
/ 07 октября 2019

Я пытаюсь отобразить дату прибытия товара. Я использую moment.js для форматирования YYYY/MM/DD строки даты в японскую локальную строку. Мой код javascript включен в файл twig:

<script>
        moment.locale('ja');
        let updateArrivalDate = function() {
            $('.arrival-date').each(function() {
                let $this = $(this);
                $selectDate = $this.next().next().find('select').eq(0);
                $selectTime = $this.next().next().find('select').eq(1);
                var text = $selectDate.val();
                var date = moment(text, 'YYYY/MM/DD');
                if (date.isValid()) {
                    $this.text(date.format('{{ 'YYYY年M月D日 (dd)'|raw }}'))
                }
            });
        };
        $(document).ready(function() {
          updateArrivalDate();
            $('select').on('change', function() {
                updateArrivalDate();
            });
        });
    </script>

Как вы можете видеть, я использовал фильтр raw для предотвращения выхода веток из японских символов. Тем не менее, ветка в любом случае экранирует специальные символы, а текст искажается:

garbled Japanese characters due to twig auto-escaping

Конечно, это будет решено, если я переместу приведенный выше фрагмент на внешнийфайл. А если серьезно, разве нет способа остановить веточку, избегающую японских символов? Почему raw фильтр не работает?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Импортировать момент ja локаль из cdn (или из установленного пакета npm / yarm), как видно из https://momentjs.com/docs/#/i18n/

Если вы используете js, размещенную на cdn, то используйте следующий код:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js" integrity="sha256-4iQZ6BVL4qNKlQ27TExEhBN1HFPvAvAMbFavKKosSWQ=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/ja.js" integrity="sha256-CFWtR1hGN/5Vc+kcJkqeMFND0g6gFFZdnSqUtdL7WOQ=" crossorigin="anonymous"></script>

Тогда вместо:

 $this.text(date.format('{{ 'YYYY年M月D日 (dd)'|raw }}'))

Используйте:

 var date = moment(text, 'YYYY/MM/DD');
 $this.html(date.locale('ja').format('LL (dd)'))

И удалите:

        moment.locale('ja');

строку

ТакВаш сценарий будет:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js" integrity="sha256-4iQZ6BVL4qNKlQ27TExEhBN1HFPvAvAMbFavKKosSWQ=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/ja.js" integrity="sha256-CFWtR1hGN/5Vc+kcJkqeMFND0g6gFFZdnSqUtdL7WOQ=" crossorigin="anonymous"></script>
<script>
        let updateArrivalDate = function() {
            $('.arrival-date').each(function() {
                let $this = $(this);
                $selectDate = $this.next().next().find('select').eq(0);
                $selectTime = $this.next().next().find('select').eq(1);
                let text = $selectDate.val();
                let date = moment(text, 'YYYY/MM/DD');
                if (date.isValid()) {
                    $this.text(date.locale('ja').format('LL (dd)'))
                }
            });
        };
        $(document).ready(function() {
          updateArrivalDate();
            $('select').on('change', function() {
                updateArrivalDate();
            });
        });
    </script>

Обратитесь к приведенному ниже примеру, содержащему только форматирование относительно языка:

$(document).ready(function(){
 $("#date").html(moment().locale('ja').format('LL (dd)'))
});
<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/ja.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="date"></div>

Таким образом, вы можете отформатировать дату и избежать сложностей с помощью js / twig. Просто будьте проще и позвольте js выполнять свою работу вместо того, чтобы смешивать их все вместе.

1 голос
/ 07 октября 2019

Я думаю, вы можете изменить код следующим образом:

$this.text(date.format('{{ "YYYY年M月D日 (dd)"|json_encode()|raw }}'))
...