script.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* eslint-disable no-eval */
  2. const fs = require('node:fs')
  3. const path = require('node:path')
  4. const transpile = require('typescript').transpile
  5. const targetLanguage = 'en-US'
  6. const data = require('./languages.json')
  7. const languages = data.languages.filter(language => language.supported).map(language => language.value)
  8. async function getKeysFromLanuage(language) {
  9. return new Promise((resolve, reject) => {
  10. const folderPath = path.join(__dirname, language)
  11. let allKeys = []
  12. fs.readdir(folderPath, (err, files) => {
  13. if (err) {
  14. console.error('Error reading folder:', err)
  15. reject(err)
  16. return
  17. }
  18. files.forEach((file) => {
  19. const filePath = path.join(folderPath, file)
  20. const fileName = file.replace(/\.[^/.]+$/, '') // Remove file extension
  21. const camelCaseFileName = fileName.replace(/[-_](.)/g, (_, c) =>
  22. c.toUpperCase(),
  23. ) // Convert to camel case
  24. // console.log(camelCaseFileName)
  25. const content = fs.readFileSync(filePath, 'utf8')
  26. const translation = eval(transpile(content))
  27. const keys = Object.keys(translation)
  28. const nestedKeys = []
  29. const iterateKeys = (obj, prefix = '') => {
  30. for (const key in obj) {
  31. const nestedKey = prefix ? `${prefix}.${key}` : key
  32. nestedKeys.push(nestedKey)
  33. if (typeof obj[key] === 'object')
  34. iterateKeys(obj[key], nestedKey)
  35. }
  36. }
  37. iterateKeys(translation)
  38. allKeys = [...keys, ...nestedKeys].map(
  39. key => `${camelCaseFileName}.${key}`,
  40. )
  41. })
  42. resolve(allKeys)
  43. })
  44. })
  45. }
  46. async function main() {
  47. const compareKeysCount = async () => {
  48. const targetKeys = await getKeysFromLanuage(targetLanguage)
  49. const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanuage(language)))
  50. const keysCount = languagesKeys.map(keys => keys.length)
  51. const targetKeysCount = targetKeys.length
  52. const comparison = languages.reduce((result, language, index) => {
  53. const languageKeysCount = keysCount[index]
  54. const difference = targetKeysCount - languageKeysCount
  55. result[language] = difference
  56. return result
  57. }, {})
  58. console.log(comparison)
  59. // Print missing keys
  60. languages.forEach((language, index) => {
  61. const missingKeys = targetKeys.filter(key => !languagesKeys[index].includes(key))
  62. console.log(`Missing keys in ${language}:`, missingKeys)
  63. })
  64. }
  65. compareKeysCount()
  66. }
  67. main()