UNPKG

cnd-i18n-loader

Version:

cnd-i18n-loader 一键式实现项目的国际化 语言包 处理的过程

140 lines (134 loc) 4.45 kB
const loaderUtils = require("loader-utils") const path = require("path") const fs = require("fs") const FileProcess = require("./lib/fileProcess") let messages = null // 语言包对象 let vue = 0 //vue版本 0为未获取到,默认2版本 const replaceTemplateContent = (content) => { return FileProcess.generateTemplate(messages, content, true) } const replaceScriptContent = (content) => { return FileProcess.generateScript(messages, content, true, Number(vue)) } const initMessages = ({ localeFile }) => { //如果资源数据不存在,但资源文件存在,则将资源文件载入到资源数据中 if (!messages && fs.existsSync(localeFile)) { messages = require(localeFile) // 获取需要翻译的文件内容 // const needFile = fs.readFileSync(localeFile, "utf8") // messages = needFile // ? JSON.parse(needFile.replace("export default", "").replace(";", "")) // : {} //文件变化监听 const isProduction = process.env.NODE_ENV === "production" const isTest = process.env.NODE_ENV === "test" if (!isProduction && !isTest) { fs.watchFile( localeFile, { interval: 1000 }, (_) => { //删除require缓存并置空,等待下一次的载入 delete require.cache[require.resolve(localeFile)] messages = null } ) } } } const { config_file } = require("./lib/const") let config = {} let state = false // 读取配置状态 确保项目启动只读取一次 // 获取当前项目的vue版本 const getVueVersion = () => { // 获取vue版本号 const packageFile = path.resolve(__dirname, "../../package.json") let package = {} // 获取当前项目的package.json信息 if (fs.existsSync(packageFile)) { package = require(packageFile) } console.log("/n ===============") // 获取当前vue版本,默认 2 const vueVersion = package.dependencies.vue || package.devDependencies.vue console.log(vueVersion) try { const firstVersion = String(vueVersion).split(".")[0] const vueArr = String(firstVersion).match(/\d+/g) vue = vueArr.join("") console.log("vue================") console.log(vue) } catch (e) { vue = 2 } } module.exports = function (source) { if (state === false) { if (fs.existsSync(config_file)) { const processFile = path.resolve(__dirname, `../../${config_file}`) config = require(processFile) // const needFile = fs.readFileSync(config_file, "utf8") // // 清除注释 // const cleanedData = needFile.replace(/\/\/.*|\/\*[\s\S]*?\*\//g, "") // config = cleanedData // ? JSON.parse(cleanedData.replace("export default", "").replace(";", "")) // : {} } // else { // return source // } } state = true // 不在打包环境下生效 if (config.open === false && process.env.NODE_ENV !== "production") { return source } let options = loaderUtils.getOptions(this) options = Object.assign( { localeFile: path.resolve(__dirname, `../../src/locale/zh.js`) }, options ) initMessages(options) if (!messages) return source if (vue === 0) { // 只执行一次 getVueVersion() } let result = "" // 不需要屏蔽node_modules,为了组件可以被翻译 TODO... // if(this.resourcePath.indexOf('node_modules')>-1){ // return source // } // 屏蔽i18n.js,不需要翻译 if (this.resourcePath.indexOf("i18n.js") > -1) { return source } const fileSuffix = path.extname(this.resourcePath) if ( [".js", ".jsx", ".ts", ".tsx"].includes(fileSuffix) && this.resourcePath.indexOf(path.parse(options.localeFile).dir) < 0 ) { //处理js文件 result = replaceScriptContent(source) } else if (fileSuffix === ".vue") { //处理vue文件 result = source.replace( /(<template[^>]*>)((.|\n|\r)*)(<\/template>)/gim, (_, preTag, content, $3, afterTag) => { return `${preTag}${replaceTemplateContent(content)}${afterTag}` } ) result = result.replace( /(<script[^>]*>)((.|\n|\r)*)(<\/script>)/gim, (_, preTag, content, $3, afterTag) => { return `${preTag}${replaceScriptContent(content)}${afterTag}` } ) } else { result = source } return result }