cnd-i18n-loader
Version:
cnd-i18n-loader 一键式实现项目的国际化 语言包 处理的过程
140 lines (134 loc) • 4.45 kB
JavaScript
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
}