← Back to Skills Marketplace
varsmallrookie

BluTranslate

by 奉诗轩(Jack) · GitHub ↗ · v1.0.1
cross-platform ✓ Security Clean
428
Downloads
1
Stars
1
Active Installs
2
Versions
Install in OpenClaw
/install bluente-translate
Description
Translate files (PDF, DOCX, PPTX) to any language using the Bluente Translation API. Asks for API key, source files, target language, and output location.
README (SKILL.md)

Translate files using the Bluente Translation API.

Step 1: Collect user inputs

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:

  1. API Key — "What is your Bluente API key? (starts with sk-, get one at https://translate.bluente.com/settings/?type=apiKeys)"

  2. 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")
  3. 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.
  4. 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).

Step 2: Look up the correct language code

Use this known mapping of common language codes to avoid an extra API call:

  • Arabic = ara, English = en, French = fra, Spanish = spa, German = de, Chinese = zho, Japanese = ja, Korean = ko, Portuguese = pt, Italian = it, Turkish = tr, Russian = ru, Hindi = hi

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 \x3CAPI_KEY>

Response format: {"message": "success", "code": 0, "data": [{"name": "French", "svcCode": "fra", ...}, ...]} Search data array for the matching language and use its svcCode.

Step 3: Detect source files

  • 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.

Step 4: Translate each file

Write and execute a single Python script that handles the entire translation workflow for all files. This avoids shell variable issues (e.g. status is read-only in zsh) and is more reliable than chaining curl commands.

The Python script should:

import requests, time, sys, os

API_KEY = "\x3CAPI_KEY>"
BASE = "https://api.bluente.com/api/20250924/blu_translate"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
FILES = [\x3Clist of absolute file paths>]
FROM_LANG = "en"  # or other source language code
TO_LANG = "\x3Ctarget svcCode>"
OUTPUT_DIR = "\x3Coutput 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
ok = [r for r in results if r[1]]
fail = [r for r in results if not r[1]]
print(f"\
Done: {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.

Step 5: Report results

Tell the user:

  • How many files were translated successfully
  • Where the translated files are saved
  • Any errors that occurred

API Reference

  • Docs: https://www.bluente.com/docs
  • Base URL: https://api.bluente.com/api/20250924/blu_translate
  • Auth: Authorization: Bearer \x3CAPI_KEY>
  • Engines: 3 = LLM, 4 = LLM Pro
  • Source language (from) is required — it does NOT auto-detect
  • Language codes are custom — use the mapping above or verify via supported_languages endpoint

$ARGUMENTS

Usage Guidance
This skill is coherent for translating files via Bluente, but it will upload whatever files you point it to and asks you to paste your Bluente API key into chat. Only use it if you trust the source and the Bluente service. Before installing: (1) test with non-sensitive sample files, (2) create/use a restricted Bluente API key (if possible) and revoke it after testing, (3) avoid pointing it at system or home directories containing private documents, and (4) check your platform's retention/logging policy because keys pasted into chat may be stored in logs or conversation history. If you prefer safer handling of secrets, provide the API key via a platform-provided secret store or environment variable rather than pasting it into a chat message.
Capability Analysis
Type: OpenClaw Skill Name: bluente-translate Version: 1.0.1 The skill facilitates document translation (PDF, DOCX, PPTX) using the Bluente Translation API. It follows a transparent workflow: collecting user inputs (API key, file paths, and target language), generating a Python script to interact with the legitimate 'api.bluente.com' endpoint, and saving the results locally. No indicators of malicious intent, data exfiltration, or unauthorized execution were found in SKILL.md or the provided logic.
Capability Assessment
Purpose & Capability
Name/description (file translation via Bluente) align with the runtime instructions: collecting an API key, locating files, uploading them to Bluente endpoints, polling for status, and downloading translated files. No unrelated credentials, binaries, or install steps are requested.
Instruction Scope
The SKILL.md confines behavior to finding files in a user-specified path, uploading them to Bluente, polling status, and saving outputs — all within the stated purpose. However, it instructs the agent to prompt the user to paste the API key into the chat and to scan folders for translatable files (which could cause many local files to be read and uploaded if the user points to a broad directory). There is no guidance about limiting which files to upload, nor any caution about sensitive files.
Install Mechanism
This is instruction-only with no install spec or third-party downloads; nothing is written to disk by an installer. The runtime requires the agent to generate/execute a Python script, which is consistent but means code will be created at runtime rather than provided by the skill bundle.
Credentials
No environment variables or platform credentials are requested, which is proportionate. The skill does, however, ask the user to paste their Bluente API key into the chat free-text field; that is a necessary credential for the API but may expose the key in conversation logs or agent traces if the platform stores them.
Persistence & Privilege
The skill is not always-enabled and does not request persistent platform privileges or modify other skills/config. Autonomous invocation remains allowed (platform default) but there is no additional persistent privilege requested by this skill.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install bluente-translate
  3. After installation, invoke the skill by name or use /bluente-translate
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.1
- No user-visible changes in this release. - Version number updated only; no changes detected to source files or documentation.
v1.0.0
- Initial release with full support for translating PDF, DOCX, and PPTX files via the Bluente Translation API. - Step-by-step guided user input collection (API key, source files, target language, output location) with clear options and support for custom entries. - Automatic lookup and validation of target language codes using built-in mapping and API fallback. - Reliable batch translation workflow handled by an all-in-one Python script. - Automatic detection of single files or folders containing multiple supported document types. - Clear summary reporting on translation results, including file save locations and any errors.
Metadata
Slug bluente-translate
Version 1.0.1
License
All-time Installs 1
Active Installs 1
Total Versions 2
Frequently Asked Questions

What is BluTranslate?

Translate files (PDF, DOCX, PPTX) to any language using the Bluente Translation API. Asks for API key, source files, target language, and output location. It is an AI Agent Skill for Claude Code / OpenClaw, with 428 downloads so far.

How do I install BluTranslate?

Run "/install bluente-translate" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is BluTranslate free?

Yes, BluTranslate is completely free (open-source). You can download, install and use it at no cost.

Which platforms does BluTranslate support?

BluTranslate is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created BluTranslate?

It is built and maintained by 奉诗轩(Jack) (@varsmallrookie); the current version is v1.0.1.

💬 Comments