diff --git a/README.md b/README.md index 5e194e7..0affd56 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ - 暗黑 / 浅色主题切换,选择持久化,刷新不丢失 - 每个工具独立路由、独立本地历史记录(localStorage) - 所有文件上传支持点击选择 + 拖拽上传,图片自动缩略图回显;图片压缩支持批量、按质量/限制大小、等比缩放与 ZIP 批量下载 +- 翻译工具参考有道翻译的交互:中/英/韩/日互译、双栏对照、单词释义(拼音 + 词性释义 + 例句)、真人发音朗读、逐句对照与来源标注 - 通用组件:拖拽上传、复制按钮、下载按钮、错误提示、历史记录面板 - 全部能力由浏览器原生 API、WebAssembly 与 npm 前端库实现,无任何 mock 后端接口、无 CDN 脚本引入 @@ -24,7 +25,7 @@ | 样式 | UnoCSS 原子类 + SCSS(使用 TDesign 设计令牌变量) | | 路由 | Vue Router 4(History 模式) | -工具依赖:`qrcode`、`jsqr`、`cropperjs`、`browser-image-compression`、`tesseract.js`、`cron-parser`、`spark-md5`、`jszip`(全部通过 npm 安装)。 +工具依赖:`qrcode`、`jsqr`、`cropperjs`、`browser-image-compression`、`tesseract.js`、`cron-parser`、`spark-md5`、`jszip`、`pinyin-pro`(全部通过 npm 安装)。 ## 快速开始 @@ -109,7 +110,7 @@ location / { ## 隐私说明 -所有计算均在浏览器本地完成:图片压缩/裁剪/OCR 使用本地 Canvas/WASM,哈希使用本地 Web Crypto 与 spark-md5,历史记录仅存于本机 localStorage。项目不包含任何后端接口调用,用户文件永远不会离开浏览器。唯一例外是「翻译」工具:为调用第三方免费翻译接口(有道 / 腾讯),待翻译文本会发送至对应接口,页面已做提示。 +所有计算均在浏览器本地完成:图片压缩/裁剪/OCR 使用本地 Canvas/WASM,哈希使用本地 Web Crypto 与 spark-md5,历史记录仅存于本机 localStorage。项目不包含任何后端接口调用,用户文件永远不会离开浏览器。唯一例外是「翻译」工具:待翻译文本会发送至第三方免费翻译接口(有道 / 腾讯),单词释义与发音会请求 Free Dictionary API / Datamuse 与有道词典语音接口,页面已做提示。 ## OCR 语言包说明 diff --git a/agents.md b/agents.md index 0bb8c30..01e3108 100644 --- a/agents.md +++ b/agents.md @@ -101,7 +101,7 @@ export interface ToolItem { | 身份证 | `views/idcard` | 纯 TS 实现 GB 11643-1999 校验 | 内置全部省级行政区代码表;校验位权重表勿改动 | | 地址解析 | `views/address-parse` | 内置省份表 + 正则规则 | 纯规则近似解析,非地理数据库;直辖市无地级市层级需特殊处理 | | URL 解析 | `views/url-parse` | 原生 `URL` / `URLSearchParams` | 无协议输入自动补 `https://`;构造器用 `searchParams.append` 自动编码 | -| 翻译 | `views/translate` | 有道演示接口 + 腾讯翻译君(均免 key、支持 CORS) | **唯一需要联网的工具**:浏览器直接 POST 第三方接口,不经过自建后端;语言码映射 zh-CN→zh-CHS(有道)/zh(腾讯);「自动检测」用脚本特征兜底判定(中文/日文/韩文/英文);两个接口依次尝试降级;免费接口有频率限制,页面已提示 | +| 翻译 | `views/translate` | 有道演示接口 + 腾讯翻译君(翻译);`dict.youdao.com/dictvoice`(发音);Free Dictionary API → Datamuse(词典);`pinyin-pro`(拼音) | **唯一需要联网的工具**,界面参考有道翻译:语言对/场景下拉、双栏对照、字符计数、单词释义(拼音+词性释义+例句)、发音朗读、逐句对照、反馈按钮、来源标注(有道AI翻译标准模型/腾讯翻译君)。翻译接口:语言码映射 zh-CN→zh-CHS(有道)/zh(腾讯);「自动检测」用脚本特征兜底判定(中文/日文/韩文/英文);两个接口依次尝试降级;免费接口有频率限制(411),页面已提示。**发音**:`dict.youdao.com/dictvoice?audio=<文本>&type=<2=美音|0=中文/韩文>` 免签,日文不支持(500),日文译文改用有道接口返回的签名 `tSpeakUrl`(仅有道成功时可用,否则隐藏按钮)。**词典**:英文单词先查 `api.dictionaryapi.dev`(含音标/例句,部分地区网络不稳),超时降级 `api.datamuse.com/words?sp=<词>&md=d`(defs 为 "词性\t释义" 文本,需 split)。中文源词拼音由 pinyin-pro 本地生成(`toneType: 'symbol'`)。**已知限制**:有道演示接口不支持 en→ja(errorCode 102,自动降级腾讯);「逐句对照」按句拆分后逐句翻译(并发 3、最多 15 句);「AI 润色」仅保留入口(需官方 Key,点击展示说明) | | OCR | `views/ocr` | `tesseract.js`(WASM) | 见第 5 节离线说明 | ## 5. OCR 特殊说明(重要) diff --git a/package.json b/package.json index 32bdc98..b2ac503 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "jsqr": "^1.4.0", "jszip": "^3.10.1", "pinia": "^3.0.1", + "pinyin-pro": "^3.29.3", "qrcode": "^1.5.4", "spark-md5": "^3.0.2", "tdesign-icons-vue-next": "^0.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2caa5d0..c0778d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: pinia: specifier: ^3.0.1 version: 3.0.4(typescript@5.7.3)(vue@3.5.41(typescript@5.7.3)) + pinyin-pro: + specifier: ^3.29.3 + version: 3.29.3 qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -1260,6 +1263,9 @@ packages: typescript: optional: true + pinyin-pro@3.29.3: + resolution: {integrity: sha512-+UU9bx6vfDw8amOJGHm0TE0rdQl8VPylsDWviQ5OOQ3e+on1xRP4OqDbiDuMT5OISgvfl/Y6ez1BBRaIP80GLQ==} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -2560,6 +2566,8 @@ snapshots: optionalDependencies: typescript: 5.7.3 + pinyin-pro@3.29.3: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 diff --git a/src/views/translate/TranslateView.vue b/src/views/translate/TranslateView.vue index 70f7664..5c6d200 100644 --- a/src/views/translate/TranslateView.vue +++ b/src/views/translate/TranslateView.vue @@ -1,41 +1,170 @@