/react-intl-po

:rocket: Extract POT from react-intl and convert back to json.

Primary LanguageJavaScriptMIT LicenseMIT

react-intl-po

Extract POT from react-intl and convert back to json.

messages.json → POT → PO → translation.json

Travis Codecov Status npm package npm downloads license

Dependency Status devDependency Status peerDependency Status

Greenkeeper badge

Demo

Standalone example based on Create-React-App: https://github.com/evenchange4/react-intl-po-example

Installation

$ npm install react-intl-po --save

Requirements and Workflow

RIP Workflow

Usage

There are two sub-commands of react-intl-po or rip:

  1. json2pot: Convert the json files extracted from babel-plugin-react-intl into one .pot file.
  2. po2json: Convert translated .po files back to .json format.

json2pot

$ rip json2pot '_translations/src/**/*.json' \
    -o ./mcs-public.pot
Arguments Description
srcPatterns The pattern of .json files extracted from babel-plugin-react-intl
output (-o) The output pathname of .pot file to be translated
message-key (-k) [Optional] Translation message key (default key is defaultMessage)
message-context (-c) [Optional] Translation message context (defaults to no context)

po2json

Case 1: Output one file per locale if a directory is set

$ rip po2json './node_modules/mcs-translation/po/mcs-public*.po' \
     -m './_translations/src/**/*.json' \
     -o './translations'

Case 2: Output one merged file if a .json file is set

$ rip po2json './node_modules/mcs-translation/po/mcs-public*.po' \`
     -m './_translations/src/**/*.json' \
     -o './translations.json'
Arguments Description
srcPatterns The pattern of translated .po files
messagesPattern (-m) The pattern of .json files extracted from babel-plugin-react-intl
output (-o) The output pathname of a file / directory
message-key (-k) [Optional] Translation message key (default key is defaultMessage)
message-context (-c) [Optional] Translation message context (defaults to no context)

API

Property

Q&A

How to translate the same message into two different meanings?

Option 1 (Recommended):

Set the message-context (-c) to 'id' of message object from babel-plugin-react-intl (there is no context by default).

The advantage of this option over Option 2 (below) is that PO file editors that provide features such as translation suggestions or error-checking often expect the message key to be defaultMessage.

$ rip po2json './node_modules/mcs-translation/po/mcs-public*.po' \
     -m './_translations/src/**/*.json' \
     -o './translations' \
     -c 'id'

$ rip po2json './node_modules/mcs-translation/po/mcs-public*.po' \`
    -m './_translations/src/**/*.json' \
    -o './translations.json' \
    -c 'id'

Option 2:

Set the message-key (-k) to 'id' of message object from babel-plugin-react-intl (default key is 'defaultMessage'). (#41)

$ rip po2json './node_modules/mcs-translation/po/mcs-public*.po' \
     -m './_translations/src/**/*.json' \
     -o './translations' \
     -k 'id'

$ rip po2json './node_modules/mcs-translation/po/mcs-public*.po' \`
    -m './_translations/src/**/*.json' \
    -o './translations.json' \
    -k 'id'

Test

$ npm run lint
$ npm run test:watch

CONTRIBUTING

  • ⇄ Pull requests and ★ Stars are always welcome.
  • For bugs and feature requests, please create an issue.
  • Pull requests must be accompanied by passing automated tests ($ npm test).

CHANGELOG

LICENSE

MIT: http://michaelhsu.mit-license.org