Ответ 1
Я столкнулся с той же проблемой, и вот что я узнал:
Чтобы изменить язык, я использовал предоставленное решение здесь, что в основном связывает IntlProvider с ReduxStore с функцией Connect. Также не забудьте включить ключ для повторной обработки компонентов при изменении языка. Это в основном весь код:
Это ConnectedIntlProvider.js, просто привязывает стандартный IntlProvider (обратите внимание на ключевую опору, отсутствующую в исходном комментарии к github)
import { connect } from 'react-redux';
import { IntlProvider } from 'react-intl';
// This function will map the current redux state to the props for the component that it is "connected" to.
// When the state of the redux store changes, this function will be called, if the props that come out of
// this function are different, then the component that is wrapped is re-rendered.
function mapStateToProps(state) {
const { lang, messages } = state.locales;
return { locale: lang, key: lang, messages };
}
export default connect(mapStateToProps)(IntlProvider);
И затем в вашем файле точки входа:
// index.js (your top-level file)
import ConnectedIntlProvider from 'ConnectedIntlProvider';
const store = applyMiddleware(thunkMiddleware)(createStore)(reducers);
ReactDOM.render((
<Provider store={store}>
<ConnectedIntlProvider>
<Router history={createHistory()}>{routes}</Router>
</ConnectedIntlProvider>
</Provider>
), document.getElementById( APP_DOM_CONTAINER ));
Следующее, что нужно сделать, - это просто реализовать редуктор для управления языками и заставить создателей действий изменять языки по запросу.
Что касается наилучшего способа хранения переводов, я нашел много дискуссий по этой теме, и ситуация кажется довольно запутанной, честно говоря, я совершенно сбив с толку, что создатели интерактивного фокуса так много внимания уделяют форматам даты и числа и забывают о переводе, Итак, я не знаю абсолютно правильный способ справиться с этим, но это то, что я делаю:
Создайте папку "locales" и внутри создайте кучу файлов типа "en.js", "fi.js", "ru.js" и т.д. В основном все языки, с которыми вы работаете.
В каждом файле экспортируется json-объект с такими переводами:
export const ENGLISH_STATE = {
lang: 'en',
messages: {
'app.header.title': 'Awesome site',
'app.header.subtitle': 'check it out',
'app.header.about': 'About',
'app.header.services': 'services',
'app.header.shipping': 'Shipping & Payment',
}
}
Другие файлы имеют точно такую же структуру, но с переведенными строками внутри.
Затем в редукторе, который отвечает за изменение языка, импортируйте все состояния из этих файлов и загрузите их в хранилище redux, как только будет отправлено действие для изменения языка. Ваш компонент, созданный на предыдущем шаге, будет распространять изменения в IntlProvider, и новая локаль будет иметь место. Выведите его на странице с помощью <FormattedMessage>
или intl.formatMessage({id: 'app.header.title'})}
, прочитайте больше об этом в своей вики-базе github.
У них есть функция DefineMessages, но, честно говоря, я не мог найти никакой хорошей информации, как ее использовать, в основном вы можете забыть об этом и быть в порядке.