Title: LangRelay – AI Translation &amp; Multilingual
Author: langrelay
Published: <strong>April 29, 2026</strong>
Last modified: October 17, 2026

---

Search plugins

![](https://ps.w.org/langrelay/assets/banner-772x250.png?rev=3723561)

![](https://ps.w.org/langrelay/assets/icon-256x256.gif?rev=3723571)

# LangRelay – AI Translation & Multilingual

 By [langrelay](https://profiles.wordpress.org/langrelay/)

[Download](https://downloads.wordpress.org/plugin/langrelay.2.11.2.zip)

 * [Details](https://kea.wordpress.org/plugins/langrelay/#description)
 * [Reviews](https://kea.wordpress.org/plugins/langrelay/#reviews)
 *  [Installation](https://kea.wordpress.org/plugins/langrelay/#installation)
 * [Development](https://kea.wordpress.org/plugins/langrelay/#developers)

 [Support](https://wordpress.org/support/plugin/langrelay/)

## Description

LangRelay is a WordPress translation plugin that makes your site multilingual. AI
translates your pages, posts, and products. You review and approve each translation
in the LangRelay Dashboard, and your site serves it at its own address, with hreflang
tags and a language switcher handled automatically.

Most translation plugins stop at the words on the page. LangRelay also translates
your meta titles and descriptions and gives every translated page its own address,
so your site gets found in every market you sell in.

#### What you get

 * **AI translations you approve.** Machine translation drafts each page, and nothing
   goes live until it has been approved in the LangRelay Dashboard.
 * **An address for every language.** Each translated page lives under its language
   prefix, like `yoursite.com/nl/about-us`, and you can set its address in that 
   language, like `yoursite.com/nl/over-ons`, in the LangRelay Dashboard.
 * **Automatic hreflang.** Hreflang and canonical tags are set on every translated
   page for you. No manual setup.
 * **Translated SEO metadata.** Meta titles, descriptions, and OG tags in your page’s
   HTML translate alongside the page, whichever plugin writes them.
 * **Language switcher.** A language menu or list with flags and language names,
   in one of four styles. A plain list of links is rendered with the page, so visitors
   without JavaScript and search engines still see every language. Available as 
   a Gutenberg block, Elementor widget, shortcode, an HTML snippet, items in your
   menus, or as a floating switcher in the corner you choose.
 * **WooCommerce pages.** Product and shop pages translate like any other page once
   their translation is approved.
 * **Visitors offered their language.** A visitor who reads one of your languages
   is offered the page in it, or, if you choose, taken there when they arrive. Set
   it in the LangRelay Dashboard.

#### Why a multilingual WordPress site matters

 * English is only 16% of the internet. The other 84% is your addressable market.
 * Google ranks translated pages separately. A multilingual site can multiply your
   organic traffic without adding new content.
 * AI search engines (ChatGPT, Perplexity, Gemini) increasingly answer questions
   in the user’s native language. Without translated pages, you don’t show up.

#### How it works

 1. Install the plugin, go to **Settings > LangRelay**, and click **Connect to LangRelay**.
    Sign in to LangRelay, or create your account right there, approve the connection
    in the LangRelay Dashboard, and you’re returned to your site, connected.
 2. Pick the languages you want, in the LangRelay Dashboard.
 3. Review and approve translations in the LangRelay Dashboard. Once a page’s translation
    is activated, your site serves it at its own address, with the language switcher,
    hreflang and canonical tags taken care of.

That’s it. No content duplication, no manual translation interface, no separate 
posts to manage.

#### Multilingual SEO done right

LangRelay handles the SEO work that usually takes hours per language:

 * `hreflang` and `x-default` tags on every translated page and its original
 * Canonical tags pointing to the correct language version
 * An address of its own for each language version, under its language prefix
 * Translated meta titles, descriptions, and Open Graph tags

Search engines understand which language to serve to which visitor. AI models cite
your site across markets.

#### What makes LangRelay different

Nothing goes live without your approval. Every translated page is approved in the
LangRelay Dashboard before your site serves it, and your site serves exactly the
translation that was approved.

The same sentence is translated once. If it appears on 500 pages, like a line in
your footer, LangRelay translates it once and reuses that translation wherever it
appears.

#### Switching from another translation plugin?

Coming from a service like Weglot, or a manual translation plugin like WPML or Polylang?
Two things change:

 * **You stop maintaining translations by hand.** There are no duplicate posts or
   separate editors to keep in sync. LangRelay applies approved translations to 
   your pages as they are served, so your content lives in one place.
 * **You approve before anything goes live.** Each page’s translation is reviewed
   and approved in the LangRelay Dashboard, and your site serves exactly what was
   approved.

Keep your content and keep your domain.

#### Pricing

Plans and prices are at [langrelay.com/pricing](https://langrelay.com/pricing).

#### Meet Relay

Relay is the AI assistant in the LangRelay Dashboard. Ask it about your Site, and
it can start machine translation for a page, fetch a page again after you have changed
it, or suggest a better translation for a sentence you have selected. Approving 
and publishing translations stay with you.

#### External services

**LangRelay API**

This plugin connects your site to the LangRelay API (`api.langrelay.com`) over HTTPS.
It never sends your page content.

What is sent: the one-time connection code when you connect; your site’s address,
WordPress and plugin versions and an installation ID when connecting and in an hourly
health check, which also says whether WooCommerce is installed, which version, and
whether it is active (no other plugin is named); after you save content, the address
of each published page you saved, or that a menu, category or tag, or your site 
title, tagline or theme changed, with the time and the installation ID; after WordPress,
an active plugin or your theme is updated, its name and its old and new version 
numbers; when a translated page had to be shown in its original language because
your site’s page layout changed, which page and language, and how much of the translation
still fitted; when you erase a customer’s personal data under Tools > Erase Personal
Data, that customer’s profile key (see revenue below); and this site’s connection
credential with every request.
 What is received: the languages your site is translated
into, and the approved translations of your pages, which the plugin caches on your
site; and, for Settings > LangRelay, your LangRelay plan, this month’s word usage
and welcome grant, the pages waiting to be translated (with their titles and addresses)
and the plan that would translate them now, with its price and a link to the LangRelay
Dashboard. When: when you connect, once an hour, about a minute after you save content,
within ten minutes of an update or of a translated page shown in its original language(
each page at most once every six hours), and on visitor page requests at most once
per refresh interval (one minute by default) or when an approved translation changes;
your site’s languages and its translations’ versions are also checked once an hour,
with the health check. Your plan and usage only when an administrator opens Settings
> LangRelay: at most once every five minutes, or a minute later when LangRelay could
not be reached. A profile key to delete when you erase a customer’s personal data,
and again later if LangRelay could not be reached.

**LangRelay API, from your visitors’ browsers**

On every page of your site while your Site counts page views (otherwise only on 
pages with the language switcher, on translated pages and, while Visitor language
is on, on every page that has a translation), a small script that ships with this
plugin talks to the LangRelay API (`api.langrelay.com`) from the visitor’s browser.
It reads your site’s languages on every such page, and on a translated page the 
approved translations it needs to translate text that appears after the page loads,
such as a mini-cart. It also counts the page view for your Site’s visitor analytics
in the LangRelay Dashboard. The script is served from your site, never from LangRelay.
It follows your Site’s Dynamic content setting in LangRelay, which is on by default.

What is sent to read translations: your site’s public key, which is printed in the
page and is not a password, and on a translated page its language and which part
of your site’s translations it needs (a version and a part number).
 What is sent
to count a page view: your site’s public key; the page’s address on your site, without
any query string; the visitor’s language as your site names it; whether the page
was shown translated, could have been, or was read in the original language; and,
when another website’s link brought the visitor, that website’s domain name only.
Never the page’s text or title, any cookie, the full address of the page the visitor
came from, or any identifier, except the profile key of a customer signed in to 
your shop while revenue tracking is on (see revenue below). What LangRelay works
out from a page view: the visitor’s country, the kind of device, browser and operating
system, and a visitor code that changes every day, so the same visitor cannot be
recognised from one day to the next (a signed-in customer’s profile key is the one
exception). The visitor’s IP address and browser details are used only for that 
and are never stored. Counting a page view stores nothing on the visitor’s device.
Individual page views are kept for three months; after that only totals remain. 
What is received: your site’s languages and, on a translated page, the approved,
live translations of your site’s text in that language and the addresses of its 
translated pages. Nothing is received for a page view. When: translations, when 
a visitor opens a page, unless their browser already has a fresh copy. Page views,
once for each page a visitor opens. No page view is sent when the visitor’s browser
has Global Privacy Control or Do Not Track turned on. None is sent either for people
signed in with a role left out under Settings  LangRelay  Advanced (administrators
and editors by default). Turning page-view counting off: it is on by default. Switch
off **Visitor analytics** under your Site’s Settings  Analytics in the LangRelay
Dashboard, and counting stops within about a minute. LangRelay’s [Privacy Policy](https://langrelay.com/privacy)
and [Data Processing Agreement](https://langrelay.com/dpa) describe how this data
is handled.

**Visitor language, in your visitors’ browsers**

While your Site’s Visitor language is Suggest (the default) or Redirect in the LangRelay
Dashboard, the same script compares the visitor’s browser languages with the languages
each page is translated into. With Suggest, a visitor who reads one of them is offered
the page in their language. With Redirect, a visitor who arrives from another website
is taken to the page in their language before it shows, and told so. It sends nothing
to LangRelay or anyone else for this, the small file that shows the suggestion is
served from your site, and it never runs for search engines or for people signed
in who can edit posts.

What is stored, in the visitor’s browser only:

 * `localStorage["langrelay:language"]`: the language the visitor chose, with the
   date. Written only after they click a choice in the suggestion, in the notice
   after a redirect, or in the language switcher. Kept for one year, then deleted.
 * `sessionStorage["langrelay:redirected"]`: the language of the page an automatic
   redirect left. Written just before the redirect, and deleted by the next page
   as soon as it opens.

Neither ever leaves the visitor’s device, and no cookie is set. To turn it off, 
set Visitor language to Off under your Site’s Settings  WordPress in the LangRelay
Dashboard.

**The “Powered by LangRelay” link**

The language switcher’s menu and the language suggestion show a “Powered by LangRelay”
link to langrelay.com, on by default (a paid plan can turn it off in the LangRelay
Dashboard). Nothing is sent unless a visitor clicks it.

What is sent: when a visitor clicks it, langrelay.com opens in a new tab with your
site’s domain name, whether the link was in the switcher or the suggestion, and 
your site’s public key in its address, so LangRelay can tell which site the visit
came from. The page the visitor was on is not sent.
 When: only when a visitor clicks
the link.

**LangRelay API, for your shop’s revenue (WooCommerce)**

When WooCommerce is active and you switch on revenue tracking under your Site’s 
Settings  Analytics in the LangRelay Dashboard, your site tells the LangRelay API(`
api.langrelay.com`) what happens to its orders, so the Dashboard can show your revenue
and the language each order came from. It is sent from your site’s server, never
from the shopper’s browser. Revenue tracking is off by default, and nothing is sent
while it is off.

What is sent: for each order placed at checkout, paid, refunded or cancelled, the
order’s ID, what happened, the amount (the order’s total, or the refund’s amount)
with its currency, when it happened, and the language the shopper browsed in (the
language of the checkout page, or else of the page they last added a product from,
which WooCommerce keeps in the shopper’s existing cart session; no new cookie); 
for the order of a customer signed in to your shop, their profile key (below); with
this site’s connection credential and installation ID. For an order placed at checkout,
also the shopper’s IP address and browser details as WooCommerce recorded them, 
which LangRelay turns into that day’s visitor code and never stores. Never the shopper’s
name, email address, postal address, phone number, customer account, or what they
bought.
 What is received: whether each order event was recorded. When: about a 
minute after an order is placed, paid, refunded or cancelled, in batches, and again
later if LangRelay could not be reached. Orders are kept while your Site exists;
the visitor code on an order is removed 90 days after the order. Turning it off:
switch off revenue tracking under your Site’s Settings  Analytics in the LangRelay
Dashboard; your site stops sending within about a minute and drops what it had not
sent yet.

Customers signed in to your shop: while revenue tracking is on, the plugin gives
each customer who is signed in to your shop a pseudonymous profile key, so the Dashboard
can show which pages your customers came in on before they ordered. Your site’s 
server computes the key from the customer’s account number in your shop and a secret
LangRelay hands it; it is never computed from an email address and does not name
the customer. The key is printed in the pages that customer views, sent with their
page views and with their orders, and links that customer’s visits across days. 
Never for guests, for people signed in with a role left out under Settings  LangRelay
Advanced, or, when the WP Consent API plugin is installed, for a visitor who has
not consented to statistics. LangRelay keeps the key on page views for three months
and on orders for as long as the order. When you erase a customer’s personal data
under Tools > Erase Personal Data, the plugin asks LangRelay to remove their key
from their orders, and computes no key for them again. LangRelay receives no name,
email address or customer number with it.

**LangRelay Dashboard**

When you click **Connect to LangRelay**, your browser is sent to the LangRelay Dashboard(`
app.langrelay.com`) to approve the connection, and back to your site afterwards.

What is …

## Screenshots

[⌊The LangRelay Dashboard shows how far each language is translated and which pages
are out of date.⌉⌊The LangRelay Dashboard shows how far each language is translated
and which pages are out of date.⌉[

The LangRelay Dashboard shows how far each language is translated and which pages
are out of date.

[⌊When a page's content changes, the edit is caught and queued for translation.⌉⌊
When a page's content changes, the edit is caught and queued for translation.⌉[

When a page’s content changes, the edit is caught and queued for translation.

[⌊Review each translation before it goes live, with your glossary applied.⌉⌊Review
each translation before it goes live, with your glossary applied.⌉[

Review each translation before it goes live, with your glossary applied.

## Blocks

This plugin provides 2 blocks.

 *   LangRelay Language Switcher Display a language switcher for your translated
   site.
 *   Languages Every language your site is translated into, as items of this navigation
   menu.

## Installation

 1. Upload the `langrelay` folder to `/wp-content/plugins/`.
 2. Activate through **Plugins** in WordPress.
 3. Go to **Settings > LangRelay** and click **Connect to LangRelay**. Sign in to LangRelay,
    or create your account right there, approve the connection in the LangRelay Dashboard,
    and you’re returned to your site, connected.
 4. Pick your languages in the LangRelay Dashboard, then approve and activate your 
    pages’ translations. Your site starts serving each one within about a minute of
    activation (a full-page cache can hold the previous version until it expires).

There’s nothing else to set up: approving the connection binds your installation
to a Site in the LangRelay Dashboard, and your languages are chosen there.

Can’t be redirected back to your site (staging, localhost)? Paste a connection code
from the Dashboard instead, under **Connect manually with a code** on the Settings
> LangRelay page.

## FAQ

### What does this plugin do?

It makes your WordPress site multilingual. AI translates your pages, you approve
the translations in the LangRelay Dashboard, and your site serves each one at its
own address, with hreflang tags and a language switcher. You don’t manage translated
posts manually.

### How is this different from other translation plugins?

Two big things. First, nothing goes live until it has been approved, and your site
serves exactly the translation that was approved. Second, a sentence that appears
across your whole site is translated once and reused, not once per page.

### Which languages are supported?

The LangRelay Dashboard currently offers Dutch, English, French, German, Italian,
Portuguese, Spanish, and Turkish, both as the language your site is written in and
as languages to translate into.

### Do I need a LangRelay account?

Yes. LangRelay is a cloud service. If you don’t have an account yet, you can create
one when you click **Connect to LangRelay** under **Settings > LangRelay**.

### How much does it cost?

See [langrelay.com/pricing](https://langrelay.com/pricing) for current plans and
prices.

### Will this slow down my site?

Not on a typical page view. Approved translations are cached on your site and applied
as each page is served, in well under a millisecond on a typical page. About once
a minute (the refresh interval), one page view also checks LangRelay for newly activated
translations. That check is capped by the API timeout under Settings > LangRelay
> Advanced; if LangRelay doesn’t answer in time, the page is served with the translation
already cached on your site, or in its original language if it has none yet. Pages
also load one small script, deferred so it never holds up the page: every page while
your Site counts page views, otherwise pages with the language switcher, translated
pages and, while Visitor language is on, every page that has a translation.

### Does it handle hreflang tags?

Yes, automatically. On every page with an activated translation, LangRelay adds 
an `hreflang` tag for each language version plus an `x-default` tag pointing to 
the original. Canonical tags are language-aware. No manual SEO work required.

### Does it work with WooCommerce?

Product and shop pages are translated like any other page once their translation
is approved. Text that appears after the page loads, such as the mini-cart or an“
added to cart” notice, is translated in the visitor’s browser when the same text
has an approved translation elsewhere on your site. Parts of a page that change 
for every visitor, such as a cart’s contents or a checkout’s form fields, can stay
in the original language.

### Does it work with Yoast SEO and Rank Math?

LangRelay translates the meta titles, meta descriptions, Open Graph and Twitter 
Card tags in your pages’ HTML, whichever plugin writes them — including Yoast SEO
and Rank Math — once the page’s translation is approved.

### How do I add the language switcher?

Pick whichever suits your theme:

 * **Floating switcher.** On by default. Under Settings > LangRelay > Language Switcher,
   choose the corner it sits in, or switch it off. Pages where you have placed a
   switcher or a Languages menu item yourself don’t get it.
 * **Menus.** In Appearance > Menus, add the Languages item to a menu. The languages
   show as your theme’s own menu items, either the current language with the others
   below it or side by side.
 * **Navigation block.** In a block theme, add the Languages block inside your Navigation
   block.
 * **Block editor.** Add the Language Switcher block, for example to your header
   template part.
 * **Elementor.** Drag in the Language Switcher widget.
 * **Shortcode.** `[langrelay_switcher]` works anywhere shortcodes do. Add `show_flags
   ="false"`, `show_name="false"` or `use_native_name="false"` to change what each
   language shows.
 * **HTML.** Paste `<div data-langrelay-switcher></div>` into any HTML block or 
   widget. It takes the same options as attributes, like `data-show-flags="false"`.

The switcher’s look is set in the LangRelay Dashboard: one of four styles (Classic,
Modern, Commerce or Text), light or dark, a dropdown or a list, and how each language
is named. The block, the Elementor widget and the shortcode can give one switcher
its own style, layout or label, like `[langrelay_switcher style="text" layout="list"
label="code"]`. Menu items always take your theme’s look.

### Can visitors see my site in their own language automatically?

Yes. Your Site’s Visitor language setting, under Settings  WordPress in the LangRelay
Dashboard, decides what a visitor who reads another of your languages sees when 
they arrive:

 * **Suggest** (the default). A short dialog in the middle of the page offers the
   page in their language, in that language, with a button to stay in the page’s
   own language. Nothing changes until they choose, and closing it keeps the page
   as it is.
 * **Redirect.** A visitor who arrives from another website is taken to the page
   in their language before it shows, and told so, with a link back. Search engines
   advise against automatic redirects, so it is your choice to make.
 * **Off.** Visitors see the page they asked for.

It only offers a language the page is actually translated into, and only on the 
first page of a visit. Search engines are never redirected or shown the suggestion.
You won’t see it while signed in as someone who can edit posts. A visitor’s choice
is remembered in their own browser for a year, and no cookie is set. Settings > 
LangRelay > Language Switcher shows the current setting.

### Does LangRelay show its name on my site?

Yes, by default: a small “Powered by LangRelay” line in the language switcher’s 
menu and at the bottom of the language suggestion, linking to langrelay.com. On 
a paid plan you can turn it off, and on again, in the LangRelay Dashboard under 
your Site’s Appearance settings. On the Free plan it stays on.

### What happens if the LangRelay API goes down?

Your site keeps serving the translations it has cached. A page it has no translation
for is served in its original language. Nothing breaks.

### What is GEO?

GEO stands for Generative Engine Optimization. It’s the practice of making your 
site visible and citable by AI-powered search engines like ChatGPT, Perplexity, 
and Google AI Overviews. LangRelay helps by serving each translation as a real page
at its own address, with hreflang tags, so AI search engines can find and cite it
in each language.

## Reviews

![](https://secure.gravatar.com/avatar/5b8298d6ccc394dcf645d5f21a43bf2fc985747898ddc3c7a787cbb7c19f38d6?
s=60&d=retro&r=g)

### 󠀁[Really helpful for reaching our international community](https://wordpress.org/support/topic/really-helpful-for-reaching-our-international-community/)󠁿

 [gym053](https://profiles.wordpress.org/gym053/) October 2, 2026

We’re a gym based in Enschede and we have a lot of international students and people
from all over the world in our city. For us, having our website available in English
and Dutch has made a real difference. Since using LangRelay, it’s much easier for
people who aren’t Dutch speakers to understand what we offer and feel welcome before
they even walk through the door. We’ve noticed that our gym is attracting a more
diverse mix of people, which is exactly what we hoped for. LangRelay has made the
whole translation process simple without adding a lot of extra work to our website
management as it gets translated automatically. For a local business in a very international
city like Enschede, it's been really useful. Thx!

 [ Read all 1 review ](https://wordpress.org/support/plugin/langrelay/reviews/)

## Contributors & Developers

“LangRelay – AI Translation & Multilingual” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ langrelay ](https://profiles.wordpress.org/langrelay/)

“LangRelay – AI Translation & Multilingual” has been translated into 1 locale. Thank
you to [the translators](https://translate.wordpress.org/projects/wp-plugins/langrelay/contributors)
for their contributions.

[Translate “LangRelay – AI Translation & Multilingual” into your language.](https://translate.wordpress.org/projects/wp-plugins/langrelay)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/langrelay/), check 
out the [SVN repository](https://plugins.svn.wordpress.org/langrelay/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/langrelay/) by [RSS](https://plugins.trac.wordpress.org/log/langrelay/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 2.11.2

 * Fix: The Documentation link in Settings  LangRelay opens the guide to translating
   your WordPress site.
 * Fix: The floating language switcher now appears on every page as soon as your
   first language goes live, also on sites with a page cache and on pages whose 
   theme template leaves out the footer.

#### 2.11.1

 * Fix: The “Powered by LangRelay” line now shows LangRelay’s real logo.

#### 2.11.0

 * Improvement: the language suggestion is now a dialog in the middle of the page,
   so visitors notice it, with a button to stay in the page’s own language.
 * New: a small “Powered by LangRelay” line shows in the language switcher’s menu
   and in the language suggestion. On a paid plan you can turn it off in the LangRelay
   Dashboard under Appearance.

#### 2.10.0

 * New: visitors who read another of your languages are offered the page in their
   own language. You can choose to take them there instead, or turn it off, under
   your Site’s Settings in the LangRelay Dashboard.

#### 2.9.0

 * New: align the Language Switcher’s Elementor widget to the start, center or end
   of its column.
 * Fix: the plain list of languages no longer flashes on screen while the language
   switcher loads.

#### 2.8.0

 * New: with revenue tracking on, the LangRelay Dashboard can show which pages your
   signed-in WooCommerce customers came in on before they ordered. Erasing a customer’s
   personal data under Tools  Erase Personal Data removes them from it, and Settings
   Integrations in the Dashboard shows your WooCommerce.

#### 2.7.0

 * New: add your languages to a menu. Classic menus get a Languages item under Appearance
   Menus, and block themes a Languages block inside the Navigation block; both show
   the languages in your theme’s own menu style.
 * New: the Language Switcher block, the Elementor widget and the shortcode can 
   give one switcher its own style, layout or label. Settings  LangRelay  Language
   Switcher links to where the switcher’s look is set in the LangRelay Dashboard.
 * New: choose your language switcher’s look in the LangRelay Dashboard: four styles(
   Classic, Modern, Commerce and Text), light or dark, as a dropdown or a list.

#### 2.6.0

 * Fix: after a theme, builder or WordPress update changes your pages’ layout, translated
   pages no longer stay in the original language. LangRelay now notices it, puts
   your approved translations back on the new layout without charging words again,
   and tells you which update caused it; your cache plugin no longer keeps the untranslated
   page meanwhile.
 * Improvement: visitor analytics now count page views on every page of your site,
   not only translated pages and pages with the language switcher.
 * New: WooCommerce shops can track revenue. Switch it on under your Site’s Settings
   Analytics in the LangRelay Dashboard, and each order is reported with its amount
   and the language the shopper browsed in, never anything about the buyer.

#### 2.5.3

 * Fix: On sites hosted on a Mac (Local, MAMP, Herd, Valet), translated pages whose
   address contains characters such as ş, Cyrillic or Chinese now open instead of
   showing “not found”.

#### 2.5.2

 * Fix: Free Sites’ switcher shows Powered by LangRelay in Firefox and Safari.

#### 2.5.1

 * Fix: On sites with a page optimizer such as LiteSpeed Cache, logged-in users 
   now see translated pages too, not only visitors.

#### 2.5.0

 * New: page views from signed-in administrators and editors no longer count in 
   your visitor analytics, so your own browsing stays out of the numbers. Choose
   which roles to leave out under Settings  LangRelay  Advanced.

#### 2.4.0

 * New: the language switcher is now a compact language menu, wherever you place
   it. Visitors without JavaScript, and search engines, still get the plain list
   of links. Under Settings  LangRelay  Language Switcher you can choose the corner
   the floating switcher sits in, and a `<div data-langrelay-switcher></div>` pasted
   into an HTML block or widget now shows the switcher too.

#### 2.3.0

 * New: translated pages and pages with the language switcher now count page views
   for your Site’s visitor analytics in the LangRelay Dashboard, without cookies
   and without storing visitors’ IP addresses. You can switch it off under your 
   Site’s Settings  Analytics in the LangRelay Dashboard.

#### 2.2.0

 * New: Settings  LangRelay shows your plan, this month’s words and which pages 
   are waiting to be translated, with a link to upgrade in the LangRelay Dashboard.
 * Fix: on Settings  LangRelay, the “Disconnect this site?” dialog no longer shows
   the tabs on top of it.

#### 2.1.0

 * New: on a translated page, text that appears after it loads, such as a mini-cart
   or a notice, now shows in the visitor’s language when that text has an approved
   translation elsewhere on your site. Pages with the language switcher, and translated
   pages, load a small script for it.
 * Removed: the Debug Mode option under Settings  LangRelay  Advanced, which had
   no effect. Logs are still recorded and shown on the Logs tab.
 * Improvement: Settings  LangRelay has a new design in the LangRelay brand. Changes
   save without reloading the page, and a bar reminds you of unsaved changes.
 * New: Settings  LangRelay shows which languages are live and which pages are translated,
   with links to each translation and a Sync now button.
 * New: when you publish or update a page, or change a menu, category, your site
   title or theme, LangRelay picks up the change within minutes instead of at its
   next scheduled check of your site.

#### 2.0.1

 * Fix: translated pages now appear on sites that optimize their pages with a cache
   plugin such as LiteSpeed Cache, instead of showing the original language.

#### 2.0.0

 * Important: after updating, reconnect under Settings  LangRelay and approve your
   translations again in the new LangRelay Dashboard. Until then pages show in their
   original language; your content and settings stay as they are.
 * New: connect with one click from Settings  LangRelay. Staging and local sites
   can paste a code instead.
 * New: approved translations go live on your site, each language at its own address(
   for example `/es/about-us/`), within about a minute of activation.
 * New: if a page changed after it was translated, the unchanged parts stay translated.
   A page that changed too much is shown in its original language.
 * New: the language switcher loads with the page and has refreshed flags.
 * New: your site no longer sends page content to LangRelay.
 * Changed: connecting is the whole setup, and you choose your languages in the 
   LangRelay Dashboard. Your switcher, excluded paths and developer settings carry
   over.
 * Removed: translated `llms.txt` files, email translation, the browser-language
   redirect, the dropdown switcher, the “Excluded selectors” setting and the cache-
   purge webhook.

#### 1.9.25

 * Improvement: clearer plugin listing so people searching for a translation plugin
   can find LangRelay more easily. No changes to how the plugin works.

#### 1.9.24

 * Fix: the LangRelay connection could drop on busy sites. When several visitors
   loaded pages at the same moment, the plugin could renew its access more than 
   once at once and lose the connection, which forced a manual reconnect. Renewals
   are now coordinated so the connection stays active.

#### 1.9.23

 * Fix: the built-in Logs tab now shows log entries. Requests to the logs endpoint
   were missing the required authentication header, so the tab always showed “No
   log entries found.”

#### 1.9.22

 * Fix: the plugin connection could silently drop on sites that had connected before
   refresh tokens were available. The plugin now detects this correctly and shows
   the reconnect prompt.

#### 1.9.21

 * Fix: clicking “Sync” after the LangRelay connection expired would show a generic
   error with no way to recover. It now shows a clear message with a reconnect link.

#### 1.9.20

 * Fix: newly published pages are now correctly translated on first visit.

#### 1.9.19

 * Fix: newly published pages are now correctly translated on first visit.

#### 1.9.18

 * Improvement: pages that have not been translated yet are automatically prepared
   for translation in the background when first visited. Future visitors see a fully
   translated page without any delay.

#### 1.9.17

 * Fix: WordPress admin links no longer show a language prefix in the URL.
 * Fix: dynamic content (modals, AJAX panels) no longer re-translates text that 
   is already in the target language.
 * Fix: very short sentence fragments are no longer sent for translation, reducing
   unnecessary API calls.

#### 1.9.16

 * Fix: links in the WooCommerce mini-cart drawer (View cart, Checkout) now point
   to the correct language URL. These links are loaded via AJAX, so the plugin’s
   server-side link rewriting couldn’t reach them — they’re now rewritten in the
   browser automatically.

#### 1.9.15

 * Fix: WooCommerce checkout fields (Billing address, Contact information, First
   name, etc.) now translate on page load. The translation engine now scans content
   that was already rendered by React before it started — previously these labels
   were invisible to LangRelay because they appeared before the observer attached.

#### 1.9.14

 * Fix: dynamic translations on language-prefixed URLs (e.g. `/de/checkout`) now
   correctly associate with the source-language page, so coverage tracking in the
   dashboard is accurate.
 * Improvement: screen-reader-only text (invisible to sighted visitors) is no longer
   sent for translation, reducing unnecessary API calls on WooCommerce checkout 
   pages.
 * Improvement: price strings like “CHF 25,00” and “€25.00” are no longer sent for
   translation.

#### 1.9.13

 * Improvement: dynamically translated content (modals, React blocks, WooCommerce
   checkout) now counts toward the correct page’s translation coverage in the dashboard.
 * Performance: dynamic translations appear faster — the browser no longer waits
   for background processing to complete before showing translated text.

#### 1.9.12

 * Fix: WooCommerce Blocks checkout section headings and field labels (Contact information,
   Billing address, First name, etc.) now render in the target language. React was
   re-rendering these from wp.i18n.__() after PHP translation — an inline script
   now pre-loads translations into the wp.i18n registry before the deferred WC Blocks
   scripts execute.
 * Fix: auto-redirect now skips when the `X-LangRelay-Crawler` request header is
   present, so the LangRelay crawler always receives the source-language page instead
   of being redirected to a language-prefixed URL. Also adds `langrelay` to the 
   bot user-agent bypass list as a fallback.

#### 1.9.11

 * Fix: auto-redirect no longer fires on `/wp-admin`, `/wp-login.php`, or `/wp-json`
   paths. With force-fallback enabled, logged-out users were being redirected from`/
   wp-admin` to `/<lang>/404/`.

#### 1.9.10

 * Fix: visitor routing settings (`auto_redirect`, `auto_redirect_fallback`, `auto_redirect_force_fallback`)
   synced from the LangRelay dashboard now persist correctly. They were being stripped
   by the settings sanitizer, so auto-redirect never engaged on synced sites even
   when enabled in the dashboard.
 * Add `X-LangRelay-Handle` and `X-LangRelay-AutoRedirect` response headers, the
   auto-redirect state in `/wp-json/langrelay/v1/debug/status`, and a log entry 
   on every “Sync project” attempt — so support can diagnose redirect issues without
   touching the server.

#### 1.9.6

 * Add “Always redirect to fallback” toggle – overrides browser language matching,
   sends every non-bot visitor to the chosen fallback language. Useful when the 
   WordPress site language is set to one language but the customer wants traffic
   served from a different language URL prefix by default.
 * Sync `auto_redirect`, `auto_redirect_fallback`, and `auto_redirect_force_fallback`
   from the LangRelay API so dashboard changes propagate to the plugin.
 * Refactor `LangRelay_Auto_Redirect::maybe_redirect` to use a pure `resolve()` 
   method for testability.

#### 1.9.5

 * Fix: language switcher chevron now sits inline next to the flag/language name.
   The 1.9.4 button reset (`display: contents`) inadvertently broke the default 
   row layout of the customizable select; explicitly making the select an inline-
   flex row restores it.

#### 1.9.4

 * Fix: language switcher’s inner trigger button now correctly resets against page-
   builder themes. With `appearance: base-select`, the browser renders a `<button
   >` inside the `<select>` that themes like Elementor were re-styling (red background,
   uppercase text). The 1.9.3 fix scoped the `<select>` styles but missed this inner
   button. Now explicitly resets it with `all: unset; display: contents` at higher
   specificity.

#### 1.9.3

 * Fix: language switcher styles now beat aggressive page-builder themes (Elementor,
   Divi, etc.) by scoping selectors under `.langrelay-switcher` for higher specificity.
   Also explicitly resets text-transform, letter-spacing, font-weight, and text-
   align so themes that style bare `button` elements no longer leak through.

#### 1.9.2

 * Security: escape hreflang and canonical output with wp_kses().
 * Security: use wp_add_inline_script() for translation preloading instead of raw
   script injection.
 * Security: eliminate unescaped full-page echo by using ob_start() callback.
 * Improvement: rename all transient prefixes from lr_ to langrelay_ for consistency.
 * Fix: stale mock prefix in cache purge test after transient rename.

#### 1.9.1

 * Security: use wp_safe_redirect() for auto language redirects.
 * Security: remove token preview from debug REST endpoint.
 * Security: remove unused debug token authentication methods.
 * Improvement: bundle country flag SVGs locally instead of loading from external
   CDN.

#### 1.9.0

 * WordPress.org plugin review compliance: removed “WordPress” trademark from display
   name, fixed Plugin URI, properly sanitize all settings fields in register_setting
   callback, and explicitly close output buffer via shutdown hook.
 * New: setup wizard now lets you select an existing organization and project instead
   of requiring a new one.
 * Removed debug panel from setup wizard.

#### 1.8.1

 * Fix: languages added in the LangRelay dashboard now auto-sync to WordPress via
   a project.updated webhook event.
 * New: manual “Sync” button in the Project Status card to pull the latest project
   settings (languages, source language) from the dashboard on demand.
 * Improvement: existing installs automatically reconcile their webhook subscription
   on the next admin page load to include the new project.updated event.

#### 1.8.0

 * Dynamic content translation: modals, AJAX panels, and client-rendered content(
   React, Vue, Svelte) now translate without flickering or invisible text.
 * Performance: client-side translations are cached in localStorage with automatic
   version-based invalidation when you edit translations in the dashboard.
 * Performance: first batch of dynamic text translates immediately (no 300ms debounce
   delay on initial render).
 * New: server-side translation map is pre-loaded into the client SDK, so shared
   strings translate instantly from cache.
 * New: debug logging via `?langrelay_debug=1` query param or `data-debug="true"`
   on the script tag for troubleshooting.

#### 1.7.1

 * Fix: script blocks containing HTML string literals (e.g. WooCommerce gallery 
   scripts building `<a>` and `<img>` tags in JavaScript) are no longer corrupted
   by the URL rewriter. DOMDocument now skips script and style blocks during URL
   rewriting.
 * Fix: translation matching is now case-insensitive. Menu items and other text 
   styled with CSS text-transform (e.g. “wallcoverings” in HTML displayed as “Wallcoverings”
   via CSS) now match translations regardless of casing.

#### 1.7.0

 * Email translation: outgoing WordPress emails (wp_mail) can now be translated 
   to the recipient’s language. Enable under Settings > LangRelay.
 * WooCommerce email integration: order confirmations and other WooCommerce emails
   are automatically translated when email translation is enabled.
 * Batch translation API: new translate_batch() method for translating plain text
   strings without HTML overhead.
 * URL slug routing fix: translated URL slugs are now reverse-translated before 
   WordPress routing, fixing 404s on translated permalink slugs.
 * Bundled client JavaScript locally instead of loading from an external server.
 * Various wp.org Plugin Check compliance fixes.

#### 1.6.0

 * Language switcher block, Elementor widget, and shortcode now support display 
   override attributes (show flags, show names, use native names)
 * Added [langrelay_switcher] shortcode for placing the switcher in classic themes
   and page builders
 * Cleaned up admin settings: removed unused switcher fields, added dashboard link
   and status indicator
 * Auto-inject toggle now properly controls whether the switcher script loads
 * Org slug persisted during OAuth for dashboard deep links

#### 1.5.1

 * Added Settings link to plugin action row on the Plugins page.
 * Redirect to settings page on first activation for easier onboarding.

#### 1.4.7

 * Updated admin UI to match LangRelay brand design.
 * Added SVG logo to plugin settings header.
 * Lowered PHP requirement to 8.0 with polyfills.
 * Added 15 new translation locales (27 total).
 * Language pills with flags on settings overview.

#### 1.0.0

 * Initial release.
 * AI-powered page translation via LangRelay API.
 * Language switcher (dropdown, list, flags) as Gutenberg block, Elementor widget,
   shortcode, or auto-injected.
 * SEO support with hreflang tags and translated meta.
 * WooCommerce, Yoast SEO, Rank Math, WP Rocket, and Cache Enabler compatibility.
 * WordPress transient caching for translated pages.

## Meta

 *  Version **2.11.2**
 *  Last updated **2 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.0 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 8.0 or higher **
 *  Languages
 * [Czech](https://cs.wordpress.org/plugins/langrelay/) and [English (US)](https://wordpress.org/plugins/langrelay/).
 *  [Translate into your language](https://translate.wordpress.org/projects/wp-plugins/langrelay)
 * Tags
 * [localization](https://kea.wordpress.org/plugins/tags/localization/)[multilingual](https://kea.wordpress.org/plugins/tags/multilingual/)
   [translate](https://kea.wordpress.org/plugins/tags/translate/)[translation](https://kea.wordpress.org/plugins/tags/translation/)
   [woocommerce](https://kea.wordpress.org/plugins/tags/woocommerce/)
 *  [Advanced View](https://kea.wordpress.org/plugins/langrelay/advanced/)

## Ratings

 5 out of 5 stars.

 *  [  1 5-star review     ](https://wordpress.org/support/plugin/langrelay/reviews/?filter=5)
 *  [  0 4-star reviews     ](https://wordpress.org/support/plugin/langrelay/reviews/?filter=4)
 *  [  0 3-star reviews     ](https://wordpress.org/support/plugin/langrelay/reviews/?filter=3)
 *  [  0 2-star reviews     ](https://wordpress.org/support/plugin/langrelay/reviews/?filter=2)
 *  [  0 1-star reviews     ](https://wordpress.org/support/plugin/langrelay/reviews/?filter=1)

[Your review](https://wordpress.org/support/plugin/langrelay/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/langrelay/reviews/)

## Contributors

 *   [ langrelay ](https://profiles.wordpress.org/langrelay/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/langrelay/)