Description
Instant website translation and SEO to grow your global traffic. Get lang prefixes, hreflang tags, and automated sitemaps for Google. No complex DNS setup needed. Launch your multilingual store or site in 60 seconds.
Why Proxylang
WordPress translation generally takes one of three approaches:
- Database plugins: store duplicated translated content in your database and often involve manual translation work.
- DNS proxies: require CNAME or nameserver changes that some managed hosts don’t allow.
- Browser translate widgets: translate in the visitor’s browser but aren’t indexed by search engines.
Proxylang gives you real indexed per-language URLs, server-rendered SEO for search crawlers, and instant in-browser translation for visitors — with no DNS changes:
- Real per-language URLs (
yoursite.com/es-MX/about) indexed by Google - AI translation in 68 languages with context-aware quality
- Server-rendered translated HTML for search-engine bots (Googlebot, Bingbot, ChatGPT, Claude, Perplexity)
- Instant client-side translation for human visitors. No page re-render
- Auto-generated hreflang tags, per-language XML sitemaps, robots.txt
- WooCommerce Product JSON-LD localized for Google Shopping rich results
- Translation glossary so brand terms always render the way you want
- Full analytics dashboard with anonymous visitor tracking, languages, countries, top pages
- Zero DNS setup. Install plugin, paste keys, you’re live
Account required
This plugin connects WordPress to the Proxylang translation network. You’ll need a free Proxylang account at proxylang.dev to use the plugin. Sign-up takes 30 seconds. The free tier translates 2,000 words/month at no cost. Enough for most small business sites. Higher tiers scale with traffic. See proxylang.dev/pricing.
Who is this for?
- WordPress sites going international: blogs, agencies, SaaS marketing sites, portfolios.
- WooCommerce stores selling cross-border: products, variations, cart, checkout, and Product schema all translate automatically.
- Sites on managed hosts that don’t allow DNS changes: Kinsta, WP Engine, WordPress.com Business+, Pressable, and similar.
- Agencies managing multilingual clients: install once, manage translations from one dashboard.
How it works under the hood
When a visitor lands on /es-MX/about, the plugin inspects the request:
- Search-engine bot (Googlebot, ChatGPT, Claude, etc.): plugin fetches a fully translated HTML page from Proxylang’s edge network and serves it directly. Indexable, hreflang-annotated, no JavaScript required.
- Human visitor: plugin redirects to your source URL (
/about) and sets a language cookie. Your page then loads with a tiny script that translates visible content client-side. No full re-render, no flicker, and your address bar stays clean.
Translations are cached at 300+ edge locations and inside your WordPress install, so repeat visitors see instant translated pages.
Features
- AI translation in 68 languages with brand-context awareness
- Translates both search engines and visitors. Bots see pre-rendered translated HTML, real visitors see live in-browser translation
- Per-language
sitemap.xml,robots.txt, hreflang, og:locale, content-language headers - Translation glossary: override AI translations for brand terms or any specific phrase
- Full analytics dashboard: visitors, languages, countries, top pages, growth over time. All anonymous and aggregated
- WooCommerce Product JSON-LD localization for Google Shopping
- Compatible with W3 Total Cache, WP Super Cache, LiteSpeed Cache, and other page caches
- Translation cache invalidation via signed HMAC webhooks. No manual purge
- GDPR-friendly. No visitor PII, cookies, or form submissions sent to Proxylang
- Works with any theme, page builder, or block editor (Elementor, Divi, Gutenberg, Bricks, etc.)
- WordPress 6.5+ and PHP 7.4+ supported
External services
This plugin connects to the Proxylang translation service. The plugin will not function without contacting these services. Translation cannot happen entirely on your server. Proxylang runs the AI translation pipeline, edge cache, and dashboard.
What data is sent and when:
-
proxylang.dev: configuration, plugin registration, daily heartbeat.
POST https://proxylang.dev/api/proxylang/plugin/register: sent on plugin activation. Transmits: your public key (Authorization header), plugin version, your site’s home URL, REST webhook URL, requested mode.POST https://proxylang.dev/api/proxylang/plugin/heartbeat: sent once per day. Transmits: your public key, plugin version, mode, home URL.POST https://proxylang.dev/api/proxylang/plugin/config: sent on settings save and twice daily. Transmits: your public key. Returns: enabled languages, source language, registered domain.
-
proxy.proxylang.dev (server-to-server, from your WordPress server): translated HTML and sitemap delivery.
GET https://proxy.proxylang.dev/v1/render?domain=…&path=…&lang=…: sent when a search-engine bot requests a/{lang}/*URL. Transmits: your public key (X-Proxylang-Key header), the requesting visitor’s User-Agent (X-Proxylang-Visitor-UA header), requested path, language.GET https://proxy.proxylang.dev/v1/sitemap?domain=…&lang=…: sent when WordPress requests a per-language sitemap. Transmits: your public key, language code.
-
proxy.proxylang.dev (loaded in each site visitor’s browser): live in-page translation for human visitors. The plugin adds the following to your front-end pages when enabled:
<script src="https://proxy.proxylang.dev/script.js">: enqueued into every enabled front-end page. The visitor’s browser downloads and runs this script to translate the page client-side. Your public key is passed to it via adata-keyattribute.GET https://proxy.proxylang.dev/v1/script-bundle?key=…&lang=…&path=…: fetched (and<link rel="preload">-hinted) by that script to retrieve cached translations for the current page and language. Transmits: your public key, target language, page path. No visitor personal data is sent.
Proxylang’s privacy policy: https://proxylang.dev/privacy
Proxylang’s terms of service: https://proxylang.dev/terms
Privacy
This plugin does NOT send visitor personal data, cookies, form submissions, IP addresses, or session content to Proxylang. Only the request URL path and the visitor’s User-Agent string are transmitted (the User-Agent is required so that bot translations can be metered per crawler). Logged-in administrator previews skip Proxylang entirely and serve the origin page directly.
Translation caches live entirely on your WordPress install (in object cache or transients) and on Proxylang’s edge network. No per-visitor records are stored. Analytics are collected anonymously and aggregated (country, language, page path) for the dashboard.
For European customers: Proxylang is GDPR-compliant. See the privacy policy linked above for the full data-processing agreement.
Screenshots




Installation
- Create a free Proxylang account at proxylang.dev and add your domain. Setup wizard takes about 60 seconds and gives you two keys: production and local-development.
- Install the plugin from WordPress.org (or upload the
.zipfrom your Proxylang dashboard). - Activate through the Plugins screen.
- Go to Settings Proxylang and paste your two keys:
pk_xxxxxxxxxxxxxxxxxxxxinto the Production Key fieldpk_local_xxxxxxxxxxxxxxxxxxxxinto the Local / Development Key field (optional but recommended)
- Check Enabled and click Save Changes.
- Visit your site at
yoursite.com/{language}/(e.g./es-MX/,/ja-jp/) to confirm translations are live. - Go to proxylang.dev/customize to design your language switcher.
That’s it. No code paste, no DNS, no theme edits, no .htaccess changes.
FAQ
-
Do I need a Proxylang account?
-
Yes. The plugin connects WordPress to the Proxylang AI translation service. Sign up at proxylang.dev. The free tier covers 2,000 translated words per month. Enough for small business sites. Paid tiers scale by translated word volume, not by site count or page count.
-
Does this require DNS changes?
-
No. Traditional DNS-based translation proxies require you to point a CNAME or change your nameservers. Proxylang avoids that entirely — everything runs through WordPress itself.
-
Why two keys (production + local)?
-
The plugin auto-selects between your production key (
pk_xxx) and your local-dev key (pk_local_xxx) based on the current site hostname. This lets you copy the same WordPress install from production to a local staging environment without swapping keys. -
How does this differ from database-stored translation plugins?
-
Some translation plugins store duplicated translated content in your WordPress database, with translation done manually per post / product or via a managed service. Proxylang translates with AI on demand and caches at the edge, so translated content isn’t duplicated in your database and updates propagate from a single dashboard.
-
Can I override AI translations for brand terms or specific phrases?
-
Yes. Proxylang ships a translation glossary in your dashboard where you define exact translations per language for any term or phrase. Glossary entries are applied site-wide and propagate to your live site within seconds. (A full visual live editor for arbitrary inline content is on the roadmap.)
-
Do you provide analytics?
-
Yes. Every account includes a full analytics dashboard with visitor counts, language and country breakdowns, top pages, and growth over time. All data is anonymous and aggregated. No personally identifiable information is collected from your visitors.
-
Will Google actually index my translated pages?
-
Yes. Search engine bots receive fully server-rendered HTML with hreflang tags pointing to all language versions. The plugin generates per-language sitemaps and pings IndexNow / Bing on translation changes. Real per-language URLs are indexable like any other page.
-
How much does bot translation cost compared to visitor translation?
-
Bot translations cost about 1/4 the word usage of human (visitor) translations. Search engines see fully pre-rendered translated pages for SEO, your visitors get instant in-browser translation, and the bot side uses a fraction of your word quota.
-
Does it work with WooCommerce?
-
Yes, fully. Product titles, descriptions, variations, attribute swatches, cart, checkout field labels, and shipping/payment method names all translate automatically. Product JSON-LD is localized so translated pages appear correctly in Google Shopping and rich results. Cart and checkout pages are explicitly excluded from caching to preserve session state.
-
Is the plugin compatible with caching plugins?
-
Yes. Built-in shims for W3 Total Cache, WP Super Cache, and LiteSpeed Cache automatically vary cached entries by language and visitor type, so bots and humans don’t share cache entries.
-
What happens to my content if I deactivate the plugin?
-
Translations stop, the
/{language}/URLs stop responding, and your site reverts to its source language. Your original content is untouched. We never modify your posts, products, or theme files. Translations live in the Proxylang dashboard and can be re-enabled anytime. -
Does it work on WordPress.com?
-
Yes, on Business and Commerce plans (which allow plugin uploads). WordPress.com Personal / Premium don’t allow third-party plugins.
-
Is there a free tier?
-
Yes. 2,000 translated words per month, no credit card required. See proxylang.dev/pricing for the full breakdown.
-
Is my visitors’ data sent to any AI provider?
-
No. The plugin does NOT send visitor cookies, form submissions, session data, or IP addresses to Proxylang or any translation provider. Only the source text being translated is transmitted, and only on cache misses. Subsequent visitors are served from cached translations. Visitor analytics are collected anonymously and aggregated. No PII.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Proxylang: AI Translation & Multilingual SEO” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Proxylang: AI Translation & Multilingual SEO” 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.4
- Admin-notice dismiss scripts are now enqueued (
wp_enqueue_script+wp_localize_script) instead of printed inline. Readme wording clarified to remove comparative/superlative phrasing per WordPress.org plugin guidelines. No functional changes for existing sites.
1.4.3
- WordPress.org directory release. Bundled the full GNU GPLv2 license text, documented every external service call (including the browser-loaded translation script and translation-bundle fetch) in the readme, and gated debug logging behind
WP_DEBUG. No functional changes for existing sites.
1.4.2
- Fix: Widget script is now excluded from page-optimizer interference. The Proxylang
<script>is flagged so optimization plugins never combine, minify, self-host (which can serve a stale copy), or delay-until-interaction it. Covers Cloudflare Rocket Loader (data-cfasync), Autoptimize (data-noptimize), LiteSpeed / SiteGround / Perfmatters (data-no-optimize), JS-minify skips (data-no-minify), and WP Rocket / Perfmatters external-JS + delay-JS filter exclusions. Prevents broken or stale widget loads on optimizer-heavy sites.
1.4.1
- Fix: PHP-FPM pool exhaustion guards on sitemap build. Global concurrent-build budget (default 3, filterable via
proxylang_sitemap_build_budget) with atomic per-slot SETNX, exponential backoff polling (100/200/400ms), andregister_shutdown_functioncrash-safety for lock + budget release. - Fix: Lock TTL raised 60s 90s to cover cold-start fetch+parse on shared hosts.
- Fix: Cache-flush fence prevents stale pre-flush content from landing in cache after publish.
- Fix: Loopback fetch now validates response Content-Type, body shape, byte length (rejects > 20 MiB), and uses
limit_response_sizeat the transport layer so a hostile/misconfigured origin cannot OOM the PHP process before our size guard runs. - Fix: Loopback fetch no longer follows redirects (
redirection => 0) — closes attack vector via origin redirect to internal endpoints. - Fix: Origin XML transient cache (5 min TTL, ≤ 5 MB) deduplicates loopback fetches across language mirrors — halves PHP-FPM slot usage on multi-lang installs.
- Fix: Per-request flush dedup eliminates 800+ DB writes during 100-product WooCommerce bulk imports.
- Add:
rest_after_insert_{cpt}hooks registered for every public post type so REST PATCH writes always invalidate sitemap cache. - Add: WooCommerce update/new/delete/trash + Polylang
pll_save_post+ WPMLwpml_translation_update/icl_make_duplicatehooks invalidate sitemap cache. - Add: Memory peak telemetry — logs warning when chunk build exceeds 80% of PHP
memory_limit. - Add: Dismissible admin notice when host SEO plugin index exceeds 200-child cap (degrades to legacy single-XML mode with no hreflang).
- Refactor: Shared
SitemapFlushHooksclass consolidates content-change hooks for ENHANCE + REPLACE strategies (~150 lines deduplicated).
1.4.0
- Add: Multilingual-aware sitemap compatibility mode. Detects host SEO plugin (Yoast, RankMath, AIOSEO, SEOPress, Slim SEO, WP-core) and dispatches to one of three strategies:
- ENHANCE (Yoast/RankMath/AIOSEO) — keeps host plugin’s chunked sitemap structure, injects
<xhtml:link rel="alternate" hreflang>annotations per URL via the host’s filter hooks, mirrors topology at/{lang}/{cpt}-sitemap.xmlmirror endpoints. Legacy/sitemap.xml301-redirects to the host’s index. - REPLACE (SEOPress/Slim SEO/WP-core) — disables competing native sitemap, emits monolithic Proxylang sitemap (same shape as v1.0.x).
- LEGACY — v1.0.x monolithic behavior, kept as kill-switch fallback (Settings “Multilingual-aware sitemap compatibility mode”).
- ENHANCE (Yoast/RankMath/AIOSEO) — keeps host plugin’s chunked sitemap structure, injects
- Add:
<meta name="proxylang-seo">sentinel emitted on every translated page so the Proxylang worker skips duplicate hreflang/canonical/og:locale injection when proxying. - Add: Single source of truth for translated URL construction (
Plugin::build_translated_url) used by sitemap<loc>,<head>hreflang, canonical, and HTTPLink:header — guarantees Google’s bidirectional return-tag contract. - Add: SEO host detection cache with auto-invalidation on plugin activate/deactivate. Strategy switches automatically when Yoast/RankMath/AIOSEO is installed or removed.
- Add: Cache-stampede protection on big sites — single-builder lock prevents PHP-FPM pool exhaustion during cold-cache rebuilds.
- Add: SEO-host-aware
<head>injection — skips canonical andog:localeon Yoast/RankMath/AIOSEO so the host plugin’s own tags are not duplicated. - Add: Dev-tunnel host detection —
pk_local_*keys auto-select on*.ngrok-free.app,*.loca.lt,*.serveo.net,*.trycloudflare.comfor easier staging testing. - Add: Settings UI toggle, one-time admin notice on upgrade, and runtime version-stamp migration that flushes rewrite rules on SFTP/git deploys (not just WP-updater upgrades).
- Add:
XXEdefense (LIBXML_NONET) on origin sitemap parsing; UTF-8 BOM stripping; output-buffer cleanup before XML stream. - Fix: Query-var hijack —
?proxylang_sitemap=1on any URL now requires the path to end in.xmlbefore triggering serve. - Fix:
save_posthook now gates on publish-status + skips revisions/autosaves so Gutenberg’s per-10s autosave doesn’t wipe the sitemap cache. - Fix:
flush_sitemap_namespacenow targets a dedicated cache group instead of wiping the entireproxylangobject cache (no more accidental render/config/widget cache invalidation). - Fix: Plugin-disabled state no longer registers strategy filter hooks (was silently disabling competing SEO plugins’ sitemaps even when key was missing).
- Fix:
uninstall.phpcleans v1.4 options + sitemap build-lock options.
1.0.1
- Fix:
/{lang}/sitemap.xmlreturned the blog page instead of XML on most sites — sitemap rewrite regex required lowercase region subtag but BCP-47 codes (fr-FR,es-MX, etc.) use uppercase. Now accepts both/es/and/es-MX/shapes, matching the content router. - Fix: Per-language URLs were emitted in mixed case (
/fr-FR/about) but worker emits lowercase (/fr-fr/about). Mismatch fragmented Google’s indexing signals across two URL variants for the same locale. All URL paths now use lowercase BCP-47 tags; thehreflangattribute itself keeps standard case (e.g.hreflang="fr-FR"). - Fix: Plugin did not re-flush WordPress rewrite rules when
plugin_modechanged (e.g. fromnonetohybrid). Routes for/{lang}/*and/{lang}/sitemap.xmlstayed stale until language config changed independently. Now flush triggers on any rewrite-relevant config change. - Fix: Sitemap cache key did not include
plugin_mode, so ahybridwidget_onlyhybridflip could serve a stale sitemap built for the previous URL pattern. - Fix:
robots.txtsitemap entries and the<link rel="sitemap">head tag now emit lowercase BCP-47 paths to match the canonical URL form.
1.0.0
- Initial release.
- Translates both search engines (server-rendered) and visitors (client-side widget). Bot translations cost about 1/4 the word usage of human translations, so a fully multilingual site uses a fraction of your word quota.
- Two-key support: auto-selects between production and local-development keys based on site hostname.
- Per-language URL routing accepts variant prefixes (
/es-mx/,/es-MX/,/es/,/mx/) and resolves to canonical BCP47. - Per-language sitemaps, hreflang, robots.txt, og:locale, content-language headers.
- WooCommerce Product JSON-LD localization.
- Page-cache compatibility shims (W3 Total Cache, WP Super Cache, LiteSpeed Cache).
- HMAC-signed translation cache invalidation webhooks with 5-minute replay protection.
- Translation glossary support: dashboard-defined per-language overrides propagate live.
- Full analytics dashboard: anonymous visitor counts, languages, countries, top pages.
- Privacy admin notice on first activation.
