diff --git a/package.json b/package.json index 7c5cdc56..3ccacf89 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "2.0.0", "description": "Localization for the Scratch 3.0 components", "main": "./dist/l10n.js", + "bin": { + "build-i18n-src": "./scripts/build-i18n-src.js" + }, "scripts": { "build:data": "babel-node scripts/build-data", "build": "npm run clean && npm run build:data && webpack --progress --colors --bail", @@ -20,8 +23,12 @@ "url": "https://github.com/LLK/scratch-l10n/issues" }, "homepage": "https://github.com/LLK/scratch-l10n#readme", - "devDependencies": { + "dependencies": { "babel-cli": "^6.26.0", + "babel-plugin-intl": "^0.1.1", + "babel-plugin-react-intl": "^2.3.1" + }, + "devDependencies": { "babel-core": "^6.26.0", "babel-eslint": "^7.2.3", "babel-loader": "^7.1.2", diff --git a/scripts/build-i18n-src.js b/scripts/build-i18n-src.js new file mode 100755 index 00000000..9f6571c1 --- /dev/null +++ b/scripts/build-i18n-src.js @@ -0,0 +1,45 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const glob = require('glob'); +const path = require('path'); +const mkdirp = require('mkdirp'); + +var args = process.argv.slice(2); + +if (!args.length) { + process.stdout.write('You must specify the messages dir generated by babel-plugin-react-intl.\n'); + process.exit(1); +} + +const MESSAGES_PATTERN = args.shift() + '/**/*.json'; + +if (!args.length) { + process.stdout.write('A destination directory must be specified.\n'); + process.exit(1); +} + +const LANG_DIR = args.shift(); + +// Aggregates the default messages that were extracted from the example app's +// React components via the React Intl Babel plugin. An error will be thrown if +// there are messages in different components that use the same `id`. The result +// is a chromei18n format collection of `id: {message: defaultMessage, +// description: description}` pairs for the app's default locale. +let defaultMessages = glob.sync(MESSAGES_PATTERN) + .map((filename) => fs.readFileSync(filename, 'utf8')) + .map((file) => JSON.parse(file)) + .reduce((collection, descriptors) => { + descriptors.forEach(({id, defaultMessage, description}) => { + if (collection.hasOwnProperty(id)) { + throw new Error(`Duplicate message id: ${id}`); + } + + collection[id] = {message: defaultMessage, description: description}; + }); + + return collection; + }, {}); + +mkdirp.sync(LANG_DIR); +fs.writeFileSync(path.join(LANG_DIR, 'en.json'), JSON.stringify(defaultMessages, null, 2));