script.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 languages = ['zh-Hans', 'fr-FR', 'ja-JP', 'pt-BR', 'uk-UA', 'vi-VN']
  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. const translation = eval(transpile(content))
  26. const keys = Object.keys(translation)
  27. const nestedKeys = []
  28. const iterateKeys = (obj, prefix = '') => {
  29. for (const key in obj) {
  30. const nestedKey = prefix ? `${prefix}.${key}` : key
  31. nestedKeys.push(nestedKey)
  32. if (typeof obj[key] === 'object')
  33. iterateKeys(obj[key], nestedKey)
  34. }
  35. }
  36. iterateKeys(translation)
  37. allKeys = [...keys, ...nestedKeys].map(
  38. key => `${camelCaseFileName}.${key}`,
  39. )
  40. })
  41. resolve(allKeys)
  42. })
  43. })
  44. }
  45. async function main() {
  46. const compareKeysCount = async () => {
  47. const targetKeys = await getKeysFromLanuage(targetLanguage)
  48. const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanuage(language)))
  49. const keysCount = languagesKeys.map(keys => keys.length)
  50. const targetKeysCount = targetKeys.length
  51. const comparison = languages.reduce((result, language, index) => {
  52. const languageKeysCount = keysCount[index]
  53. const difference = targetKeysCount - languageKeysCount
  54. result[language] = difference
  55. return result
  56. }, {})
  57. console.log(comparison)
  58. // Print missing keys
  59. languages.forEach((language, index) => {
  60. const missingKeys = targetKeys.filter(key => !languagesKeys[index].includes(key))
  61. console.log(`Missing keys in ${language}:`, missingKeys)
  62. })
  63. }
  64. compareKeysCount()
  65. }
  66. main()