From 09ecafc25a95e1259dfac0433e50f7b468d972a4 Mon Sep 17 00:00:00 2001 From: jingrow Date: Sat, 21 Feb 2026 22:56:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=87=BD=E6=95=B0t=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=94=AF=E6=8C=81=E5=B8=A6=E5=8F=82=E6=95=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/vite-plugin-translate.mjs | 34 +++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/dashboard/vite-plugin-translate.mjs b/dashboard/vite-plugin-translate.mjs index 7c9c08d..1bb6410 100644 --- a/dashboard/vite-plugin-translate.mjs +++ b/dashboard/vite-plugin-translate.mjs @@ -78,6 +78,29 @@ function findBalancedBracket(code, startPos, openChar = '(', closeChar = ')') { return -1; } +/** + * 处理带参数的 t() 调用,支持 t('key') 和 t('key', { params }) + * @param {string} code - 源代码 + * @param {object} translations - 翻译字典 + * @returns {string} 处理后的代码 + */ +function replaceTFunctionWithParams(code, translations) { + const result = code.replace( + /\bt\((['"])((?:\\.|(?!\1).)*)\1(?:,\s*(\{[^}]*\}))?\)/g, + (match, quote, key, params) => { + const unescapedKey = unescapeString(key); + const translation = translations[unescapedKey]; + if (translation) { + // 如果有参数,保持参数不变,只替换 key 部分 + const translated = quote + escapeString(translation, quote) + quote; + return params ? `t(${translated},${params})` : `t(${translated})`; + } + return match; + } + ); + return result; +} + /** * 处理参数对象中的嵌套 $t() 调用 * @param {string} paramsCode - 参数部分的代码 @@ -206,15 +229,8 @@ function vitePluginTranslate(options = {}) { code = processVueSFC(code, translations); } } else { - // 非 Vue 文件 - code = code.replace( - /\bt\((['"])((?:\\.|(?!\1).)*)\1\)/g, - (match, quote, key) => { - const unescapedKey = unescapeString(key); - const translation = translations[unescapedKey]; - return translation ? quote + escapeString(translation, quote) + quote : match; - } - ); + // 非 Vue 文件 - 支持带参数的 t() 调用 + code = replaceTFunctionWithParams(code, translations); } return code !== originalCode ? { code, map: null } : null;