Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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