const fs = require('fs'); const path = require('path'); const { default: manageTranslations } = require('react-intl-translations-manager'); const RFC5646_REGEXP = /^[a-z]{2,3}(?:-(?:x|[A-Za-z]{2,4}))*$/; const rootDirectory = path.resolve(__dirname, '..', '..'); const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales'); const messagesDirectory = path.resolve(rootDirectory, 'build', 'messages'); const availableLanguages = fs.readdirSync(translationsDirectory).reduce((languages, filename) => { const basename = path.basename(filename, '.json'); if (RFC5646_REGEXP.test(basename)) { languages.push(basename); } return languages; }, []); const testRFC5646 = language => { if (!RFC5646_REGEXP.test(language)) { throw new Error('Not RFC5646 name'); } }; const testAvailability = language => { if (!availableLanguages.includes(language)) { throw new Error('Not an available language'); } }; const validateLanguages = (languages, validators) => { const invalidLanguages = languages.reduce((acc, language) => { try { validators.forEach(validator => validator(language)); } catch (error) { acc.push({ language, error }); } return acc; }, []); if (invalidLanguages.length > 0) { console.error(` Error: Specified invalid LANGUAGES: ${invalidLanguages.map(({ language, error }) => `* ${language}: ${error.message}`).join('\n')} Use yarn "manage:translations -- --help" for usage information `); process.exit(1); } }; const { argv } = require('yargs') .usage(`Usage: yarn manage:translations -- [OPTIONS] [LANGUAGES] Manage JavaScript translation files in Mastodon. Generates and update translations in translationsDirectory: ${translationsDirectory} LANGUAGES The RFC5646 language tag for the language you want to test or fix. If you want to input multiple languages, separate them with space. Available languages: ${availableLanguages.join(', ')} `) .help('h', 'show this message') .alias('h', 'help') .options({ f: { alias: 'force', default: false, describe: 'force using the provided languages. create files if not exists.', type: 'boolean', }, }); // check if message directory exists if (!fs.existsSync(messagesDirectory)) { console.error(` Error: messagesDirectory not exists (${messagesDirectory}) Try to run "yarn build:development" first`); process.exit(1); } // determine the languages list const languages = (argv._.length > 0) ? argv._ : availableLanguages; // validate languages validateLanguages(languages, [ testRFC5646, !argv.force && testAvailability, ].filter(Boolean)); // manage translations manageTranslations({ messagesDirectory, translationsDirectory, detectDuplicateIds: false, singleMessagesFile: true, languages, jsonOptions: { trailingNewline: true, }, });