This plugin helps when using react-intl for internationalization of react apps.
This fork adds a few options for generating the JSON output:
- Changes JSON output to be simple key-value pairs
- Orders outputted keys alphabetically
- Removes all whitespace from values, i.e. spaces and newlines in multiline ES6 strings.
- Use
<FormattedMessage id="newItem" defaultMessage="Add item" />
for adding text in your react components. - Use the babel plugin
babel-plugin-react-intl
to extract them from your source code. - Use
react-intl-webpack-plugin
to combine them into one message file calledreactIntlMessages.json
and put this file into the webpack output path. - Use CAT (Computer Aided Translation) tools (like the cloud based memsource.com or okapi) to translate this file into the translated file. These tools use a concept called Translation Memory (TM) . This is a separate file where all translations are stored and with this file all translations can be reapplied to a newly generated
reactIntlMessages.json
file. - Save the TM file and the translated json file in a separate directory of your source code.
- Use
reactIntlJson-loader
to load the translated files and convert them to messages.
yarn add -D @jdcrensh/react-intl-webpack-plugin
or
npm install @jdcrensh/react-intl-webpack-plugin --save-dev
- this works only with babel-loader >= 6.4.0
- you will need also the babel plugin
babel-plugin-react-intl
webpack.config.js:
- add the plugin
var ReactIntlPlugin = require('@jdcrensh/react-intl-webpack-plugin');
// ...
plugins: [
// ...
new ReactIntlPlugin({
// see options section
})
],
- modify your babel-loader to contain the
metadataSubscribers
option
module: {
// ...
rules: [
// ...
{
test: /\.jsx?$/,
use: [{
loader: 'babel-loader',
options: {
presets: [['es2015', { 'modules': false }], 'react', 'stage-0'],
plugins: [
['react-intl', {
messagesDir: path.resolve(__dirname, 'dist', 'i18n')
}]
],
metadataSubscribers: [ReactIntlPlugin.metadataContextFunctionName],
cacheDirectory: true
}
}]
}
]
}
- the generated file is called
<messagesDir>/reactIntlMessages.json
sortKeys
(boolean, default true
): If true, sorts JSON output by message id
flatOutput
(boolean, default false
): If true, outputs as a simple key-value pair, i.e. {'key1': 'text', 'key2': 'text'}
collapseWhitespace
(boolean, default false
): If true, collapses all inner whitespace and newlines. Useful for ES6 multiline template literals.
-
Keep in mind that as long as you use webpack-dev-server all assets are generated in memory. To access those assets use either:
- the browser an check http://localhost:devServerPort/reactIntlMessages.json
- or, add a script to package.json like
"trans:refreshJsonDEV": "curl localhost:3100/reactIntlMessages.json >./dist/reactIntlMessages.json"
- or start your webpack build to generate the assets into the build directory.
-
If no messages are generated it could be helpful to cleanup the
cacheDirectory
of the babel-loader, or set"cacheDirectory": false
temporarily