Description
Lionrapid Translation translates your site’s content on the server, before the page reaches the browser. Visitors never see a flash of untranslated text, and search engines index the translated pages.
The plugin is managed from your Lionrapid dashboard: languages, switcher style, excluded paths and server-side rendering sync to the plugin automatically. In WordPress you only enter your site key.
Key features
- Server-side translation: the page’s HTML is translated before delivery, so search engines see the translated content directly.
- Formatting kept: inline formatting such as
<b>and<a>survives translation. - Managed from the dashboard: source and target languages, the switcher and excluded paths come from your Lionrapid project. Changes are pushed to the site immediately, with a 5-minute check as a safety net.
- Gutenberg blocks: a translation block, a language switcher block and an inline translation editor.
- Language switcher: three styles (floating, buttons, flags), added to every page automatically or placed where you want it with the block.
- Language URLs: addresses like
/de/,/es/and/fi/lead visitors to the right language. - SEO: hreflang tags, translated meta descriptions and canonical URLs.
- New text is collected: text that appears on the live site is sent to your dashboard for translation in the background (
wp_cron).
Required external service
This plugin requires a Lionrapid account. It connects to the Lionrapid service at the address shown under Settings Lionrapid (https://app.lionrapid.com by default).
When activated and configured with a site key, the plugin sends:
- Translation requests (page content blocks) server for translation lookup
- New keys discovered on the live site server for translation queue
- Configuration sync requests server for current project settings
Server endpoints called:
GET /api/integrations/config?domain={your-site-domain}— fetches project configGET /api/integrations/translations/{locale}/{namespace}— fetches translationsPOST /api/integrations/sync/...— pushes newly discovered keys
When your settings hold a publishable key (pk_), your visitors’ browsers also call the Lionrapid service directly, at the API address your Lionrapid project gives (https://app.lionrapid.com by default):
- to load the translations and language settings for the page they are viewing;
- to report text on the page that has no translation yet, so it appears in your dashboard.
Like any web request, these calls show the service the visitor’s IP address and browser details. The plugin adds no tracking or analytics. Login and account pages excluded on the dashboard never report text. Without a publishable key, the browser loads translations from your own site instead and calls no Lionrapid address.
The plugin also adds two REST endpoints to your site:
POST /wp-json/lionrapid/v1/resync: your Lionrapid dashboard calls it to push configuration changes immediately. It is authenticated with the key stored in your plugin settings.GET /wp-json/lionrapid/v1/api/integrations/translations/{locale}/{namespace}: public and read-only. It serves your site’s translations to the visitor’s browser, so the browser never needs a key.
Lionrapid’s terms of service: https://www.lionrapid.com/terms. Privacy policy: https://www.lionrapid.com/privacy.
Without a site key
Until you enter a site key, the plugin calls no external service. It does start preparing your pages for translation as soon as it is active (language links and markers in the HTML), so activate it once your Lionrapid account is ready.
Screenshots

Installation
- In Plugins Add New, search for “Lionrapid Translation”, then click Install Now and Activate.
- Visit Settings Lionrapid.
- Enter your site key from the WordPress tab of your Lionrapid dashboard: a publishable key starting with
pk_. Leave the address as it is unless support asks you to change it. Sites configured earlier with a master key (sk_) keep working unchanged. - Click Save settings. The plugin pulls your project settings (languages, switcher, excluded paths) from the dashboard automatically.
- Language URLs like
/de/are set up automatically when your languages change. If one answers “not found”, click Refresh language URLs on the same page.
FAQ
-
Do I need a Lionrapid account?
-
Yes. The plugin connects to the Lionrapid service. You can sign up at https://www.lionrapid.com.
-
Can I use it without server-side translation?
-
Yes. In the Lionrapid dashboard, turn off “Server-side translate initial page render” for your project. The plugin will then rely on JavaScript-side translation only, applied via MutationObserver after page load.
-
How does it handle new strings that haven’t been translated yet?
-
The plugin scans the block-level strings of every page it renders, in your source language too. On a translated page, each string is looked up in the cached translations. A string Lionrapid does not know yet is queued for sync via
wp_cron, so a visit to a page in your source language is enough to send its new strings. They appear in the Lionrapid editor for human or machine translation, and the next page load gets the translated version. -
Does it work with WooCommerce / Elementor / page builders?
-
The plugin operates at the rendered HTML level, so it works with any front-end content. Path rules let you exclude
/cart/,/checkout/,/wp-admin/, and similar paths from translation if needed (configured on the dashboard). -
Is my API key visible to visitors?
-
The key the plugin prints for the browser is a publishable key (
pk_), which is designed to be public — it can read your translations and register new strings for translation, nothing else. The plugin refuses to print anything that is not apk_key: if your settings hold a master key (sk_), it stays server-side and the browser is pointed at this site’s own read-only translation endpoint instead. A master key is never written into your page HTML. -
Where are my settings stored?
-
In
wp_optionsunder the keylionrapid_settings. Your site key, the service address and the on/off switch are set in Settings Lionrapid. Everything else (languages, namespace, switcher, exclude paths) is read-only and overwritten by the dashboard sync. -
How do I uninstall cleanly?
-
Deactivating the plugin stops it and keeps your settings. Deleting it from Plugins removes its settings, saved translations and scheduled jobs (on a multisite network, on every site).
-
I installed an earlier version from a ZIP file. How do I switch to the directory version?
-
ZIP files before 1.3.1 installed into the folder
lionrapid; the directory version installs intolionrapid-translation. WordPress treats them as two plugins, but they share one set of settings.Install Lionrapid Translation from the directory and activate it. If the old copy is still active, the new one deactivates it and takes over with your site key and settings. Then delete the old copy from Plugins; your settings stay. The Plugins screen and Settings Lionrapid point out the old copy while it is still installed.
Before 1.4.2, deleting the old copy removed the shared settings. If you installed an earlier version from the directory and still have the old copy, update to 1.4.2 first, then delete it.
ZIP files from 1.3.1 on install into
lionrapid-translation, the directory’s own folder, so WordPress treats a ZIP install and a directory install as the same plugin: updates from the directory arrive in Dashboard Updates either way, and your settings are kept. -
Where is the source code of the bundled JavaScript?
-
The plugin’s own minified scripts in
assets/dist/are built from the TypeScript sources that ship inassets/src/.The three scripts in
assets/dist/js/vendor/come from the open-source Lionrapid SDK, https://github.com/LionRapid/lionrapid-sdk (MIT,packages/core, built bypackages/core/build.browser.js):lionrapid.auto.min.js: the language switcher and in-page translation, fromsrc/browser/index.ts. Its unminified build ships beside it aslionrapid.auto.dev.js.lionrapid.iife.min.js: the library the Gutenberg blocks use in the editor, fromsrc/index.ts.lionrapid.editor.min.js: the visual translation editor, loaded only during an editor session, fromsrc/browser/editor/editor-init.ts.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Lionrapid Translation” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Lionrapid Translation” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.4.2
- Fixed: activating Lionrapid Translation while an older copy installed from a ZIP
(in plugins/lionrapid/) is still active no longer fails with a fatal error. The new
copy takes over and deactivates the old one; your connection and settings carry over. - Fixed: deleting that older copy no longer deletes your settings. Its uninstall used to
remove the settings the two copies share, which disconnected the site. - New: the Plugins screen and Settings Lionrapid say when an older copy is still
installed, and that it can be deleted.
1.4.1
- Changed: the plugin now requires PHP 8.1. On PHP 8.0 it could not be activated.
- Changed: activation no longer switches Plain permalinks to /%postname%/ by itself.
Settings Lionrapid says when your permalinks need changing for language addresses. - Changed: the page-cache notice shows only on Settings Lionrapid, not on every
admin screen. - Fixed: settings saved through the settings form or synced from your dashboard are
cleaned field by field; invalid language codes are dropped. - Fixed: the plugin reads WordPress’s own addresses (REST, admin, login) instead of
assuming the default ones, so a custom REST prefix works. - Fixed: the translation-editor block no longer contacts Lionrapid before the site is
connected, and dashboard pushes are limited to one run a minute. - Fixed: no missing-file notices or 404s for block scripts in the block editor.
1.4.0
- New: a simpler settings page. Connection, Translation and Languages each sit on one
card, the status shows at the top (Connected, Waiting for approval, Not connected), and
the connection code is shown large with a Copy button. Explanations moved into small ⓘ
labels that open on hover, keyboard focus or tap. Technical details are under Advanced. - Fixed: “Connect to Lionrapid” always starts on the first click, also before the page’s
script has loaded. - Fixed: a top-corner language switcher no longer covers your theme’s header menu.
- Fixed: a visitor’s browser no longer shows a stored copy of translations from another
Lionrapid project on the same site, and a removed translation stops being shown. - The page language (
<html lang>) follows the language the visitor picks.
1.3.2
- Fixed: the first Save on the settings page, and Sync Now, could drop the languages,
namespace and switcher settings arriving from your dashboard, while still showing a
successful Last sync. They came back only at the next background sync. - Fixed: with “Enable Plugin” or “Emit hreflang tags” turned off, Sync Now could turn
them back on. - A sync whose settings could not be saved now reports an error instead of success.
- The FAQ now says that pages in your source language are scanned too: that is how new
strings reach Lionrapid. - The redirect to a visitor’s language uses
wp_safe_redirect(), which only follows
addresses on your own site.
1.3.1
- Now in the WordPress plugin directory as “Lionrapid Translation”. The text domain is
lionrapid-translation, the directory’s name for the plugin, so translations of the
settings screen can come from translate.wordpress.org. - The readable TypeScript sources of the bundled scripts ship with the plugin, in
assets/src/. - The readme describes the plugin as it is today: three switcher styles, the current
button names, what deleting the plugin removes, the service it connects to, and
what visitors’ browsers send to it when you use a publishable key. - The plugin folder is now
lionrapid-translation, the same as the directory
install, so a ZIP install and a directory install are one plugin. ZIP files
before 1.3.1 installed intolionrapid; see the FAQ before switching. - Deleting the plugin keeps your settings while another copy of it is still
installed. - The translation cache rows carry the plugin’s
lionrapid_prefix. The old rows
are removed once after updating and your translations are fetched again on the
next page view. - The same-origin translation endpoint moved into the plugin’s own namespace:
/wp-json/lionrapid/v1/api/integrations/translations/{locale}/{namespace}. The
old/wp-json/api/integrations/...address is gone. A page your host cached
before updating may ask the old address until that cache expires; its
server-side translation is unaffected. - Every value read from the request is unslashed and sanitized, with web addresses
kept intact, and each admin action checks its security token itself.
1.3.0
-
The settings page now speaks plainly. Labels and messages were written for the
developers who built the plugin, not for the people who install it — so a failure
said things like “Invalid response format” and left you nowhere to go. Every
message now says what happened and what to do about it. -
The server address defaults to the real one. A fresh install pointed at localhost,
an address that only exists on a developer’s own machine, so the first connection
test could never succeed. Sites already set up are unaffected — your saved address
is kept. -
Every button shows its own progress and result. Test connection, Sync now, Clear
cache and Update language URLs now behave the same way: the button tells you it is
working, then whether it worked, and the answer stays on screen underneath instead
of vanishing. -
When something fails you get a plain explanation and a next step, with the
technical detail behind a “Details” link for when support needs it.
1.2.6
- Fix: visitors whose browser is set to another language now reach that language
from your home page, even when the page is served from your host’s cache.
Previously the redirect ran in PHP, and on a cached page PHP never runs — so a
Finnish visitor landing on a warm home page simply saw English. The choice is
now made in the browser, which still runs when the cache is serving.
Your home page stays cached for everyone; only the language decision moved.
1.2.5
- Fix: a translation you removed or unapproved could keep appearing on your site
forever. Each string was stored twice — once on its own and once inside a
bundle — and refreshing replaced the bundle without ever clearing the individual
copy, which is the one the plugin reads first. - Fix: choosing your own language now sticks. Picking the site’s main language
from the switcher could be overridden by your browser’s language on the next
visit, sending you back to the language you had just left. - Fix: language-prefixed URLs like /fi/about/ now resolve the same way /about/
does, including nested pages and content from other plugins. Cache and SEO tools
that ask WordPress “which page is this URL?” previously got no answer for a
translated page. - Fix: “Clear Translations” also clears the bookkeeping that tracks how fresh your
translations are. - Fix: deactivating the plugin now stops all three of its scheduled jobs, not one.
- New: on hosts with a page cache the plugin can clear — WP Rocket, W3TC,
LiteSpeed, WP Super Cache — it clears it automatically when translations change. - New: on WordPress.com, where plugins cannot clear the cache, you get a notice in
the admin when your visitors are being served old pages, and how to clear it. It
appears only when translations actually change, and once dismissed it stays
dismissed until they change again. - New: on WordPress.com your language choice is now part of the page-cache key, so
a visitor who prefers Finnish is no longer served the page cached for an English
visitor.
1.2.4
- Fix: “Clear Translations” now really clears them on hosts that keep a
persistent object cache, WordPress.com among them. The rows were being
deleted, but a cached copy was still served, so old translations came back
and no amount of clearing helped. The same stale copies also made every
string look like one the site had already reported, so the site quietly
stopped sending new content to your dashboard. If your site is on such a
host, press Clear Translations once after updating. - Fix: the plugin’s own short-lived caches are cleared too. On a site with a
persistent object cache those are not kept in the database at all, so the
previous cleanup silently matched nothing. - Change: a resync from the dashboard now refreshes translations as well as
settings, so an edit reaches your site without waiting for the next
scheduled check.
1.2.3
- Fix: translation changes now appear on the FIRST page load. The refresh ran
after the page had already been sent, so a page always showed the previous
version and a reload was needed to see an edit. - Fix: saving a new API key no longer silently reverts to the old one. The
settings page reported success while the previous key was written back. - Fix: the server URL you configure is the one the plugin calls. A legacy
setting could override it invisibly, so requests went to the old host and
failed with an error blaming the API key. - Fix: the dashboard’s minimum-text-length setting now reaches the site. It was
declared and honoured everywhere except the one place that reads it from the
server, so sites stayed on the built-in default.
1.2.2
- Fix: “Clear Translations” now actually clears them. It was deleting from a
cache layer the plugin never wrote to, and reported success because the delete
matched zero rows rather than failing. - Fix: the source-language home page is reachable again. A visitor arriving at
your site with no referer — a typed address, a bookmark, a search result — was
redirected to their guessed language every time, with no way back to/. An
inferred language now redirects once; an explicit choice from the switcher
still always applies.
1.2.1
- Fix: og: and twitter: social preview text is now translated. A shared link
showed the source language even on a translated page, because the preview
meta tags were never extracted for translation. - Housekeeping: removed
translationMode, a setting nothing ever read.
1.2.0
- Feature: regional locale routing (for example /pt-br/), with BCP-47 hreflang
and Accept-Language quality-value parsing. - Feature: SEO plugin coexistence — Yoast and similar plugins are detected, and
canonical/hreflang output defers to them instead of emitting a second,
conflicting set. - Feature: localized sitemap alternates for Yoast.
- Feature: honours the noindex-locales setting, so a locale still under review
is not indexed before it is ready. - Change: the plugin authenticates with a publishable (pk_) key, and prefers
the API host the server advertises over a hardcoded one.
1.1.2
- Fix: background sync no longer retries in a loop when the API key is missing
or the server answers 4xx. - Fix: no If-None-Match header while the translations cache is empty — the
request could return 304 with nothing to render from. - Fix: exact attribute-name matching when detecting no-translate markers, so a
name that merely starts the same is no longer treated as a match. - Fix: the fallback class loader mirrors src/ again, so a fresh install cannot
fatal on a class the loader never required.
1.1.1
- Security: hex-escape the inline config script so a config value cannot break
out of the<script>tag (including the<!--<script>mXSS vector). - Fix: editor-pushed formatted translations now store under the real
translation key instead of a numeric style index. - Build: the release now fails if the readme Stable tag and plugin header
Version drift apart, so wp.org always ships the built version.
1.1.0
- Feature: attribute translation — alt, title, placeholder, meta and input
values. - Feature: href and canonical rewriting on localized paths.
- Feature: auth-page contract — configured paths never sync keys (GDPR).
- Fix: the same-site referer guard never fired, because a bare host was
compared against one carrying a port. - Fix: /{lang}/ home now resolves in the request filter, rewrite rules flush on
a language change, and the locale redirect is skipped during editor sessions. - Fix: decode HTML entities in the markup parser, so PHP and JavaScript derive
the same translation key for the same text.
1.0.1
- Fix: translated Pages (not just Posts) now resolve at /{lang}/ URLs.
- Fix: editor URLs like /es/?__lr_editor= no longer 404 (query string was
being captured as the post slug). - Add: pretty permalinks are enabled automatically on activation when the
site is on the default plain structure (a custom structure is left
untouched), so /{lang}/ routing works out of the box. - Fix: config-sync cron is scheduled on init, silencing a WP 6.7
“textdomain loaded too early” notice.
1.0.0
Initial public release.
- Server-side block-level translation via output buffering.
- Dashboard-managed config sync: languages, namespace, switcher, exclude paths, output-buffering toggle pulled from the LionRapid server.
- Real-time config push via
POST /wp-json/lionrapid/v1/resyncfrom the dashboard. - 5-minute wp_cron fallback for config sync.
- Gutenberg blocks: translation, language switcher, translation editor.
- Language switcher auto-inject with four styles.
- URL prefix routing for non-source languages.
- SEO hreflang + translated meta descriptions.
- Background sync of newly discovered keys via wp_cron.
