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.
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.