diff --git a/common/translations-cli/constants.js b/common/translations-cli/constants.js index b37a3e98e..388ea082c 100644 --- a/common/translations-cli/constants.js +++ b/common/translations-cli/constants.js @@ -1,5 +1,14 @@ const defaultLanguage = 'en-US'; +/** @typedef {{ extensions: string[], directories: string[]}} ExtractConfig + +/** @type {ExtractConfig} */ +const defaultExtractConfig = { + extensions: ['.js', '.ts', '.svelte'], + directories: ['app', 'packages/web'], +}; + module.exports = { defaultLanguage, + defaultExtractConfig, }; diff --git a/common/translations-cli/extract.js b/common/translations-cli/extract.js index 99ad0633c..9c6374594 100644 --- a/common/translations-cli/extract.js +++ b/common/translations-cli/extract.js @@ -72,8 +72,6 @@ async function extractAllTranslations(directories, extensions, options = {}) { } } - console.log(`Total translations found: ${Object.keys(allTranslations).length}`); - return allTranslations; } catch (error) { console.error('Error extracting translations:', error); diff --git a/common/translations-cli/program.js b/common/translations-cli/program.js index 3fed3d244..532450c5d 100644 --- a/common/translations-cli/program.js +++ b/common/translations-cli/program.js @@ -4,8 +4,6 @@ const { program } = require('commander'); const { resolveDirs, resolveExtensions, - resolveFile, - ensureFileDirExists, getTranslationChanges, setLanguageTranslations, getAllNonDefaultLanguages, @@ -14,26 +12,20 @@ const { } = require('./helpers'); const { extractAllTranslations } = require('./extract'); const { getMissingTranslations } = require('./addMissing'); -const { defaultLanguage } = require('./constants'); +const { defaultLanguage, defaultExtractConfig } = require('./constants'); +const { removeUnusedAllTranslations, removeUnusedForSignelLanguage } = require('./removeUnused'); /** - * @typedef {{ extensions: string[], directories: string[]}} ExtractConfig - * @typedef {ExtractConfig & { verbose?: boolean, removeUnused?: boolean }} ExtractOptions + * @typedef {import('./constants').ExtractConfig & { verbose?: boolean, removeUnused?: boolean }} ExtractOptions */ -/** @type {ExtractConfig} */ -const defaultConfig = { - extensions: ['.js', '.ts', '.svelte'], - directories: ['app', 'packages/web'], -}; - program.name('dbgate-translations-cli').description('CLI tool for managing translation').version('1.0.0'); program .command('extract') .description('Extract translation keys from source files') - .option('-d, --directories ', 'directories to search', defaultConfig.directories) - .option('-e, --extensions ', 'file extensions to process', defaultConfig.extensions) + .option('-d, --directories ', 'directories to search', defaultExtractConfig.directories) + .option('-e, --extensions ', 'file extensions to process', defaultExtractConfig.extensions) .option('-r, --removeUnused', 'Remove unused keys from the output file') .option('-v, --verbose', 'verbose mode') .action(async (/** @type {ExtractOptions} */ options) => { @@ -134,4 +126,24 @@ program } }); +program + .command('remove-unused') + .description('Remove unused keys from the translation files') + .option('-t, --target ', 'language to add missing translations to', ALL_LANGUAGES) + .action(async options => { + try { + const { target } = options; + if (target === ALL_LANGUAGES) { + console.log('Removing unused keys from all languages\n'); + await removeUnusedAllTranslations(); + } else { + await removeUnusedForSignelLanguage(target); + } + } catch (error) { + console.error(error); + console.error('Error during add-missing:', error.message); + process.exit(1); + } + }); + module.exports = { program }; diff --git a/common/translations-cli/removeUnused.js b/common/translations-cli/removeUnused.js new file mode 100644 index 000000000..0894fccea --- /dev/null +++ b/common/translations-cli/removeUnused.js @@ -0,0 +1,46 @@ +// @ts-check +const { defaultExtractConfig } = require('./constants'); +const { extractAllTranslations } = require('./extract'); +const { getLanguageTranslations, getAllLanguages, setLanguageTranslations } = require('./helpers'); + +const { directories, extensions } = defaultExtractConfig; + +/** + * @param {string} language + * @param {Record} source + */ +function getUsedTranslations(language, source) { + const languageTranslations = getLanguageTranslations(language); + + for (const key in languageTranslations) { + if (!(key in source)) { + delete languageTranslations[key]; + } + } + + return languageTranslations; +} + +async function removeUnusedAllTranslations() { + const source = await extractAllTranslations(directories, extensions); + const languages = getAllLanguages(); + + for (const language of languages) { + const newTranslations = getUsedTranslations(language, source); + setLanguageTranslations(language, newTranslations); + } +} + +/** + * @param {string} language + */ +async function removeUnusedForSignelLanguage(language) { + const source = await extractAllTranslations(directories, extensions); + const newTranslations = getUsedTranslations(language, source); + setLanguageTranslations(language, newTranslations); +} + +module.exports = { + removeUnusedAllTranslations, + removeUnusedForSignelLanguage, +}; diff --git a/package.json b/package.json index 4671457a4..c0d33953c 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,8 @@ "workflows": "node common/processWorkflows.js", "cy:open": "cd e2e-tests && yarn cy:open", "translations:extract": "node common/translations-cli/index.js extract", - "translations:add-missing": "node common/translations-cli/index.js add-missing" + "translations:add-missing": "node common/translations-cli/index.js add-missing", + "translations:remove-unused": "node common/translations-cli/index.js remove-unused" }, "dependencies": { "concurrently": "^5.1.0",