vue中自定义设置多语言(包括使用vue-i18n),并且运行js脚本自动生成多语言文件

news2024/11/17 20:49:08

在项目中需要进行多个国家语言的切换时,可以用到下面方法其中一个

一、自定义设置多语言

方法一:

可以自己编写一个设置多语言文件

在项目新建js文件,命名为:language.js,代码如下

// language.js 文档
let languagePage = {
  CN: {
    frame_rules: "规则",
    frame_remark: "虚位拟待",
  },
  EN: {
    frame_rules: "Rules",
    frame_remark: "Vacant position",
  },
  IN: {
    frame_rules: "Aturan",
    frame_remark: "Posisi Kosong",
  },
  VI: {
    frame_rules: "Quy tắc",
    frame_remark: "Vị trí Trống",
  },
  MS: {
    frame_rules: "Peraturan",
    frame_remark: "Jawatan Kosong",
  },
  TH: {
    frame_rules: "กฎ",
    frame_remark: "ตำแหน่งว่าง",
  },
  HI: {
    frame_rules: "กฎ",
    frame_remark: "खाली पद",
  },
};
export const getLangue = () => {
  // 获取我们设置存放在浏览器的localStorage 的语言类型
  let { language } =
    JSON.parse(window.localStorage.getItem("userInfo")) || {};
  // if (language == "ar") {
  //   // 阿拉伯语 展示顺序会相反,设置反向,使语言展示正常
  //   document.documentElement.setAttribute("dir", "rtl");
  //   // document.getElementById("app") &&
  //   //   document.getElementById("app").classList.add("ar");
  // }

  // zh  中文
  // en 英文
  // in  印尼
  // vi  越南
  // ms 马拉西亚
  // th  泰语
  // hi  印度语
  // ar 阿拉伯语

  let list = {
    in: "IN",
    id: "IN",
    zh: "CN",
    ms: "MS",
    vi: "VI",
    th: "TH",
    hi: "HI",
  };
  //假设能读取到浏览器设置的语言,就使用该语言 ,假设没有设置到浏览器任何语言类型,就默认使用英文
  if (list[language]) return languagePage[list[language]];
  return languagePage.EN;
};

在组件中使用多语言:

<template>
  <div>
    <!-- 使用多语言 -->
    <div>{{ language.frame_rules }}</div>
  </div>
</template>
<script>
// 在需要的组件引入多语言文件
import { getLangue } from "@/utils/language.js";

export default {
  data() {
    return {
      language: getLangue(), //赋值多语言
    };
  },
  mounted() {},
  computed: {},
  methods: {},
};
</script>
<style lang="scss" scoped></style>

设置类型语言 :

你可以在app.vue的生命周期设置

//vue的生命周期mounted设置语言为中文
mounted() {
    const langType = JSON.stringify({ language: "zh" });
    window.localStorage.setItem("userInfo", langType);
},

当然,你可以写选择器,让用户选择对应的语言,然后强制刷新浏览器后便生效了

 const langType = JSON.stringify({ language: "zh" });
 window.localStorage.setItem("userInfo", langType);
 window.location.reload(); //设置完语言后 强制刷新浏览器才生效

方法二:使用使用vue-i18n 库,提示,下面展示是vue3中使用为例子

官方文档介绍:介绍 | Vue I18n

使用npm导入vue-i18n

npm i vue-i18n@next  --save

1、创建i18n所需文件夹(这里最好放置src下)

在src下建文件夹lang,在文件夹下新建文档 en.ts 和zh.ts 文档里面内容如下

en.ts文档:

// en.js文档

//键值命名一定要和zh.ts 一一对应 ,键值的写法可用双引号,例如:"OP_check",也可不用。例如:home

// 英文
const en = {
  "OP_check": "CHECK",
  home: "Home",
};
export default en;

zh.ts文档:

// zh.js文档

// 中文
const zh = {
  "OP_check": "查看",
  home: "主页",
};
export default zh;

2.在文件夹lang新建文档 命名 index.ts

index.ts文档:

import en from "./en"; // 英文
import zh from "./zh"; // 中文

//导出所有翻译内容
export default {
  en,
  zh,
};

3、在文件夹lang新建文档 命名 i18n.ts

i18n.ts文档

import { createApp } from "vue";
//这里注意引入的App.vue文件路径,确保文件成功被引进来
import App from "../App.vue";

import { createI18n } from "vue-i18n";
import messages from "./index";

const app = createApp(App);
const language = (navigator.language || "en").toLocaleLowerCase(); // 这是获取浏览器的语言

if (!localStorage.getItem("lang")) {
  localStorage.setItem("lang", "en"); //设置默认语言为英文
}

const i18n = createI18n({
  legacy: false, //处理报错Uncaught (in promise) SyntaxError: Not available in legacy mode (at message-compiler.esm-bundler.js:54:19)
  locale: localStorage.getItem("lang") || language.split("-")[0] || "en", //注意locale属性! 首先从缓存里拿,没有的话就用浏览器语言,
  fallbackLocale: "en", // 设置备用语言
  messages,
});

export default function (app: any) {
  app.use(i18n);
}

4、在vue的mian文件,全局注入多语言

主要代码如下;

import i18n from "@/lang/i18n"; //导入多语言

app.use(i18n); //全局注入多语言

5、在项目中使用多语言

在dom元素上直接使用vue-i18n如下

<template>
  <!-- 在 dom中使用vue-i18n-->
  <div>{{ $t("home") }}</div>
</template>

在<script>脚本中使用vue-i18n如下

<template>
  <!-- 在 dom中使用vue-i18n-->
  <div>{{ $t("home") }}</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { useI18n } from "vue-i18n"; //引入vue-i18n
const { t } = useI18n(); // 使用多语言关键字 t ——> vue-i18内置关键字,不可改写名字
const title = ref(t("OP_check"));  //在js代码中使用vue-i18n 这里的title === "CHECK"
</script>
<style scoped lang="scss"></style>

6、使用vue-i18n设置语言

<template>
  <!-- 在 dom中使用vue-i18n-->
  <div>{{ $t("home") }}</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { useI18n } from "vue-i18n"; //引入vue-i18n
const { locale } = useI18n(); // 使用多语言关键字 locale ——> vue-i18内置关键字,不可改写名字
const changLanguage = (e: any) => {
// 设置语言,其中locale是vue-i18内置设置语言的固定方法;改变locale的值就是改变语言类型了
  if (Number(e) === 1) {
    locale.value = "en";
    localStorage.setItem("lang", "en");
  } else {
    locale.value = "zh";
    localStorage.setItem("lang", "zh");
  }
  window.location.reload(); // 设置语言完成后,强制刷新浏览器,效果更换好
};
</script>
<style scoped lang="scss"></style>

上面设置多语言需要一个个复制粘贴进去,在开发工作的过程中很麻烦,是非常浪费时间的无脑操作,下面我们通过脚本,自动生成多语言文档,

二、运行js脚本自动生成多语言文件

1、在src同级目录下,新建目录命名 tools 

2.在tools 下新建文件夹 命名lang

3、在lang文件夹下,新建文档 命名:package-lock.json

package-lock.json文档代码如下

{
  "name": "app",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@babel/runtime": {
      "version": "7.24.7",
      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
      "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
      "requires": {
        "regenerator-runtime": "^0.14.0"
      }
    },
    "adler-32": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
      "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
      "requires": {
        "exit-on-epipe": "~1.0.1",
        "printj": "~1.1.0"
      }
    },
    "babel-plugin-transform-remove-console": {
      "version": "6.9.4",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
      "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==",
      "dev": true
    },
    "buffer-from": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
    },
    "cfb": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
      "requires": {
        "adler-32": "~1.3.0",
        "crc-32": "~1.2.0"
      },
      "dependencies": {
        "adler-32": {
          "version": "1.3.1",
          "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
          "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
        }
      }
    },
    "codepage": {
      "version": "1.15.0",
      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
    },
    "crc-32": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
    },
    "exit-on-epipe": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
    },
    "frac": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
    },
    "minimist": {
      "version": "1.2.8",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
    },
    "node-xlsx": {
      "version": "0.17.2",
      "resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.17.2.tgz",
      "integrity": "sha512-j92dGS8KvGPi6YpYovHrR9zWiyDONx7DiGhl1SjM+vzxAh3do6hmerFCyN+hRuK7QhwHdwzfpYxZm+hKA/uErA==",
      "requires": {
        "@babel/runtime": "^7.15.4",
        "buffer-from": "^1.1.2",
        "xlsx": "^0.17.2"
      }
    },
    "printj": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
    },
    "regenerator-runtime": {
      "version": "0.14.1",
      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
    },
    "ssf": {
      "version": "0.11.2",
      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
      "requires": {
        "frac": "~1.1.2"
      }
    },
    "wmf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
    },
    "word": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
    },
    "xlsx": {
      "version": "0.17.5",
      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.5.tgz",
      "integrity": "sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==",
      "requires": {
        "adler-32": "~1.2.0",
        "cfb": "^1.1.4",
        "codepage": "~1.15.0",
        "crc-32": "~1.2.0",
        "ssf": "~0.11.2",
        "wmf": "~1.0.1",
        "word": "~0.3.0"
      }
    }
  }
}

4、在lang文件夹下,新建文档 命名:package.json

package.json文档代码如下

{
  "name": "app",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@babel/runtime": {
      "version": "7.24.7",
      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
      "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
      "requires": {
        "regenerator-runtime": "^0.14.0"
      }
    },
    "adler-32": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
      "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
      "requires": {
        "exit-on-epipe": "~1.0.1",
        "printj": "~1.1.0"
      }
    },
    "babel-plugin-transform-remove-console": {
      "version": "6.9.4",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
      "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==",
      "dev": true
    },
    "buffer-from": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
    },
    "cfb": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
      "requires": {
        "adler-32": "~1.3.0",
        "crc-32": "~1.2.0"
      },
      "dependencies": {
        "adler-32": {
          "version": "1.3.1",
          "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
          "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
        }
      }
    },
    "codepage": {
      "version": "1.15.0",
      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
    },
    "crc-32": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
    },
    "exit-on-epipe": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
    },
    "frac": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
    },
    "minimist": {
      "version": "1.2.8",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
    },
    "node-xlsx": {
      "version": "0.17.2",
      "resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.17.2.tgz",
      "integrity": "sha512-j92dGS8KvGPi6YpYovHrR9zWiyDONx7DiGhl1SjM+vzxAh3do6hmerFCyN+hRuK7QhwHdwzfpYxZm+hKA/uErA==",
      "requires": {
        "@babel/runtime": "^7.15.4",
        "buffer-from": "^1.1.2",
        "xlsx": "^0.17.2"
      }
    },
    "printj": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
    },
    "regenerator-runtime": {
      "version": "0.14.1",
      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
    },
    "ssf": {
      "version": "0.11.2",
      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
      "requires": {
        "frac": "~1.1.2"
      }
    },
    "wmf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
    },
    "word": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
    },
    "xlsx": {
      "version": "0.17.5",
      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.5.tgz",
      "integrity": "sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==",
      "requires": {
        "adler-32": "~1.2.0",
        "cfb": "^1.1.4",
        "codepage": "~1.15.0",
        "crc-32": "~1.2.0",
        "ssf": "~0.11.2",
        "wmf": "~1.0.1",
        "word": "~0.3.0"
      }
    }
  }
}

5、在lang文件夹下,新建文档 命名:app.js

app.js文档代码如下

import { createRequire } from "module";

const require = createRequire(import.meta.url);
var path = require("path");
var fs = require("fs");
var xlsx = require("node-xlsx").default;
const TABLE_KEY = "lang_key";
var _OutputPath = "../../src/lang/";

function isExits(path) {
  try {
    fs.statSync(path);
    return true;
  } catch (e) {
    return false;
  }
}

function loopSheet(data) {
  if (data) {
    let _myData = {};
    let _myIndex = {};
    //解析表头
    while (data.length > 0) {
      const _rData = data.shift();
      if (_rData.length > 0) {
        if (_rData[0] == TABLE_KEY) {
          let len = _rData.length > 4 ? 4 : _rData.length; // 这里数字表示要生产几个文件, 3表示生产两种多语言,假设4,便是生产3种多语言
          for (let index = 1; index < len; index++) {
            const element = _rData[index];
            _myData[element] = {};
            _myIndex[element] = index;
          }
          break;
        }
      }
    }
    console.log("====================================");
    console.log("语言结构:", _myIndex);
    console.log("语言结构:", _myData);
    console.log("====================================");
    let _keys1 = Object.keys(_myData);
    let _keys2 = Object.keys(_myIndex);
    //确保结构是对称的
    if (
      _keys1.length > 0 &&
      _keys2.length > 0 &&
      _keys1.length == _keys2.length
    ) {
      //TODO:做数据的遍历、存储到需要的位置
      for (let row = 0; row < data.length; row++) {
        const _rData = data[row];
        for (const key in _myIndex) {
          if (_myIndex.hasOwnProperty(key)) {
            const _keyIndex = _myIndex[key];
            _myData[key][_rData[0]] = _rData[_keyIndex];
          }
        }
      }
    }
    console.log("====================================");
    console.log("数据汇总:", _myData);
    console.log("====================================");

    //写出文件
    for (const key in _myData) {
      if (_myData.hasOwnProperty(key)) {
        const _sheetData = _myData[key];
        let _file = _OutputPath + key + ".ts";
        let str =
          "const " +
          key +
          " = " +
          JSON.stringify(_sheetData, null, "\t") +
          ";\n";
        str += "export default " + key + ";";

        fs.writeFile(_file, str, function (err) {
          if (err) {
            res.status(500).send("Server is error...");
          }
        });
      }
    }
  }
}

function parse(path) {
  let _isFile = isExits(path);
  if (_isFile) {
    // var arr = path.split("/");
    // delete arr[arr.length - 1];
    // _OutputPath = arr.join("/");
    console.log("====================================");
    console.log("_OutputPath:", _OutputPath);
    console.log("====================================");
    const workSheetsFromFile = xlsx.parse(path);
    if (workSheetsFromFile) {
      for (let index = 0; index < workSheetsFromFile.length; index++) {
        const sheet = workSheetsFromFile[index];
        console.log("====================================");
        console.log(sheet.name);
        console.log("====================================");
        loopSheet(sheet.data);
      }
    } else {
      console.log("====================================");
      console.log("文件出错!");
      console.log("====================================");
    }
  } else {
    console.log("====================================");
    console.log("文件不存在!");
    console.log("====================================");
  }
}

parse(process.argv[2]);

6、确认在src目录下有一个文件夹名字为lang 如下图

没有就必须创建文件夹名字为lang

7、使用xlsx表格导出多语言文档

xlsx表格也必须放在tools的lang目录下,xlsx表格名字可以随意命名,这里我命名为:TEXAS_i18n.xlsx

8、TEXAS_i18n.xlsx的书写格式如下,这个格式是不可更改的,需要严格对应

9.运行这个脚本需要安装node 确保电脑已经安装好node, 建议是14版本以上

10,运行脚本,生成多语言,需要在tools的lang目录运行

10.1先运行npm i

npm i

10.2.在运行

node .\app.js .\TEXAS_i18n.xlsx

如图:

11、查看运行结果,你会发现,在src的lang目录下,会生成三个文件

如果需要生成更多,请更改app,js文件个数,其他都不要改动就可

好了,编写完成,有需要请自行查看!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入分析 Android BroadcastReceiver (八)

文章目录 深入分析 Android BroadcastReceiver (八)1. 系统与自定义实现1.1 系统广播机制1.1.1 系统广播的实现原理1.1.2 系统广播的源码分析 1.2 自定义广播机制1.2.1 自定义广播的实现步骤1.2.2 自定义广播的源码分析 2. 广播机制设计的初衷与优势2.1 设计初衷2.2 优势 3. 总…

(七)[重制]C++命名空间与标准模板库(STL)

​ 引言 在专栏C教程的第六篇C中的结构体与联合体中&#xff0c;介绍了C中的结构体和联合体&#xff0c;包括它们的定义、初始化、内存布局和对齐&#xff0c;以及作为函数参数和返回值的应用。在专栏C教程的第七篇中&#xff0c;我们将深入了解C中的命名空间&#xff08;nam…

leetcode判断二分图

判断二分图 图的问题肯定要用到深度优先遍历或者广度优先遍历&#xff0c;但又不是单纯的深度优先遍历算法和广度优先遍历算法&#xff0c;而是需要在遍历的过程中加入与解决题目相关的逻辑。 题干中说了&#xff0c;这个图可能不是连通图&#xff0c;这个提示有什么作用呢&a…

x.java => 字节码文件x.class => 运行

使用javac.exe对.java进行编译&#xff0c;编译成.class字节码文件 使用java.exe启动java虚拟机执行.class字节码 JVM是一个系统进程&#xff0c;这个进程运行会读取.class字节码文件&#xff0c;一旦他抢到了CPU的执行权&#xff0c;就会以那个类的main方法来执行程序逻辑。

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

1119 胖达与盆盆奶

solution 递推&#xff1a;序列的每一位所需要计算的值都可以通过该位左右两侧的结果计算得到&#xff0c;就可以考虑所谓的“左右两侧的结果”是否能通过递推进行预处理来得到&#xff0c;以避免后续使用中的反复求解。 #include<iostream> using namespace std; cons…

Ubuntu 20版本安装Redis教程

第一步 切换到root用户&#xff0c;使用su命令&#xff0c;进行切换。 输入&#xff1a; su - 第二步 使用apt命令来搜索redis的软件包&#xff0c;输入命令&#xff1a;apt search redis 第三步 选择需要的redis版本进行安装&#xff0c;本次选择默认版本&#xff0c;redis5.…

多点mGRE over IPsecVPN 配置及NHRP的使用

一、实验目的及拓扑 1、实验思路&#xff1a;FW1为总部固定IP&#xff0c;FW2和FW3为分支动态地址&#xff0c;通过mGRE over IPsec实现&#xff0c;并加载NHR解决多点隧道目的地址问题 2、网络拓扑 二、基本配置 &#xff08;一&#xff09;配置相关接口地址&#xff0c;并…

项目实战--Spring Boot与PageHelper的集成及线程污染解决

一、PageHelper使用背景 公司要做个简单管理系统&#xff0c;要我搭建Spring BootMyBatisPageHelperRedis的项目框架然后交i给实习生来开发。这个其实很简单&#xff0c;但是遇到搭建和使用过程中PageHelper有好多小坑&#xff0c;就记录一下&#xff0c;避免再踩。 版本选择&…

短视频博主:成都柏煜文化传媒有限公司

短视频博主&#xff1a;数字时代的新星&#xff0c;创意与梦想的舞台 在移动互联网的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为连接亿万用户、展现生活百态的重要窗口。成都柏煜文化传媒有限公司 而在这片充满无限可能的土地上&#xff0c;短视频博主…

【Python机器学习】处理文本数据——多个单词的词袋(n元分词)

使用词袋表示的主要缺点之一就是完全舍弃了单词顺序。因此“its bad&#xff0c;not good at all”和“its good&#xff0c;not bad at all”这两个字符串的词袋表示完全相同&#xff0c;尽管它们的含义相反。幸运的是&#xff0c;使用词袋表示时有一种获取上下文的方法&#…

Fastjson首字母大小写问题

1、问题 使用Fastjson转json之后发现首字母小写。实体类如下&#xff1a; Data public class DataIdentity {private String BYDBSM;private String SNWRSSJSJ;private Integer CJFS 20; } 测试代码如下&#xff1a; public static void main(String[] args) {DataIdentit…

C# Application.DoEvents()的作用

文章目录 1、详解 Application.DoEvents()2、示例处理用户事件响应系统事件控制台输出游戏和多媒体应用与操作系统的交互 3、注意事项总结 Application.DoEvents() 是 .NET 框架中的一个方法&#xff0c;它主要用于处理消息队列中的事件。在 Windows 应用程序中&#xff0c;当一…

Node.js实现一个文章生成器

前言 本文将从零开始&#xff0c;讲解如何使用Node.js来实现一个文章生成器 node里面有很多优秀的模块&#xff0c;现在我们就借助node的fs模块来操控文本&#xff0c;来实现我们想要的效果 效果展示 体验 fs 首先我们先创建一个json文件 里面放一些内容 接下来我们书写代码…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高&#xff0c;室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐&#xff0c;以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

MATLAB绘图合集包(18种代码和20个绘图)资料免费分享

MATLAB绘图合集包&#xff01;18种代码和20个绘图小技巧&#xff01; 获取链接&#xff1a;https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码&#xff1a;381i 包括单组箱式图、堆叠柱状图、对数坐标图、多组箱式图、二维散点图、进阶热力图、进阶柱状图、面积填充…

ArcGIS Pro:地理信息系统的新篇章

引言 在地理信息系统&#xff08;GIS&#xff09;的世界中&#xff0c;ArcGIS Pro无疑是一款引领潮流的软件。作为一名经验丰富的GIS用户&#xff0c;我对ArcGIS Pro的强大功能和出色性能有着深刻的认识。今天&#xff0c;我想分享一下我对ArcGIS Pro的使用体验&#xff0c;希…

【CG】计算机图形学(Computer Graphics)基础(其壹)

0 学习视频 B站GAMES101-现代计算机图形学入门-闫令琪 1 什么是计算机图形学 1.1 什么是好的画面&#xff1f; 画面足够亮。如果全局光照做的好&#xff0c;整个画面就会亮&#xff0c;看起来很舒服。 1.2 计算机图形学涉及到的领域 数学&#xff08;透视&#xff09;投影…

【AIGC自动化编程技巧笔记】一、起步

本专栏参考了CSDN高级讲师李宁的《AIGC自动化编程技巧》&#xff0c;是学习过程中记录的笔记。 一、ChatGPT的实质 尽管ChatGPT的功能非常强大&#xff0c;看似无所不能&#xff0c;但是ChatGPT毕竟只是基于很多算法和 数据并运行在强大GPU上的大量代码而已。ChatGPT甚至并不…

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

目录 引出定时器事件QTimerEventQTimer 事件的分发事件过滤器 总结QT中的鼠标事件定义QLable的鼠标进入离开事件提升为myLabel重写QLabel的函数鼠标的事件鼠标的左中右键枚举鼠标多事件获取和鼠标移动鼠标追踪 QT中的信号和槽自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.…