yummyTranslator
最近阅读英文文献,发现原有翻译流 (沙拉划词+Quiker) 由于Chrome安全策略原因失效。加之本人有学习英语的兴趣及其阅读英文文档的需求,萌生了开发一款 Translator Hub的想法。因此 Yummy Translator 诞生。此LOG记录整个项目的开发历程。
8.27(建项、架构确立)
通过与 Gemini 的”深入交流“,确定了以 React + Tauri的架构开发
模块 | 核心组件 | 技术选型/设计模式 | 主要职责与优势 |
---|---|---|---|
应用框架 | 桌面端应用 | Tauri (Rust + Web UI) | 高性能、低资源占用,提供原生级的体验。 |
表现层 | 用户界面 (UI) | Web技术 (React) | 利用现代前端生态,实现高效、美观、灵活的界面开发。 |
核心逻辑层 | Rust 后端 | Tauri Command & Event System | Rust保证了后端的稳定、安全和高并发处理能力。 |
服务层 | 翻译服务 | 适配器模式 (Adapter Pattern) | 高扩展性、低耦合,未来增加新的翻译源无需修改核心代码。 |
服务层 | 输入修正服务 | 纯本地离线库 | 瞬时响应、完全离线、保护隐私,提升核心输入体验。 |
数据层 | 本地化存储 | SQLite 数据库 | 功能强大、数据安全,为未来复杂的单词本功能铺平道路。 |
以 MVP的策略开发,先构建第一版v1 实现最基础的翻译功能
- 程序主界面
- 翻译结果界面
- 翻译API接入
- 本地化存储词典
- 输入修正(修正 多余复制进去的标点、以及拼错情况)
9.14 (Prompt工程)
对于 React + Tauri 的前端开发, 本人的只有些许 H5 DOM的开发经验。为了提升整个开发效率,采用高度依赖Ai agent的形式开发。由于成本限制 本项目主要采用 Github Copilot 免费模型开发。
1 | /* |
输入关键词后,进过多次 prompt修正 形成第一版 DEMO页

9.15(架构逻辑)
学习了一下项目的基本结构
1 | YUMMYTRANSLATOR |
采用了单向数据流 (One-Way Data Flow) 和状态提升 (Lifting State Up) 的架构方案,App
组件通过 props 将状态数据传递给子组件(SearchBox
、SuggestionDropdown.tsx
etc...),子组件再将UI样式回传回 App
进行调用渲染。
9.16(组件及其参数)
剖析一下程序的组件及其参数
App.tsx
先把主要控制处理组件 App
列出
1 |
|
组件 (Components)
Box: (来自 @mui/material) 用于布局和样式化的容器组件
SearchBox: 自定义的搜索框组件
SuggestionDropdown:自定义的搜索建议下拉框组件
ResultPanel: 自定义的结果展示面板组件。
变量 / 状态 (Variables / State)
SUGGESTIONS(arr): 一个建议单词测试数组,数量优先 后期会修改
filteredSuggestions(arr):根据 searchValue 从 SUGGESTIONS 中过滤出的建议列表。
searchValue (String): 存储当前搜索框中的输入内容
showDropdown(Boolen):是否显示下拉建议
isActivated(Boolen): 是否处于结果展示模式
results(arr): 存储模拟 API 返回的翻译结果 ,后期修改接入API
inputRef(useRef): 获取 SearchBox 内部 input 元素的直接引用
函数 (Functions)
getApiResults(word): 模拟 API 请求,根据输入的单词返回一个包含多个翻译结果的数组。
handleSelect(word): 处理用户在下拉建议中选择一项的逻辑。
handleInputChange(e): 处理输入框内容变化的逻辑。
handleKeyDown(e): 处理在输入框中按下键盘(特别是回车键)的逻辑。
SearchBox.tsx
然后是搜索组件 SerchBox
1 | import React from "react"; |
组件 (Components)
SearchBox: 组件本身,渲染带样式的输入框
Box: (@mui/material) 作为 SearchBox 的容器
TextField: (@mui/material) 核心的文本输入框组件
SearchIcon: (@mui/icons-material/Search) 搜索图标组件
参数 (Parameters)
SearchBox 组件通过 Props 接收参数:
value: (string) 需要在输入框中显示的值。
onChange: (function) 当输入框内容改变时需要触发的回调函数。
onKeyDown: (function) 当在输入框中按下按键时需要触发的回调函数。
inputRef: (object) 从父组件传递过来的 ref 对象。
SuggestionDropdown.tsx
再是搜索建议组件 SuggestionDropdown
1 | import React from "react"; |
组件 (Components)
- Box, List, ListItem, ListItemButton: (@mui/material) 构建列表结构的 UI 组件
参数 (Parameters)
SuggestionDropdown 组件通过 Props 接收参数:
suggestions: (string[]) 需要在列表中显示的建议单词数组
onSelect: (function) 当用户点击某一个建议项时需要触发的回调函数
在 .map() 循环内部:
- word: 代表 suggestions 数组中当前正在被渲染的单词
ResultPanel.tsx
最后是结果页 ResultPanel
1 | import React from "react"; |
组件 (Components)
Box
,Paper
,Typography
,TextField
: (@mui/material`) 用于构建结果卡片样式的 UI 组件
参数 (Parameters)
ResultPanel
组件通过 Props 接收参数:results
: (Array) 包含多个翻译结果对象的数组。
- 在
.map()
循环内部:api
: 代表results
数组中当前正在被渲染的那个结果对象 (e.g.,{ name: "Google 翻译", result: "..." }
)。