From ba7f57c7d5ffe5fcccc8795b5c1fb68ea5790633 Mon Sep 17 00:00:00 2001 From: shenmo Date: Fri, 30 Oct 2026 20:23:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20=E7=BF=BB=E8=AF=91=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E4=B8=8E=20.qm=20=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 启动时按 locale 加载 gxde-ai-see_.qm(用户数据目录 / /usr/share) - translations/gxde-ai-see_en.ts 翻译模板,lupdate/lrelease 接入 CMake 并安装 - README 补充翻译流程 --- .gitignore | 3 + CMakeLists.txt | 20 ++ README.md | 1 + src/main.cpp | 23 ++ translations/gxde-ai-see_en.ts | 524 +++++++++++++++++++++++++++++++++ 5 files changed, 571 insertions(+) create mode 100644 translations/gxde-ai-see_en.ts diff --git a/.gitignore b/.gitignore index bc1dbf9..23cde1c 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ debian/.debhelper/ debian/files debian/debhelper-build-stamp debian/gxde-ai-see/ + +# translations build output +*.qm diff --git a/CMakeLists.txt b/CMakeLists.txt index b2d97c1..c0c8940 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,26 @@ add_executable(gxde-ai-see-mcptest target_include_directories(gxde-ai-see-mcptest PRIVATE src) target_link_libraries(gxde-ai-see-mcptest PRIVATE Qt6::Core) +# translations +find_program(LRELEASE_EXECUTABLE NAMES lrelease lrelease6) +file(GLOB TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts) +if (LRELEASE_EXECUTABLE AND TS_FILES) + set(QM_FILES) + foreach(ts ${TS_FILES}) + get_filename_component(ts_name ${ts} NAME_WE) + set(qm ${CMAKE_CURRENT_BINARY_DIR}/translations/${ts_name}.qm) + add_custom_command(OUTPUT ${qm} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/translations + COMMAND ${LRELEASE_EXECUTABLE} ${ts} -qm ${qm} + DEPENDS ${ts} + VERBATIM) + list(APPEND QM_FILES ${qm}) + endforeach() + add_custom_target(gxde-ai-see-translations ALL DEPENDS ${QM_FILES}) + add_dependencies(gxde-ai-see gxde-ai-see-translations) + install(FILES ${QM_FILES} DESTINATION share/gxde-ai-see/translations) +endif() + install(TARGETS gxde-ai-see RUNTIME DESTINATION bin) install(FILES data/gxde-ai-see.desktop data/gxde-ai-see-todo.desktop DESTINATION share/applications) install(DIRECTORY data/icons/ DESTINATION share/icons/hicolor) diff --git a/README.md b/README.md index 0fa379c..1ad8b87 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ gxde-ai-see --daemon # 后台常驻(由 gxde-k9 拉起) ## 📄 文档 - [设计方案(v0.2)](docs/PLAN.md) +- 翻译:`translations/gxde-ai-see_en.ts`(`lupdate src -ts translations/gxde-ai-see_en.ts` 更新,`lrelease` 生成 .qm) --- diff --git a/src/main.cpp b/src/main.cpp index cc94edf..4c8c993 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #include "app.h" @@ -18,6 +21,26 @@ int main(int argc, char *argv[]) app.setApplicationVersion(QStringLiteral("0.1.0")); app.setQuitOnLastWindowClosed(false); + const QString locale = QLocale::system().name(); + auto *translator = new QTranslator(&app); + const QStringList translationDirs = { + QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + + QStringLiteral("/translations"), + QStringLiteral("/usr/share/gxde-ai-see/translations"), + QStringLiteral("/usr/local/share/gxde-ai-see/translations"), + }; + bool translated = false; + for (const QString &dir : translationDirs) { + if (translator->load(QStringLiteral("gxde-ai-see_") + locale, dir) || + translator->load(QStringLiteral("gxde-ai-see_") + locale.section(QLatin1Char('_'), 0, 0), + dir)) { + app.installTranslator(translator); + translated = true; + break; + } + } + Q_UNUSED(translated) + QCommandLineParser parser; parser.setApplicationDescription(QStringLiteral("GXDE 小埃同学")); parser.addHelpOption(); diff --git a/translations/gxde-ai-see_en.ts b/translations/gxde-ai-see_en.ts new file mode 100644 index 0000000..6b9f09c --- /dev/null +++ b/translations/gxde-ai-see_en.ts @@ -0,0 +1,524 @@ + + + + + App + + + 小埃同学 + + + + + 当前桌面不支持传送门(需要 GXDE Wayland 合成器)。小埃同学会继续在后台待命,暂存区、内容工厂和对话仍然可用。 + + + + + ChatClient + + + 模型没有返回内容 + + + + + 请求失败 + + + + + API Key 无效或已过期 + + + + + ChatWindow + + + + 小埃同学 + + + + + 工具调用次数过多,已停止 + + + + + ⚠️ %1 + + + + + 把内容拖进对话即可提问 + + + + + + 新建对话 + + + + + ⋯ 更多 + + + + + 压缩上下文 + + + + + 重试上一条 + + + + + 重新加载 MCP + + + + + 没有配置 MCP 服务器 + + + + + 关于 + + + + + 设置 + + + + + 输入消息,Ctrl+Enter 发送;也可以把文件/文字拖进窗口 + + + + + 发送 + + + + + + 新对话 + + + + + 你 + + + + + + 小埃 + + + + + 正在压缩上下文… + + + + + 编辑消息 + + + + + %1 · 分支 + + + + + 关于小埃同学 + + + + + <h3>GXDE 小埃同学</h3><p>版本 %1</p><p>GXDE 桌面的 AI 助手:传送门、内容工厂、待办与对话。</p><p>许可证:GPL-3.0-or-later<br/>仓库:<a href='https://gitee.com/GXDE-OS/gxde-ai-see'>gitee.com/GXDE-OS/gxde-ai-see</a></p> + + + + + 小埃同学设置 + + + + + DeepSeek API Key + + + + + API 地址 + + + + + 模型 + + + + + 上下文条数 + + + + + 超出后自动压缩旧消息 + + + + + MCP 服务器(JSON) + + + + + 系统提示 + + + + + 还没有账号?前往 <a href='https://platform.deepseek.com'>platform.deepseek.com</a> 开通并创建 API Key。Key 只保存在本机配置文件中。 + + + + + MCP 配置不是合法的 JSON 数组,已忽略 + + + + + ContentFactory + + + + 拖到这里,按类型处理 + + + + + 拖到动作上松手 + + + + + Downloader + + + 另存为 + + + + + 无法写入:%1 + + + + + 开始下载:%1 + + + + + 下载失败:%1 + + + + + 下载完成:%1 + + + + + PortalPanel + + + GXDE 小埃同学 + + + + + + %1 项 + + + + + 移动到目标窗口上松手 + + + + + 当前无已打开的窗口 + + + + + 当前环境不支持传送门 + + + + + 暂存区 + + + + + 全选 + + + + + 反选 + + + + + 删除选中 + + + + + 复制 + + + + + + 已复制 + + + + + 真实地址 + + + + + 分词(%1) + + + + + 提取链接(%1) + + + + + 未找到语音朗读程序 + + + + + 开始朗读 + + + + + 已添加到待办 + + + + + 没有可保存的图片 + + + + + 保存图片 + + + + + 图片 (*.png *.jpg) + + + + + 已保存:%1 + + + + + 翻译接口将在小埃同学接入后可用 + + + + + 该能力尚未接入 GXDE Daemon + + + + + 未知操作:%1 + + + + + 固定位置 + + + + + 恢复默认位置 + + + + + 固定大小 + + + + + 全屏时隐藏 + + + + + 开机自启与后台保活 + + + + + 清空暂存区 + + + + + 关于 + + + + + 退出 + + + + + 已开启开机自启与保活 + + + + + 已关闭开机自启与保活 + + + + + 关于小埃同学 + + + + + <h3>GXDE 小埃同学</h3><p>版本 %1</p><p>传送门、内容工厂、待办与小埃同学对话。</p><p>GPL-3.0-or-later · <a href='https://gitee.com/GXDE-OS/gxde-ai-see'>gxde-ai-see</a></p> + + + + + PortalZone + + + 问问小埃 → + + + + + 传送门 + + + + + 拖到这里 +选择窗口跃迁 + + + + + 悬停在「传送门」上,再移动到目标窗口 + + + + + QObject + + + 还没有配置 API Key。请先点右上角设置,填入 DeepSeek API Key。 + + + + + 文件 + + + + + 图片 + + + + + 文字 · %1 字 + + + + + StagingView + + + 把文件、文字或图片拖到这里 + + + + + TodoWindow + + + + 待办 + + + + + + %1 项 + + + + + + + + + + + + 新建待办 + + + + + × + + + + + 隐藏 + + + + + 要做的事… + + + +