我该如何在Laravel本地化文件中使用HTML标签?

78

我想利用Laravel的本地化功能,但我需要能够强调或加粗短语的一部分。将HTML标记插入到语言文件中会导致其在输出到Blade时被转义。

例如,这是我的语言文件条目:

return [
    'nav' => [
        'find' => '<strong>Find</strong> Your Home',
    ]
];

当我在Blade模板中调用它时:(我也尝试过使用三个大括号。)

{{ trans('base.nav.find') }}

它输出:

&lt;strong&gt;Find&lt;/strong&gt; Your Home

我可以考虑把措辞拆开,比如说:

return [
    'nav' => [
        'fyh' => [
            'find' => 'Find',
            'yh'   => 'Your Home',
        ]
    ]
]

然后输出:

<strong>{{ trans('base.nav.fyh.find') }}</strong>{{ trans('base.nav.fyh.yh') }}

但那似乎有些过头了,有更好的解决方案吗?


2
第二个选项不仅是过度杀伤力,而且是有问题的。如果在某种语言中动词位于句子末尾,翻译人员该怎么办呢?您可以将翻译后的字符串放置在页面上靠近彼此的位置,但通常不希望将它们连接起来形成句子或段落。 - bdsl
3个回答

166

使用{!! !!}而不是{{ }}来防止转义:

{!! trans('nav.find') !!}

啊,该死!我不确定我是怎么忽略了那个。谢谢你。当SO允许时,我会接受这个答案。 - Michael Irigoyen
5
你提到了三重花括号,我想提醒一下,在L4和L5之间有一个区别。在L4中,{{ }}是未转义的,而 {{{ }}}是转义的。在L5中, {!! !!}是未转义的,而 {{ }}是转义的。 - patricus
谢谢,我上一次使用 Laravel 是版本 4,所以我错过了这个变化,现在我正在使用一个干净的 5.1 安装。 - Michael Irigoyen
1
请注意,如果攻击者可以以某种方式写入/lang,则未转义的方法可能会导致漏洞,例如XSS。 - Ion Farima

11

当用于“占位符”时,此@lang指令无法帮助跨度标记。 - Farhan Ibn Wahid

8

使用 Laravel 5.6 及以上版本,可以结合 Blade 语法使用 __ 辅助函数:

{!! __('pagination.next') !!}

在分页的 Blade 模板中需要这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接