PerfLocale is a performance-first multilingual plugin for WordPress. A 3-layer cache, batch-preloaded queries, and conditional hook registration keep its own code to a small fraction of total page time — a few milliseconds per page, A/B-measured.
/en/), subdomain (en.example.com), per-domain, or query-parameter (?lang=en) modes; auto-detect from URL, cookie, browser, or an edge/CDN hint.l10n.php) or database-mode, with full CLDR plural rules (Arabic 6 forms, Russian 3) and context supportTranslation-aware features generic SEO plugins can’t provide: Content-Language HTTP header, data-nosnippet guard for fallback pages, and opt-in Speculation Rules prerender and View Transitions for switching between languages. Auto-detects and integrates with 20+ plugins and themes, including WooCommerce, Elementor, ACF, Meta Box, Pods, all major SEO plugins, Gravity Forms, and the Blocksy, Kadence, and Neve themes.
200+ action/filter hooks, a full REST API, WP-CLI commands, and a documented addon system. Every internal primitive is @api and semver-stable across 1.x. Multisite-ready. Full docs at https://perflocale.com/docs/.
PerfLocale is privacy-first by default. No tracking, no analytics, no visitor fingerprinting.
perflocale_lang, stores only the active language slug. HttpOnly, Secure on HTTPS, SameSite=Lax, 365-day default lifetime (filterable via perflocale/cookie_lifetime). It can be turned off entirely (see “Cookieless mode” below) — language routing is URL-based and works without it.perflocale/geo/lookup_country or perflocale/geo/providers filter, the IP is passed to that source once per first visit to resolve a country code; the country code is then cached server-side (24 hours by default) under a salted, non-reversible key – an HMAC-SHA256, keyed with the site’s auth salt, of the IP after wp_privacy_anonymize_ip() has zeroed the host bits – never the raw IP or any value reversible to it.created_by on the background jobs the data subject dispatched and deletes their per-user UI-state meta — returning items_removed/items_retained counts. The same flow runs on the admin delete_user path. Full detail in the docs.perflocale/privacy/consent_given filter lets any consent-management plugin (Cookiebot, Complianz, OneTrust, etc.) hold back PerfLocale until a visitor has consented. When the filter returns false, the perflocale_lang cookie is not set, and the GeoIP and browser-language redirects do not run (no outbound request is made).perflocale_lang cookie off entirely — no consent-management plugin required. URL-based language routing keeps working; you only lose “remember my language” on non-prefixed URLs.wp_add_privacy_policy_content(). The sections shown adapt to which features are enabled — GeoIP wording only appears if GeoIP is on, MT wording only appears if MT is on.Full technical detail: https://perflocale.com/docs/privacy/
PerfLocale can optionally connect to external services for machine translation. All external service calls are disabled by default and require explicit user configuration (entering an API key and enabling the feature in settings). No data is sent to any external service without your action. The hosted providers below are contacted over HTTPS; for self-hosted or user-configured endpoints (LibreTranslate, agency, webhooks) use an HTTPS URL.
The GeoIP-redirect and WooCommerce exchange-rate features ship with no provider and contact no service on their own: they call nothing unless you wire a source yourself through the perflocale/geo/lookup_country / perflocale/geo/providers and perflocale/woocommerce/exchange_rates_fetched / perflocale/woocommerce/exchange_rate_providers filters. If you connect one, disclosing that service is your responsibility as the site owner.
API keys for the providers below can be supplied via an environment variable, a wp-config.php constant, or the admin Settings field (see the “Can I keep API keys out of the database?” FAQ).
When you enable machine translation and configure an API key in PerfLocale Settings Addons Machine Translation, the plugin sends the text you ask it to translate to the selected provider, together with source/target language codes and your API key. That text is: post titles, content and excerpts; taxonomy term names and descriptions; interface strings listed on the Strings screen (which can include strings registered by other plugins and themes) when you use its machine-translation controls; and, when meta translation is enabled, registered meta values such as SEO titles and descriptions or custom text fields. It is sent when you click “Machine Translate”, run a bulk or site-wide translation, translate via WP-CLI or the REST API, or enable auto-translate on publish. Each provider below receives exactly that data, and only for the actions just listed. The provider API additionally defines a connection-test call that sends only your API key (no post content) so an add-on can verify credentials; no screen, WP-CLI command or REST route in PerfLocale itself invokes it.
wp_ai_client_prompt() function. PerfLocale itself makes no outbound HTTP request for this provider: WordPress core (and whichever AI provider you configured under core’s AI Connectors settings) performs the network call. The data sent, the destination, and the governing Terms of Service / Privacy Policy are therefore those of the AI provider you configured in WordPress core, only for the actions listed above.When you configure an external agency URL in PerfLocale Settings Addons Machine Translation, the plugin sends post content to the configured endpoint for human or agency translation:
When you register webhooks via the PerfLocale REST API, the plugin sends event notifications to your configured webhook URLs when translations are created, updated, or content changes:
PerfLocale can also publish a read-only public REST endpoint for edge runtimes (/wp-json/perflocale/v1/config). It is served by your own site, makes no outbound third-party request and sends no data anywhere – see the “Does PerfLocale expose anything to edge workers?” FAQ for the full description.