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