// 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 { mkdirp } = require('mkdirp'); const rimraf = require('rimraf'); 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; }, {});