glitchier-soc/config/webpack/generateLocalePacks.js
Claire a3c10b6ced Change locales file generation to use JSON sources (#2028)
* Change locales file generation to use JSON sources

Instead of inheriting in JS files, set locale inheritance in the
theme's YML file, and inherit in the generated locale file, rather
than the source file.

* Convert glitch-soc JS translation files to JSON

Obtained running the following:

```sh
sed -i -z "s/import inherited from '.*';\s*\nconst messages = //" *.js
sed -i "s/\s*\/\/.*//" *.js
sed -i -z "s/;\s*export default .*/\n/" *.js
for i in *.js; do
  json5 $i | json_pp > ${i}on;
done
```

* Change `yarn manage:translations` to exclude any translation already defined upstream

* Run yarn manage:translations
2022-12-21 22:13:14 +01:00

74 lines
2.6 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 => {
return /\.json$/.test(filename) &&
!/defaultMessages/.test(filename) &&
!/whitelist/.test(filename);
}).map(filename => filename.replace(/\.json$/, ''));
let inherited_locales_path = null;
if (flavour.inherit_locales && flavours[flavour.inherit_locales]?.locales) {
inherited_locales_path = flavours[flavour.inherit_locales]?.locales;
}
const outPath = resolve('tmp', 'locales', entry);
rimraf.sync(outPath);
mkdirp.sync(outPath);
locales.forEach(function (locale) {
const localePath = join(outPath, `${locale}.js`);
const baseLocale = locale.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}/${locale}.js
// automatically generated by generateLocalePacks.js
//
${inherited_locales_path ? `import inherited from '../../../${inherited_locales_path}/${locale}.json';` : ''}
import messages from '../../../${flavour.locales}/${locale}.json';
import localeData from '${localeDataPath}';
import { setLocale } from 'locales';
setLocale({
localeData,
${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'},
});
`;
writeFileSync(localePath, localeContent, 'utf8');
map[`locales/${entry}/${locale}`] = localePath;
});
return map;
}, {});