From af98954fc19b3f6eea4ebe19e8a0f99cdc38c2b0 Mon Sep 17 00:00:00 2001 From: crazywoola <100913391+crazywoola@users.noreply.github.com> Date: Thu, 14 Mar 2024 18:03:59 +0800 Subject: [PATCH] Feat/add script to check i18n keys (#2835) --- web/i18n/script.js | 77 ++++++++++++++++++++++++++++++++++++++++++++++ web/package.json | 3 +- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 web/i18n/script.js diff --git a/web/i18n/script.js b/web/i18n/script.js new file mode 100644 index 00000000000000..e6f1853c839011 --- /dev/null +++ b/web/i18n/script.js @@ -0,0 +1,77 @@ +/* eslint-disable no-eval */ +const fs = require('node:fs') +const path = require('node:path') +const transpile = require('typescript').transpile + +const targetLanguage = 'en-US' +const languages = ['zh-Hans', 'fr-FR', 'ja-JP', 'pt-BR', 'uk-UA', 'vi-VN'] + +async function getKeysFromLanuage(language) { + return new Promise((resolve, reject) => { + const folderPath = path.join(__dirname, language) + let allKeys = [] + fs.readdir(folderPath, (err, files) => { + if (err) { + console.error('Error reading folder:', err) + reject(err) + return + } + + files.forEach((file) => { + const filePath = path.join(folderPath, file) + const fileName = file.replace(/\.[^/.]+$/, '') // Remove file extension + const camelCaseFileName = fileName.replace(/[-_](.)/g, (_, c) => + c.toUpperCase(), + ) // Convert to camel case + // console.log(camelCaseFileName) + const content = fs.readFileSync(filePath, 'utf8') + const translation = eval(transpile(content)) + const keys = Object.keys(translation) + const nestedKeys = [] + const iterateKeys = (obj, prefix = '') => { + for (const key in obj) { + const nestedKey = prefix ? `${prefix}.${key}` : key + nestedKeys.push(nestedKey) + if (typeof obj[key] === 'object') + iterateKeys(obj[key], nestedKey) + } + } + iterateKeys(translation) + + allKeys = [...keys, ...nestedKeys].map( + key => `${camelCaseFileName}.${key}`, + ) + }) + resolve(allKeys) + }) + }) +} + +async function main() { + const compareKeysCount = async () => { + const targetKeys = await getKeysFromLanuage(targetLanguage) + const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanuage(language))) + + const keysCount = languagesKeys.map(keys => keys.length) + const targetKeysCount = targetKeys.length + + const comparison = languages.reduce((result, language, index) => { + const languageKeysCount = keysCount[index] + const difference = targetKeysCount - languageKeysCount + result[language] = difference + return result + }, {}) + + console.log(comparison) + + // Print missing keys + languages.forEach((language, index) => { + const missingKeys = targetKeys.filter(key => !languagesKeys[index].includes(key)) + console.log(`Missing keys in ${language}:`, missingKeys) + }) + } + + compareKeysCount() +} + +main() diff --git a/web/package.json b/web/package.json index 1ef344645a3f80..fc466f42b3009f 100644 --- a/web/package.json +++ b/web/package.json @@ -11,7 +11,8 @@ "eslint-fix": "eslint --fix", "prepare": "cd ../ && node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky install ./web/.husky", "gen-icons": "node ./app/components/base/icons/script.js", - "uglify-embed": "node ./bin/uglify-embed" + "uglify-embed": "node ./bin/uglify-embed", + "check-i18n": "node ./i18n/script.js" }, "dependencies": { "@babel/runtime": "^7.22.3",