From 7ec5413c0e71300814350164c69e6452136bd4cd Mon Sep 17 00:00:00 2001 From: Rémy Raes Date: Thu, 6 Apr 2023 00:28:09 +0200 Subject: Add CI logic for finding missing translations (#608) * build: add script to get missing keys per language * fix: typo * fix: check arguments before launching script * feat: script can be run with language argument * docs: add readme * fix: remove multiple spaces while searching for translations * build: add translations check CI * refactor: put translation job alongside encoding job * feat: add unicode characters because why not * build: exit with an error code if some translations are missing * build: exit using process.exit * feat: CI should continue running with missing translations * build: use actions/checkout v3 * refactor: put build directory into .github directory --- .github/build/find-missing-translations.js | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/build/find-missing-translations.js (limited to '.github/build/find-missing-translations.js') diff --git a/.github/build/find-missing-translations.js b/.github/build/find-missing-translations.js new file mode 100644 index 000000000..3f6c6c995 --- /dev/null +++ b/.github/build/find-missing-translations.js @@ -0,0 +1,66 @@ +const fs = require('fs'); +const { exit } = require('process'); +const langPath = "Northstar.Client/mod/resource"; +const knownLanguages = ['english', 'french', 'german', 'italian', 'japanese', 'mspanish', 'portuguese', 'russian', 'spanish', 'tchinese']; + + +// Proceed checks before launch +if (![2,3].includes(process.argv.length)) { + console.error('Wrong number of arguments, either call this script with no argument, or with a language.'); + return; +} +const inputLang = process.argv[2]; +if (process.argv.length === 3 && !knownLanguages.includes(inputLang)) { + console.error(`"${inputLang}" is not a valid language.\nValid languages are: ${knownLanguages}`); + return; +} + + +// Get language files names +const langs = fs.readdirSync(langPath) + .filter(lang => lang.indexOf('northstar_client_localisation_') !== -1); + + +function getLanguageKeys (lang) { + if (knownLanguages.indexOf(lang) === -1) return; + return fs.readFileSync(`${langPath}/northstar_client_localisation_${lang}.txt`, {encoding:'utf16le', flag:'r'}) + .split('\n') + .filter(line => line.length !== 0) // remove empty lines + .map(line => line.replaceAll(/\s+/g, ' ').trim()) // remove multiple spaces + .map(line => line.replaceAll('\t', '')) // remove tabs characters + + // keep only lines with translation keys + .filter(line => { + const words = line.split('" "'); + return words.length === 2 && words[1] !== 'english"' + }) + .map(line => line.split('" "')[0].substring(1)); // only keep translation keys (throw values) +} + +// We use english keys as reference for other languages +const englishKeys = getLanguageKeys('english'); +const inputLanguages = inputLang !== undefined ? ["", inputLang] : [...knownLanguages]; +inputLanguages.shift(); + +// Check for each language if there are missing keys +var missingKeysCount = 0; + +for (const language of inputLanguages) { + const languageKeys = getLanguageKeys(language); + const missingKeys = [...englishKeys] // clone + .filter(key => languageKeys.indexOf(key) === -1); + const missingKeysLength = missingKeys.length; + console.log( + missingKeysLength === 0 + ? `✔️ "${language}" doesn't have missing keys.` + : `❌ "${language}" has ${missingKeys.length} missing key${missingKeys.length === 1 ? '' : 's'}:` + ); + + if (missingKeysLength !== 0) { + console.log(missingKeys); + missingKeysCount += missingKeys.length; + } +} + +process.exitCode = missingKeysCount; +exit(); -- cgit v1.2.3