javascript - 如何防止 twig 自动转义日语字符?

标签 javascript php jquery twig momentjs

我正在尝试显示产品的到达日期。我正在使用 moment.jsYYYY/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 过滤器来防止 twig 转义日语字符。尽管如此,twig 无论如何都会转义特殊字符,并且文本会出现乱码:

garbled Japanese characters due to twig auto-escaping

当然,如果我将上面的代码片段移到外部文件中就可以解决。但说真的,有没有办法阻止 twig 转义日语字符?为什么raw过滤器工作?

最佳答案

从 cdn(或 npm/yarm 安装包)导入 moment ja 语言环境,如 https://momentjs.com/docs/#/i18n/ 中所示。

如果您使用 cdn 托管 js,则使用以下代码:

<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 完成它的工作,而不是将它们混合在一起。

关于javascript - 如何防止 twig 自动转义日语字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58276059/

相关文章:

javascript - 使用JS全屏显示页面

php - 如何在 .htaccess 或 php 文件中设置变量 'allow_url_fopen'?

php - PHP 5.2 是否仍会收到安全补丁?

javascript - 如何在到达页面顶部(滚动时)后将 css 添加到 div?

javascript - Laravel + React : Pass Function in JSON response

javascript - 突出显示菜单栏航点

php - jQuery 发布和获取表单数据

jquery - IE 11 中的转换 + 定位问题

javascript - 获取已在 keydown 上悬停的元素的属性

php - 使用主题标签获取对象属性