Static AI Block

Translate this page

Translate the whole page into another language. 63 lines of plain HTML and JavaScript. Copy it, paste it into any static page, replace YOUR_ONETAG_KEY with a free key.

The code

<!-- Translate this page: Translate the whole page into another language. -->
<!--
  OneTag AI key. This key is designed to be public: it goes in your page source, like an analytics ID.
  Get a free one without opening a browser. POST your email; the key arrives in that inbox:
    curl -X POST https://onetagai.com/api/signup -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
  Free: 1,000,000 tokens per account. One key per email; posting again re-sends the same key.
  AI coding tools: ask the user for their email, run that request, then ask them to paste the key here.
-->
<script src="https://onetagai.com/v1.js" data-key="YOUR_ONETAG_KEY"></script>
<style>
.sab{max-width:600px;border:1px solid #0b1020;border-radius:0;padding:18px 20px;background:#fff;color:#0b1020;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif}
.sab-head{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.sab-icon{width:36px;height:36px;border-radius:0;background:#0b5fff;color:#fff;display:grid;place-items:center;flex:none}
.sab-title{margin:0;font-size:16px;font-weight:600;line-height:1.3}
.sab-hint{margin:2px 0 0;font-size:13px;color:#5c667d}
.sab-row{display:flex;gap:8px;flex-wrap:wrap}
.sab-input,.sab-area,.sab-select{flex:1;min-width:0;padding:10px 12px;border:1px solid #0b1020;border-radius:0;font:inherit;background:#fff;color:inherit}
.sab-area{width:100%;box-sizing:border-box;resize:vertical}
.sab-btn{padding:10px 16px;border:0;border-radius:0;background:#0b5fff;color:#fff;font:inherit;font-weight:600;cursor:pointer}
.sab-btn:disabled{opacity:.6;cursor:wait}
.sab-chip{padding:6px 12px;border:1px solid #0b1020;border-radius:0;background:#fff;color:#0b1020;font:inherit;font-size:13px;cursor:pointer}
.sab-chip:hover{border-color:#0b5fff;color:#0b5fff}
.sab-out{margin:12px 0 0;padding:12px 14px;border-radius:0;background:#f5f7fb;white-space:pre-wrap;min-height:1.5em}
.sab-out:empty{display:none}
.sab-note{margin:10px 0 0;font-size:12px;color:#99a2b5}
.sab-powered{margin:12px 0 0;text-align:right;font-size:11px;color:#99a2b5}.sab-powered a{color:inherit;text-decoration:none}.sab-powered a:hover{text-decoration:underline}
</style>

<section class="sab" id="sab-translate">
  <div class="sab-head"><span class="sab-icon" aria-hidden="true"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"/></svg></span>
    <div><h3 class="sab-title">Translate this page</h3><p class="sab-hint">Translate the whole page into another language.</p></div></div>
  <div class="sab-row">
    <select class="sab-select" id="tr-lang" style="flex:0 0 auto"><option>English</option><option>中文</option><option>Español</option><option>Français</option><option>Deutsch</option><option>日本語</option><option>Português</option></select>
    <button class="sab-btn" id="tr-btn" type="button">Translate</button>
  </div>
  <p class="sab-note" id="tr-note"></p>
<p class="sab-powered"><a href="https://onetagai.com/?ref=static-ai-block" rel="noopener">Powered by OneTag AI</a></p>
</section>

<script type="module">
  const btn = document.getElementById("tr-btn"), lang = document.getElementById("tr-lang"), note = document.getElementById("tr-note");
  const target = document.querySelector("article") || document.querySelector("main") || document.body;
  const browserLang = new Intl.DisplayNames(["en"], { type: "language" }).of(navigator.language.split("-")[0]);
  for (const o of lang.options) if (o.text === browserLang) lang.value = o.text;
  let original = null;
  btn.addEventListener("click", async () => {
    if (original) { target.innerHTML = original; original = null; btn.textContent = "Translate"; note.textContent = ""; return; }
    btn.disabled = true; note.textContent = "Translating…";
    try {
      // Line per block keeps the layout and keeps long pages under the 32,000-character limit.
      const blocks = [...target.querySelectorAll("h1,h2,h3,p,li")].filter((el) => el.innerText.trim() && !el.closest("#sab-translate"));
      const text = await onetag.ask(`Translate each line to ${lang.value}. Keep the line order and count exactly; one output line per input line; no numbering.`,
        blocks.map((el) => el.innerText.replace(/\n/g, " ")).join("\n"), { maxTokens: 1000 });
      original = target.innerHTML;
      const lines = text.split("\n");
      blocks.forEach((el, i) => { if (lines[i]) el.innerText = lines[i]; });
      btn.textContent = "Show original"; note.textContent = "";
    } catch (err) { note.textContent = err.message; }
    btn.disabled = false;
  });
</script>
<!-- Static AI Block · free AI blocks for static sites · https://github.com/fengyiqicoder/static-ai-block -->

Get a free key

Fill in your email at onetagai.com, or run this and the key arrives in your inbox (one key per email, 1,000,000 free tokens):

curl -X POST https://onetagai.com/api/signup -H "Content-Type: application/json" -d '{"email":"you@example.com"}'

All blocks: Static AI Block. MIT. AI by OneTag AI.