• 项目中根据excel文件生成json多语言文件


    首先安装依赖
    pnpm install xlsx file-saver
    
    创建translate.js文件
    /* eslint-disable no-useless-escape */
    /* eslint-disable no-control-regex */
    import fs from 'node:fs'
    import path from 'node:path'
    
    import * as XLSX from 'xlsx'
    
    export default function useParseLang() {
      const filePath = process.argv[2]
      if (!filePath) {
        console.error('文件不存在')
        return
      }
      const inputPath = path.resolve(filePath)
      console.log('翻译文件', inputPath)
      fs.readFile(inputPath, 'binary', (err, data) => {
        if (err) {
          throw new Error(err)
        }
        const workBook = XLSX.read(data, { type: 'binary', cellDates: true })
        // const reg = /([^\x00-\xff])|([\?\.\(\)\$\:\u00A0\s,'-])|[0-9]/g // 去除key中的特殊字符数字,所有全角符号和部分半角符号
        const reg = /[\s\u00A0]+/g // 匹配一个或多个连续的空格字符或非断空格
        workBook.SheetNames.forEach(name => {
          const workSheet = workBook.Sheets[name]
          console.log('workSheet: ', workSheet)
          const rawList = XLSX.utils.sheet_to_json(workSheet, { header: 1 })
          const enObj = {}
          const zhObj = {}
          const zhPath = path.join(
            process.cwd(),
            `/src/locales/lang/zh-CN/${name}.json`
          )
          const enPath = path.join(
            process.cwd(),
            `/src/locales/lang/en-US/${name}.json`
          )
          // if (name === 'common') {
          //   zhPath = path.join(
          //     process.cwd(),
          //     `/packages/website/lang/zh-CN/website.json`
          //   )
          //   enPath = path.join(
          //     process.cwd(),
          //     `/packages/website/lang/en/website.json`
          //   )
          // } else {
          // }
          rawList.forEach(item => {
            const valueArr = item.slice(item.length - 2)
            const keyArr = item.slice(0, item.length - 2)
            const parseKeyArr = keyArr
              .map(key => {
                const tem = key.charAt(0).toLowerCase() + key.slice(1)
                return tem.replaceAll(reg, '')
              })
              .filter(Boolean)
            parseKeyArr.unshift(name)
            // const keyResult = name + '.' + parseKeyArr.join('.')
            const keyResult = parseKeyArr.join('.')
            zhObj[keyResult] = valueArr[0]
            enObj[keyResult] = valueArr[1]
            console.log('zhObj: ', zhObj, enObj)
          })
    
          fs.writeFileSync(zhPath, JSON.stringify(zhObj, null, 2))
          fs.writeFileSync(enPath, JSON.stringify(enObj, null, 2))
        })
      })
    }
    
    useParseLang()
    
    
    local/index.ts
    import { createI18n } from 'vue-i18n'
    
    import { storage } from '@/utils/sessionStorage'
    
    const supportedLanguages: Language[] = ['zh-CN', 'en-US']
    function generateI18nMessages() {
      const messages: { [key in Language]?: Record<string, any> } = {}
      const modules = import.meta.glob(`./lang/**/*.json`, {
        eager: true,
        import: 'default'
      })
      //1. 遍历所有文件,获取语言代码,采用平铺的方式
      Object.keys(modules).forEach(key => {
        const moduleMessages = modules[key] as any
        const [lang, _] = key.replace('./lang/', '').replace('.json', '').split('/')
        console.log(_)
        if (!messages[lang]) {
          messages[lang] = {}
        }
        for (const key2 in moduleMessages) {
          messages[lang][key2] = moduleMessages[key2]
        }
      })
      // 2.处理的是en-US下有多文件层级的情况
      // function getMsg(obj, arr: string[]) {
      //   if (!arr.length) {
      //     return
      //   }
      //   const item = arr.shift()!
      //   console.log('item: ', item)
      //   let next = arr.length === 0 ? moduleMessages : {}
      //   if (obj[item]) {
      //     next = obj[item]
      //   }
      //   obj[item] = next
      //   getMsg(next, arr)
      // }
      // getMsg(messages, arr)
      return messages
    }
    const getCurrentLanguage = () => {
      //设置
      const navLang = navigator.language //系统语言
      console.log('navLang: ', navigator, navLang)
      const storageLang = storage.get('lang') //本地存储
      console.log('storageLang: ', storageLang)
      const localLang = navLang.indexOf('zh') !== -1 ? 'zh-CN' : 'en-US' || 'zh'
      let langCode = 'zh-CN'
      if (storageLang) {
        langCode = storageLang?.indexOf('zh') !== -1 ? 'zh-CN' : 'en-US'
      } else {
        langCode = localLang
      }
      storage.set('lang', langCode)
      return langCode
    }
    
    const i18n = createI18n({
      legacy: false, // 如果要支持compositionAPI,此项必须设置为false;
      // globalInjection: true, // 全局注册$t方法
      locale: getCurrentLanguage(),
      fallbackLocale: supportedLanguages[0],
      availableLocales: supportedLanguages,
      messages: generateI18nMessages()
    })
    
    export default i18n
    
    
    执行node命令
    node src/config/translate.mjs./src/config/admin.xlsx'
    
  • 相关阅读:
    JAVA8 - java.util.function.Predicate
    Scala函数柯里化(Currying)
    面试精选:3、史上最详细的Linux精选面试题(二)
    go 反射
    MySQL模块---查询和插入数据
    这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
    Crypto(1) 攻防世界Caesar
    C#基础进阶
    使用C#编写.NET分析器-第二部分
    供应链安全体系建设方案
  • 原文地址:https://blog.csdn.net/weCat_s/article/details/139746921