第一次来这里发文章,分享一下我使用沉浸式翻译的一些经验。这篇文章是原创,之前在隔壁发过一次。如果遇到熟人,一定留下来打个招呼。
沉浸式翻译 + Gemini 2.5 Flash 是最佳组合。
有免费的 deeplx 服务当然灰常好用,但是大模型可以自定义提示词,自定翻译风格啊。体验确实不一样。
(叠甲:纯个人观点,2.5Flash 是肉测的速度和质量平衡最好模型。)
要实现这个最佳组合,需要:
来一个一个说清楚。
这个简单,直接浏览器市场,或者网上搜一下“沉浸式翻译”。
我比较喜欢用自己的 API ,所以没有开通沉浸式的 pro 会员。
API 申请方式:
Gemini Flash 2.5 的价格虽然比 2.0 涨了 50%,但是总体还是比较便宜的。自己可以衡量一下翻译量,是用自己的 api 还是开通插件的 pro 会员。
Gemini 的 429 算是一个老生常谈问题了,论坛评论区经常看到,根据我的经验也在这儿给大家一个解决方案。(按照后面提到的方法处理后,我已经稳定使用半年 2.0flash ,包括最近使用 2.5flash ,没遇到过一次 429 )
根据个人使用情况分析原因:
根据这个分析,得出的解决方案就简单了:
不要用插件默认的提示词!可以基于默认提示词进行修改和润色(比如让 AI 帮你优化一下结构和措辞),形成自己专属的提示词。网上有很多有特色的翻译提示词,同样不要直接复制,还是需要自己稍微改一下再用。
记住,是插件的几个提示词都要修改为独有的,不只是修改系统提示词。
我解决了提示词的问题后,直接插件里面把并发设置为 1000 ,翻译体验直接起飞。(使用半年,再高的并发都从来没有 429 )。
如果仍然还有 429 问题,可以尝试以下几点来解决:
目前的这个 Gemini 2.5 Flash 版本竟然自带思考模式,个人感觉很不习惯(希望 google 后面还是单独把 thinking 模型独立出去)。如果要翻译用得爽,必须要关闭。
关闭方式:请求接口入参设置:
"generationConfig": {
"thinkingConfig": {
"thinkingBudget": 0
}
}
插件方式关闭:
沉浸式插件本身就可以关闭,具体方法:
Edit Full User Config
"gemini": {
"APIKEY": "******",
# 从此处为添加配置
"bodyConfigs": {
"generationConfig": {
"thinkingConfig": {
"thinkingBudget": 0
}
}
}
# 添加部分结束
}
注意是添加配置,不要修改到原有配置。new-api 关闭方式:
我习惯使用 new-api 来管理多个渠道的 api ,这里也提供关闭思考的方式。
# 设定 gemini-2.5-flash-nothinking 为模型显示名称,gemini-2.5-flash-preview-04-17-nothinking 为实际模型名称。这样设置需要把显示名称(gemini-2.5-flash-nothinking)作为自定义模型填入模型列表。
{
"gemini-2.5-flash-nothinking": "gemini-2.5-flash-preview-04-17-nothinking"
}
deno 方式关闭:
前文有提到使用 deno 来代理,同样可以在代理代码里面向上游传递关闭思考的参数,deno 代码:
const targetHost = Deno.env.get("TARGET_HOST") || "generativelanguage.googleapis.com";
Deno.serve(async (req: Request) => {
const url = new URL(req.url);
url.hostname = targetHost;
url.protocol = "https:";
const headers = new Headers(req.headers);
headers.set('Host', url.hostname);
headers.delete('content-length');
let requestBody: BodyInit | null = null;
let modified = false;
if (req.method === "POST" && req.body && headers.get("content-type")?.includes("application/json")) {
const originalBodyText = await req.text();
if (originalBodyText) {
const bodyJson = JSON.parse(originalBodyText);
bodyJson.generationConfig = {
...(bodyJson.generationConfig || {}),
thinkingConfig: {
thinkingBudget: 0
}
};
requestBody = JSON.stringify(bodyJson);
modified = true;
} else {
requestBody = null;
}
} else if (req.body) {
requestBody = req.body;
}
const response = await fetch(url.toString(), {
method: req.method,
headers,
body: requestBody,
redirect: 'manual',
});
return response;
});
注意: 这个代码会强制关闭思考功能,单独用来代理不需要思考的 2.5flash 即可,2.5pro 勿用。
分享一个非常实用但可能用的人不多的功能:**用户规则 (User Rules)**。
场景: 看文档或特定网站(比如如 Folo 阅读器)时,插件会连带侧边栏、导航栏等非主要内容一起翻译,导致页面布局混乱。这时就可以通过配置用户规则,指定插件只翻译页面的特定部分。
示例: 就拿 app.follow.is 来举例:
[
{
"matches": "app.follow.is",
"excludeSelectors": [
".group.absolute"
],
"selectors": [
"article"
]
}
]
配置说明:
目前就分享这些了,如果对于这个方案使用还有疑问就直接问吧,看看还有没有需要分享的。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.