@pleio/react-polyglot
v0.7.1
Published
Higher order React component for using Polyglot
Downloads
2
Readme
React Polyglot
Provides higher order component for using Polyglot with React.
This package is a fork of react-polyglot.
Installation
npm install --save react-polyglot
Usage
react-polyglot
exports consists for one wrapper component called I18n
, one decorator called
translate
and one hook called useTranslate
. The decorator provides a prop t
which is instance of Polyglot
.
You are required to wrap your root component with I18n
and pass on a locale
like en
or fr
.
And messages
object containing the strings.
import React from 'react'
import { render } from 'react-dom'
import { I18n } from 'react-polyglot'
import App from './components/app'
const locale = window.locale || 'en'
const messages = {
hello_name: 'Hello, %{name}.',
num_cars: '%{smart_count} car |||| %{smart_count} cars',
}
render(
<I18n locale={locale} messages={messages}>
<App />
</I18n>,
document.getElementById('app')
)
Then inside App
or a child component of App
you can do:
import React from 'react'
import { translate } from 'react-polyglot'
const Greeter = ({ name, t }) => <h3>{t('hello_name', { name })}</h3>
Greeter.propTypes = {
name: React.PropTypes.string.isRequired,
t: React.PropTypes.func.isRequired,
}
export default translate(Greeter)
or with React Hooks:
import React from 'react';
import { useTranslate } from 'react-polyglot';
export default const Greeter = ({ name }) => {
const t = useTranslate();
return (
<h3>{t('hello_name', { name })}</h3>
);
};
Greeter.propTypes = {
name: React.PropTypes.string.isRequired
};
Live Examples
Minimal example using class components
https://codesandbox.io/s/mq76ojk228
Advance example with user changeable locales
https://codesandbox.io/s/px8n63v0m
How to provide context in your tests
Use a simple helper to wrap your components in a context.
export const wrapWithContext = function(component, context, contextTypes) {
const wrappedComponent = React.createClass({
childContextTypes: contextTypes,
getChildContext() {
return context
},
render() {
return component
},
})
return React.createElement(wrappedComponent)
}
Then use it inside your tests.
import React from 'react'
import { renderToString } from 'react-dom/server'
import Polyglot from 'node-polyglot'
import Greeter from './greeter'
import { wrapWithContext } from './helpers'
const polyglot = new Polyglot({
locale: 'en',
phrases: { hello_name: 'Hello, %{name}.' },
})
const greeterWithContext = wrapWithContext(
<Greeter name="Batsy" />,
{ t: polyglot.t.bind(polyglot) },
{ t: React.PropTypes.func }
)
// use greeterWithContext in your tests
// here it is shown how to use it with renderToString
console.log(renderToString(greeterWithContext))
Work in progress
Tests and Contributing guides are in progress.
Release History
- 0.6.2 (publicJorn) Updated release notes.
- 0.6.1 (publicJorn) Fixed prop-type warning in example.
- 0.6.0 (publicJorn) Added
useTranslate
(by @soda0289) and tests (by publicJorn). - 0.5.0 (publicJorn) Removed
componentWillReceiveProps
in I18n. Changetranslate
api totranslate(Component)
. - 0.2.6 Add React v16 as a peer dependency PR#12.
- 0.2.5 Prevent creation of multiple instances on receiving new props PR#9.
- 0.2.4 Add a section on 'How to provide context in tests' PR#10.
- 0.2.3 Add prop-types and start using that instead of React.PropTypes PR#6.
- 0.2.2 Add babel-cli for the commonjs build.
- 0.2.1 Add 'files' to keep in the package.
- 0.2.0 Update the I18n component when the locale changes.
- 0.1.0 Initial Release.