translate
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTranslate files using the Bluente Translation API.
使用Bluente Translation API翻译文件。
Step 1: Collect user inputs
步骤1:收集用户输入
Ask the user using AskUserQuestion. IMPORTANT: Every question MUST have at least 2 options (AskUserQuestion requires min 2 options per question). Use the user's "Other" free-text option for custom input.
Ask all 4 questions in a single AskUserQuestion call:
-
API Key — "What is your Bluente API key? (starts with sk-, get one at https://translate.bluente.com/settings/?type=apiKeys)"
- Options: "I have my key ready" (description: "I'll type it in the Other field below"), "I need to get a key" (description: "Visit https://translate.bluente.com/settings/?type=apiKeys")
- The user will type their actual key in the "Other" free-text field.
-
Source path — "What is the path to the file or folder you want to translate?"
- Options: "Current directory" (description: "Use the current working directory"), "Enter path" (description: "I'll specify a custom path in the Other field")
-
Target language — "What language do you want to translate to?"
- Options (pick 4, use the most common): "Arabic" , "French", "Spanish", "German"
- The user can pick "Other" for any other language.
-
Output path — "Where should the translated files be saved?"
- Options: "Same folder as source" (description: "Save next to the originals"), "Enter path" (description: "I'll specify a custom path in the Other field")
If the user selected "I have my key ready" but didn't type a key in "Other", ask them to provide the key in a follow-up message (don't use AskUserQuestion again for this — just ask in plain text).
使用AskUserQuestion向用户提问。重要提示:每个问题必须至少包含2个选项(AskUserQuestion要求每个问题最少有2个选项)。使用“其他”自由文本选项供用户输入自定义内容。
在单次AskUserQuestion调用中询问全部4个问题:
-
API密钥 — "你的Bluente API密钥是什么?(以sk-开头,可在https://translate.bluente.com/settings/?type=apiKeys获取)"
- 选项:"我已经准备好密钥"(描述:"我会在下方的其他字段中输入"),"我需要获取密钥"(描述:"访问https://translate.bluente.com/settings/?type=apiKeys")
- 用户将在“其他”自由文本字段中输入实际的密钥。
-
源路径 — "你要翻译的文件或文件夹的路径是什么?"
- 选项:"当前目录"(描述:"使用当前工作目录"),"输入路径"(描述:"我会在其他字段中指定自定义路径")
-
目标语言 — "你想翻译成什么语言?"
- 选项(选4个最常用的):"阿拉伯语"、"法语"、"西班牙语"、"德语"
- 用户可以选择“其他”来指定任意其他语言。
-
输出路径 — "翻译后的文件应该保存到哪里?"
- 选项:"与源文件同文件夹"(描述:"保存在原文件旁"),"输入路径"(描述:"我会在其他字段中指定自定义路径")
如果用户选择了“我已经准备好密钥”但没有在“其他”字段中输入密钥,发送后续消息请用户提供密钥(无需再次使用AskUserQuestion,直接用普通文本询问即可)。
Step 2: Look up the correct language code
步骤2:查找正确的语言代码
Use this known mapping of common language codes to avoid an extra API call:
- Arabic = , English =
ara, French =en, Spanish =fra, German =spa, Chinese =de, Japanese =zho, Korean =ja, Portuguese =ko, Italian =pt, Turkish =it, Russian =tr, Hindi =ruhi
If the user picks a language NOT in this list, call the supported languages endpoint:
GET https://api.bluente.com/api/20250924/blu_translate/supported_languages
Header: Authorization: Bearer <API_KEY>Response format:
Search array for the matching language and use its .
{"message": "success", "code": 0, "data": [{"name": "French", "svcCode": "fra", ...}, ...]}datasvcCode使用以下已知的常用语言代码映射,避免额外的API调用:
- 阿拉伯语 = ,英语 =
ara,法语 =en,西班牙语 =fra,德语 =spa,中文 =de,日语 =zho,韩语 =ja,葡萄牙语 =ko,意大利语 =pt,土耳其语 =it,俄语 =tr,印地语 =ruhi
如果用户选择的语言不在此列表中,调用支持语言接口:
GET https://api.bluente.com/api/20250924/blu_translate/supported_languages
Header: Authorization: Bearer <API_KEY>响应格式:
在数组中搜索匹配的语言并使用其。
{"message": "success", "code": 0, "data": [{"name": "French", "svcCode": "fra", ...}, ...]}datasvcCodeStep 3: Detect source files
步骤3:检测源文件
- If the source path is a single file, translate just that file.
- If the source path is a folder, find all translatable files in it (pdf, docx, pptx, xlsx, etc.)
- If no translatable files found, tell the user and stop.
- 如果源路径是单个文件,仅翻译该文件。
- 如果源路径是文件夹,查找其中所有可翻译的文件(pdf、docx、pptx、xlsx等)
- 如果未找到可翻译的文件,告知用户并终止流程。
Step 4: Translate each file
步骤4:翻译每个文件
Write and execute a single Python script that handles the entire translation workflow for all files. This avoids shell variable issues (e.g. is read-only in zsh) and is more reliable than chaining curl commands.
statusThe Python script should:
python
import requests, time, sys, os
API_KEY = "<API_KEY>"
BASE = "https://api.bluente.com/api/20250924/blu_translate"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
FILES = [<list of absolute file paths>]
FROM_LANG = "en" # or other source language code
TO_LANG = "<target svcCode>"
OUTPUT_DIR = "<output directory>"
os.makedirs(OUTPUT_DIR, exist_ok=True)
results = []
for filepath in FILES:
filename = os.path.basename(filepath)
ext = filename.rsplit(".", 1)[-1].lower()
to_type = {"pdf": "pdf", "docx": "word", "doc": "word", "pptx": "pptx"}.get(ext, ext)
print(f"Translating: {filename}")
# Upload
with open(filepath, "rb") as f:
r = requests.post(f"{BASE}/upload?glossary=0&engine=3", headers=HEADERS, files={"file": f})
resp = r.json()
if resp.get("code") != 0:
print(f" Upload failed: {resp}")
results.append((filename, False, "Upload failed"))
continue
task_id = resp["data"]["id"]
print(f" Task ID: {task_id}")
# Wait for processing
for _ in range(40):
r = requests.get(f"{BASE}/check?entry=get_status&id={task_id}", headers=HEADERS)
st = r.json()["data"]["status"]
if st == "SERVICE_PROCESSED":
break
if st == "ERROR":
print(f" Processing error")
results.append((filename, False, "Processing error"))
break
time.sleep(3)
else:
results.append((filename, False, "Processing timeout"))
continue
if st == "ERROR":
continue
# Start translation
r = requests.post(f"{BASE}/translate?engine=3", headers=HEADERS,
json={"id": task_id, "action": "start", "from": FROM_LANG, "to": TO_LANG})
resp = r.json()
if resp.get("code") != 0:
print(f" Translation start failed: {resp.get('message')}")
results.append((filename, False, f"Start failed: {resp.get('message')}"))
continue
# Wait for translation
for _ in range(120):
r = requests.get(f"{BASE}/check?entry=get_status&id={task_id}", headers=HEADERS)
st = r.json()["data"]["status"]
if st == "READY":
break
if st == "ERROR":
print(f" Translation error")
results.append((filename, False, "Translation error"))
break
time.sleep(5)
else:
results.append((filename, False, "Translation timeout"))
continue
if st == "ERROR":
continue
# Download
r = requests.get(f"{BASE}/download?id={task_id}&to_type={to_type}", headers=HEADERS)
out_path = os.path.join(OUTPUT_DIR, filename)
with open(out_path, "wb") as f:
f.write(r.content)
print(f" Saved: {out_path}")
results.append((filename, True, out_path))编写并执行单个Python脚本,处理所有文件的完整翻译工作流。这可以避免shell变量问题(例如zsh中是只读变量),并且比链式调用curl命令更可靠。
statusPython脚本应包含以下内容:
python
import requests, time, sys, os
API_KEY = "<API_KEY>"
BASE = "https://api.bluente.com/api/20250924/blu_translate"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
FILES = [<list of absolute file paths>]
FROM_LANG = "en" # or other source language code
TO_LANG = "<target svcCode>"
OUTPUT_DIR = "<output directory>"
os.makedirs(OUTPUT_DIR, exist_ok=True)
results = []
for filepath in FILES:
filename = os.path.basename(filepath)
ext = filename.rsplit(".", 1)[-1].lower()
to_type = {"pdf": "pdf", "docx": "word", "doc": "word", "pptx": "pptx"}.get(ext, ext)
print(f"Translating: {filename}")
# Upload
with open(filepath, "rb") as f:
r = requests.post(f"{BASE}/upload?glossary=0&engine=3", headers=HEADERS, files={"file": f})
resp = r.json()
if resp.get("code") != 0:
print(f" Upload failed: {resp}")
results.append((filename, False, "Upload failed"))
continue
task_id = resp["data"]["id"]
print(f" Task ID: {task_id}")
# Wait for processing
for _ in range(40):
r = requests.get(f"{BASE}/check?entry=get_status&id={task_id}", headers=HEADERS)
st = r.json()["data"]["status"]
if st == "SERVICE_PROCESSED":
break
if st == "ERROR":
print(f" Processing error")
results.append((filename, False, "Processing error"))
break
time.sleep(3)
else:
results.append((filename, False, "Processing timeout"))
continue
if st == "ERROR":
continue
# Start translation
r = requests.post(f"{BASE}/translate?engine=3", headers=HEADERS,
json={"id": task_id, "action": "start", "from": FROM_LANG, "to": TO_LANG})
resp = r.json()
if resp.get("code") != 0:
print(f" Translation start failed: {resp.get('message')}")
results.append((filename, False, f"Start failed: {resp.get('message')}"))
continue
# Wait for translation
for _ in range(120):
r = requests.get(f"{BASE}/check?entry=get_status&id={task_id}", headers=HEADERS)
st = r.json()["data"]["status"]
if st == "READY":
break
if st == "ERROR":
print(f" Translation error")
results.append((filename, False, "Translation error"))
break
time.sleep(5)
else:
results.append((filename, False, "Translation timeout"))
continue
if st == "ERROR":
continue
# Download
r = requests.get(f"{BASE}/download?id={task_id}&to_type={to_type}", headers=HEADERS)
out_path = os.path.join(OUTPUT_DIR, filename)
with open(out_path, "wb") as f:
f.write(r.content)
print(f" Saved: {out_path}")
results.append((filename, True, out_path))Summary
Summary
ok = [r for r in results if r[1]]
fail = [r for r in results if not r[1]]
print(f"\nDone: {len(ok)} succeeded, {len(fail)} failed")
for name, _, path in ok:
print(f" OK: {name} -> {path}")
for name, _, err in fail:
print(f" FAIL: {name}: {err}")
Fill in the API_KEY, FILES, FROM_LANG, TO_LANG, and OUTPUT_DIR variables from the user's inputs, then run the script with `python3`. Set a timeout of 600000ms (10 min) on the Bash tool call.ok = [r for r in results if r[1]]
fail = [r for r in results if not r[1]]
print(f"\nDone: {len(ok)} succeeded, {len(fail)} failed")
for name, _, path in ok:
print(f" OK: {name} -> {path}")
for name, _, err in fail:
print(f" FAIL: {name}: {err}")
根据用户输入填充API_KEY、FILES、FROM_LANG、TO_LANG和OUTPUT_DIR变量,然后使用`python3`运行脚本。将Bash工具调用的超时时间设置为600000ms(10分钟)。Step 5: Report results
步骤5:上报结果
Tell the user:
- How many files were translated successfully
- Where the translated files are saved
- Any errors that occurred
告知用户以下信息:
- 成功翻译的文件数量
- 翻译后文件的保存位置
- 发生的所有错误
API Reference
API参考
- Docs: https://www.bluente.com/docs
- Base URL:
https://api.bluente.com/api/20250924/blu_translate - Auth:
Authorization: Bearer <API_KEY> - Engines: = LLM,
3= LLM Pro4 - Source language () is required — it does NOT auto-detect
from - Language codes are custom — use the mapping above or verify via supported_languages endpoint
$ARGUMENTS
- 文档: https://www.bluente.com/docs
- 基础URL:
https://api.bluente.com/api/20250924/blu_translate - 认证方式:
Authorization: Bearer <API_KEY> - 引擎: = LLM,
3= LLM Pro4 - 源语言()为必填项——不支持自动检测
from - 语言代码为自定义格式——使用上述映射或通过supported_languages接口验证
$ARGUMENTS