Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

check-i18n.js 2.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. // eslint-disable-next-line sonarjs/code-eval
  27. const translationObj = eval(transpile(content))
  28. // console.log(translation)
  29. if(!translationObj || typeof translationObj !== 'object') {
  30. console.error(`Error parsing file: ${filePath}`)
  31. reject(new Error(`Error parsing file: ${filePath}`))
  32. return
  33. }
  34. const keys = Object.keys(translationObj)
  35. const nestedKeys = []
  36. const iterateKeys = (obj, prefix = '') => {
  37. for (const key in obj) {
  38. const nestedKey = prefix ? `${prefix}.${key}` : key
  39. nestedKeys.push(nestedKey)
  40. if (typeof obj[key] === 'object')
  41. iterateKeys(obj[key], nestedKey)
  42. }
  43. }
  44. iterateKeys(translationObj)
  45. allKeys = [...keys, ...nestedKeys].map(
  46. key => `${camelCaseFileName}.${key}`,
  47. )
  48. })
  49. resolve(allKeys)
  50. })
  51. })
  52. }
  53. async function main() {
  54. const compareKeysCount = async () => {
  55. const targetKeys = await getKeysFromLanuage(targetLanguage)
  56. const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanuage(language)))
  57. const keysCount = languagesKeys.map(keys => keys.length)
  58. const targetKeysCount = targetKeys.length
  59. const comparison = languages.reduce((result, language, index) => {
  60. const languageKeysCount = keysCount[index]
  61. const difference = targetKeysCount - languageKeysCount
  62. result[language] = difference
  63. return result
  64. }, {})
  65. console.log(comparison)
  66. // Print missing keys
  67. languages.forEach((language, index) => {
  68. const missingKeys = targetKeys.filter(key => !languagesKeys[index].includes(key))
  69. console.log(`Missing keys in ${language}:`, missingKeys)
  70. })
  71. }
  72. compareKeysCount()
  73. }
  74. main()