tootlab-mastodon/config/webpack/generateLocalePacks.js

67 lines
2.2 KiB
JavaScript

// A message from upstream:
// ========================
// To avoid adding a lot of boilerplate, locale packs are
// automatically generated here. These are written into the tmp/
// directory and then used to generate locale_en.js, locale_fr.js, etc.
// Glitch note:
// ============
// This code has been entirely rewritten to support glitch flavours.
// However, the underlying process is exactly the same.
const { existsSync, readdirSync, writeFileSync } = require('fs');
const { join, resolve } = require('path');
const rimraf = require('rimraf');
const mkdirp = require('mkdirp');
const { flavours } = require('./configuration.js');
module.exports = Object.keys(flavours).reduce(function (map, entry) {
const flavour = flavours[entry];
if (!flavour.locales) {
return map;
}
const locales = readdirSync(flavour.locales).filter(
filename => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename)
);
const outPath = resolve('tmp', 'locales', entry);
rimraf.sync(outPath);
mkdirp.sync(outPath);
locales.forEach(function (locale) {
const localeName = locale.replace(/\.js(?:on)?$/, '');
const localePath = join(outPath, `${localeName}.js`);
const baseLocale = localeName.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
const localeDataPath = [
// first try react-intl
`node_modules/react-intl/locale-data/${baseLocale}.js`,
// then check locales/locale-data
`app/javascript/locales/locale-data/${baseLocale}.js`,
// fall back to English (this is what react-intl does anyway)
'node_modules/react-intl/locale-data/en.js',
].filter(
filename => existsSync(filename)
).map(
filename => filename.replace(/(?:node_modules|app\/javascript)\//, '')
)[0];
const localeContent = `//
// locales/${entry}/${localeName}.js
// automatically generated by generateLocalePacks.js
//
import messages from '../../../${flavour.locales}/${locale.replace(/\.js$/, '')}';
import localeData from '${localeDataPath}';
import { setLocale } from 'locales';
setLocale({
localeData,
messages,
});
`;
writeFileSync(localePath, localeContent, 'utf8');
map[`locales/${entry}/${localeName}`] = localePath;
});
return map;
}, {});