假设我有这个消息对象:
{greetings: '{blah} is welcome'}
如何将HTML注入{blah}
param?
我试过这个,但它不起作用:
{{ $t('greetings', {blah: '<foo>' + some_string + '</foo>'}) }}
答案 0 :(得分:3)
你必须告诉我你在尝试用这条消息做什么,只要在HTML中显示它,但是在第一次通过时它似乎就像你想要的那样
this.msg = '<foo>' + some_string + '</foo>';
然后,在您要显示此消息的HTML中,您会说:
{{{ msg }}}
注意三个括号,这意味着它将msg
解释为原始HTML而不是转义字符串...请谨慎使用。如果msg
纯粹是由前端设定的东西那么它就没事了;只是不要让some_string
成为用户输入的数据。
答案 1 :(得分:2)
对于Vue 2.0,things have changed:
如果您的消息对象是:
{greetings: '<foo>{blah}</foo> is welcome'}
然后在模板方面,您应该具有以下内容:
<p v-html="$t('greetings', {blah: some_string})"></p>
也适用于<div v-html="..."></div>
,当然还有其他标签。见https://github.com/kazupon/vue-i18n/issues/73
答案 2 :(得分:1)
请谨慎对待[先前]接受的答案,因为不受信任的输入将导致XSS漏洞。正确的方法是使用component interpolation。它的工作原理有点像插槽。
这是一个实际的示例,它在用户名周围包裹了一个链接:
const messages = {
welcome: 'Welcome, {user}!'
};
<i18n
path="welcome"
tag="p"
>
<a place="user" :href="user.link">{{ user.name }}</a>
</i18n>
这将导致以下输出:
<p>Welcome, <a href="/users/bob">Bob Marley</a>!</p>
为便于理解,请注意:
path
属性是消息密钥。place
属性占位符。tag
属性确定要呈现的元素类型。place
属性的元素即可。如果您对<i18n>
组件感到好奇,则不必显式启用它-在初始化vue-i18n时会对其进行注册。
答案 3 :(得分:0)
您可以使用:
$t('greetings', {blah: some_string})
在他们的en.json中
{
greetings: '<foo>{blah}</foo> is welcome'
}
答案 4 :(得分:0)
为什么不直接在 json 中使用 html 标签而不是模板。 这是我在解决方案中将不同布局句子结构的动态参数与html标签的组合
<块引用>en.json
"Accept_Terms": "Do you accept the <b>{0}</b> and <span class="something">{1}</span> ?",
"Terms":"Terms",
"Conditions":"Conditions"
<块引用>
tr.json
"Accept_Terms": "<b>{0}</b> ve <span class="something">{1}</span> kabul ediyor musunuz ??",
"Terms":"Şartları",
"Conditions":"Kullanım koşullarını"
<块引用>
component.vue
<p v-html=" $t('Accept_Terms', [
$t('Terms'),
$t('Conditions')
])">
</p>
“terms”和“conditions”属性根据语言而变化,因此我可以使用任何html标签将句子序列管理为定义的语言
<块引用>在组件中
$t("message", [$t("paramater_1"),$t("parameter_2")])
<块引用>在json文件中
"message" : "some text {0} some text with html {1}....."