我尝试将react-i18next
与包含一些HTML标记的翻译json一起使用,如下所示:
// en.json
{ "welcome": "Welcome to our site, <strong>{{name}}</strong>" }
在我的React组件中,我希望字符串像这样呈现。
欢迎来到我们的网站,约翰
使用useTranslation
函数时,通常会直接打印字符串,而不会像Welcome to our site, <strong>John</strong>
那样将其解释为HTML。
import React from 'react'
import { useTranslation } from 'react-i18next'
const App = () => {
const { t } = useTranslation()
return(
<div>{t('welcome', { name: 'John' })}</div>
)
}
我用dangerouslySetInnerHTML
替换了它,它被正确地渲染了。
<div dangerouslySetInnerHTML={{ __html: t('welcome', { name: 'John' }) }}></div>
不过,如果可能的话,我想避免使用dangerouslySetInnerHTML
。我在文档中读到,你可以使用一种叫做Trans组件的东西来进行带有HTML标签的翻译。
文档:用于翻译中的<br />
和其他简单html元素(v10.4.0)
但是我对如何使用它们感到困惑,因为它们显示的示例似乎是用像<br />
这样的实际标记替换像<1>
这样的占位符标记。有没有一种方法可以使用Trans组件(或其他一些不使用dangerouslySetInnerHTML
的方法)来获得翻译后的字符串,使其被解释为HTML?
先谢了。
4条答案
按热度按时间tzxcd3kk1#
在这里发帖是因为这是interwebz上的第一个搜索结果,没有一个答案对我的情况有效。
我的翻译JSON看起来像这样:
我设法使它工作的唯一方法是这样使用
Trans
:它看起来像这样:
**存储:***2 TB固态硬盘 *
7bsow1i62#
是啊,你做错了。
您的JSON文件应该如下所示:
使用
<1>
的原因是Trans
将字符串分解为数组,因此在本例中为:["Welcome to our site, ", "<strong>{{name}}</strong>"]
https://react.i18next.com/latest/trans-component#how-to-get-the-correct-translation-stringz9smfwbn3#
我刚刚发布了一个类似问题的答案,我可以解决,但在React Native中,应该也可以在React中工作:https://stackoverflow.com/a/70112582/9506908
xxe27gdn4#
您需要围绕
<div>
使用Trans
组件。如果您还想传递一些更复杂的组件,则需要将组件作为prop传递到Trans
组件中,并将其索引用作中间HTML标记。然后还将转换传递到options对象中在t
函数中,并在翻译字符串中使用它们。在您的组件中。
然后在翻译文件中:
结果