From d62bfb8fdee73871e598ba4b39fd866912190904 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 14:55:29 +0200 Subject: [PATCH] add script to compare language files --- .../devops/localization/compare-languages.js | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/devops/localization/compare-languages.js diff --git a/src/Umbraco.Web.UI.Client/devops/localization/compare-languages.js b/src/Umbraco.Web.UI.Client/devops/localization/compare-languages.js new file mode 100644 index 0000000000..9a532f300f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/devops/localization/compare-languages.js @@ -0,0 +1,66 @@ +/** + * This script is used to compare the keys in the localization files. It will take a main language (en.js) and compare with the other languages. + * The script will output the keys that are missing in the other languages and the keys that are missing in the main language. + * + * Note: Since the source files are TypeScript files, the script will only compare on the dist-cms files. + * + * Usage: node devops/localization/compare-languages.js [filter] + * Example: node devops/localization/compare-languages.js da-dk.js + * + * Copyright (c) 2024 by Umbraco HQ + */ + +import fs from 'fs'; +import path from 'path'; + +const mainLanguage = 'en.js'; +const __dirname = import.meta.dirname; +const languageFolder = path.join(__dirname, '../../dist-cms/assets/lang'); + +// Check that the languageFolder exists +if (!fs.existsSync(languageFolder)) { + console.error(`The language folder does not exist: ${languageFolder}. You need to build the project first by running 'npm run build'`); + process.exit(1); +} + +const mainKeys = (await import(path.join(languageFolder, mainLanguage))).default; +const mainMap = buildMap(mainKeys); + +const filter = process.argv[2]; +if (filter) { + console.log(`Filtering on: ${filter}`); +} + +const languages = fs.readdirSync(languageFolder).filter((file) => file !== mainLanguage && file.endsWith('.js') && (!filter || file.includes(filter))); +const missingKeysInMain = []; + +const languagePromise = Promise.all(languages.map(async (language) => { + const languageKeys = (await import(path.join(languageFolder, language))).default; + const languageMap = buildMap(languageKeys); + + const missingKeys = Array.from(mainMap.keys()).filter((key) => !languageMap.has(key)); + let localMissingKeysInMain = Array.from(languageMap.keys()).filter((key) => !mainMap.has(key)); + localMissingKeysInMain = localMissingKeysInMain.map((key) => `${key} (${language})`); + missingKeysInMain.push(...localMissingKeysInMain); + + console.log(`\n${language}:`); + console.log(`Missing keys in ${language}:`); + console.log(missingKeys); +})); + +await languagePromise; + +console.log(`Missing keys in ${mainLanguage}:`); +console.log(missingKeysInMain); + +function buildMap(keys) { + const map = new Map(); + + for (const key in keys) { + for (const subKey in keys[key]) { + map.set(`${key}_${subKey}`, keys[key][subKey]); + } + } + + return map; +}