From d86d5c1c6426b55b4ca05baf3ade7eb6bea6085e Mon Sep 17 00:00:00 2001 From: Leon Date: Fri, 26 Jun 2026 10:02:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=AF=E8=AF=AD=E8=A1=A8=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0/=E5=AF=BC=E5=85=A5/=E5=AF=BC=E5=87=BA=E5=85=A8?= =?UTF-8?q?=E9=9D=A2=E4=BF=AE=E5=A4=8D+=E5=8D=8F=E5=90=8C=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4+=E7=A6=BB=E7=BA=BF=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上传不触发问题: - 原生file控件改为隐藏,由【导入CSV】按钮触发(triggerGlossaryImport) - 折叠区和弹窗内都提供导入入口 - 导入后自动打开弹窗显示结果+提示导入条数 CSV解析鲁棒性: - 用FileReader读UTF-8文本,Papa.parse(字符串)替代File对象,加手动parseCsvText兜底 - transformHeader剥离BOM+规范化,修复带BOM的CSV首列名变成zh导致中文列丢失 - normalizeGlossaryRow支持3列(zh/en/id)、2列任意组合、旧src/dst格式 协同维护+离线保存: - loadGlossaryFromServer失败时从localStorage缓存回退 - saveGlossary先写localStorage再同步服务端,服务端失败提示"已保存到本机" - openGlossaryModal用getOrCreateInstance复用实例避免重复创建 文案: - glossaryHelp更新为三语说明+支持任意两列 - 新增glossaryImportBtn/glossaryImportNone/glossaryImportError/glossarySavedLocal Co-Authored-By: Claude Opus 4.7 --- docutranslate/static/i18nData.json | 24 +++- docutranslate/static/index.html | 176 ++++++++++++++++++++++------- 2 files changed, 151 insertions(+), 49 deletions(-) diff --git a/docutranslate/static/i18nData.json b/docutranslate/static/i18nData.json index 1877bf6..680d381 100644 --- a/docutranslate/static/i18nData.json +++ b/docutranslate/static/i18nData.json @@ -108,7 +108,7 @@ "unlimitedPlaceholder": "留空为无限制", "glossaryGenTitle": "术语表", "glossaryLabel": "术语表(全公司共享)", - "glossaryHelp": "选择一个或多个CSV文件。文件需包含'src'和'dst'两列标题,分别代表原文和译文。", + "glossaryHelp": "全公司共享的三语术语表(中文/English/Bahasa)。翻译时按目标语言自动取对应列。支持任意两列(如仅中英)。点击下方按钮导入CSV或查看编辑。", "viewGlossaryBtn": "查看术语表", "clearGlossaryBtn": "清空", "glossaryGenEnableLabel": "自动生成术语表", @@ -186,7 +186,11 @@ "glossaryUnsaved": "未保存", "glossarySaved": "术语表已保存,对所有用户生效。", "glossarySaveFailed": "保存失败", - "glossaryImported": "已导入 {n} 条术语,请点击【保存】使其对所有用户生效。" + "glossaryImported": "已导入 {n} 条术语,请点击【保存】使其对所有用户生效。", + "glossaryImportBtn": "导入CSV", + "glossaryImportNone": "未能从CSV中解析出有效术语,请检查文件格式(表头应为 zh,en,id 或 src,dst)。", + "glossaryImportError": "导入失败", + "glossarySavedLocal": "已保存到本机(服务端同步失败,数据保留在本地,下次可重试保存)" }, "en": { "pageTitle": "DocuTranslate - Interactive Document Translation", @@ -297,7 +301,7 @@ "unlimitedPlaceholder": "Leave empty for unlimited", "glossaryGenTitle": "Glossary", "glossaryLabel": "Glossary (shared company-wide)", - "glossaryHelp": "Select one or more CSV files. Files must contain 'src' and 'dst' headers, representing source and destination terms.", + "glossaryHelp": "Company-wide shared trilingual glossary (中文/English/Bahasa). The target-language column is used automatically during translation. Any two columns (e.g. Chinese-English only) are supported. Use the buttons below to import CSV or view/edit.", "viewGlossaryBtn": "View Glossary", "clearGlossaryBtn": "Clear", "glossaryGenEnableLabel": "Auto-generate Glossary", @@ -375,7 +379,11 @@ "glossaryUnsaved": "Unsaved", "glossarySaved": "Glossary saved and applied to all users.", "glossarySaveFailed": "Save failed", - "glossaryImported": "Imported {n} terms. Click [Save] to apply to all users." + "glossaryImported": "Imported {n} terms. Click [Save] to apply to all users.", + "glossaryImportBtn": "Import CSV", + "glossaryImportNone": "No valid terms parsed from the CSV. Check the format (headers should be zh,en,id or src,dst).", + "glossaryImportError": "Import failed", + "glossarySavedLocal": "Saved locally (server sync failed; data kept locally, retry save later)" }, "id": { "pageTitle": "DocuTranslate - Terjemahan Dokumen Interaktif", @@ -486,7 +494,7 @@ "unlimitedPlaceholder": "Kosongkan untuk tanpa batas", "glossaryGenTitle": "Glosarium", "glossaryLabel": "Glosarium (dibagikan ke seluruh perusahaan)", - "glossaryHelp": "Pilih file CSV dengan kolom src dan dst.", + "glossaryHelp": "Glosarium trilingual dibagikan ke seluruh perusahaan (中文/English/Bahasa). Kolom bahasa target digunakan otomatis saat menerjemahkan. Mendukung dua kolom saja (mis. Chinese-English). Gunakan tombol di bawah untuk mengimpor CSV atau melihat/mengedit.", "viewGlossaryBtn": "Lihat Glosarium", "clearGlossaryBtn": "Hapus", "glossaryGenEnableLabel": "Buat Glosarium Otomatis", @@ -564,6 +572,10 @@ "glossaryUnsaved": "Belum disimpan", "glossarySaved": "Glosarium disimpan, berlaku untuk semua pengguna.", "glossarySaveFailed": "Gagal menyimpan", - "glossaryImported": "Mengimpor {n} istilah. Klik [Simpan] untuk berlaku ke semua pengguna." + "glossaryImported": "Mengimpor {n} istilah. Klik [Simpan] untuk berlaku ke semua pengguna.", + "glossaryImportBtn": "Impor CSV", + "glossaryImportNone": "Tidak ada istilah valid yang diurai dari CSV. Periksa format (header seharusnya zh,en,id atau src,dst).", + "glossaryImportError": "Impor gagal", + "glossarySavedLocal": "Tersimpan secara lokal (sinkronisasi server gagal; data tetap lokal, coba simpan lagi nanti)" } } \ No newline at end of file diff --git a/docutranslate/static/index.html b/docutranslate/static/index.html index 90ce3b0..e3d0061 100644 --- a/docutranslate/static/index.html +++ b/docutranslate/static/index.html @@ -684,21 +684,20 @@
- -
{{ t('glossaryHelp') }}
-
+
{{ t('glossaryHelp') }}
+
-
+
@@ -883,6 +882,9 @@