在項目中需要進行多個國家語言的切換時,可以用到下面方法其中一個
一、自定義設置多語言
方法一:
可以自己編寫一個設置多語言文件
在項目新建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文件個數,其他都不要改動就可
好了,編寫完成,有需要請自行查看!!!!!