jak*_*ill 4 i18next reactjs next.js react-i18next mdxjs
我们使用MDXJS包在Markdown中编写内容并在其中使用React组件。
有没有办法在 MDX/Markdown 文件中使用i18next / react-i18next包?
i18next内部MDX:当你导入一个MDX文件时,你只需将它用作任何其他 React 组件:
import { default as SomeContent } from './some-content.mdx';
...
<SomeContent />
Run Code Online (Sandbox Code Playgroud)
因此,您还可以传递一些 props(在本例中为t函数),并以某些特定方式在内部使用它:
import { default as SomeContent } from './some-content.mdx';
export const SomeComponent: React.FC = React.memo((props) => {
const { t } = useTranslation();
return (
<SomeContent t={ t } someProp="Some value" />
);
});
Run Code Online (Sandbox Code Playgroud)
如果您想检查这是否有效或查看可以从MDX文件中访问哪些道具,请在其中添加以下内容:
<pre>{ JSON.stringify(props, null, ' ') }</pre>
<pre>{ typeof props.t }</pre>
Run Code Online (Sandbox Code Playgroud)
对于上面的例子,它将显示:
{"someProp":"Some value"}
function
Run Code Online (Sandbox Code Playgroud)
请注意,您不能在“原始”MD元素中使用这些道具,即使您在它们周围添加了包装器:
### Doesn't work: { props.t('some.translation') }
Doesn't work: { props.t('some.translation') }.
Doesn't work: <>{ props.t('some.translation') }</>.
Doesn't work: <Fragment>{ props.t('some.translation') }</Fragment>.
Doesn't work: <span>{ props.t('some.translation') }</span>.
Run Code Online (Sandbox Code Playgroud)
所以你必须写HTML标签:
<h3>Works: { props.t('some.translation') }</h3>
<p>Works: { props.t('some.translation') }.</p>
<p>Works: <>{ props.t('some.translation') }</>.</p>
<p>Works: <Fragment>{ props.t('some.translation') }</Fragment>.</p>
<p>Works: <span>{ props.t('some.translation') }</span>.</p>
Run Code Online (Sandbox Code Playgroud)
MDX于i18next:如果您在配置returnObjects: true中进行设置,您还可以在翻译文件中i18next添加组件:MDX
import { default as ContentEN } from './content.en.mdx';
import { default as ContentES } from './content.es.mdx';
i18next.use(initReactI18next).init({
resources: {
en: {
translation: {
content: ContentEN,
},
},
es: {
translation: {
content: ContentES,
},
},
},
returnObjects: true,
}));
Run Code Online (Sandbox Code Playgroud)
然后你可以在任何组件中像这样使用它(是的,你也可以传递t或任何其他道具,就像以前一样:
export const SomeComponent: React.FC = React.memo((props) => {
const { t } = useTranslation();
const Content = t('content');
return (
<Content t={ t } someProp="Some value" />
);
});
Run Code Online (Sandbox Code Playgroud)
i18next内部@mdx-js/runtime:如果您正在使用@mdx-js/runtime,那么您将把您的 props 传递为scope:
import { default as SomeContent } from './some-content.mdx';
export const SomeComponent: React.FC = React.memo((props) => {
const { t } = useTranslation();
return (
<MDX components={ ... } scope={ { t, someProp: 'Some value' } }>{ props.mdx }</MDX>
);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2938 次 |
| 最近记录: |