Lionrapid Translation

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 config
  • GET /api/integrations/translations/{locale}/{namespace} — fetches translations
  • POST /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

  1. In Plugins Add New, search for “Lionrapid Translation”, then click Install Now and Activate.
  2. Visit Settings Lionrapid.
  3. 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.
  4. Click Save settings. The plugin pulls your project settings (languages, switcher, excluded paths) from the dashboard automatically.
  5. 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 a pk_ 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_options under the key lionrapid_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 into lionrapid-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 in assets/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 by packages/core/build.browser.js):

  • lionrapid.auto.min.js: the language switcher and in-page translation, from src/browser/index.ts. Its unminified build ships beside it as lionrapid.auto.dev.js.
  • lionrapid.iife.min.js: the library the Gutenberg blocks use in the editor, from src/index.ts.
  • lionrapid.editor.min.js: the visual translation editor, loaded only during an editor session, from src/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.

Contributors

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 into lionrapid; 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/resync from 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.