翻译函数t增加支持带参数翻译

This commit is contained in:
jingrow 2026-02-21 22:56:05 +08:00
parent 7948d4dcc2
commit 09ecafc25a

View File

@ -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;