{"id":365833,"date":"2026-09-20T10:27:49","date_gmt":"2026-09-20T10:27:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ozy-translate\/"},"modified":"2026-10-01T21:49:14","modified_gmt":"2026-10-01T21:49:14","slug":"ozy-translate","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/ozy-translate\/","author":23508772,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"OZY Translate","header_author":"Danish Rangaiz","header_description":"Context-aware AI translation with voice-first accessibility. Unlimited languages, 4 URL modes, 8 switcher designs, and text-to-speech in 100+ languages.","assets_banners_color":"3c5033","last_updated":"2026-10-01 21:49:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/ozysolutions.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":355,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"idanishrangaiz","date":"2026-09-20 10:27:15","revision":3704121},"1.0.1":{"tag":"1.0.1","author":"idanishrangaiz","date":"2026-09-20 11:13:24","revision":3704163},"1.0.3":{"tag":"1.0.3","author":"idanishrangaiz","date":"2026-09-29 22:16:55","revision":3719934},"1.0.4":{"tag":"1.0.4","author":"idanishrangaiz","date":"2026-10-01 21:49:14","revision":3723894}},"upgrade_notice":{"1.0.4":"<p>Fixes the plugin not translating. The whole finished page is now translated, so custom themes and page builders are covered; missing text is translated in the visitor&#039;s browser instead of only being queued, so no page is slowed down and none is left half done; the background queue no longer spends a request per string; and a built-in translator means no API key is needed at all. Update if switching language left the page in the source language, or made it slow.<\/p>","1.0.3":"<p>Fixes the default language being impossible to select again, shows why a provider refused a request, and releases translations that were produced earlier but held back from visitors. Update if any page stayed in the source language after translating it.<\/p>","1.0.2":"<p>Fixes page builder content never being translated, the admin area switching to a right-to-left language, and AI translations being held back from visitors on sites with no approval workflow, and a false report that the WordPress AI Client was connected.<\/p>","1.0.1":"<p>Fixes a language switcher that would not open when placed by shortcode, widget or template tag.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3704121,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3704121,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3704121,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3704121,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.3","1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3704163,"resolution":"1","location":"assets","locale":"","width":1440,"height":1450},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3704163,"resolution":"2","location":"assets","locale":"","width":1440,"height":1124},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3704163,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3704163,"resolution":"4","location":"assets","locale":"","width":1440,"height":1200},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3704163,"resolution":"5","location":"assets","locale":"","width":1440,"height":977},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3704163,"resolution":"6","location":"assets","locale":"","width":1440,"height":577},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3704163,"resolution":"7","location":"assets","locale":"","width":1440,"height":1330}},"screenshots":{"1":"Add a language and the slug, direction and flag are set for you. Four ways to carry the language in the address, each with a worked example and its search engine trade-off stated plainly","2":"Eight switcher designs, previewed live with your own languages and settings. All keyboard operable and screen-reader labelled","3":"The full screen switcher on the front end, with a search box for sites that offer more than a handful of languages","4":"The SEO screen states what is set up and what still needs attention, and works alongside the SEO plugin you already run","5":"Insights stay in your own database and tell you which pages to translate next","6":"Pin your brand names so a machine never translates them into something else, or force one agreed wording per language","7":"Detection is checked in a stated order, and every option says plainly what it does and why it is on or off by default"}},"plugin_section":[],"plugin_tags":[220668,22323,99,95,2333],"plugin_category":[48],"plugin_contributors":[269519],"plugin_business_model":[],"class_list":["post-365833","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-translation","plugin_tags-language-switcher","plugin_tags-multilingual","plugin_tags-translate","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-idanishrangaiz","plugin_committers-idanishrangaiz"],"banners":{"banner":"https:\/\/ps.w.org\/ozy-translate\/assets\/banner-772x250.png?rev=3704121","banner_2x":"https:\/\/ps.w.org\/ozy-translate\/assets\/banner-1544x500.png?rev=3704121","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ozy-translate\/assets\/icon-128x128.png?rev=3704121","icon_2x":"https:\/\/ps.w.org\/ozy-translate\/assets\/icon-256x256.png?rev=3704121","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-1.png?rev=3704163","caption":"Add a language and the slug, direction and flag are set for you. Four ways to carry the language in the address, each with a worked example and its search engine trade-off stated plainly"},{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-2.png?rev=3704163","caption":"Eight switcher designs, previewed live with your own languages and settings. All keyboard operable and screen-reader labelled"},{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-3.png?rev=3704163","caption":"The full screen switcher on the front end, with a search box for sites that offer more than a handful of languages"},{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-4.png?rev=3704163","caption":"The SEO screen states what is set up and what still needs attention, and works alongside the SEO plugin you already run"},{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-5.png?rev=3704163","caption":"Insights stay in your own database and tell you which pages to translate next"},{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-6.png?rev=3704163","caption":"Pin your brand names so a machine never translates them into something else, or force one agreed wording per language"},{"src":"https:\/\/ps.w.org\/ozy-translate\/assets\/screenshot-7.png?rev=3704163","caption":"Detection is checked in a stated order, and every option says plainly what it does and why it is on or off by default"}],"raw_content":"<!--section=description-->\n<p>OZY Translate makes a WordPress site multilingual without metered word counts, per-language upsells, or a monthly subscription. Everything the plugin can do is available to everyone, for free.<\/p>\n\n<p>Nothing has to be configured for it to translate. A built-in translator that needs no API key and no account handles the site from the moment you add a second language, and a visitor who picks a language sees that page translated straight away rather than waiting for a queue to catch up.<\/p>\n\n<p>Pages are not slowed down to do it. The page is sent at full speed with every translation the site has stored, and anything new is translated in the visitor's browser a moment after the page appears, then kept, so the next visitor gets it from storage.<\/p>\n\n<p>When you want the better phrasing a language model gives, bring your own key from a provider you already trust, several of which have generous free tiers. On WordPress 7.0 and later the plugin can also use the AI Client built into WordPress, so whichever provider you have connected under Settings, Connectors just works and this plugin never handles a key. The AI Providers screen decides which translator leads. You can also turn automatic translation off entirely and write every translation by hand through the built-in editors.<\/p>\n\n<h4>Voice-first accessibility<\/h4>\n\n<p>Every translated page can be read aloud in the active language using the browser's built-in speech synthesis. No external service, no API key, no per-character cost. Visitors get play, pause, speed, pitch, voice, and accent controls, plus word-level highlighting as the page is read.<\/p>\n\n<p>This is paired with a wider accessibility toolkit: font size controls, high contrast mode, a dyslexia-friendly font, reduced motion enforcement, skip links, ARIA landmarks, and a correctly maintained <code>lang<\/code> attribute so operating-system screen readers switch pronunciation properly.<\/p>\n\n<h4>What is included<\/h4>\n\n<ul>\n<li>Unlimited languages and unlimited translated content.<\/li>\n<li>A built-in translator that needs no API key, no account and no billing.<\/li>\n<li>Whole-page translation, so custom themes, page builders, menus, buttons and forms are all covered.<\/li>\n<li>Works with the AI Client built into WordPress 7.0, so no API key is needed here either.<\/li>\n<li>Four URL modes: subdirectory, subdomain, query parameter, and cookie-only.<\/li>\n<li>Eight language switcher designs, including a searchable full-screen modal grid.<\/li>\n<li>Text-to-speech in 100+ languages through the browser Web Speech API.<\/li>\n<li>Accent selection for English, Spanish, French, Portuguese, Arabic, Chinese, and more.<\/li>\n<li>Translated URL slugs with three storage strategies to suit any site size.<\/li>\n<li>Hreflang tags, per-language canonicals, per-language XML sitemaps, and translated structured data.<\/li>\n<li>Native WooCommerce support: products, variations, cart, checkout, and order emails.<\/li>\n<li>Custom field support through seven adapters, including ACF, Meta Box, CMB2, and Carbon Fields.<\/li>\n<li>Glossary and do-not-translate rules so brand terms survive translation intact.<\/li>\n<li>Translation memory, approval workflow, and PO \/ XLIFF \/ CSV \/ JSON import and export.<\/li>\n<li>A string scanner for theme and plugin strings, with both file and runtime scanning.<\/li>\n<li>Usage insights, kept entirely in your own database, showing which pages to translate next.<\/li>\n<li>A\/B testing of two wordings, with a winner declared only at 95% statistical confidence.<\/li>\n<li>Automatic right-to-left layout and CJK typography handling.<\/li>\n<li>Bulk approve, review, flag and delete, run in the background over a whole language.<\/li>\n<li>Optional visitor-submitted corrections, held for review and never published automatically.<\/li>\n<li>One-click migration from eight other translation plugins.<\/li>\n<li>Language switcher widgets for nine page builders, plus shortcodes and template functions.<\/li>\n<\/ul>\n\n<h4>Accessibility statement<\/h4>\n\n<p>OZY Translate targets WCAG 2.1 level AA for everything it renders, and reaches level AAA for contrast in most places. All switcher designs are keyboard operable, expose correct ARIA roles, trap focus in modal contexts, return focus to the trigger on close, announce language changes through a live region, and respect <code>prefers-reduced-motion<\/code>. Contrast is measured programmatically on every build, and the build fails if any pairing drops below AA.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>OZY Translate does not phone home, does not include analytics beacons, and does not transmit any data to OZY Solutions. Usage statistics, when enabled, are stored only in your own database. No external service is contacted unless you explicitly configure and enable it.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Every request below is made from your server to the named provider. Your visitors are never sent to a third party, and no data is ever sent to OZY Solutions.<\/p>\n\n<p>One service is used without you configuring anything: the built-in translator, described first below. Your visitors' browsers talk only to your own site, never to a translation service: the browser asks your site for the missing translations, and your server contacts the service. It is what lets the plugin translate with no API key, and it is contacted only when you have added a second language, automatic translation is on, and a page is viewed in that language with text that has not been translated yet. It sends the text being translated and nothing else. It can be switched off under AI Providers, and with it off nothing is sent anywhere until you configure a provider of your own.<\/p>\n\n<p>Every other service here is contacted only after you have switched on the feature that uses it and entered your own credentials for it, and only at the moment that feature runs.<\/p>\n\n<h4>Translation providers<\/h4>\n\n<p>The built-in translator is used unless you switch it off. The rest you need at most one of, and only if you want a language model to do the translating instead. Manual translation, imports, the string scanner and browser text-to-speech work with none of them.<\/p>\n\n<p><strong>Built-in translator: Google Translate public endpoint<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/translate.googleapis.com\/translate_a\/t and https:\/\/translate.googleapis.com\/translate_a\/single<\/li>\n<li>Purpose: translate content and interface strings without an API key<\/li>\n<li>Data sent: the source text and the source and target language codes. No key, no account, no site identifier and nothing about your visitors.<\/li>\n<li>When: only when automatic translation and the built-in translator are both on, at the moment a page is viewed in a language that has text with no translation stored yet. Once stored, the text is never sent again.<\/li>\n<li>Terms of service: https:\/\/policies.google.com\/terms<\/li>\n<li>Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>Built-in translator: MyMemory<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.mymemory.translated.net\/get<\/li>\n<li>Purpose: translate content and interface strings without an API key, when the endpoint above could not<\/li>\n<li>Data sent: the source text and the source and target language codes. No key, no account and no site identifier.<\/li>\n<li>When: only when automatic translation and the built-in translator are both on, and only for text the endpoint above refused or could not be reached for<\/li>\n<li>Terms of service: https:\/\/mymemory.translated.net\/doc\/en\/tos.php<\/li>\n<li>Privacy policy: https:\/\/translated.com\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>Built-in translator: LibreTranslate<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: whichever instance you enter under AI Providers. Nothing is contacted unless you enter one.<\/li>\n<li>Purpose: translate content and interface strings through a LibreTranslate instance you choose, including one you host yourself<\/li>\n<li>Data sent: the source text, the source and target language codes, and the optional key you entered for that instance<\/li>\n<li>When: only when you have entered an endpoint, and only for text the two endpoints above could not translate<\/li>\n<li>Terms of service: set by the instance you choose. The project is at https:\/\/libretranslate.com\/<\/li>\n<li>Privacy policy: set by the instance you choose<\/li>\n<\/ul>\n\n<p><strong>OpenAI<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.openai.com\/v1\/chat\/completions<\/li>\n<li>Purpose: translate content and interface strings<\/li>\n<li>Data sent: the source text, the source and target language codes, and the translation instructions you configured (brand name, tone, audience, glossary terms)<\/li>\n<li>When: only when AI translation is enabled and an OpenAI key is configured, at the moment a translation is generated<\/li>\n<li>Terms of service: https:\/\/openai.com\/policies\/terms-of-use<\/li>\n<li>Privacy policy: https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>Anthropic<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.anthropic.com\/v1\/messages<\/li>\n<li>Purpose: translate content and interface strings<\/li>\n<li>Data sent: the source text, the source and target language codes, and the translation instructions you configured<\/li>\n<li>When: only when AI translation is enabled and an Anthropic key is configured, at the moment a translation is generated<\/li>\n<li>Terms of service: https:\/\/www.anthropic.com\/legal\/consumer-terms<\/li>\n<li>Privacy policy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<\/ul>\n\n<p><strong>Groq<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.groq.com\/openai\/v1\/chat\/completions<\/li>\n<li>Purpose: translate content and interface strings<\/li>\n<li>Data sent: the source text, the source and target language codes, and the translation instructions you configured<\/li>\n<li>When: only when AI translation is enabled and a Groq key is configured, at the moment a translation is generated<\/li>\n<li>Terms of service: https:\/\/groq.com\/terms-of-use\/<\/li>\n<li>Privacy policy: https:\/\/groq.com\/privacy-policy\/<\/li>\n<\/ul>\n\n<p><strong>Google Gemini<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/generativelanguage.googleapis.com\/v1beta\/models\/<\/li>\n<li>Purpose: translate content and interface strings<\/li>\n<li>Data sent: the source text, the source and target language codes, and the translation instructions you configured<\/li>\n<li>When: only when AI translation is enabled and a Gemini key is configured, at the moment a translation is generated<\/li>\n<li>Terms of service: https:\/\/ai.google.dev\/gemini-api\/terms<\/li>\n<li>Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>Mistral AI<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.mistral.ai\/v1\/chat\/completions<\/li>\n<li>Purpose: translate content and interface strings<\/li>\n<li>Data sent: the source text, the source and target language codes, and the translation instructions you configured<\/li>\n<li>When: only when AI translation is enabled and a Mistral key is configured, at the moment a translation is generated<\/li>\n<li>Terms of service: https:\/\/legal.mistral.ai\/terms<\/li>\n<li>Privacy policy: https:\/\/legal.mistral.ai\/terms\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>DeepL<\/strong><\/p>\n\n<ul>\n<li>Endpoints contacted: https:\/\/api.deepl.com\/v2\/translate and https:\/\/api-free.deepl.com\/v2\/translate<\/li>\n<li>Purpose: machine translation of content and interface strings<\/li>\n<li>Data sent: the source text and the source and target language codes<\/li>\n<li>When: only when DeepL is selected as a translation provider and a key is configured<\/li>\n<li>Terms of service: https:\/\/www.deepl.com\/pro-license<\/li>\n<li>Privacy policy: https:\/\/www.deepl.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>Google Cloud Translation<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/translation.googleapis.com\/language\/translate\/v2<\/li>\n<li>Purpose: machine translation of content and interface strings<\/li>\n<li>Data sent: the source text and the source and target language codes<\/li>\n<li>When: only when Google Cloud Translation is selected as a translation provider and a key is configured<\/li>\n<li>Terms of service: https:\/\/cloud.google.com\/terms<\/li>\n<li>Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>Microsoft Translator<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.cognitive.microsofttranslator.com\/translate<\/li>\n<li>Purpose: machine translation of content and interface strings<\/li>\n<li>Data sent: the source text and the source and target language codes<\/li>\n<li>When: only when Microsoft Translator is selected as a translation provider and a key and region are configured<\/li>\n<li>Terms of service: https:\/\/azure.microsoft.com\/en-us\/support\/legal\/<\/li>\n<li>Privacy policy: https:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/li>\n<\/ul>\n\n<p>On WordPress 7.0 and later the plugin can use the AI Client built into WordPress instead of any of the above. In that case this plugin makes no request of its own and holds no key: WordPress contacts whichever provider you connected under Settings, Connectors, under that provider's own terms.<\/p>\n\n<h4>Spoken audio<\/h4>\n\n<p>The listen feature uses the visitor's own browser by default, through the Web Speech API. That is entirely local: no request leaves the site and none of the services below is used. They are alternatives you can switch to, and each returns audio that is then cached in your own uploads directory.<\/p>\n\n<p><strong>ElevenLabs<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.elevenlabs.io\/v1\/text-to-speech\/<\/li>\n<li>Purpose: generate spoken audio of translated text<\/li>\n<li>Data sent: the text to be spoken, the language code and the chosen voice identifier<\/li>\n<li>When: only when the voice engine is switched from the browser to ElevenLabs and a key is configured<\/li>\n<li>Terms of service: https:\/\/elevenlabs.io\/terms-of-use<\/li>\n<li>Privacy policy: https:\/\/elevenlabs.io\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>Microsoft Azure Speech<\/strong><\/p>\n\n<ul>\n<li>Endpoints contacted: https:\/\/REGION.tts.speech.microsoft.com\/cognitiveservices\/v1 and the matching \/cognitiveservices\/voices\/list, where REGION is the Azure region you enter<\/li>\n<li>Purpose: generate spoken audio of translated text<\/li>\n<li>Data sent: the text to be spoken, the language code and the chosen voice identifier<\/li>\n<li>When: only when the voice engine is switched to Azure Speech and a key and region are configured<\/li>\n<li>Terms of service: https:\/\/azure.microsoft.com\/en-us\/support\/legal\/<\/li>\n<li>Privacy policy: https:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/li>\n<\/ul>\n\n<p><strong>Google Cloud Text-to-Speech<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/texttospeech.googleapis.com\/v1\/text:synthesize<\/li>\n<li>Purpose: generate spoken audio of translated text<\/li>\n<li>Data sent: the text to be spoken, the language code and the chosen voice identifier<\/li>\n<li>When: only when the voice engine is switched to Google Cloud Text-to-Speech and a key is configured<\/li>\n<li>Terms of service: https:\/\/cloud.google.com\/terms<\/li>\n<li>Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>Amazon Polly<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/polly.REGION.amazonaws.com\/v1\/speech, where REGION is the AWS region you enter<\/li>\n<li>Purpose: generate spoken audio of translated text<\/li>\n<li>Data sent: the text to be spoken, the language code and the chosen voice identifier<\/li>\n<li>When: only when the voice engine is switched to Amazon Polly and AWS credentials are configured<\/li>\n<li>Terms of service: https:\/\/aws.amazon.com\/service-terms\/<\/li>\n<li>Privacy policy: https:\/\/aws.amazon.com\/privacy\/<\/li>\n<\/ul>\n\n<h4>WooCommerce multi-currency<\/h4>\n\n<p><strong>ExchangeRate-API<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/open.er-api.com\/v6\/latest\/<\/li>\n<li>Purpose: fetch currency exchange rates for the optional WooCommerce multi-currency feature<\/li>\n<li>Data sent: your shop base currency code only. No customer, order, visitor or site data is sent<\/li>\n<li>When: only when multi-currency is enabled with automatic exchange rates. Entering rates by hand avoids this entirely<\/li>\n<li>Terms of service: https:\/\/www.exchangerate-api.com\/terms<\/li>\n<li>Privacy policy: https:\/\/www.exchangerate-api.com\/privacy<\/li>\n<\/ul>\n\n<h4>Migrating away from another plugin<\/h4>\n\n<p><strong>Weglot<\/strong><\/p>\n\n<ul>\n<li>Endpoint contacted: https:\/\/api.weglot.com\/<\/li>\n<li>Purpose: read your existing Weglot translations so they can be copied into your own database<\/li>\n<li>Data sent: your Weglot API key and the project identifier it belongs to<\/li>\n<li>When: only while you are running the Weglot migration, and only after you supply your key<\/li>\n<li>Terms of service: https:\/\/www.weglot.com\/terms<\/li>\n<li>Privacy policy: https:\/\/weglot.com\/privacy\/<\/li>\n<\/ul>\n\n<p>Every other migration importer (WPML, Polylang, TranslatePress, GTranslate, Loco Translate, qTranslate and MultilingualPress) reads your own database directly and contacts nothing.<\/p>\n\n<h4>Country detection<\/h4>\n\n<p>Country detection reads a header your CDN or proxy already sends, such as the CF-IPCountry header from Cloudflare. No lookup service is contacted and no visitor IP address is sent anywhere. Where no such header is present, country detection simply does nothing.<\/p>\n\n<p>If none of the services above is configured, this plugin operates entirely on your own server and contacts nothing.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>ozy-translate<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin through the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open <strong>OZY Translate<\/strong> in the admin menu and follow the setup wizard.<\/li>\n<li>Choose your languages, pick a URL mode, and place a language switcher.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20cost%20anything%3F\"><h3>Does this cost anything?<\/h3><\/dt>\n<dd><p>No. Every feature is free. If you enable AI translation you pay your chosen AI provider directly for the tokens you use, which on free-tier providers is typically nothing.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20enter%20an%20api%20key%3F\"><h3>Do I have to enter an API key?<\/h3><\/dt>\n<dd><p>No. The built-in translator needs no key and no account, and it is on by default, so adding a second language is enough to see the site translated. Entering a key buys you the better phrasing a language model gives, not the ability to translate at all. On WordPress 7.0 and later, if you have already connected an AI provider under Settings, Connectors, the plugin can use the AI Client built into WordPress instead, in which case WordPress keeps the credentials and this plugin never sees a key.<\/p><\/dd>\n<dt id=\"does%20translating%20slow%20my%20pages%20down%3F\"><h3>Does translating slow my pages down?<\/h3><\/dt>\n<dd><p>No. A page is sent with every translation the site already has, which is a database read, and anything that has no translation yet is translated in the visitor's browser just after the page has appeared. Nothing is held back waiting for a translation service. If you would rather the HTML left the server complete, which search engines prefer on a page nobody has visited yet, choose \"Before the page is sent\" under AI Providers; the first visitor to each page then waits while it happens.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20translate%20each%20page%20by%20hand%3F\"><h3>Do I have to translate each page by hand?<\/h3><\/dt>\n<dd><p>No. A page translates itself the first time somebody views it in another language, and the result is stored for everyone after that, so adding a language is all that is required. If you would rather not wait for a first visitor, Content Translation has a \"Translate the whole site\" button that queues everything.<\/p><\/dd>\n<dt id=\"which%20translator%20is%20used%20if%20i%20add%20a%20key%20as%20well%3F\"><h3>Which translator is used if I add a key as well?<\/h3><\/dt>\n<dd><p>Whichever you choose, under AI Providers. By default the built-in translator leads, so nothing is spent until it cannot manage a string. Turn off \"Try the built-in translator before my own providers\" and your own provider translates everything, with the built-in one kept as the safety net behind it.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20an%20ai%20provider%3F\"><h3>Does it work without an AI provider?<\/h3><\/dt>\n<dd><p>Yes, and it translates without one: the built-in translator handles the site with no key of your own. Manual translation, imports, the string scanner, the visual editor, all switcher designs, and browser-based text-to-speech work with no external service at all.<\/p><\/dd>\n<dt id=\"will%20it%20duplicate%20my%20posts%3F\"><h3>Will it duplicate my posts?<\/h3><\/dt>\n<dd><p>No. Translations are stored in dedicated tables keyed by a hash of the source text. Your original content is never modified.<\/p><\/dd>\n<dt id=\"which%20url%20mode%20should%20i%20choose%3F\"><h3>Which URL mode should I choose?<\/h3><\/dt>\n<dd><p>Subdirectory (<code>\/es\/page\/<\/code>) is recommended and gives the best search engine results. Cookie-only mode changes no URLs at all, which is convenient but means search engines only ever see your default language.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20caching%20plugins%3F\"><h3>Is it compatible with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. The plugin ships integrations for WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache, and WP Fastest Cache, and sets correct <code>Vary<\/code> headers for CDN edge caching.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fixed: switching language did not translate the page. A missing translation was only ever added to a background queue, and that queue translated one string per request to a provider the site had to configure and pay for first. A single page holds hundreds of strings, so visitors saw the source language and kept seeing it, whether or not a key had been entered.<\/li>\n<li>Changed: missing text is now translated in the visitor's browser just after the page appears, which is how a page with four hundred untranslated strings still loads instantly. The page is sent with everything already stored, the few words that are new fill in a moment later, and because every answer is stored the next visitor needs none of it. Translating before the page is sent is still offered under AI Providers for sites that want complete HTML on a page nobody has visited yet.<\/li>\n<li>Fixed: a long page was left partly translated. Translating during the render had to stop at a time limit, so everything past it stayed in the source language until the queue caught up. The browser has no such limit and finishes the page.<\/li>\n<li>Fixed: the background queue spent one request per string, which is why it never caught up on a real site. Strings for the same language now travel together, roughly twenty to a request, and a worker run clears fifty jobs rather than ten.<\/li>\n<li>Added: a \"Translate the whole site\" button under Content Translation, which walks every published page, post and product and queues all of it for every language. Nothing requires it, since pages translate themselves when viewed, but it means no visitor has to be the first.<\/li>\n<li>Changed: the Content Translation screen now says what its percentages mean and that most sites need nothing from it. A page nobody has viewed in a language reads \"Not yet\" rather than a bare zero.<\/li>\n<li>Added: a built-in translator that needs no API key and no account. Translation now works as soon as a second language is added. A provider of your own is still used when you add one, and the AI Providers screen chooses which of the two leads.<\/li>\n<li>Fixed: only post content was ever translated. A custom theme's own markup, a page builder's header and footer, template parts, menus, buttons, form labels and meta descriptions do not travel through any filter a plugin can hook, so they stayed in the source language on every theme and every builder. The finished page is now translated on its way to the browser, which reaches all of it. The language switcher's own list of languages is left alone, as are scripts, styles, preformatted text and anything marked do not translate.<\/li>\n<li>Fixed: a hidden field's value and a meta tag's content were sent out for translation. Nonces, tokens and viewport declarations are not prose, and translating them wasted provider usage. Only button labels and the handful of meta tags that carry prose are translated now.<\/li>\n<li>Fixed: a page carrying a large HTML comment, which builders and caching layers both produce, could not be parsed and so was not translated at all.<\/li>\n<li>Fixed: a translation service that was unreachable cost nineteen failed requests for four strings, with a visitor waiting on each one. A service that cannot be reached is now dropped for the rest of the request and paused for five minutes.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: the default language could not be selected again. Once a visitor chose another language the choice was stored in a cookie, and because the default language's address carries no language marker, the cookie overrode it on every later request. Clicking English gave Spanish back, for good. Where the address can carry the language, the address now decides; a stored preference only settles it in cookie-only mode, where there is nothing else to go on.<\/li>\n<li>Fixed: a provider that refused a request failed silently. The reason was recorded and never shown, so a rejected API key looked identical to the plugin doing nothing. The dashboard now prints the last failure, and says so when the queue has work but has never finished any.<\/li>\n<li>Fixed: translations produced before 1.0.2 stayed hidden after updating. They were filed as awaiting review by the storage rule 1.0.2 corrected, and fixing that rule only changed new work. Sites that never switched the approval workflow on now have those translations published on update, so pages that were translated already start showing without translating anything again.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed: Elementor's text widgets were translated through WordPress's widget_text filter, at a point before WordPress had finished processing the text. The same sentence was stored two or three times in encodings that never matched what the visitor saw, and translating it again later doubled it.<\/li>\n<li>Fixed: every piece of text containing an HTML entity, a URL, an email address, a shortcode or a printf token was queued twice, once with the plugin's own protection placeholders still in it. Providers were being asked to translate placeholder text such as \"didnOZYX0Zt\", and the result was stored beside the real translation.<\/li>\n<li>Fixed: pages built with Elementor, Divi, Beaver Builder or Brizy were never translated. Those builders discard post_content and render their own stored layout, and the translation pass ran before them, so it translated something the visitor never sees. The language and the address changed and the page stayed in English. Builder-rendered pages are now translated after the builder has run, and Elementor headers, footers, popups and template parts are translated too.<\/li>\n<li>Fixed: changing URL mode left the previous mode's language argument on every link built afterwards, producing addresses such as \/es-es\/?lang=es-es.<\/li>\n<li>Fixed: the whole administration area switched language and flipped right to left once a right-to-left language such as Urdu or Arabic was added, because the visitor's language was being applied to wp-admin as well. Administration screens now always use the site's own language.<\/li>\n<li>Fixed: removing a language left the confirmation screen on screen afterwards, reporting the language it had just removed as not configured.<\/li>\n<li>Added: languages can be removed several at a time. Tick the ones you want, press Remove selected, and choose one redirect strategy for all of them.<\/li>\n<li>Fixed: AI translations were stored as awaiting review and never shown, on sites that had not switched the approval workflow on. A single diagnostic note from the optional review pass was enough to hold a perfectly good translation back, so pages kept appearing in the source language however many were translated.<\/li>\n<li>Fixed: the WordPress AI Client was reported as connected on WordPress 7.0 and later even when no connector offered text generation, so the plugin claimed it was ready to translate and then failed on every request.<\/li>\n<li>Fixed: the dashboard's \"place a language switcher\" step linked to a screen that does not exist, and counted itself as done whenever any design was selected, which it always is.<\/li>\n<li>Changed: new installs place a floating switcher and switch automatic translation on, so adding a language is enough to see the plugin working. Nothing is sent anywhere until a provider is connected, and both settings can be turned off.<\/li>\n<li>Changed: existing sites that never altered these settings are moved to the new defaults on update.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed: a switcher placed with the shortcode, the widget or a template tag, and left on the site's own design, did not load the script it needs. A modal grid, sliding panel, floating button or mega menu placed that way had nothing to open it.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Context-aware AI translation with voice-first accessibility. Unlimited languages, four URL modes, eight switcher designs, and text-to-speech.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/365833","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=365833"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/idanishrangaiz"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=365833"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=365833"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=365833"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=365833"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=365833"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=365833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}