我在项目中使用i18next并且无法在翻译文件中包含html标记并正确呈现它们。
我的.json
翻译文件示例:
"en": {
"product": {
"header": "Welcome, <strong>User!</strong>"
}
}
有一个excellent answer to this question,但与JQuery有关。我没有使用JQuery,我的项目是React,这是我的设置:
import i18next from 'i18next';
import en from 'locales/en';
i18next.
init({
lng: 'en',
fallbackLng: false,
resources: en,
debug: false,
interpolation: {
escapeValue: false
}
});
export default i18next.t.bind(i18next);
在组件中我有:
import t from 'i18n';
t('product.header')
我想要的HTML:
Welcome, <strong>User!</strong>
我得到的HTML:
Welcome, <strong>User!</strong>
由于
答案 0 :(得分:3)
不是react-i18next的问题 - 你只是不能将html添加到react元素中。 react会保护您免受xss漏洞攻击并逃避内容:
更多细节和可能的解决方案:https://facebook.github.io/react/tips/dangerously-set-inner-html.html
但请注意,如果您将用户内容放在那里没有逃脱,请将您的网站打开以进行xss攻击。
更安全地阅读react-i18next自述文件: https://github.com/i18next/react-i18next#interpolate-component
这使你分割内容
所以&#34;最好&#34;解决方案 - 至少我们所做的 - 在翻译中使用markdown并使用例如:https://github.com/acdlite/react-remarkable将其转换为格式化内容。
答案 1 :(得分:2)
请勿将HTML标签放入翻译中。无论如何,这是一个坏主意。 关注分离家伙们都会对此抱怨。
如果 react-i18next https://react.i18next.com/latest/trans-component
,请使用<Trans>
组件
这样做:
// Component.js
<Trans>Welcome, <strong>User!</strong>, here's your <strong>broom</strong></Trans>
以及相应的翻译文件:
// your locales/starwars_en.js file
translations: {
"Welcome, <1>User!</1>, here's your <3>broom</3>": "Welcome, <1>young padawan!</1>, here's your <3>light saber</3>",
}
这些数字 <1> 和 <3> 会随机打击您,但请等待:
Trans.children = [
'Welcome, ', // index 0
'<strong>User!</strong>' // index 1
', please don't be ', // index 2
'<strong>weak</strong>', // index 3
' unread messages. ', // index 4
]
侧注(可以被视为一种hack,但可以节省大量时间): react.i18next.com的人员在文档中没有此内容,但是您可以使用基本语言作为键(在这种情况下为英文)。这样可以节省您的时间,而无需像他们在文档中显示的那样重复翻译,我引用:
// Component file
import React from 'react';
import { Trans } from 'react-i18next'
function MyComponent({ person, messages }) {
const { name } = person;
const count = messages.length;
return (
<Trans i18nKey="userMessagesUnread" count={count}>
Hello <strong title={t('nameTitle')}>{{name}}</strong>, you have {{count}} unread message. <Link to="/msgs">Go to messages</Link>.
</Trans>
);
}
// translation file
"userMessagesUnread": "Hello <1>{{name}}</1>, you have {{count}} unread message. <5>Go to message</5>.",
"userMessagesUnread_plural": "Hello <1>{{name}}</1>, you have {{count}} unread messages. <5>Go to messages</5>.",
无论如何,“荣誉!”加入i18next团队!你们真棒!
在这里-go nuts!