OpenTranslation
OpenTranslation 是一个面向 TranslatePress 的自动翻译适配插件。
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/itandelin/opentranslation/archive/refs/heads/main.zipReadme
OpenTranslation
OpenTranslation 是一个面向 TranslatePress 的自动翻译适配插件。
它的作用不是自己做页面翻译,而是把 TranslatePress 的自动翻译请求接管下来,转发到你配置的 AI 大模型,再把翻译结果写回 TranslatePress 词库。这样你可以继续使用 TranslatePress 的页面扫描、语言切换和词库体系,同时把实际翻译能力切换成 OpenAI、Claude 或兼容它们接口的第三方模型网关。
插件定位
这个插件适合下面几类场景:
- 你已经在用 TranslatePress,但不想继续使用默认的自动翻译服务。
- 你希望把自动翻译切换到自己可控的 AI 模型。
- 你需要主模型与备用模型的故障切换能力。
- 你希望翻译任务尽量在后台异步完成,避免前台访问被实时翻译拖慢。
核心特性
- 接入 TranslatePress,自定义自动翻译引擎
OpenTranslation AI - 支持
OpenAI与Claude两类 Provider - 支持 OpenAI / Claude 兼容网关,自定义
Base URL - 支持多模型优先级与自动降级
- 支持模型连通性测试与结构化诊断输出
- 支持缓存、失败重试、重试退避
- 支持后台异步队列翻译
- 支持按语言暂停 / 恢复队列
- 支持 URL、邮箱、媒体路径、协议链接等内容直通,不占模型请求
- 支持占位符保护,尽量避免 HTML、短代码、变量被错误翻译
- 默认关闭前台实时翻译,避免页面请求被同步模型调用拖慢
工作原理
OpenTranslation 的整体链路如下:
- TranslatePress 在设置中选择自动翻译引擎
OpenTranslation AI - 页面内容被 TranslatePress 扫描并进入词库
- OpenTranslation 从 TranslatePress 词库中取出未翻译内容
- 插件根据规则判断:
- 可直通内容直接回写原文
- 已有缓存的内容直接回填
- 其余内容提交给 AI 模型翻译
- 翻译结果写入 OpenTranslation 缓存表
- 最终批量写回 TranslatePress 的字典表
默认情况下,前台页面访问不会主动触发实时模型翻译。翻译主要由后台异步队列完成,这样可以显著降低前台 504、超时和首屏卡顿的风险。
当前运行策略
为了保证前台访问稳定,插件当前采用以下策略:
-
前台实时翻译默认关闭
- 管理后台
- Ajax
- Cron
- REST
- WP-CLI 这些上下文允许触发翻译。 普通前台访问默认不触发实时模型请求。
-
后台优先异步处理
- 优先使用
Action Scheduler - 如果不可用,则回退到
WP-Cron
- 优先使用
-
后台队列已做吞吐优化
- 一次异步 worker 可在时间预算内连续处理多轮任务
- 翻译批次会同时参考“条数上限”和“字符预算上限”切块
- 长段落会自动拆成更小批次,减少模型超时或空响应概率
- 已有缓存结果会直接回填到 TranslatePress 词库
- URL 等明显无需翻译的内容会走 fast-path
环境要求
- WordPress 5.8+
- PHP 7.4+
- 已安装并启用 TranslatePress
建议环境:
- 允许
WP-Cron正常运行,或服务器已配置真实 cron - 站点可正常访问你配置的 AI Provider / 网关
安装方法
- 将插件目录放到 WordPress 的插件目录:
wp-content/plugins/opentranslation
- 进入 WordPress 后台,启用
OpenTranslation - 确保
TranslatePress已启用
启用插件后,OpenTranslation 会自动创建以下数据表:
wp_opentranslation_cachewp_opentranslation_logwp_opentranslation_rate_limit
实际前缀取决于你的 WordPress 表前缀,不一定是 wp_。
快速开始
1. 添加模型
进入:
OpenTranslation -> Models
你可以添加一个或多个模型。每个模型包含以下配置:
ProviderOpenAIClaude
API KeyBase URL- 可留空使用官方地址
- 也可以填写兼容网关地址
ModelPriority- 数字越小优先级越高
TemperatureMax Tokens
说明:
- 如果主模型失败,插件会按优先级自动切换到备用模型。
- 模型页支持“获取模型列表”和“测试”。
2. 配置插件设置
进入:
OpenTranslation -> Settings
主要配置项如下:
Batch Size- 每轮模型翻译的目标条数上限
Cron Interval (minutes)- 非 Action Scheduler 场景下的轮询间隔
Rate Limit (requests/min)- 后台每分钟请求单位上限
System Prompt- 模型翻译提示词
Plugin Language- 插件后台界面语言
3. 在 TranslatePress 中选择引擎
进入 TranslatePress 的自动翻译设置,将自动翻译引擎切换为:
OpenTranslation AI
保存后,点击 Test API Credentials。
如果配置正确,测试不会再走 TranslatePress 官方 MTAPI,而是返回 OpenTranslation 的诊断结果。
4. 触发后台队列
进入:
OpenTranslation -> Queue & Logs
你可以:
- 查看待处理 / 已翻译 / 失败数量
- 查看当前队列执行器
- 手动点击
Run Queue Now - 对失败项点击
Retry Failed - 按语言暂停 / 恢复翻译
- 查看最近日志
推荐配置
如果你正在使用不太稳定、容易返回空响应或 524 的兼容模型,建议从下面的保守配置开始:
Batch Size:10 ~ 20Temperature:0.1 ~ 0.3Max Tokens: 先用0,如果模型输出经常被截断,再适当调高- 至少配置一个备用模型
如果你希望优先追求吞吐,可以这样调整:
Batch Size:20Rate Limit: 根据你的网关额度提高- 保持默认后台异步模式,不要依赖前台实时翻译
管理页面说明
Settings
用于配置后台运行参数和系统提示词。
Models
用于管理模型列表。支持:
- 新增模型
- 删除模型
- 测试模型
- 设置主备顺序
Queue & Logs
用于观察后台翻译状态。你可以看到:
PendingTranslatedFailed- 当前由
Action Scheduler还是WP-Cron驱动 - 下次运行时间
- 各语言剩余未翻译数量
- 最近日志明细
缓存、重试与失败处理
插件内置了如下机制:
-
翻译结果缓存
- 相同源文本、目标语言、上下文会复用缓存结果
-
重试退避
- 临时失败不会立即标记为永久失败
- 会按退避策略等待下次重试
-
模型降级
- 主模型失败后,自动切换下一个优先级模型
-
空响应 / 524 处理
- 对兼容网关常见的
HTTP 524 + empty body - 插件会自动重试
- 对部分失败场景还会进一步拆小批次再试
- 对兼容网关常见的
TranslatePress 接入说明
插件通过 TranslatePress 提供的过滤器把自己注册成一个新的自动翻译引擎。
注册后的引擎名称为:
OpenTranslation AI
因此只要 TranslatePress 正常工作,OpenTranslation 就能沿用它的:
- 语言配置
- 字典表
- 自动翻译入口
- 页面语言切换逻辑
性能与稳定性说明
当前版本已经针对后台吞吐做过几轮优化,重点包括:
- 后台队列多轮连续执行
- 长文本与短文本分开切块
- 直通内容不占模型请求
- 缓存命中内容直接回填
- 请求单位记录改为更接近真实 HTTP 尝试次数
如果你的模型网关质量一般,仍可能看到以下日志:
HTTP 524OpenAI-compatible endpoint returned empty contentModel response count does not match request count
这不一定表示插件逻辑有问题,很多时候是上游模型或网关返回不稳定。插件会尽量通过重试、切块、降级模型来继续推进队列。
常见问题
1. Test API Credentials 通过了,但页面还是没立刻翻译
这是正常现象。
默认策略下,前台普通访问不会触发实时模型翻译。翻译主要依赖后台队列完成。请到 Queue & Logs 页面确认:
- 模型已配置
- TranslatePress 已选择
OpenTranslation AI - 自动翻译已启用
- 队列在运行
- 目标语言没有被暂停
2. 前台页面不应该再出现 504 吗?
按当前实现,普通前台访问默认不会同步调用模型,所以前台 504 风险已经大幅下降。
如果你又通过代码或过滤器手动开启了前台实时翻译,就可能再次把模型延迟带回前台请求链路。
当前默认过滤行为是:
apply_filters( 'opentranslation_allow_frontend_live_translation', false )
也就是说,除非你显式开放,否则前台实时翻译保持关闭。
3. Run Queue Now 点了以后看起来没反应
当前实现会优先把任务排到异步队列,而不是在管理页里同步跑完整翻译。这样是为了避免后台页面卡住。
请到 Queue & Logs 页面查看:
Next RunQueue Runner- 最新日志
4. 站点定义了 DISABLE_WP_CRON
如果站点禁用了 WP-Cron,你需要:
- 确保
Action Scheduler可以运行,或 - 服务器层面配置真实 cron
否则后台队列不会自动推进。
5. 模型经常返回空响应或 524
建议按下面顺序排查:
- 降低单模型压力
- 减少
Batch Size - 保持
Temperature较低 - 配置备用模型
- 更换更稳定的网关或模型
6. 为什么有些内容没有被翻译?
有一类内容会被插件判断为无需翻译,直接回填原文,例如:
- URL
- 邮箱
mailto:/tel:/sms:/fax:- 图片、视频、PDF 等资源路径
- 一些明显像语言标识或技术标记的内容
这样做是为了减少无意义模型调用,提升吞吐。
日志与诊断
你可以在 Queue & Logs 页面直接查看最近日志。
日志里常见的动作包括:
scheduler_runmodel_fallbackretryfailedplaceholder_restored
如果要排查连通性问题,优先看:
- 模型测试结果
model_fallbackretryfailed
如果要排查翻译完整性问题,优先看:
placeholder_restored
数据安全与存储说明
插件会保存:
- 模型配置
- 翻译缓存
- 失败状态
- 运行日志
- 请求单位窗口统计
其中模型配置通过插件内部的加密选项封装保存,不直接依赖 TranslatePress 的 API Key 字段。
卸载说明
停用插件会清理队列调度。
卸载插件会删除 OpenTranslation 创建的数据表:
- 缓存表
- 日志表
- 请求单位表
如果你希望保留历史翻译缓存或日志,请在卸载前自行备份数据库。
适合你的使用方式
如果你的目标是“站点前台稳定,后台慢慢把词库补全”,推荐这样使用:
- 前台实时翻译保持关闭
- TranslatePress 继续负责页面扫描与语言结构
- OpenTranslation 只负责后台异步翻译和词库回填
- 主模型外再配一个备用模型
- 定期在
Queue & Logs页面观察失败和积压情况
免责声明
OpenTranslation 负责 TranslatePress 对接、缓存、队列、重试和回写流程。
最终翻译质量、延迟和稳定性,仍然取决于你所使用的模型本身,以及对应网关的可用性与吞吐能力。