Skip to content

Commit

Permalink
Feat/add script to check i18n keys (#2835)
Browse files Browse the repository at this point in the history
  • Loading branch information
crazywoola authored Mar 14, 2024
1 parent 4d63770 commit af98954
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 1 deletion.
77 changes: 77 additions & 0 deletions web/i18n/script.js
Original file line number Diff line number Diff line change
@@ -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()
3 changes: 2 additions & 1 deletion web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit af98954

Please sign in to comment.