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;