|
|
|
// 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');
|
|
|
|
|
|
|
|
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/mastodon/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;
|
|
|
|
}, {});
|