From adfc40e4d009f01aac75911a23c865c3c3b5f5ae Mon Sep 17 00:00:00 2001 From: jingrow Date: Mon, 29 Dec 2025 21:55:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20replaceAttributeArrayLiter?= =?UTF-8?q?als=20=E5=87=BD=E6=95=B0=EF=BC=9A=E5=A4=84=E7=90=86=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=BB=91=E5=AE=9A=E4=B8=AD=E6=95=B0=E7=BB=84=E5=AD=97?= =?UTF-8?q?=E9=9D=A2=E9=87=8F=E5=86=85=E7=9A=84=20()=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E6=9B=BF=E6=8D=A2=E4=B8=BA=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/vite-plugin-translate.mjs | 36 +++++++++++++++++++++++++++-- jcloud/translations/zh.csv | 1 - 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/dashboard/vite-plugin-translate.mjs b/dashboard/vite-plugin-translate.mjs index e13f913..cef53a5 100644 --- a/dashboard/vite-plugin-translate.mjs +++ b/dashboard/vite-plugin-translate.mjs @@ -191,6 +191,8 @@ function processVueSFC(code, translations) { let replacedContent = templateContent; replacedContent = replaceInterpolations(replacedContent, translations); replacedContent = replaceAttributeBindings(replacedContent, translations); + // 处理属性绑定中的数组字面量,如 :items="[{ label: $t('key'), ... }]" + replacedContent = replaceAttributeArrayLiterals(replacedContent, translations); code = code.substring(0, startIndex) + openTag + replacedContent + CONSTANTS.VUE_TEMPLATE_CLOSE_TAG + code.substring(startIndex + openTag.length + templateContent.length + CONSTANTS.VUE_TEMPLATE_CLOSE_TAG_LEN); @@ -203,11 +205,14 @@ function processVueSFC(code, translations) { /(]*>)([\s\S]*?)(<\/script>)/gi, (match, openTag, scriptContent, closeTag) => { const replacedContent = scriptContent.replace( - /\$t\((['"])((?:\\.|(?!\1).)*)\1\)/g, + /(?:this\.)?\$t\((['"])((?:\\.|(?!\1).)*)\1\)/g, (match, quote, key) => { const unescapedKey = unescapeString(key); const translation = translations[unescapedKey]; - return translation ? `$t(${quote}${escapeString(translation, quote)}${quote})` : match; + // 如果匹配包含 this.,保留它 + const hasThis = match.startsWith('this.'); + const prefix = hasThis ? 'this.' : ''; + return translation ? `${prefix}$t(${quote}${escapeString(translation, quote)}${quote})` : match; } ); return openTag + replacedContent + closeTag; @@ -383,6 +388,33 @@ function replaceAttributeBindings(code, translations) { ); } +/** + * 替换属性绑定中数组字面量内的 $t('xxx') + * 例如::items="[{ label: $t('key'), ... }]" + */ +function replaceAttributeArrayLiterals(code, translations) { + // 匹配属性绑定中的数组字面量,如 :items="[...]" + // 使用更宽松的匹配,支持单引号和双引号 + return code.replace( + /([:@]|v-bind:|v-on:)([a-zA-Z0-9_-]+)=(["'])\[([\s\S]*?)\]\3/g, + (match, prefix, attrName, outerQuote, arrayContent) => { + // 在数组内容中查找并替换所有 $t() 调用,直接替换为翻译文本 + const replacedContent = arrayContent.replace( + /\$t\((['"])((?:\\.|(?!\1).)*)\1\)/g, + (m, quote, key) => { + const unescapedKey = unescapeString(key); + const translation = translations[unescapedKey]; + if (!translation || !translation.trim()) return m; + // 直接替换为翻译文本字符串,转义引号 + const escaped = escapeString(translation, quote); + return `${quote}${escaped}${quote}`; + } + ); + return `${prefix}${attrName}=${outerQuote}[${replacedContent}]${outerQuote}`; + } + ); +} + /** * 去除字符串中的转义字符(将 \' 转换为 ',\" 转换为 " 等) */ diff --git a/jcloud/translations/zh.csv b/jcloud/translations/zh.csv index c1a65ff..8fc8fe6 100644 --- a/jcloud/translations/zh.csv +++ b/jcloud/translations/zh.csv @@ -293,7 +293,6 @@ Site Update,站点更新, Site update started,站点更新已启动, Size,尺寸, Servers,服务器, -Servers,服务器, Skip,跳跃, Social Login Key,社交登录密钥, Source,源,