Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ratson/react-intl-redux
Redux binding for React Intl.
https://github.com/ratson/react-intl-redux
i18n react react-intl redux
Last synced: 5 days ago
JSON representation
Redux binding for React Intl.
- Host: GitHub
- URL: https://github.com/ratson/react-intl-redux
- Owner: ratson
- License: mit
- Created: 2016-02-04T12:38:30.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2024-03-09T12:03:46.000Z (10 months ago)
- Last Synced: 2024-05-16T00:10:18.815Z (7 months ago)
- Topics: i18n, react, react-intl, redux
- Language: JavaScript
- Homepage:
- Size: 103 KB
- Stars: 298
- Watchers: 11
- Forks: 48
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# React Intl Redux
[Redux](https://github.com/reactjs/redux) binding for [React Intl](https://github.com/yahoo/react-intl).
Building idiomatic React Redux Application by
having translations in store and dispatching action to update it.## Installation
```
npm install react-intl-redux react react-intl react-redux redux --save
```## Usage
```js
import React from 'react'
import ReactDOM from 'react-dom'
import { createStore, combineReducers } from 'redux'
import { FormattedNumber } from 'react-intl'
import { Provider, intlReducer } from 'react-intl-redux'
import reducers from '/reducers'const reducer = combineReducers({
...reducers,
intl: intlReducer,
})const store = createStore(reducer)
const App = () => (
)ReactDOM.render(, document.getElementById('container'))
```### Provide `locale` and `messages` on load
You should provide a different `locale` and `messages` if your user is not using `en` locale.
```js
const initialState = {
intl: {
locale: 'it',
messages: {
'app.greeting': 'Ciao!',
},
},
// ...other initialState
}
const store = createStore(reducer, initialState)
```Refer to the [`initial-locale` example](https://github.com/ratson/react-intl-redux/tree/master/examples/initial-locale) for more details.
### Switch `locale` and `messages` on request
You could also switch `locale` on user's request by dispatching `updateIntl` action.
```js
import { updateIntl } from 'react-intl-redux'store.dispatch(updateIntl({
locale,
messages,
}))
```React Intl in browsers only contain locale data for basic English
by default, see
[Loading Locale Data](https://github.com/yahoo/react-intl/wiki#loading-locale-data)
for loading locale data in browsers.### `Provider` vs `IntlProvider`
In most cases, `react-intl-redux` will be wrapped immediately after `Provider` from `react-redux`. For convenient, `react-intl-redux` provides `Provider` to do that for you.
However, if you don't want it, you could do it manually via [`IntlProvider`](https://github.com/yahoo/react-intl/wiki/Components#intlprovider). For example,
```js
import React from 'react'
import { IntlProvider } from 'react-intl-redux'
import { Provider } from 'react-redux'const App = () => (
)
```### Formatting Data
`react-intl` provides two ways to format data, see the [official docs](https://github.com/yahoo/react-intl/wiki#formatting-data).
To change `formats` through [React components](https://github.com/yahoo/react-intl/wiki/Components),
```js
import { updateIntl } from 'react-intl-redux'store.dispatch(updateIntl({
locale,
formats,
messages,
}))
```### Use with `redux-immutable`
See the usage in [test](https://github.com/ratson/react-intl-redux/blob/master/test/immutable.spec.js).
## Examples
There are some examples under the [`examples`](./examples) folder for reference.
## Troubleshooting
1. Why my connected component does not update after locale change?
By default, `locale` is used as `key` for `IntlProvider`, which will trigger re-render when locale changes, things should just work.
If it doesn't, here are few solutions could be tried,
* Do a `forceUpdate` after changing locale.
* Mark the connecting compoent `{pure: false}`.
* Pass `locale` in `props`.
* Set `key` when dispatching `updateIntl`.
* Provide custom `intlSelector` for `IntlProvider`.2. How to use `intl` in asynchronous action?
A simple solution would be retrive `intl` object using [`injectIntl`](https://github.com/yahoo/react-intl/wiki/API#injection-api) and pass it in the action payload.