From a5e446a4a0bf567e2c293cb68f84ca141f527a21 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 21 Dec 2022 22:13:14 +0100 Subject: 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 --- config/webpack/generateLocalePacks.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'config/webpack/generateLocalePacks.js') diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js index 09fba4a18..b1b818159 100644 --- a/config/webpack/generateLocalePacks.js +++ b/config/webpack/generateLocalePacks.js @@ -20,18 +20,25 @@ module.exports = Object.keys(flavours).reduce(function (map, entry) { if (!flavour.locales) { return map; } - const locales = readdirSync(flavour.locales).filter( - filename => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename) - ); + 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 localeName = locale.replace(/\.js(?:on)?$/, ''); - const localePath = join(outPath, `${localeName}.js`); - const baseLocale = localeName.split('-')[0]; // e.g. 'zh-TW' -> 'zh' + 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`, @@ -45,21 +52,22 @@ module.exports = Object.keys(flavours).reduce(function (map, entry) { filename => filename.replace(/(?:node_modules|app\/javascript)\//, '') )[0]; const localeContent = `// -// locales/${entry}/${localeName}.js +// locales/${entry}/${locale}.js // automatically generated by generateLocalePacks.js // -import messages from '../../../${flavour.locales}/${locale.replace(/\.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, - messages, + ${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'}, }); `; writeFileSync(localePath, localeContent, 'utf8'); - map[`locales/${entry}/${localeName}`] = localePath; + map[`locales/${entry}/${locale}`] = localePath; }); return map; -- cgit