UNPKG

magic-i18n

Version:

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

97 lines (90 loc) 2.75 kB
const loaderUtils = require("loader-utils"); const path = require("path"); const fs = require("fs"); const FileProcess = require("./lib/fileProcess"); let messages = null; const replaceTemplateContent = (content) => { return FileProcess.generateTemplate(messages, content, true); }; const replaceScriptContent = (content, jsneed) => { return FileProcess.generateScript(messages, content, true, jsneed); }; const initMessages = ({ localeFile }) => { //如果资源数据不存在,但资源文件存在,则将资源文件载入到资源数据中 if (!messages && fs.existsSync(localeFile)) { messages = require(localeFile); //文件变化监听 const isProduction = process.env.NODE_ENV === "production"; if (!isProduction) { 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; // 读取配置状态 确保项目启动只读取一次 module.exports = function (source) { if (state === false) { if (fs.existsSync(config_file)) { const processFile = path.join(process.cwd(), config_file); config = require(processFile); } // 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.join(process.cwd(), "src/locale/zh.js"), }, options ); initMessages(options); if (!messages) return source; let result = source; if (this.resourcePath.indexOf("node_modules") > -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, true); } else if (fileSuffix === ".vue") { //处理vue文件 // console.log(source) result = source.replace( /<template[^>]*>([\s\S]*)<\/template>/gim, (preTag, content, $3, afterTag) => { return `<template>${replaceTemplateContent(content)}</template>`; } ); result = result.replace( /<script[^>]*>([\s\S]*)<\/script>/gim, (preTag, content, $3, afterTag) => { return `<script>${replaceScriptContent(content, config.step)}</script>`; } ); } else { result = source; } return result; };