我试图弄清楚如何使用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”参数上发送字符串,当我更改 i18nConfig 时, IntlProvider 似乎没有任何改变。我的想法是先更改 i18nConfig 变量,然后我的所有应用程序也会更改语言。
我在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