React-Intl如何从变量切换语言环境和消息

我试图弄清楚如何使用React-Intl更改语言。这是我的第一个React App,它是用create-react-

app制作的,我没有使用Redux或Flux。

在我的index.js中,我有以下代码:

import React from 'react';

import ReactDOM from 'react-dom';

import TodoApp from './components/TodoApp';

import registerServiceWorker from './registerServiceWorker';

import './index.css';

// Bootstrap CSS libraries

import 'bootstrap/dist/css/bootstrap.css';

import 'bootstrap/dist/css/bootstrap-theme.css';

import { IntlProvider, addLocaleData } from 'react-intl';

import intlEN from 'react-intl/locale-data/en';

import intlES from 'react-intl/locale-data/es';

import intlMessagesES from './i18n/locales/es.json';

import intlMessagesEN from './i18n/locales/en.json';

addLocaleData([...intlEN, ...intlES]);

/* Define your translations */

let i18nConfig = {

locale: 'es',

messages: intlMessagesES

};

let changeLanguage = (lang) => {

i18nConfig = { locale: lang, messages: intlMessagesEN };

return i18nConfig;

}

ReactDOM.render(

<IntlProvider locale={ i18nConfig.locale } key={ i18nConfig.locale } messages={ i18nConfig.messages }>

<TodoApp onChangeLanguage={changeLanguage} />

</IntlProvider>,

document.getElementById('root'));

registerServiceWorker();

TodoApp通过道具(例如:“ es”或“ en”)在“ lang”参数上发送字符串,当我更改 时,

似乎没有任何改变。我的想法是先更改 变量,然后我的所有应用程序也会更改语言。

我在TodoApp中有FormattedMessages,我的两个JSON消息是这样填充的:

// i18n/locales/en.json

{

"footer.add.placeholder": "Enter a name ...",

"footer.add.priority0.text": "No priority",

"footer.add.priority1.text": "Priority 1",

...

}

您知道我的代码中缺少什么吗?也许我对React-Intl不太了解。任何建议都会有所帮助,谢谢。

回答:

如果您从根目录删除所有内容,则可以使用:

ReactDOM.render(<TodoApp />, document.getElementById('root'));

但是现在我们像这样更改TodoApp组件:

1)我们添加’locale’作为组件状态并导入React-Intl:

import { IntlProvider, addLocaleData } from 'react-intl';

import intlEN from 'react-intl/locale-data/en';

import intlES from 'react-intl/locale-data/es';

import intlMessagesES from './../i18n/locales/es.json';

import intlMessagesEN from './../i18n/locales/en.json';

addLocaleData([...intlEN, ...intlES]);

/* Define your default translations */

let i18nConfig = {

locale: 'en',

messages: intlMessagesEN

};

2)更改我们的changeLanguage函数(这次称为“ onChangeLanguage”),此函数从子组件语言选择器接收“ lang”:

onChangeLanguage(lang) {

switch (lang) {

case 'ES': i18nConfig.messages = intlMessagesES; break;

case 'EN': i18nConfig.messages = intlMessagesEN; break;

default: i18nConfig.messages = intlMessagesEN; break;

}

this.setState({ locale: lang });

i18nConfig.locale = lang;

}

最后渲染:

render() {

return (

<IntlProvider key={ i18nConfig.locale } locale={ i18nConfig.locale } messages={ i18nConfig.messages }>

<div>

<Header onChangeLanguage={this.onChangeLanguage} />

// Other components ...

</div>

</IntlProvider>

);

}

如果有人根本听不懂,请在评论中提问!感谢@TomásEhrich

以上是 React-Intl如何从变量切换语言环境和消息 的全部内容, 来源链接: utcz.com/qa/416050.html

回到顶部