From $2.50 per 1M characters

Translate the words.
Leave the code alone.

Translinga translates Shopify stores, WordPress sites and apps without touching Liquid tags, HTML or placeholders. It reads which screen each string is on, and repeats come back free.

  • Every tag checked on the way back
  • Works with your DeepL code
  • First $1 free

ENNo cap, your cart is looking fire! Spend {{ remaining_amount | money }} more to unlock <strong class="perk">free next-day shipping</strong> before this drop sells out.

DeepL APIEN → NL

Winkelmandje2 artikelen

Echt waar, je winkelmandje ziet er te gek uit! Geef nog 1250 uit om gratis verzending de volgende dag te krijgen, voordat deze drop uitverkocht is.

Subtotaal€87,50

Afrekenen

filter| geld2/3 tags

TranslingaEN → NL

Winkelmandje2 artikelen

No cap, je winkelmandje is echt fire! Bestel voor nog €12,50 en scoor gratis next-day verzending voordat deze drop uitverkocht is.

Subtotaal€87,50

Afrekenen

filter| money3/3 tags

Real output, October 27, 2026. DeepL API with its context option and HTML tag handling on.

Plugs into the store, site or codebase you already have

  • Shopify
  • WordPress
  • i18next
  • Next.js
  • Vue
  • GitHub Actions
  • Node.js
  • Python

Why translations break

What happens when a translator reads your code

Most translation tools treat code like any other words, and translate a label without knowing which screen it sits on. Three real results from the DeepL API:

  • Shopify cartDeepL, context on

    ENSpend {{ remaining_amount | money }} more

    NLGeef nog {{ remaining_amount | geld }} uitgeld is Dutch for money, and not a Shopify filter

    Bestel voor nog {{ remaining_amount | money }}the price still shows as €12,50

    Shopify skips filters it doesn't know and prints the raw amount in cents. No error shows up, so the cart looks fine until a shopper reads it.

  • RPG combat menuDeepL, context on

    ENSave

    NLOpslaansaving a file

    Reddingsworpa saving throw

    Short labels are where context matters most. In a combat menu, Save is a saving throw, not a save file, and DeepL missed it even with the context given.

  • Billing settingsDeepL, default

    ENCharge

    NLOpladencharging a battery

    Afschrijvinga charge on your card

    Without context, Charge gets one translation everywhere it appears. On a billing page, it's the wrong one.

English to Dutch through the DeepL API on October 27, 2026.

Translinga takes the code out before it translates, and reads which screen each string is on.

See how it works

How it works

Made for text that lives inside code

Store themes, app strings and game menus are full of tags and two-word labels. Translinga handles both, and remembers what it already translated.

tags locked

Code stays code, every time

Before translating, Translinga takes out everything that isn't words and puts it back untouched afterwards. Every reply is checked tag by tag, and a string that comes back with a tag missing is retried before it reaches you.

  • Shopify Liquid like {{ remaining_amount | money }} and {% if %}
  • HTML tags and their attributes, and ICU plural rules
  • Placeholders like {name}, {{count}} and %s
See the request

shipping-update.liquid

7 tags locked

ENHi {{ customer.first_name }}, your order <strong>{{ order.name }}</strong> ships {% if express %}tomorrow{% else %}within 3 days{% endif %}.

NLHoi {{ customer.first_name }}, je bestelling <strong>{{ order.name }}</strong> wordt {% if express %}morgen{% else %}binnen 3 dagen{% endif %} verzonden.

7 of 7 tags identical to the English, in Dutch

context

It knows where the words live

Write where a string lives, like checkout button or combat menu, and that note carries down to every string under it. No notes? The key names count as context, and strings from the same screen are translated together, so the wording matches.

  • A $context note covers everything nested under it
  • checkout.save and combat.save get different words
  • Strings from one screen go in together, so the tone stays the same
See a request with context

en.json

{
  "$context": "SaaS billing page, invoices and payments",
  "charge": "Charge",
  "save": "Save",
  "order": "Order"
}
EnglishTranslingaDeepL, no context
ChargeAfschrijvingOpladen
SaveOpslaanOpslaan
OrderBestellingBestelling

memory and glossary

Pay once, and keep your own terms

Every string is remembered for the context it was translated in. Send it again and it comes back in about 2 ms, free. A glossary and a do-not-translate list keep brand names, product names and your own terms the way you want them.

  • Re-run a 5,000-string file with 12 changes, and pay for 12
  • Glossary terms are used on every request, in every plugin
  • Brand and product names stay exactly as written
See the glossary request

$ npx translinga sync --to nl

en.json → nl.json5,000 strings

From memory4,988 strings, about 2 ms each
$0
Translated12 changed strings, 1,140 characters
$0.0057

Glossary

  • cartwinkelmandje
  • checkoutafrekenen

Never translated

  • Translinga
  • Box Logo

Plugins

Plug it into what you already run

No integration to build if you run a store, a blog or a normal codebase. Install it, pick your languages, and keep the setup you have.

  • Shopify app

    Translates products, collections, pages and your theme, and leaves Liquid like {{ remaining_amount | money }} and {% if %} exactly as it was.

    Translates

    • Products
    • Collections
    • Pages
    • Theme

    300 products and a theme, into 3 languages, about 900k characters$4.50 once

  • WordPress plugin

    Translates posts, pages, WooCommerce products and theme strings, and leaves HTML, shortcodes and attributes alone.

    Works with

    • WooCommerce
    • TranslatePress
    • Loco Translate
    • Polylang Pro

    50 posts and pages, into 2 languages, about 600k characters$3 once

  • CLI and GitHub Action

    Syncs your locale files on every push. Only new and changed strings get translated, the rest comes back from memory.

    $ npx translinga sync --to nl,de,fr

    Reads

    • i18next
    • next-intl
    • vue-i18n
    • Any JSON

    Re-run on 5,000 strings with 12 changed, into 3 languages$0.017

Switch from DeepL

Already using DeepL or Google Translate?

Translinga takes DeepL and Google Translate API requests as they are. If your app already calls DeepL, you switch by changing one URL and the key.

  • Same request and same response as DeepL, DeepL-Auth-Key header included
  • Works with DeepL's own Node and Python libraries
  • Google Translate v2 requests work too, on /google/language/translate/v2
import * as deepl from "deepl-node"; const translator = new deepl.DeepLClient(process.env.DEEPL_AUTH_KEY);const translator = new deepl.DeepLClient(process.env.TRANSLINGA_API_KEY, {  serverUrl: "https://api.translinga.com",}); const result = await translator.translateText("Charge", null, "nl");

API

Send JSON, or keep your DeepL code

Four endpoints, one key and one balance. Send strings or whole JSON files with context, or point the code you already have at our URL.

  • Many languages in one callSend target_lang as a list. You pay per character of the text you send, once for each language.
  • A tone that fits"No cap, your cart is looking fire!" comes back as "No cap, je winkelmandje is echt fire!", not as slang your parents used.
  • Your glossary on every callPass a glossary and a do-not-translate list, and brand and product names stay put.
  • Repeats are freeUnchanged strings in the same context come back from memory in about 2 ms, at no charge.

POSTapi.translinga.com/v1/translate

curl https://api.translinga.com/v1/translate \
  -H "Authorization: Bearer $TRANSLINGA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "target_lang": ["nl", "de"],
    "tier": "hq",
    "data": {
      "$context": "Streetwear store, cart drawer. Young, casual tone.",
      "cart": {
        "free_shipping": "Spend {{ remaining_amount | money }} more to unlock <strong>free next-day shipping</strong>.",
        "checkout": "Checkout"
      }
    }
  }'

Response200 OK in 3.2 s

{
  "translations": {
    "nl": {
      "cart": {
        "free_shipping": "Bestel voor nog {{ remaining_amount | money }} en scoor <strong>gratis next-day verzending</strong>.",
        "checkout": "Afrekenen"
      }
    },
    "de": {
      "cart": {
        "free_shipping": "Gib noch {{ remaining_amount | money }} aus und sichere dir <strong>kostenlosen Next-Day-Versand</strong>.",
        "checkout": "Zur Kasse"
      }
    }
  },
  "tags_checked": 6,
  "from_memory": 0,
  "billed_characters": 200,
  "cost_usd": 0.001
}

Pricing

Pay per character. Credit never expires.

No plans and no monthly fee. Top up from $5, and the API and every plugin draw from the same balance.

Translinga prices
FastQuick, solid translations for big catalogs$2.50per 1M characters
QualityOur strongest model, for copy people read closely$5.00per 1M characters
Repeats from memorySame string, same contextFree
Your first $1About 400k characters on FastFree
2,000,000

$10a month on Quality, no plan to pick

2 million characters a month

Into one language, at each API's list price

  1. TranslingaQuality, pay as you go$10
  2. DeepL APIGrowth plan, billed yearly$53.50
  3. Google Cloud TranslationFirst 500k characters free$30
  4. Amazon TranslateStandard, after the free tier$30
  5. Azure AI TranslatorS1, pay as you go$20

List prices in US dollars from each vendor's pricing page, checked October 28, 2026. All five charge per character, once for each language. DeepL's Growth plan is $26 a month billed yearly, with 1 million characters a month included and $27.50 per million after that.

FAQ

Questions, answered

What is Translinga?

Translinga translates online stores, websites and apps. You can use it through the Shopify app, the WordPress plugin, the command-line tool or straight through the API. There are two quality levels: Fast at $2.50 and Quality at $5.00 per million characters.

Will it break my Shopify theme?

No. Before translating, Translinga takes out Liquid tags like {{ remaining_amount | money }} and {% if %}, HTML tags and placeholders, and puts them back untouched afterwards. Every reply is checked tag by tag, and a string that comes back with a tag missing is retried before you get it.

How is it different from DeepL or Google Translate?

A general translator sees your template as plain text, so code can get translated too. In our test on October 27, 2026, the DeepL API turned {{ remaining_amount | money }} into {{ remaining_amount | geld }} with its context option and HTML tag handling on, and Shopify then shows a raw number instead of a price. Translinga keeps code away from the translator and reads which screen a string is on. 2 million characters a month cost $10 on Quality, against $53.50 on DeepL's API Growth plan.

Can I switch from DeepL without rewriting my code?

Yes. Translinga accepts DeepL API requests as they are, DeepL-Auth-Key header included. If you use DeepL's own Node or Python library, set its server URL to https://api.translinga.com and put your Translinga key where the DeepL key was. Google Translate v2 requests work too.

How does context work?

Add a "$context" note anywhere in a JSON file, like "checkout button" or "fantasy RPG, combat menu", and it carries down to every string under it. Without notes, the key name still counts, so checkout.save and combat.save get different translations. Strings from the same screen are translated together, so the wording matches.

Does the WordPress plugin work with TranslatePress, Polylang or Loco Translate?

Yes. TranslatePress, Polylang Pro and Loco Translate can already use DeepL, and the Translinga plugin sends those DeepL requests to Translinga instead. You keep the multilingual setup you have and only swap the translator.

Which languages can I translate into?

Translinga takes the same language codes as the DeepL and Google Translate APIs, so code that already sends them keeps working. You can send several target languages in one request.

What counts as a character, and how does billing work?

Every character of the text you send, spaces included, once for each language you translate into. You top up prepaid credit from $5, it never expires, and your first $1 is free. Strings you already translated in the same context come back from memory at no charge.

Can I keep brand names untranslated?

Yes. A do-not-translate list keeps brand and product names exactly as written, and a glossary makes a word always translate one way, like cart into winkelmandje. Both apply to every request, through the API and the plugins.

Start free

Try it on your messiest theme file

Your first $1 is free, about 400k characters on Fast. No card needed for a key.

Printed proof sheets marked up in blue pencil, with one word struck through in red, on a dark navy desk