{"id":399864,"date":"2026-11-09T11:19:02","date_gmt":"2026-11-09T11:19:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lionrapid-translation\/"},"modified":"2026-11-09T17:11:56","modified_gmt":"2026-11-09T17:11:56","slug":"lionrapid-translation","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/lionrapid-translation\/","author":23600237,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.2","stable_tag":"1.4.2","tested":"7.1.4","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Lionrapid Translation","header_author":"Lionrapid","header_description":"Translates your site on the server, before the page reaches the browser. Languages and settings come from your Lionrapid dashboard.","assets_banners_color":"f5f5f4","last_updated":"2026-11-09 17:11:56","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.lionrapid.com\/integrations\/wordpress","header_author_uri":"https:\/\/www.lionrapid.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":95,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.1":{"tag":"1.4.1","author":"lionrapid","date":"2026-11-09 11:18:25","revision":3792329},"1.4.2":{"tag":"1.4.2","author":"lionrapid","date":"2026-11-09 17:11:56","revision":3792927}},"upgrade_notice":{"1.4.2":"<p>Moving from an older copy installed from a ZIP now keeps your settings, and the old\ncopy can be deleted safely. Your connection and settings are kept.<\/p>","1.4.1":"<p>Requires PHP 8.1. Activation no longer changes your permalink settings. Your connection\nand settings are kept.<\/p>","1.4.0":"<p>A simpler settings page; Connect works on the first click; the language switcher keeps\nclear of your header menu. Your connection and settings are kept.<\/p>","1.3.2":"<p>Fixes the first Save and Sync Now dropping the languages from your dashboard. Your\nsettings are kept; nothing needs changing after updating.<\/p>","1.3.1":"<p>The first release in the WordPress plugin directory. Your settings are kept; saved\ntranslations are fetched again once. If you installed an earlier version from a ZIP\nfile, read the FAQ first: deleting the old copy afterwards removes the shared settings.<\/p>","1.3.0":"<p>Rewrites the settings screen for people who are not developers, and fixes a default\nserver address that could never work on a new install. Existing sites keep their\nsaved address and settings; nothing needs changing after updating.<\/p>","1.2.6":"<p>Fixes automatic language redirection on cached home pages. If your host caches\npages (WordPress.com, WP Rocket, Cloudflare and similar), visitors were being\nshown your default language regardless of their browser setting. No settings\nchange is needed.<\/p>","1.2.5":"<p>Fixes translations that reappeared after being removed, and language choices that\nwould not stick. On WordPress.com, translated URLs now cache per language and the\nplugin tells you when your visitors need a cache clear.<\/p>","1.2.4":"<p>Fixes stale translations on hosts with a persistent object cache (including\nWordPress.com), where clearing appeared to do nothing and new strings stopped\nreaching the dashboard. Press Clear Translations once after updating.<\/p>","1.0.1":"<p>Bug fixes for language-prefixed URLs (Pages now resolve, editor URLs no\nlonger 404) and automatic pretty-permalink setup on activation.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3792328,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3792328,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3792328,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3792925,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3792925,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.4.1","1.4.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3792328,"resolution":"1","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"Settings: one button connects the site to your Lionrapid project; languages and everything else come from your dashboard.","2":"Dashboard view \u2014 manage languages, namespace, switcher, and exclude paths in one place.","3":"Translated page \u2014 <code>\/de\/<\/code> URL prefix and switcher injected at runtime."}},"plugin_section":[],"plugin_tags":[22323,1734,99,95,2333],"plugin_category":[48],"plugin_contributors":[291631],"plugin_business_model":[],"class_list":["post-399864","plugin","type-plugin","status-publish","hentry","plugin_tags-language-switcher","plugin_tags-localization","plugin_tags-multilingual","plugin_tags-translate","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-lionrapid","plugin_committers-lionrapid"],"banners":{"banner":"https:\/\/ps.w.org\/lionrapid-translation\/assets\/banner-772x250.png?rev=3792925","banner_2x":"https:\/\/ps.w.org\/lionrapid-translation\/assets\/banner-1544x500.png?rev=3792925","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/lionrapid-translation\/assets\/icon.svg?rev=3792328","icon":"https:\/\/ps.w.org\/lionrapid-translation\/assets\/icon.svg?rev=3792328","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/lionrapid-translation\/assets\/screenshot-1.png?rev=3792328","caption":"Settings: one button connects the site to your Lionrapid project; languages and everything else come from your dashboard."}],"raw_content":"<!--section=description-->\n<p>Lionrapid Translation translates your site's content <strong>on the server<\/strong>, before the page reaches the browser. Visitors never see a flash of untranslated text, and search engines index the translated pages.<\/p>\n\n<p>The plugin is managed from your <strong>Lionrapid dashboard<\/strong>: languages, switcher style, excluded paths and server-side rendering sync to the plugin automatically. In WordPress you only enter your site key.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Server-side translation<\/strong>: the page's HTML is translated before delivery, so search engines see the translated content directly.<\/li>\n<li><strong>Formatting kept<\/strong>: inline formatting such as <code>&lt;b&gt;<\/code> and <code>&lt;a&gt;<\/code> survives translation.<\/li>\n<li><strong>Managed from the dashboard<\/strong>: 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.<\/li>\n<li><strong>Gutenberg blocks<\/strong>: a translation block, a language switcher block and an inline translation editor.<\/li>\n<li><strong>Language switcher<\/strong>: three styles (floating, buttons, flags), added to every page automatically or placed where you want it with the block.<\/li>\n<li><strong>Language URLs<\/strong>: addresses like <code>\/de\/<\/code>, <code>\/es\/<\/code> and <code>\/fi\/<\/code> lead visitors to the right language.<\/li>\n<li><strong>SEO<\/strong>: hreflang tags, translated meta descriptions and canonical URLs.<\/li>\n<li><strong>New text is collected<\/strong>: text that appears on the live site is sent to your dashboard for translation in the background (<code>wp_cron<\/code>).<\/li>\n<\/ul>\n\n<h4>Required external service<\/h4>\n\n<p>This plugin requires a <strong>Lionrapid account<\/strong>. It connects to the Lionrapid service at the address shown under Settings \u2192 Lionrapid (https:\/\/app.lionrapid.com by default).<\/p>\n\n<p>When activated and configured with a site key, the plugin sends:<\/p>\n\n<ul>\n<li>Translation requests (page content blocks) \u2192 server for translation lookup<\/li>\n<li>New keys discovered on the live site \u2192 server for translation queue<\/li>\n<li>Configuration sync requests \u2192 server for current project settings<\/li>\n<\/ul>\n\n<p>Server endpoints called:<\/p>\n\n<ul>\n<li><code>GET \/api\/integrations\/config?domain={your-site-domain}<\/code> \u2014 fetches project config<\/li>\n<li><code>GET \/api\/integrations\/translations\/{locale}\/{namespace}<\/code> \u2014 fetches translations<\/li>\n<li><code>POST \/api\/integrations\/sync\/...<\/code> \u2014 pushes newly discovered keys<\/li>\n<\/ul>\n\n<p>When your settings hold a publishable key (<code>pk_<\/code>), your visitors' browsers also call the Lionrapid service directly, at the API address your Lionrapid project gives (https:\/\/app.lionrapid.com by default):<\/p>\n\n<ul>\n<li>to load the translations and language settings for the page they are viewing;<\/li>\n<li>to report text on the page that has no translation yet, so it appears in your dashboard.<\/li>\n<\/ul>\n\n<p>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.<\/p>\n\n<p>The plugin also adds two REST endpoints to your site:<\/p>\n\n<ul>\n<li><code>POST \/wp-json\/lionrapid\/v1\/resync<\/code>: your Lionrapid dashboard calls it to push configuration changes immediately. It is authenticated with the key stored in your plugin settings.<\/li>\n<li><code>GET \/wp-json\/lionrapid\/v1\/api\/integrations\/translations\/{locale}\/{namespace}<\/code>: public and read-only. It serves your site's translations to the visitor's browser, so the browser never needs a key.<\/li>\n<\/ul>\n\n<p>Lionrapid's terms of service: https:\/\/www.lionrapid.com\/terms. Privacy policy: https:\/\/www.lionrapid.com\/privacy.<\/p>\n\n<h4>Without a site key<\/h4>\n\n<p>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.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In <strong>Plugins \u2192 Add New<\/strong>, search for \"Lionrapid Translation\", then click <strong>Install Now<\/strong> and <strong>Activate<\/strong>.<\/li>\n<li>Visit <strong>Settings \u2192 Lionrapid<\/strong>.<\/li>\n<li>Enter your <strong>site key<\/strong> from the WordPress tab of your Lionrapid dashboard: a publishable key starting with <code>pk_<\/code>. Leave the address as it is unless support asks you to change it. Sites configured earlier with a master key (<code>sk_<\/code>) keep working unchanged.<\/li>\n<li>Click <strong>Save settings<\/strong>. The plugin pulls your project settings (languages, switcher, excluded paths) from the dashboard automatically.<\/li>\n<li>Language URLs like <code>\/de\/<\/code> are set up automatically when your languages change. If one answers \"not found\", click <strong>Refresh language URLs<\/strong> on the same page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20lionrapid%20account%3F\"><h3>Do I need a Lionrapid account?<\/h3><\/dt>\n<dd><p>Yes. The plugin connects to the Lionrapid service. You can sign up at https:\/\/www.lionrapid.com.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20without%20server-side%20translation%3F\"><h3>Can I use it without server-side translation?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"how%20does%20it%20handle%20new%20strings%20that%20haven%27t%20been%20translated%20yet%3F\"><h3>How does it handle new strings that haven't been translated yet?<\/h3><\/dt>\n<dd><p>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 <code>wp_cron<\/code>, 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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20%2F%20elementor%20%2F%20page%20builders%3F\"><h3>Does it work with WooCommerce \/ Elementor \/ page builders?<\/h3><\/dt>\n<dd><p>The plugin operates at the rendered HTML level, so it works with any front-end content. Path rules let you exclude <code>\/cart\/<\/code>, <code>\/checkout\/<\/code>, <code>\/wp-admin\/<\/code>, and similar paths from translation if needed (configured on the dashboard).<\/p><\/dd>\n<dt id=\"is%20my%20api%20key%20visible%20to%20visitors%3F\"><h3>Is my API key visible to visitors?<\/h3><\/dt>\n<dd><p>The key the plugin prints for the browser is a publishable key (<code>pk_<\/code>), which is designed to be public \u2014 it can read your translations and register new strings for translation, nothing else. The plugin refuses to print anything that is not a <code>pk_<\/code> key: if your settings hold a master key (<code>sk_<\/code>), 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.<\/p><\/dd>\n<dt id=\"where%20are%20my%20settings%20stored%3F\"><h3>Where are my settings stored?<\/h3><\/dt>\n<dd><p>In <code>wp_options<\/code> under the key <code>lionrapid_settings<\/code>. Your site key, the service address and the on\/off switch are set in Settings \u2192 Lionrapid. Everything else (languages, namespace, switcher, exclude paths) is read-only and overwritten by the dashboard sync.<\/p><\/dd>\n<dt id=\"how%20do%20i%20uninstall%20cleanly%3F\"><h3>How do I uninstall cleanly?<\/h3><\/dt>\n<dd><p>Deactivating the plugin stops it and keeps your settings. Deleting it from <strong>Plugins<\/strong> removes its settings, saved translations and scheduled jobs (on a multisite network, on every site).<\/p><\/dd>\n<dt id=\"i%20installed%20an%20earlier%20version%20from%20a%20zip%20file.%20how%20do%20i%20switch%20to%20the%20directory%20version%3F\"><h3>I installed an earlier version from a ZIP file. How do I switch to the directory version?<\/h3><\/dt>\n<dd><p>ZIP files before 1.3.1 installed into the folder <code>lionrapid<\/code>; the directory version installs into <code>lionrapid-translation<\/code>. WordPress treats them as two plugins, but they share one set of settings.<\/p>\n\n<p>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 <strong>Plugins<\/strong>; your settings stay. The Plugins screen and Settings \u2192 Lionrapid point out the old copy while it is still installed.<\/p>\n\n<p>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.<\/p>\n\n<p>ZIP files from 1.3.1 on install into <code>lionrapid-translation<\/code>, 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 <strong>Dashboard \u2192 Updates<\/strong> either way, and your settings are kept.<\/p><\/dd>\n<dt id=\"where%20is%20the%20source%20code%20of%20the%20bundled%20javascript%3F\"><h3>Where is the source code of the bundled JavaScript?<\/h3><\/dt>\n<dd><p>The plugin's own minified scripts in <code>assets\/dist\/<\/code> are built from the TypeScript sources that ship in <code>assets\/src\/<\/code>.<\/p>\n\n<p>The three scripts in <code>assets\/dist\/js\/vendor\/<\/code> come from the open-source Lionrapid SDK, https:\/\/github.com\/LionRapid\/lionrapid-sdk (MIT, <code>packages\/core<\/code>, built by <code>packages\/core\/build.browser.js<\/code>):<\/p>\n\n<ul>\n<li><code>lionrapid.auto.min.js<\/code>: the language switcher and in-page translation, from <code>src\/browser\/index.ts<\/code>. Its unminified build ships beside it as <code>lionrapid.auto.dev.js<\/code>.<\/li>\n<li><code>lionrapid.iife.min.js<\/code>: the library the Gutenberg blocks use in the editor, from <code>src\/index.ts<\/code>.<\/li>\n<li><code>lionrapid.editor.min.js<\/code>: the visual translation editor, loaded only during an editor session, from <code>src\/browser\/editor\/editor-init.ts<\/code>.<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Fixed: activating Lionrapid Translation while an older copy installed from a ZIP\n(in plugins\/lionrapid\/) is still active no longer fails with a fatal error. The new\ncopy takes over and deactivates the old one; your connection and settings carry over.<\/li>\n<li>Fixed: deleting that older copy no longer deletes your settings. Its uninstall used to\nremove the settings the two copies share, which disconnected the site.<\/li>\n<li>New: the Plugins screen and Settings \u2192 Lionrapid say when an older copy is still\ninstalled, and that it can be deleted.<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Changed: the plugin now requires PHP 8.1. On PHP 8.0 it could not be activated.<\/li>\n<li>Changed: activation no longer switches Plain permalinks to \/%postname%\/ by itself.\nSettings \u2192 Lionrapid says when your permalinks need changing for language addresses.<\/li>\n<li>Changed: the page-cache notice shows only on Settings \u2192 Lionrapid, not on every\nadmin screen.<\/li>\n<li>Fixed: settings saved through the settings form or synced from your dashboard are\ncleaned field by field; invalid language codes are dropped.<\/li>\n<li>Fixed: the plugin reads WordPress's own addresses (REST, admin, login) instead of\nassuming the default ones, so a custom REST prefix works.<\/li>\n<li>Fixed: the translation-editor block no longer contacts Lionrapid before the site is\nconnected, and dashboard pushes are limited to one run a minute.<\/li>\n<li>Fixed: no missing-file notices or 404s for block scripts in the block editor.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: a simpler settings page. Connection, Translation and Languages each sit on one\ncard, the status shows at the top (Connected, Waiting for approval, Not connected), and\nthe connection code is shown large with a Copy button. Explanations moved into small \u24d8\nlabels that open on hover, keyboard focus or tap. Technical details are under Advanced.<\/li>\n<li>Fixed: \"Connect to Lionrapid\" always starts on the first click, also before the page's\nscript has loaded.<\/li>\n<li>Fixed: a top-corner language switcher no longer covers your theme's header menu.<\/li>\n<li>Fixed: a visitor's browser no longer shows a stored copy of translations from another\nLionrapid project on the same site, and a removed translation stops being shown.<\/li>\n<li>The page language (<code>&lt;html lang&gt;<\/code>) follows the language the visitor picks.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Fixed: the first Save on the settings page, and Sync Now, could drop the languages,\nnamespace and switcher settings arriving from your dashboard, while still showing a\nsuccessful Last sync. They came back only at the next background sync.<\/li>\n<li>Fixed: with \"Enable Plugin\" or \"Emit hreflang tags\" turned off, Sync Now could turn\nthem back on.<\/li>\n<li>A sync whose settings could not be saved now reports an error instead of success.<\/li>\n<li>The FAQ now says that pages in your source language are scanned too: that is how new\nstrings reach Lionrapid.<\/li>\n<li>The redirect to a visitor's language uses <code>wp_safe_redirect()<\/code>, which only follows\naddresses on your own site.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Now in the WordPress plugin directory as \"Lionrapid Translation\". The text domain is\n  lionrapid-translation, the directory's name for the plugin, so translations of the\nsettings screen can come from translate.wordpress.org.<\/li>\n<li>The readable TypeScript sources of the bundled scripts ship with the plugin, in\n  assets\/src\/.<\/li>\n<li>The readme describes the plugin as it is today: three switcher styles, the current\nbutton names, what deleting the plugin removes, the service it connects to, and\nwhat visitors' browsers send to it when you use a publishable key.<\/li>\n<li>The plugin folder is now <code>lionrapid-translation<\/code>, the same as the directory\ninstall, so a ZIP install and a directory install are one plugin. ZIP files\nbefore 1.3.1 installed into <code>lionrapid<\/code>; see the FAQ before switching.<\/li>\n<li>Deleting the plugin keeps your settings while another copy of it is still\ninstalled.<\/li>\n<li>The translation cache rows carry the plugin's <code>lionrapid_<\/code> prefix. The old rows\nare removed once after updating and your translations are fetched again on the\nnext page view.<\/li>\n<li>The same-origin translation endpoint moved into the plugin's own namespace:\n  \/wp-json\/lionrapid\/v1\/api\/integrations\/translations\/{locale}\/{namespace}. The\nold <code>\/wp-json\/api\/integrations\/...<\/code> address is gone. A page your host cached\nbefore updating may ask the old address until that cache expires; its\nserver-side translation is unaffected.<\/li>\n<li>Every value read from the request is unslashed and sanitized, with web addresses\nkept intact, and each admin action checks its security token itself.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li><p>The settings page now speaks plainly. Labels and messages were written for the\ndevelopers who built the plugin, not for the people who install it \u2014 so a failure\nsaid things like \"Invalid response format\" and left you nowhere to go. Every\nmessage now says what happened and what to do about it.<\/p><\/li>\n<li><p>The server address defaults to the real one. A fresh install pointed at localhost,\nan address that only exists on a developer's own machine, so the first connection\ntest could never succeed. Sites already set up are unaffected \u2014 your saved address\nis kept.<\/p><\/li>\n<li><p>Every button shows its own progress and result. Test connection, Sync now, Clear\ncache and Update language URLs now behave the same way: the button tells you it is\nworking, then whether it worked, and the answer stays on screen underneath instead\nof vanishing.<\/p><\/li>\n<li><p>When something fails you get a plain explanation and a next step, with the\ntechnical detail behind a \"Details\" link for when support needs it.<\/p><\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Fix: visitors whose browser is set to another language now reach that language\nfrom your home page, even when the page is served from your host's cache.\nPreviously the redirect ran in PHP, and on a cached page PHP never runs \u2014 so a\nFinnish visitor landing on a warm home page simply saw English. The choice is\nnow made in the browser, which still runs when the cache is serving.\nYour home page stays cached for everyone; only the language decision moved.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fix: a translation you removed or unapproved could keep appearing on your site\nforever. Each string was stored twice \u2014 once on its own and once inside a\nbundle \u2014 and refreshing replaced the bundle without ever clearing the individual\ncopy, which is the one the plugin reads first.<\/li>\n<li>Fix: choosing your own language now sticks. Picking the site's main language\nfrom the switcher could be overridden by your browser's language on the next\nvisit, sending you back to the language you had just left.<\/li>\n<li>Fix: language-prefixed URLs like \/fi\/about\/ now resolve the same way \/about\/\ndoes, including nested pages and content from other plugins. Cache and SEO tools\nthat ask WordPress \"which page is this URL?\" previously got no answer for a\ntranslated page.<\/li>\n<li>Fix: \"Clear Translations\" also clears the bookkeeping that tracks how fresh your\ntranslations are.<\/li>\n<li>Fix: deactivating the plugin now stops all three of its scheduled jobs, not one.<\/li>\n<li>New: on hosts with a page cache the plugin can clear \u2014 WP Rocket, W3TC,\nLiteSpeed, WP Super Cache \u2014 it clears it automatically when translations change.<\/li>\n<li>New: on WordPress.com, where plugins cannot clear the cache, you get a notice in\nthe admin when your visitors are being served old pages, and how to clear it. It\nappears only when translations actually change, and once dismissed it stays\ndismissed until they change again.<\/li>\n<li>New: on WordPress.com your language choice is now part of the page-cache key, so\na visitor who prefers Finnish is no longer served the page cached for an English\nvisitor.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fix: \"Clear Translations\" now really clears them on hosts that keep a\npersistent object cache, WordPress.com among them. The rows were being\ndeleted, but a cached copy was still served, so old translations came back\nand no amount of clearing helped. The same stale copies also made every\nstring look like one the site had already reported, so the site quietly\nstopped sending new content to your dashboard. If your site is on such a\nhost, press Clear Translations once after updating.<\/li>\n<li>Fix: the plugin's own short-lived caches are cleared too. On a site with a\npersistent object cache those are not kept in the database at all, so the\nprevious cleanup silently matched nothing.<\/li>\n<li>Change: a resync from the dashboard now refreshes translations as well as\nsettings, so an edit reaches your site without waiting for the next\nscheduled check.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fix: translation changes now appear on the FIRST page load. The refresh ran\nafter the page had already been sent, so a page always showed the previous\nversion and a reload was needed to see an edit.<\/li>\n<li>Fix: saving a new API key no longer silently reverts to the old one. The\nsettings page reported success while the previous key was written back.<\/li>\n<li>Fix: the server URL you configure is the one the plugin calls. A legacy\nsetting could override it invisibly, so requests went to the old host and\nfailed with an error blaming the API key.<\/li>\n<li>Fix: the dashboard's minimum-text-length setting now reaches the site. It was\ndeclared and honoured everywhere except the one place that reads it from the\nserver, so sites stayed on the built-in default.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fix: \"Clear Translations\" now actually clears them. It was deleting from a\ncache layer the plugin never wrote to, and reported success because the delete\nmatched zero rows rather than failing.<\/li>\n<li>Fix: the source-language home page is reachable again. A visitor arriving at\nyour site with no referer \u2014 a typed address, a bookmark, a search result \u2014 was\nredirected to their guessed language every time, with no way back to <code>\/<\/code>. An\ninferred language now redirects once; an explicit choice from the switcher\nstill always applies.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: og: and twitter: social preview text is now translated. A shared link\nshowed the source language even on a translated page, because the preview\nmeta tags were never extracted for translation.<\/li>\n<li>Housekeeping: removed <code>translationMode<\/code>, a setting nothing ever read.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Feature: regional locale routing (for example \/pt-br\/), with BCP-47 hreflang\nand Accept-Language quality-value parsing.<\/li>\n<li>Feature: SEO plugin coexistence \u2014 Yoast and similar plugins are detected, and\ncanonical\/hreflang output defers to them instead of emitting a second,\nconflicting set.<\/li>\n<li>Feature: localized sitemap alternates for Yoast.<\/li>\n<li>Feature: honours the noindex-locales setting, so a locale still under review\nis not indexed before it is ready.<\/li>\n<li>Change: the plugin authenticates with a publishable (pk_) key, and prefers\nthe API host the server advertises over a hardcoded one.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fix: background sync no longer retries in a loop when the API key is missing\nor the server answers 4xx.<\/li>\n<li>Fix: no If-None-Match header while the translations cache is empty \u2014 the\nrequest could return 304 with nothing to render from.<\/li>\n<li>Fix: exact attribute-name matching when detecting no-translate markers, so a\nname that merely starts the same is no longer treated as a match.<\/li>\n<li>Fix: the fallback class loader mirrors src\/ again, so a fresh install cannot\nfatal on a class the loader never required.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Security: hex-escape the inline config script so a config value cannot break\nout of the <code>&lt;script&gt;<\/code> tag (including the <code>&lt;!--&lt;script&gt;<\/code> mXSS vector).<\/li>\n<li>Fix: editor-pushed formatted translations now store under the real\ntranslation key instead of a numeric style index.<\/li>\n<li>Build: the release now fails if the readme Stable tag and plugin header\nVersion drift apart, so wp.org always ships the built version.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Feature: attribute translation \u2014 alt, title, placeholder, meta and input\nvalues.<\/li>\n<li>Feature: href and canonical rewriting on localized paths.<\/li>\n<li>Feature: auth-page contract \u2014 configured paths never sync keys (GDPR).<\/li>\n<li>Fix: the same-site referer guard never fired, because a bare host was\ncompared against one carrying a port.<\/li>\n<li>Fix: \/{lang}\/ home now resolves in the request filter, rewrite rules flush on\na language change, and the locale redirect is skipped during editor sessions.<\/li>\n<li>Fix: decode HTML entities in the markup parser, so PHP and JavaScript derive\nthe same translation key for the same text.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: translated Pages (not just Posts) now resolve at \/{lang}\/ URLs.<\/li>\n<li>Fix: editor URLs like \/es\/?__lr_editor= no longer 404 (query string was\nbeing captured as the post slug).<\/li>\n<li>Add: pretty permalinks are enabled automatically on activation when the\nsite is on the default plain structure (a custom structure is left\nuntouched), so \/{lang}\/ routing works out of the box.<\/li>\n<li>Fix: config-sync cron is scheduled on init, silencing a WP 6.7\n\"textdomain loaded too early\" notice.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>Initial public release.<\/p>\n\n<ul>\n<li>Server-side block-level translation via output buffering.<\/li>\n<li>Dashboard-managed config sync: languages, namespace, switcher, exclude paths, output-buffering toggle pulled from the LionRapid server.<\/li>\n<li>Real-time config push via <code>POST \/wp-json\/lionrapid\/v1\/resync<\/code> from the dashboard.<\/li>\n<li>5-minute wp_cron fallback for config sync.<\/li>\n<li>Gutenberg blocks: translation, language switcher, translation editor.<\/li>\n<li>Language switcher auto-inject with four styles.<\/li>\n<li>URL prefix routing for non-source languages.<\/li>\n<li>SEO hreflang + translated meta descriptions.<\/li>\n<li>Background sync of newly discovered keys via wp_cron.<\/li>\n<\/ul>","raw_excerpt":"Translates your site on the server, before the page reaches the browser. Languages and settings come from your Lionrapid dashboard.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/399864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=399864"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lionrapid"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=399864"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=399864"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=399864"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=399864"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=399864"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=399864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}