Getting started

Proxylang Guide

How to set up Proxylang, make translations better, and get found in other languages. Developer material is at the end.

Start here

Getting started

Four steps from a new account to a translated site. The script tag is the default and works on every platform.

WhereSetup

Set up in four steps

  1. Add your site

    Go to Setup and type your website address. Pick the platform it runs on.

  2. Pick languages

    Choose your site's own language, then the languages you want to add. Your plan sets how many.

  3. Install

    Pick how the script tag gets onto your site. Let AI do it: paste our message into ChatGPT, Claude or Cursor. Do it yourself: copy one line and publish. Or send it to your developer: we write the email. WordPress sites use the plugin.

  4. Check your site

    The wizard confirms the script is live. A language switcher appears on your site.

Install guides by platform:

Choose how Proxylang connects

The script tag is the default and works everywhere. The other modes add search-engine visibility in other languages. You change modes later on the domain's Setup tab; nothing goes offline when you switch.

Script tag

VisitorSearch engineYour serverProxylangsentences

Search engines read your original site.

Hybrid

VisitorSearch engineYour serverProxylangsentences

Search engines get translated pages.

DNS Proxy

VisitorSearch engineYour serverProxylang

Everyone gets translated pages.

Green arrow: traffic that goes through Proxylang. Dotted line: Proxylang reads your server behind the scenes.

Script tag

Every plan, every platform

Translation happens in the visitor’s browser. Search engines still see your original language.

Best for:Apps, pages behind a login, and any site builder.

WordPress plugin

WordPress sites

Installs the script for you and adds per-language addresses, SEO tags and sitemaps without touching DNS.

Best for:Any WordPress or WooCommerce site.

Hybrid

Lite plan and above, sites built with code

One DNS change. Search engines get translated pages from Proxylang. Visitors keep the script tag.

Best for:Marketing sites you want found in other languages.

DNS Proxy

Pro plan and above, sites built with code

Every visitor gets translated pages from Proxylang, at translated addresses like /es-es/about.

Best for:Sites that want full translated URLs for everyone, with no script.

How a page gets translated

With the script tag, the page loads from your server as usual. The script then asks Proxylang for the translation of each sentence and swaps it in. The first visit to a page translates as you watch. Every later visit is instant, because the translation is saved.

1Page loads from your server as usual2The script sends each sentence to Proxylang3Proxylang translates it and saves the result4The translated text is swapped innext visit: saved copy, instant
The first visit to a page translates as you watch. Every later visit uses the saved copy.

With DNS Proxy or Hybrid mode, Proxylang sits between the visitor (or the search engine) and your server:

  1. A visitor opens a translated addressyourdomain.com/es-es/page

  2. Proxylang fetches the original page from your server

  3. AI translates the visible text

    Layout and code stay exactly as they were.

  4. The translated page is saved and served

    The next visitor gets it instantly.

  5. SEO tags are added

    Language links, canonical address and more.

Short addresses also work. /es/about and /mx/about both redirect to /es-es/about.

If nothing changes on your site

  • Open your site in a private window and use the language switcher. Your own browser may have a language remembered.
  • Check the script is on every page, not only the home page. Your platform guide shows where it goes.
  • Turn off ad blockers for a moment. Some block third-party scripts.
  • Nothing at all, even after a refresh? Your site may have a Content Security Policy. See the developer section at the end of this guide.

Make translations better

Brand & context

Tell the translator who you are. Five minutes here does more for quality than anything else in this guide.

WhereDomains › your domain › Brand & Context

What to fill in

  • Brand Name. Your name in your site's language and in English. It is kept exactly as written in every language.
  • Site Description. Two or three sentences: what you sell, who reads the site, the tone you want. Example: "Online shop for Korean skincare. Customers are women 25 to 40. Friendly, not formal." This also helps translate visitors' search queries.
  • Landing Pages. Pick up to 20 pages (your home page, pricing) where headlines and calls to action should read like native marketing copy rather than a word-for-word translation.
  • Translation Formality. Formal, casual or automatic. This one is chosen when you add the domain and cannot be changed later, because every saved translation depends on it.

When it takes effect

Click Save Brand & Context . New translations use the new context within the hour. Text that was already translated keeps its wording. To redo a page you can fix individual sentences in the Live Editor.


Glossary & never-translate list

Decide how a word must be translated, once, for every page.

WhereGlossary

Your terms

  • A term is a word or phrase in your site's language, its translation, and the language it applies to. Add one with Add Term . Tick case sensitive if "Apple" and "apple" should be treated differently.
  • Terms apply everywhere the phrase appears. Up to 5,000 terms per domain.
  • Have a list already? Use Import with a CSV file. Columns: source_text, target_text, source_lang, target_lang, case_sensitive, notes . Export gives you the same format back.
  • Tick rows and click Delete Selected to remove many at once.

Timing

New terms reach the translation servers within about ten minutes. Text that was already translated keeps its old wording until it is translated again. To check a page, open it in a private window so your browser does not show you a saved copy.

Never translate

The Never Translate card at the top of the glossary holds words that must stay exactly as written in every language: your brand, a product name, a hashtag. Up to 100 entries of 60 characters each. Matching is case sensitive, so add "iPhone", not "iphone".

AI improvements

Proxylang reviews the translations on your site on a schedule and proposes small fixes. Approved fixes are added to your glossary as terms marked AI , with the reason and the wording they replaced. You can delete any of them.

  • Turn the review off for a domain with the switch in the AI Improvements card. Terms already added stay until you delete them.
  • A sentence you edited in the Live Editor is never changed by an AI improvement. Your edit wins.


Live Editor

Fix a translation on your own site: click the sentence, type, save. Included on every plan.

WhereLive Editor, or press Esc twice on your site

Edit a translation

  1. Go to Live Editor , pick the domain and click Start editing . Your site opens in a new tab with the editor bar on it. Shortcut: on any page of your site, press Esc twice and click Open editor .
  2. Switch the site to the language you want to fix.
  3. Click any text. A panel shows the Original and the Translation . Change the translation and click Save .
  • You see your change at once. Other visitors see it within about five minutes.
  • Your edit always wins. Proxylang will not overwrite it, and neither will AI improvements.
  • Changed your mind? Open the same text and click Reset to automatic translation .
  • Some text has placeholders like {0} for a link or bold word. Keep them in your translation, in any order.
  • Only verified domains you own appear in the Live Editor.

Invite a translator

A translator does not need a Proxylang account. They sign in on your site and can edit translations, nothing else.

  1. On the Live Editor page, find Invite a translator . Type their email.
  2. Under Can edit , leave All languages or pick only the languages they should touch.
  3. Click Send invite . A password appears once . Copy it now, or click Email them to open a ready-made email. Nothing is sent automatically.
  • The translator opens your site, switches language, presses Esc twice and signs in with that email and password.
  • To remove someone, hover their row in the translator list and click the ×. They are locked out at once.
  • The editor bar and panels are available in English, Korean, Japanese, Spanish, German, French, Italian and Portuguese.


Control what gets translated

Keep brand names, coupon codes and reviews in the original language, or pause translation altogether.

WhereYour HTML, or Domains › your domain › Advanced

Keep something in the original language

Some text should never change: a brand name, a coupon code, a quote, reviews written by customers. You have three tools, from no code to some code.

  • A single word or name, everywhere. Add it to the Never Translate list in the glossary. No code.
  • A block on a page. Add the proxylang-no-translate class to the element. Everything inside it is skipped. See below.
  • A whole file or region. Wrap it in the comment markers. See below.

Skip a block with a class

Add the class proxylang-no-translate to any element. The attribute data-proxylang-no-translate does the same thing. Works in every mode.

HTML
<!-- Everything inside is left in the original language -->
<div class="proxylang-no-translate">
  <h2>Brand Name™</h2>
  <p>SAVE20 is your coupon code.</p>
</div>

<!-- The attribute form does the same -->
<span data-proxylang-no-translate>Acme Corp</span>

Skip a region with comments

Useful when you cannot add a class, or for text inside JavaScript files. Everything between the two markers is skipped.

HTML
<!-- @proxylang-do-not-translate-start -->
<div class="testimonial">
  Customer reviews stay exactly as written.
</div>
<!-- @proxylang-do-not-translate-end -->
JavaScript
// @proxylang-do-not-translate-start
const message = "This string is never translated"
// @proxylang-do-not-translate-end

Skipped for you

  • Code samples inside <pre> and <code> , in every mode. Syntax highlighters that render into those tags (Shiki, highlight.js, Prism) are covered. Code editors that render into a plain <div> (CodeMirror, Monaco) are not; add the class to their wrapper.
  • <kbd>, <var> and <samp> when Proxylang translates on the server (DNS Proxy and Hybrid).
  • Legal pages at standard addresses. See the Legal pages section.
  • Email addresses, URLs, numbers and prices.

Skip for search engines only

Sometimes you want search engines to index the original wording (a tagline, a slogan you rank for) while visitors still read it translated. Use the bot-only markers. They only apply where Proxylang serves pages to bots, so DNS Proxy and Hybrid mode. On the script tag alone they do nothing.

HTML
<!-- Search engines index the original wording.
     Visitors still see it translated. -->
<h2 class="proxylang-bot-only-no-translate">Our Brand Tagline</h2>

<!-- Attribute form -->
<p data-proxylang-bot-only-no-translate>Ranked slogan</p>

<!-- Comment form, for a larger region -->
<!-- @proxylang-bot-only-do-not-translate-start -->
<section>...</section>
<!-- @proxylang-bot-only-do-not-translate-end -->

Pause everything

Two switches on the domain's Advanced tab stop new translations without removing anything from your site. Text that was already translated keeps showing.

  • Pause Translations. Humans. Visitors see cached translations only. New pages stay in the original language. Use it while you look into a cost spike or a quality problem.
  • Pause Translations. Bots. Same, for search engines and AI crawlers. Stops SEO spend without touching what visitors see.
  • Also on that tab: Preserve Line Breaks keeps line breaks where the original has them. DNS Proxy mode only.


Get found in search

SEO in other languages

Get the translated pages found. Proxylang adds the tags search engines look for and gives you one page to watch it.

WhereSEONeedsLite plan or above

The SEO page

Open SEO and pick a site. It needs the Lite plan or above. The Keywords and Page Titles tabs also need Hybrid or DNS Proxy mode, because on the script tag alone search engines never see translated titles.

Health
A score from 0 to 100 and a to-do list. It checks that search engines can reach your translated pages, that the right tags are on them, and that setup is finished.
Keywords
Type up to 20 phrases your customers search for, in your own language. Proxylang writes a matching set for every other language and uses them for your home page title and description. You can give a pricing or campaign page its own set.
Page Titles & Descriptions
See the title and description each language really shows in search results, and pin your own wording for any page. A pin is exact and final for that page and language. Too long? Click Shorten.
Settings
Bot translation budget, which pages go in the sitemap, and a switch to stop SEO tags while you test.
  • Google Search Console. The Health checklist has a "Connect Google Search Console" step. It pulls Google's own indexing data into the Health tab. Available once Hybrid or DNS Proxy is on.
  • Naver and Daum. If Korean is one of your languages, a card lists the four manual steps those engines need. Tick each one off as you go.
  • AI answers. A second checklist covers listings that help ChatGPT, Gemini and Perplexity recommend you: Wikidata, Google Business Profile and, for software, G2 and Product Hunt.

Tags added to every translated page

  • Language links (hreflang) that tell search engines which page is which language.
  • A canonical address per language, so translations are not seen as duplicates.
  • The page's language tag, for Bing and Baidu.
  • Social preview locale, so shared links show the right language.

Applies in Hybrid and DNS Proxy mode, where search engines get pages from Proxylang. On the script tag alone, they read your original site.

Show an example
What a page's head contains
<link rel="alternate" hreflang="en-US" href="https://example.com/page" />
<link rel="alternate" hreflang="es-ES" href="https://example.com/es-es/page" />
<link rel="alternate" hreflang="fr-FR" href="https://example.com/fr-fr/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/page" />
<link rel="canonical" href="https://example.com/es-es/page" />
<meta property="og:locale" content="es_ES" />

Titles, descriptions and image text

The page title, meta description, social preview title and description, and keywords are translated. So are image alt texts, button tooltips and form placeholders. Pin your own wording for any page on the Page Titles & Descriptions tab.

Rich results

If your pages carry structured data (the hidden product, article, FAQ or event details that power rich results in Google), the text fields are translated and the language field updated. Prices, dates, URLs and identifiers are left alone.

Sitemaps

Proxylang builds a sitemap per language and lists them all at /sitemap.xml on your domain. Pages come from your own sitemap, plus pages Proxylang has seen. Each language also has its own file, such as /es-es/sitemap.xml . They refresh daily; click Regenerate sitemap on the SEO Settings tab to rebuild now.

Show an example
/sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap><loc>https://example.com/sitemap-1.xml</loc></sitemap>
  <sitemap><loc>https://example.com/es-es/sitemap.xml</loc></sitemap>
  <sitemap><loc>https://example.com/fr-fr/sitemap.xml</loc></sitemap>
</sitemapindex>

Choose which pages are in the sitemap

On the SEO Settings tab, under Sitemap Pages :

  • All pages. The default.
  • Only specific paths. Start with a few pages, add more later.
  • Exclude paths. Hide a section, such as /internal/*.

One path per line. * matches anything, so /blog/* covers every blog post. The home page is always included. Subdomains use their root domain's setting.

Telling search engines about new pages

  • Bing, Yandex, Naver, Seznam and Yep are told the moment a translated page is saved. DuckDuckGo, Ecosia and Qwant use Bing's index. Nothing to set up.
  • Google does not take pings. It finds your pages through the sitemap and the language links. Connecting Search Console lets you watch it happen.
  • Your robots.txt is served with the sitemap lines added. Your own rules are kept.

AI search engines

  • robots.txt allows GPTBot, ChatGPT-User, ClaudeBot, PerplexityBot and Google-Extended.
  • A /llms.txt file describes your site and lists its languages and sitemaps for AI tools that look for one.
  • AI bots get translated pages only in Hybrid or DNS Proxy mode. They are counted under the bot budget like any other crawler.

Language in every address

In DNS Proxy mode, visitors normally see clean addresses and their language is remembered in a cookie. Turn on URL Language Prefix (domain → Advanced tab) and every visitor sees the language in the address, like /es-es/about . Search results, ads and analytics then always point at one clear version of each page.

DNS Proxy mode only. Subdomains follow their root domain.


Hybrid mode (SEO for search engines)

Search engines get translated pages from Proxylang while your visitors keep the script tag.

WhereDomains › your domain › SetupNeedsLite plan or above, site built with code

What it does

The script tag translates pages in the visitor's browser. Search engines do not run that script, so they only see your original language. Hybrid mode fixes that.

Search engines and AI bots

Get a fully translated page from Proxylang. Google, Bing, Naver, ChatGPT, Perplexity and link previews (Slack, LinkedIn, Facebook) are on the list.

Your visitors

Get your site exactly as today, translated by the script tag. Your hosting, analytics and A/B tests are untouched.

Sites on Wix, Squarespace, Webflow and similar builders cannot change DNS this way, so they stay on the script tag.

How to turn it on

There is no "Hybrid" switch. Hybrid is what you get when DNS Proxy and Script Tag are both on for the same domain.

  1. Open your domain, then the Setup tab

    Domains → your domain → Setup.

  2. Turn on DNS Proxy

    Add the DNS records we show you at your domain registrar, then verify. This is the step that lets search engines reach Proxylang.

  3. Keep Script Tag on

    Your visitors keep using the script tag you already installed.

  4. Done

    With both on, the domain badge reads "Hybrid (SEO)". Turn either off and the site drops back to the other mode with no downtime.

What it costs

Bot visits use words from your balance, at a quarter of the normal rate. Three limits keep a runaway crawl from draining it. You can lower each one on the SEO page under Settings.

Bot requestlimit 1Words todayover:original pagelimit 2Budget for this pageover:original pagelimit 3Visits today (unverified)over:original pageTranslated pageGoogle, Bing, Apple, DuckDuckGo, Yandex skip limit 3.

Words per day for bots

Once reached, bots get your original language until midnight UTC. Set it to 0 to stop bot translation entirely.

Start
3,000
Pro+
20,000

Budget per page

How much of one page a bot visit may translate, in AI tokens (about 2.7 per word). Default 4,000. Title, description and headings never count.

Start
8,000
Pro+
50,000

Visits per day, unverified bots

Google, Bing, Apple, DuckDuckGo and Yandex are verified by their network address and are not limited. Everything else shares this cap.

Start
5
Pro+
10
Free of charge. Bots that bring no visitors (SEO scrapers, uptime checkers) always get the original page and cost nothing.

When to use it

  • You want your pages to rank in other languages.
  • You want AI search tools to quote your translated pages.
  • You do not want Proxylang in the path of real visitors. Hybrid keeps them on your own server.

Pages behind a login gain nothing from Hybrid. Keep those on the script tag.


Multiple sites & subdomains

Add subdomains for free and more root domains on Start and above. All sites share one word balance.

WhereDomains

What you can add

  • Subdomains of a site you already added (app.yourdomain.com, shop.yourdomain.com). Free on every plan. They do not count toward your domain limit.
  • Separate root domains (yourdomain.com and yourapp.io). Needs the Start plan or above, which carries as many as you like. Test Drive and Lite cover one site.

All your sites share one word balance. A second site does not add words; it draws from the same pool.

If you move to a smaller plan later, nothing goes offline. You keep every site you already added. You just cannot add more until you are back under the limit.

What a subdomain inherits

A subdomain follows its root domain. It gets the same connection mode, languages, sitemap settings and Advanced-tab switches. You set those once on the root.

If the root uses DNS Proxy or Hybrid mode, each subdomain also needs its own DNS records. The app shows the exact records to add: four for a root domain (the bare domain, www, and two verification records), two for a subdomain.

Which mode for which site

Marketing site or landing page

Hybrid mode

You want it found in other languages. Use Hybrid if your plan and site allow it (Lite plan or above, site built with code). Otherwise the script tag still translates it for visitors.

App or customer portal

Script tag

Pages behind a login are never indexed, so there is no search benefit to chase. No DNS change, nothing in the traffic path.

Features

Live Chat

A chat bubble that translates both ways. One subscription, every site, unlimited agents.

WhereDomains › your domain › Live ChatNeedsIncluded from Start up. 14-day trial on Test Drive and Lite

What it does

A chat bubble on your site. Visitors write in their language. You read and answer in yours. Both sides are translated as they go. One subscription covers every site on your account, with as many agents as you like.

Turn it on

Open the domain, go to the Live Chat tab and flip the switch. The bubble appears on your site and the site shows up in your chat console at Chat .

  • On Start and above, chat is already included with your plan. Nothing to buy and no trial to start.
  • On Test Drive and Lite, every account gets one 14-day trial with 2,000 translated messages. No card needed. The trial is per account, not per site.
  • When nobody is online, visitors see "We are away" and can leave their email. You answer by email from the console. Turn this off in widget settings if you prefer.

Add your team

  1. On the Live Chat tab, in the Agents card, type a teammate's email and click Invite . Seats are free and unlimited.
  2. They get a link, good for seven days. They enter the name visitors will see and the language they want to read chats in.
  3. They see that site's conversations only, marked "Shared". No settings, no billing.

Remove someone with the Remove button on their row.

Answering chats

  • The console has three panes: conversations, the open chat, and visitor details (page they are on, country, past chats).
  • Having the console open makes you "Online". Click the pill to go "Away"; visitors then get the offline form.
  • Type / in the reply box for quick replies (hello, order, refund, shipping).
  • You can send images up to 10 MB. Edit a sent message and the visitor's translation is redone.
  • If a teammate is already answering, your reply box locks so the visitor never gets two answers.
  • Under Chat settings → Widget , set the bubble colour, position, greeting and the name visitors see. The greeting is shown as written and is not translated yet.

Desktop and mobile apps

The Downloads page has the desktop app for macOS, Windows and Linux. It gives you alerts and unread badges with the browser closed, and updates itself. iPhone and Android apps are listed as coming soon.

Signing in opens your normal browser for a moment, then returns to the app. That is expected.

What each plan includes

Only translated messages count. Same-language messages are free. The monthly allowance is shared across your sites and resets on the 1st.

Start
Live Chat includedChat · 2,000 translated messages/mo
Pro
Live Chat includedChat Plus · 10,000 translated messages/mo
Business and above
Live Chat includedChat Scale · 50,000 translated messages/mo
  • Test Drive and Lite include no chat plan beyond the trial. Bigger chat plans are a monthly add-on, priced on the Live Chat page.
  • At the limit, chat keeps running but messages arrive untranslated and new conversations wait until the 1st. A chat already in progress always finishes.
  • Hiding the "Powered by Proxylang" line in the chat window needs the Pro plan or above.


Image translation

Redraw the text inside banners and product images in the visitor's language.

WhereDomains › your domain › Image TranslationsNeedsImage credits (prepaid)

Setup

1. Buy credits

Image translation is on for every domain. Your credit balance is the only gate. Buy a pack from Billing . Packs are valid for 12 months.

10 images
$5 / ₩7,000
$0.50 per image
50 images
$20 / ₩28,000
$0.40 per image
100 images
$35 / ₩49,000
$0.35 per image

2. Choose which images to translate

Only images you pick are translated. Three ways, easiest first:

  • Live Editor. Open your site, press Escape twice, sign in, click Image Translation in the editor bar and tap the images. Works on any platform.
  • Paste image addresses. On the domain's Image Translations tab, use Auto-Translate Images by URL . Good for site builders where you cannot edit HTML.
  • Tag the HTML. Add data-pl-translate-image to the image tag.
HTML
<!-- Only tagged images are translated -->
<img src="/hero-banner.png" data-pl-translate-image alt="Welcome" />

<!-- Any image source works -->
<img src="https://cdn.example.com/promo.jpg" data-pl-translate-image />

What happens and what it costs

  • The first visitor in a language sees the original image. Translation runs in the background, usually under two minutes, then the translated image replaces it on the page without a refresh.
  • Every visitor after that gets the translated image instantly. It is kept forever.
  • One credit per image, per language. The same banner in Korean and Japanese costs two credits.
  • Images whose longer side is over 2000px cost two credits per language. Tall product detail images usually fall in this group.
  • Visitors reading your site in its own language never use credits.

Works in every mode. With the "paste image addresses" method, the matching runs in the visitor's browser, so it needs the script tag (script tag or Hybrid mode).

What to translate

Translate these

  • Banners with text on them
  • Infographics and charts with labels
  • Product images with printed details
  • Screenshots with on-screen text

Do not tag these (still charged)

  • Photos with no text
  • Logos and icons
  • SVG files and GIFs

PNG, JPG and WebP are supported. Very large files are scaled down before translation. 33 target languages are supported; the list is on the domain's Image Translations tab.


Search translation

Translate what visitors type into your search box, so they get results in any language.

WhereDomains › your domain › AdvancedNeedsSearch credits (prepaid). Script tag or Hybrid mode

Setup

1. Buy searches

Paid with prepaid search credits. Buy a pack from Billing . Packs never expire.

10,000 searches
$9.99 / ₩13,900
50,000 searches
$39.99 / ₩55,900
200,000 searches
$139.99 / ₩194,000

2. Turn it on per domain

Open the domain, go to the Advanced tab and switch on Translate Search Queries . The switch stays off until you have credits. It can take up to five minutes to reach your live site, so wait before testing.

How it works

If your search box is a normal form, or its field is named q, query, search, keyword, term or s, it works with no changes. When the visitor presses Enter, Proxylang translates the query and your search receives the translated text.

A search form that just works
<form action="/search" method="GET">
  <input type="search" name="q" />
  <button type="submit">Search</button>
</form>
  • Runs from the script tag, so it works in script tag and Hybrid mode. Not on DNS Proxy-only sites.
  • Visitors reading your site in its own language are not affected and use no credits.
  • Each search uses one credit, including repeats. Translated queries are remembered per domain, so repeats are instant.
  • If translation takes longer than 4.5 seconds, the original query is sent through instead. Visitors never wait on a spinner.

Search boxes that filter a list on the page

Some search boxes never send anything to a server. They filter a list already on the page (a FAQ, a product grid). Those need one attribute on the input:

HTML
<!-- Translate when the visitor presses Enter (default) -->
<input type="text" placeholder="Search..." data-proxylang-reverse-search />

<!-- Translate as they type, after a short pause -->
<input type="text" placeholder="Search..." data-proxylang-reverse-search="live" />

By default the query is translated when the visitor presses Enter. Add ="live" to translate as they type, after a short pause. Live mode uses more credits, one per pause.

Help the translation with context

A one-word query can mean many things. Proxylang uses the Site Description from your Brand & Context tab to pick the right meaning. For one specific search box you can override it with data-proxylang-search-context="..." on the input (up to 240 characters).

Tips

  • Keep Enter mode unless your search really needs results while typing. It costs a fraction of live mode.
  • Write a clear Site Description. "Korean skincare shop" gives better query translations than "our website".
  • Test in a private window with the site switched to another language.

Known limits

  • Queries over 200 characters are passed through untranslated.
  • When credits reach zero, searches pass through untranslated. Buying a pack turns it back on within a minute.
  • For developers: searches sent by form.submit() in code are not intercepted; use a normal submit. For fetch requests, only the query parameters and top-level JSON fields are translated. GraphQL requests are skipped.


Language switcher look & feel

Everything about the language menu visitors see: where it sits, how it looks, when it shows.

WhereLanguage Switcher

What you can change

Activate Switcher
The on/off switch for the widget on this site. Also holds a test key for trying the script on your own computer.
Layout
Floating in a corner, or inline where you place it. Starting corner. Whether visitors can drag it.
Appearance
Button size, menu size, corner shape, shadow, and whether languages show as "EN", "English" or both.
Colors
Six ready-made themes, or your own colours for light and dark mode.
Behavior
Shrink to an icon after a few seconds, menu animation, and a soft fade when translated text appears.
Branding
Hide the "Translation by Proxylang" line in the menu. Start plan and above.
Loading Indicators
A spinner, a thin bar at the top, both, or nothing while a page translates.
Dark Mode Detection
Follow the visitor's system setting, or tell Proxylang which CSS class your site uses for dark mode.
Advanced
Stacking order, the width at which the mobile layout kicks in, and the right-to-left auto-flip switch.

Changes reach your site within seconds, five minutes at most. If you do not see them, refresh the page.

Which language a visitor gets first

There is nothing to set. On the first visit, Proxylang looks at the languages the visitor's browser prefers and picks the best match among the languages you enabled. If none match, it uses the visitor's country, and then your site's own language. After that, the visitor's choice is remembered for a year.

To test another language, open your site in a private window, or add ?lang=ko-KR to the address.

Put the switcher in your own menu

Under Layout, choose Inline and place <div id="proxylang-widget"></div> where the switcher should appear, for example in your header. For a second spot in a mobile menu, add <div id="proxylang-widget-mobile"></div> as well.

Your account

Analytics & usage

See who visits in which language, and where your words go.

WhereDashboard › Analytics

Who visits, in which language

The Analytics tab on your dashboard shows visitors, visits, pages, where people came from, their country and device, and the share who read a translated version. No cookies are used; visitors are counted from a scrambled fingerprint that cannot be turned back into an address.

  • A visit ends after 30 minutes without activity.
  • Bots are hidden by default, and so is your own traffic from a development machine. Use the Filter button to show them.
  • Detailed records are kept for 90 days.
  • The Visitor Map shows the same data on a world map.

Where your words go

The Dashboard tab shows how much of your plan you have used. The Metrics and Pages tabs break it down by day, language and page.

  • A sentence costs words once, the first time it is translated for your site. Showing it again is free.
  • Bot visits in Hybrid and DNS Proxy mode count at a quarter of the rate. The chart shows "Visitor words" and "Bot words" separately.
  • A page view is one page opened by a real visitor in a translated language. Bots, visitors reading the original language, and your own testing on localhost do not count.
  • You get an email at 75%, 90% and 100% of your allowance.


Plans, billing & credits

What each plan includes, what happens at the limit, and how credits and codes work.

WhereBilling

What a plan gives you

Every plan has a word allowance, a monthly page-view allowance, a number of languages and a number of sites. The word allowance is a total, not a monthly amount: a sentence is only counted the first time it is translated, and it stays translated after that. Each language counts separately: a 500-word page opened in three languages uses 1,500 words. On Start and above, visitors can pick any of the 77 languages, and the plan sets how many of them search engines index. Crawlers fetch every indexed language, so those are the languages that spend words without a visitor.

Words: a total that fills up once

each new sentence is counted once, then never again

Page views: reset on the 1st

one count per page a visitor opens in a translated language
Both are shared across all your sites.

Test Drive

Words (total)
2,000
Page views / month
1,500
Languages
1
Sites
1

Lite

Words (total)
20,000
Page views / month
15,000
Languages
5
Sites
1

Start

Words (total)
100,000
Page views / month
50,000
Languages
All 77 (3 indexed)
Sites
Unlimited

Pro

Words (total)
500,000
Page views / month
150,000
Languages
All 77 (10 indexed)
Sites
Unlimited

Business

Words (total)
2,500,000
Page views / month
750,000
Languages
All 77 (25 indexed)
Sites
Unlimited
  • Global, Enterprise and Custom plans are arranged through the Custom card on the pricing page.
  • Lite and above add per-language SEO and Hybrid mode. Pro and above add DNS Proxy mode.
  • Words used up. New text stays in the original language until you upgrade. Text already translated keeps showing, and the language switcher keeps working. There is no overage charge.
  • Page views used up. The same happens for one month, then the whole site is served in its original language until the next month or an upgrade.
  • Bot visits in Hybrid and DNS Proxy mode count at a quarter of the rate.
  • Yearly billing is ten months for twelve.
  • Moving to a smaller plan never takes a site offline. You keep what you have and cannot add more until you fit.

Changing or cancelling

  • Open Billing and pick a plan under Available Plans . A change takes effect at once. The price difference is settled on your next invoice.
  • New subscriptions on Start or Pro (monthly, paid in USD, outside Korea) start with a 14-day free trial.
  • Korean customers pay in KRW through KG이니시스, with VAT shown separately. Yearly Korean plans are a one-time payment you renew by hand. Cancel with the 해지 button; you keep access to the end of the period.
  • Every charge and receipt is under Payment History at the top of the Billing page.

Image and search credits

Paid plans include a one-time batch of credits the first time you subscribe: Lite 2 images and 500 searches, Start 10 images and 2,000 searches, Pro 30 images and 2,000 searches, Business and Global 100 images and 2,000 searches. Moving up a plan adds only the difference. Included credits never expire and are granted once per account, not once per upgrade.

If you run out, buy more as prepaid packs on the Billing page, on the Image Translation page, or on the Reverse Search page. Packs are shared across your sites. Purchased image packs are valid for 12 months and you get an email 30 days before one expires; purchased search packs never expire.

The purchase opens in a new tab. Your balance on the Billing page refreshes when you come back to it.

Promo codes

  • Outside Korea there is no code box. Your discount is attached to your account and applied at checkout on its own.
  • In Korea, the code box is on the Billing page while you are on the free plan. Codes apply to the first payment only.
  • Discounts do not stack. The largest one wins.

Refer a friend

Your link is on the Referral page. A friend who signs up through it gets 15% off their first plan. When they subscribe, your next monthly payment is 50% off, once per friend. The link is remembered for 90 days. Packs do not count, plans do.

For developers

Attribute reference, JavaScript API and events, Live Chat API, Content Security Policy, right-to-left languages.

Attribute reference

For developers

Every class, attribute and comment marker Proxylang reads from your HTML.

Browser means the script tag and pages visitors load in Hybrid mode. Server means pages Proxylang renders for search engines in Hybrid mode and for everyone in DNS Proxy mode. Both means both.

Skip

class="proxylang-no-translate"Both
Skip this element and everything inside it.
data-proxylang-no-translateBoth
Same as the class.
class="notranslate"Browser
Google’s standard skip class. Honoured as well.
translate="no"Browser
The HTML standard skip attribute. Honoured as well.
data-pl-skipBrowser
Short form of the skip attribute.
<!-- @proxylang-do-not-translate-start --> … <!-- @proxylang-do-not-translate-end -->Server
Skip a region of HTML. JS files use the same words after //.
class="proxylang-bot-only-no-translate"Server
Keep the original wording for search engines only. Visitors still get the translation.
data-proxylang-bot-only-no-translateServer
Attribute form of the bot-only skip.
<!-- @proxylang-bot-only-do-not-translate-start --> … <!-- @proxylang-bot-only-do-not-translate-end -->Server
Comment form of the bot-only skip.

Hint

data-pl-context="…"Server
A hint for the translator about this element (“button label”, “product name”).
data-pl-max-chars="N"Server
Keep the translation at or under N characters. Useful for fixed-width buttons.
data-proxylang-search-context="…"Browser
Context for translating what visitors type in this search box.

Force

data-pl-retranslate="token"Both
Translate this element again, bypassing every cache. Change the token to trigger it. Must be switched on for your domain by Proxylang support.
data-no-url-path-langBrowser
On the script tag itself. Your own router owns /xx-xx/ paths, so Proxylang will not read the language from the URL.

Features

data-pl-translate-imageBoth
Translate the text in this image. See Image translation.
data-proxylang-reverse-searchBrowser
Translate what visitors type in this search box. See Search translation.
class="proxylang-flip-on-rtl"Both
Mirror this element for right-to-left languages.
data-pl-no-rtl-fixBoth
Leave this element out of the right-to-left animation fixes.

Also skipped without markers: <pre> and <code> everywhere; <kbd>, <var> and <samp> on the server; <script>, <style>, <svg>, <math>, form inputs and iframes.


JavaScript API and events

For developers

Read the active language, build your own switcher, react to changes.

window.Proxylang

Available in script tag, Hybrid and DNS Proxy mode.

MethodReturnsDescription
getCurrentLanguage()stringActive language code, e.g. "ko-KR".
getBaseLanguage()stringThe site’s own language.
getLanguages()ArrayEnabled languages as { code, english, native, isBase }. Empty until the config has loaded.
setLanguage(code)Promise<void>Switch language. Navigates the page. Unknown codes are ignored with a console warning.
isReady()booleanTrue once the widget has initialised.
onReady(fn)voidRuns fn when ready, or at once if already ready.
isTranslated()booleanTrue once the first translation pass has finished.
onTranslated(fn)voidRuns fn when the first pass finishes, or at once if it already has.
onLanguageChange(fn)() => voidRuns fn on every switch. Returns a function that unsubscribes.
JavaScript
window.Proxylang.getCurrentLanguage()  // "ko-KR"
window.Proxylang.getBaseLanguage()     // "en-US"
window.Proxylang.getLanguages()
// [{code: "en-US", english: "English", native: "English", isBase: true},
//  {code: "ko-KR", english: "Korean", native: "한국어", isBase: false}, ...]

window.Proxylang.setLanguage("fr-FR")  // navigates

proxylang:ready

Fired on document once the widget has initialised. detail carries language and baseLanguage .

JavaScript
window.Proxylang.onReady(() => {
  console.log(window.Proxylang.getCurrentLanguage())
})

document.addEventListener('proxylang:ready', (e) => {
  console.log(e.detail.language, e.detail.baseLanguage)
})

proxylang:translated

Fired on document exactly once per page load, when the first translation pass has finished. It never fires again, not for added content or client-side navigation. It is guaranteed within about five seconds; if the safety cap fires first, detail.timedOut is true and language may be null. Use it to remove a loading overlay.

JavaScript
document.addEventListener('proxylang:translated', (e) => {
  console.log(e.detail.language)      // "ko-KR", or null if timedOut
  console.log(e.detail.baseLanguage)  // "en-US"
  console.log(e.detail.timedOut)      // true if the 5s cap fired first
  document.getElementById('loading-overlay')?.remove()
})

// Same thing, callback style. Runs at once if already finished.
window.Proxylang.onTranslated(() => { /* ... */ })

proxylang:languagechange

Fired on document when the visitor switches language, with detail.language . Callbacks run before the page navigates, so an analytics call may not finish sending. Use your analytics library's beacon or "transport: beacon" option.

JavaScript
// Returns a function that unsubscribes
const stop = window.Proxylang.onLanguageChange((lang) => {
  navigator.sendBeacon('/analytics', JSON.stringify({ event: 'language_change', lang }))
})

// Or listen for the DOM event
document.addEventListener('proxylang:languagechange', (e) => {
  console.log(e.detail.language)
})

// Later, e.g. when a component unmounts
stop()

Debugging

  • Add ?proxylang_debug=1 to any page address to get verbose logs in the console.
  • In DNS Proxy mode a proxylang:translating event fires on window with detail.loading true or false around each re-translation.
  • Framework apps: the script waits for hydration before touching the page. If your app re-renders text after that, the observer picks it up and translates it.


Live Chat JavaScript API

For developers

Put text in the chat window, open it from your own buttons, and tell your team who the visitor is.

$proxylang

The chat loads with your Proxylang script tag. Send it commands by pushing them onto window.$proxylang . Commands pushed before the chat has loaded wait and run in order once it has.

  • The commands use the same format as Crisp's $crisp . A page already wired to Crisp moves over by renaming $crisp to $proxylang .
  • Commands the chat does not know are ignored. They never throw an error on your page.
  • $proxylang.get() and $proxylang.is() exist only after the chat has loaded. Before that, $proxylang is a plain array.
JavaScript
// Safe to run before the chat has loaded. Commands wait, then run in order.
window.$proxylang = window.$proxylang || []
$proxylang.push(['do', 'chat:open'])

Put text in the chat window

CommandWhat it does
['set', 'message:text', [text]]Fills the reply box. The visitor can edit it and presses send themselves. Nothing reaches your team until they do.
['do', 'message:show', ['text', text]]Shows a message from your team in the chat. Only this visitor sees it, only on this page. It is not sent to your team or saved, and a reload removes it.
['do', 'message:send', ['text', text]]Sends a message as the visitor. Your team gets it in the console, translated like any other message.
  • Text is capped at 4,000 characters. Empty text is ignored.
  • message:text and message:show appear exactly as you write them. They are not translated. Pick the text for the visitor's language yourself with window.Proxylang.getCurrentLanguage() .
  • A message:show message while the window is closed adds to the unread count on the chat bubble.
JavaScript
// A "Request a quote" button: open the chat with a message ready to send
function requestQuote() {
  $proxylang.push(['set', 'message:text', ['Hi, I would like a quote for the Pro plan.']])
  $proxylang.push(['do', 'chat:open'])
}

// A message from your team, shown only to this visitor on this page
$proxylang.push(['do', 'message:show', ['text', 'Questions about plans? Ask us here.']])

// A message sent as the visitor. Your team gets it in the console.
$proxylang.push(['do', 'message:send', ['text', 'I need help with order #1042']])

Open and close

CommandWhat it does
['do', 'chat:open']Opens the chat window.
['do', 'chat:close']Closes it.
$proxylang.is('chat:opened')True while the window is open.

Tell your team who the visitor is

Your team sees these in the visitor pane of the chat console. To make an email verified, sign it on your server with the secret from Chat settings › Widget › Verified visitor emails . The signature is the HMAC-SHA256 of the email, as hex.

CommandWhat it does
['set', 'user:email', [email, signature]]The visitor’s email. Add the signature to mark it verified.
['set', 'user:nickname', [name]]The name your team sees.
['set', 'user:avatar', [url]]Picture address. https only.
['set', 'user:phone', [phone]]Phone number.
['set', 'user:company', [name, { url, description }]]Company name, with an optional website and description.
['set', 'session:data', [[[key, value], ...]]]Up to 32 key/value pairs. Values are text, numbers or true/false.
['set', 'session:event', [[[name, data, colour]]]]Adds entries to the visitor’s timeline. Colour is red, orange, yellow, green, blue, purple, pink, brown, grey or black.
$proxylang.get('user:email')Reads back a value you set. Works for every user: key and for session:data.
['do', 'session:reset']Starts a new visitor in this browser. Call it when a user signs out, so the next person to sign in does not see their chats or take over their email.
JavaScript
$proxylang.push(['set', 'user:email', [user.email, signature]])
$proxylang.push(['set', 'user:nickname', [user.name]])
$proxylang.push(['set', 'user:company', ['Acme', { url: 'https://acme.com' }]])

// Key/value pairs shown in the visitor pane
$proxylang.push(['set', 'session:data', [[['plan', 'pro'], ['orders', 3]]]])

// Timeline entries: name, optional data, optional colour
$proxylang.push(['set', 'session:event', [[['checkout-failed', { total: 120 }, 'red']]]])

// When the user signs out: start a new visitor in this browser
$proxylang.push(['do', 'session:reset'])

// Once the chat has loaded
$proxylang.get('user:email')
$proxylang.is('chat:opened')


Content Security Policy

For developers

Most sites do not have a Content Security Policy. If nobody set one up for your site, skip this section.

Do you need this?

A CSP is a rule list that tells the browser which scripts and servers a page may use. If your site has one, it can block Proxylang. The sign: translations never appear and there is no error on the page. Open the browser console (F12) and look for a line starting with Refused to and mentioning Content Security Policy.

Script tag and Hybrid mode

The script loads from proxy.proxylang.dev and Live Chat from chat.proxylang.dev . It also fetches translations, swaps in translated images and adds a few inline styles. Add these sources to your existing policy:

HTTP header
# Add these sources to your existing policy.
# script-src:  the Proxylang script, plus 'unsafe-inline' for the small styles/scripts it injects
# connect-src: translation, image and chat requests (wss:// is the Live Chat socket)
# img-src:     translated images are served from Proxylang storage
Content-Security-Policy:
  script-src  'self' https://proxy.proxylang.dev https://chat.proxylang.dev 'unsafe-inline';
  style-src   'self' 'unsafe-inline';
  connect-src 'self' https://proxy.proxylang.dev https://chat.proxylang.dev wss://chat.proxylang.dev;
  img-src     'self' data: https:

Same rules as a meta tag, if that is how your site sets its policy:

HTML meta tag
<meta http-equiv="Content-Security-Policy"
  content="script-src 'self' https://proxy.proxylang.dev https://chat.proxylang.dev 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://proxy.proxylang.dev https://chat.proxylang.dev wss://chat.proxylang.dev; img-src 'self' data: https:">

DNS Proxy mode

Translations are added on the server, so most policies work as they are. Only a policy that blocks all inline scripts needs a change: Proxylang adds small inline scripts that keep translations in place while the page loads.

HTTP header
# Only needed if your policy blocks all inline scripts:
Content-Security-Policy: script-src 'self' 'unsafe-inline'


Right-to-left languages

For developers

Arabic, Hebrew, Persian and Urdu read right to left. Proxylang flips the layout for you.

What happens automatically

When a visitor picks a right-to-left language, Proxylang sets dir="rtl" on the page so text, menus and layout mirror. When an Arabic or Hebrew site is shown in English, it sets dir="ltr" and overrides any CSS that pins the direction, so the layout flips back.

  • Any right-to-left target gets dir="rtl", even if the source is already right-to-left.
  • Left-to-right to left-to-right leaves the page untouched.
  • In script tag and Hybrid mode the page paints in its original direction first and flips once the script runs. DNS Proxy mode flips on the server with no flash.

To turn the flip off for a domain, use the switch on the Language Switcher page. It only becomes active once a right-to-left language is enabled on that domain.

Mirror an arrow or icon

Directional graphics (a "next" arrow, a back icon) do not mirror on their own. Add the proxylang-flip-on-rtl class to any element that should.

HTML
<!-- Mirrored when the page is right-to-left -->
<img src="/arrow-next.svg" class="proxylang-flip-on-rtl" />

<svg class="proxylang-flip-on-rtl">...</svg>

Animation fixes and opting out

Some animations look wrong when mirrored. Proxylang adds CSS fixes for the common ones: progress bars and loading bars fill from the right, tickers and marquees keep their scroll direction, carousels and sliders keep working, and NProgress bars stay at the top edge.

If one of those fixes breaks something on your site, add data-pl-no-rtl-fix to that element and Proxylang leaves it alone. The one exception is NProgress, which is styled by its own class and cannot be excluded this way.

For your own CSS, two variables follow the reading direction: --pl-transform-origin-start and --pl-transform-origin-end .