vite翻译插件增加翻译参数的支持

This commit is contained in:
jingrow 2025-12-29 03:59:37 +08:00
parent 06ff855816
commit ee8961b8e8
2 changed files with 36 additions and 3 deletions

View File

@ -51,10 +51,36 @@ function findBalancedBracket(code, startPos, openChar = '(', closeChar = ')') {
* @returns {string} 处理后的参数代码
*/
function processNestedTranslations(paramsCode, translations, pattern) {
return paramsCode.replace(pattern, (match, ctxPrefix, quote, key) => {
return paramsCode.replace(pattern, (match, ...args) => {
// String.replace 回调的参数match, ...captureGroups, index, input
// 需要根据捕获组数量判断格式
// 格式1: /([a-zA-Z_$][a-zA-Z0-9_$]*\.)?[\$]t\((['"])([^'"]+)\2\)/g -> 3个捕获组
// 格式2: /\$t\((['"])([^'"]+)\1\)/g -> 2个捕获组
// 格式3: /\{\{\s*[\$]t\s*\(\s*(['"])([^'"]+)\1\s*\)\s*\}\}/g -> 2个捕获组
// 获取捕获组数量排除最后两个参数index 和 input
const captureGroups = args.slice(0, -2);
let ctxPrefix = '';
let quote;
let key;
if (captureGroups.length === 3) {
// 格式1带前缀的 (ctxPrefix, quote, key)
ctxPrefix = captureGroups[0] || '';
quote = captureGroups[1];
key = captureGroups[2];
} else if (captureGroups.length === 2) {
// 格式2或3不带前缀的 (quote, key)
quote = captureGroups[0];
key = captureGroups[1];
} else {
// 无法解析,返回原匹配
return match;
}
const translation = translations[key];
return translation
? `${ctxPrefix || ''}$t(${quote}${escapeString(translation, quote)}${quote})`
? `${ctxPrefix}$t(${quote}${escapeString(translation, quote)}${quote})`
: match;
});
}
@ -231,11 +257,18 @@ function replaceInterpolations(code, translations) {
let paramsPart = code.substring(m.afterKeyIndex, m.paramsEnd);
// 处理参数部分中的嵌套 $t() 调用
// 先处理 {{ $t(...) }} 格式(模板插值)
paramsPart = processNestedTranslations(
paramsPart,
translations,
/\{\{\s*[\$]t\s*\(\s*(['"])([^'"]+)\1\s*\)\s*\}\}/g
);
// 再处理 $t(...) 格式(参数对象中的直接调用)
paramsPart = processNestedTranslations(
paramsPart,
translations,
/\$t\((['"])([^'"]+)\1\)/g
);
const translation = translations[m.key];
if (translation) {

View File

@ -359,7 +359,7 @@ Payment Amount,支付金额,
Payment Method,支付方式,
Pay with {method}, fast and convenient. Balance will be credited immediately after successful payment.,使用{method}支付,快速便捷,余额将在支付成功后立即到账。,
Alipay,支付宝,
WeChat Pay,微信支付,
WeChat Pay,微信,
Billing Charges,账单费用,
Next billing date,下次扣款日期,
Current billing amount is,当前账单金额为,

Can't render this file because it has a wrong number of fields in line 338.