a5e446a4a0
* 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
75 lines
2.6 KiB
JavaScript
75 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;
|
|
}, {});
|