juice-shop

Форк
0
/
languages.ts 
74 строки · 3.1 Кб
1
/*
2
 * Copyright (c) 2014-2024 Bjoern Kimminich & the OWASP Juice Shop contributors.
3
 * SPDX-License-Identifier: MIT
4
 */
5

6
import locales from '../data/static/locales.json'
7
import fs = require('fs')
8
import { type Request, type Response, type NextFunction } from 'express'
9

10
module.exports = function getLanguageList () { // TODO Refactor and extend to also load backend translations from /i18n/*json and calculate joint percentage/gauge
11
  return (req: Request, res: Response, next: NextFunction) => {
12
    const languages: Array<{ key: string, lang: any, icons: string[], shortKey: string, percentage: unknown, gauge: string }> = []
13
    let count = 0
14
    let enContent: any
15

16
    fs.readFile('frontend/dist/frontend/assets/i18n/en.json', 'utf-8', (err, content) => {
17
      if (err != null) {
18
        next(new Error(`Unable to retrieve en.json language file: ${err.message}`))
19
      }
20
      enContent = JSON.parse(content)
21
      fs.readdir('frontend/dist/frontend/assets/i18n/', (err, languageFiles) => {
22
        if (err != null) {
23
          next(new Error(`Unable to read i18n directory: ${err.message}`))
24
        }
25
        languageFiles.forEach((fileName) => {
26
          // eslint-disable-next-line @typescript-eslint/no-misused-promises
27
          fs.readFile('frontend/dist/frontend/assets/i18n/' + fileName, 'utf-8', async (err, content) => {
28
            if (err != null) {
29
              next(new Error(`Unable to retrieve ${fileName} language file: ${err.message}`))
30
            }
31
            const fileContent = JSON.parse(content)
32
            const percentage = await calcPercentage(fileContent, enContent)
33
            const key = fileName.substring(0, fileName.indexOf('.'))
34
            const locale = locales.find((l) => l.key === key)
35
            const lang: any = {
36
              key,
37
              lang: fileContent.LANGUAGE,
38
              icons: locale?.icons,
39
              shortKey: locale?.shortKey,
40
              percentage,
41
              gauge: (percentage > 90 ? 'full' : (percentage > 70 ? 'three-quarters' : (percentage > 50 ? 'half' : (percentage > 30 ? 'quarter' : 'empty'))))
42
            }
43
            if (!(fileName === 'en.json' || fileName === 'tlh_AA.json')) {
44
              languages.push(lang)
45
            }
46
            count++
47
            if (count === languageFiles.length) {
48
              languages.push({ key: 'en', icons: ['gb', 'us'], shortKey: 'EN', lang: 'English', percentage: 100, gauge: 'full' })
49
              languages.sort((a, b) => a.lang.localeCompare(b.lang))
50
              res.status(200).json(languages)
51
            }
52
          })
53
        })
54
      })
55
    })
56

57
    async function calcPercentage (fileContent: any, enContent: any): Promise<number> {
58
      const totalStrings = Object.keys(enContent).length
59
      let differentStrings = 0
60
      return await new Promise((resolve, reject) => {
61
        try {
62
          for (const key in fileContent) {
63
            if (Object.prototype.hasOwnProperty.call(fileContent, key) && fileContent[key] !== enContent[key]) {
64
              differentStrings++
65
            }
66
          }
67
          resolve((differentStrings / totalStrings) * 100)
68
        } catch (err) {
69
          reject(err)
70
        }
71
      })
72
    }
73
  }
74
}
75

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.