相信很多人都用过 Zotero 的 Translate for Zotero 这个翻译插件,但是它自带的 Google 翻译能力很糟糕,跟网页版的 Google 翻译效果差远了。

所以很多人会使用一些进阶的设置,通过 API 接入各家的大模型,翻译效果会好很多。不过各家大模型能力参差不齐,比如百度、腾讯的翻译能力就一般,机翻味儿很重。各家 API 的调用次数限制也各不相同,像百度的普通翻译接口,每个月前 50 万个字符(约 25 万到 30 万个汉字)是免费的,超过了就需要付费。我先前也接了一个 DeepSeek 的 API,按量收费的,百万 tokens 两毛钱,效果还行,就是不知道为什么速度很慢。

最近看到 Google 云盘有一个 Apps Script 的功能,碰巧它有内置的 LanguageApp.translate() 函数,正好拿来试试。效果非常 amazing 啊,跟网页版 Google 翻译效果完全一样,比 DeepSeek 效果好,速度也更快。我看了一下官方文档,它这个限制是每天 5000 次的请求,每次上限 10000 个字符,相比之下还是蛮划算的,个人用是完全足够了。

首先我们打开 Google 云端硬盘,点击左上角“新建 - 更多 - Google Apps Script”,点击创建脚本,我们将这串代码粘贴进去,然后保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
function doPost(e) {
var rawData = e.postData.contents;
var payload = {};
var debugMode = false;

try {
payload = JSON.parse(rawData);
// 调试模式
if (payload.debug === true || payload.debug === "true") {
debugMode = true;
}
} catch (err) {
return createResponse("JSON 解析错误: " + err.toString());
}

// 获取提示词内容 (${sourceText}--->${langTo})
var fullContent = "";
if (payload.messages && payload.messages.length > 0) {
fullContent = payload.messages[payload.messages.length - 1].content;
}
var sourceText = "";
var langTo = "zh-CN";
if (fullContent.indexOf("--->") !== -1) {
var splitIndex = fullContent.lastIndexOf("--->");
sourceText = fullContent.substring(0, splitIndex).trim();
langTo = fullContent.substring(splitIndex + 4).trim();
} else {
sourceText = fullContent;
}

// 执行翻译
var translatedText = "";
try {
if (sourceText) {
translatedText = LanguageApp.translate(sourceText, '', langTo);
} else {
translatedText = "未获取到待翻译文本";
}
} catch (err) {
translatedText = "Google 引擎报错: " + err.toString();
}

// 返回
var finalDisplay = translatedText;
if (debugMode) {
finalDisplay = "【翻译结果】\n" + translatedText +
"\n\n【Debug 原始请求包】\n" + rawData +
"\n\n【解析参数】\n原文: " + sourceText +
"\n目标语言: " + langTo;
}
return createResponse(finalDisplay);
}

function createResponse(text) {
var out = {
"choices": [{
"message": {
"role": "assistant",
"content": text
},
"finish_reason": "stop"
}]
};
return ContentService.createTextOutput(JSON.stringify(out))
.setMimeType(ContentService.MimeType.JSON);
}

function doGet(e) {
return ContentService.createTextOutput("服务正常。请在使用 POST 请求。");
}

点击“部署 - 新建部署”,点击左边小齿轮 - web 应用,然后配置参数说明随便填,具有访问权限的用户改成选择 “所有人” (Anyone),最后点击底部的 “部署”。

部署成功会生成一串地址,我们复制这一串地址,打开Zotero的设置 - 翻译 - 翻译服务,拉到最下面有三个自定义GPT选项,密钥不用填,点击配置,把刚才复制的一串地址粘贴到接口里面,模型和温度都不用设置,然后提示词按照下面输入:

1
${sourceText} ---> ${langTo}

这里 ${sourceText} 就是你要翻译的原文,${langTo} 是你要翻译成的语言,然后我们把流式输出关闭,点击保存。

最后还有一点就是把“向GPT/Claude/Gemini服务提供论文标题和摘要”这一设置项取消勾选,当然你要是后面改用其他大模型翻译的话,可以把这个选项再勾回去。