=== Incode Translate Master ===
Contributors: adrianincode
Tags: translate, bilingual, translation, hreflang, localization
Requires at least: 6.1
Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 2.8.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Make your site bilingual: click any text on your page, translate it in context, and publish it on its own URL. No account, no key, no trial.

== Description ==

**Incode Translate Master makes your site bilingual from the front end — no account, no license key, no sign-up.** Install it, pick your translation language, and start translating your real pages by clicking on the text you want to change, while you look at the actual design. A translation never breaks a button or a heading again.

A built-in **keyless engine translates out of the box**, so you can go from a single-language site to a published second language in minutes. Prefer your own provider? Plug in a DeepL, Google or Gemini key whenever you like and you pay the provider directly.

= ✨ Why you'll like it =

* 🖱️ **Translate what you see.** Click text on your own page and translate it in context — headings, buttons, menus, image captions.
* 🔑 **Works with zero setup.** A free keyless engine translates immediately. No API key, no credit card, no account.
* 🚀 **Not a trial.** Everything described here is fully functional and never expires. Nothing is disabled waiting for a payment.
* 🔎 **SEO-ready.** Translations publish on their own URL prefix with reciprocal hreflang tags and a self-referencing canonical, so Google indexes them.
* ⚡ **Fast.** Translations live in your database and are served as plain HTML — no API call while a visitor loads the page.

= 🧩 Everything it does =

* 🖊️ **Visual front-end editor.** Open your page, click any string, and edit the machine translation in the side panel while seeing the real layout.
* 📦 **Batch translation.** Send all pending strings with one click. The queue runs in batches, resumes where it stopped and never translates the same string twice.
* 🔬 **Full-site scan.** Extract every translatable string from your posts and pages at once and manage them from one screen.
* 💾 **Auto-translate on save.** New and changed texts of a post can be translated automatically in the background when you save, so the translation never lags behind the original.
* 🏷️ **SEO title translation.** With Yoast SEO installed, each page's meta title is translated so your translated pages show a title in their own language on search results.
* 🌐 **Translation engines.** Free keyless engine, or bring your own key for Google Translate, DeepL or Gemini. Switch engines any time without losing what's already translated.
* 🔀 **Language switcher.** Dropdown, list, flags or inline — as a shortcode, a theme widget, a menu item or an Elementor widget.
* 🧠 **Translation memory.** Every translated string is stored in your own database. If the same sentence appears in two hundred pages, the engine is called once.
* 🧱 **Works with your stack.** Any theme, Elementor and Elementor Pro, WooCommerce product and page text, and the usual caching plugins.

= 💎 There is also a Pro version =

Everything above is free, permanent and complete — this list is here so you know what exists, not because anything is missing. [Incode Translate Master Pro](https://wptranslate.es/precios/) adds more languages at the same time, translated URL slugs, automatic language detection for first-time visitors, a multilingual XML sitemap, Rank Math SEO support and translation of the emails WordPress and WooCommerce send.

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/`, or install the ZIP from **Plugins → Add New → Upload Plugin**.
2. Activate the plugin through the **Plugins** menu in WordPress.
3. Go to **Incode Translate Master → Languages** and choose your translation language.
4. Open any page of your site and use the toolbar link to start translating, or run a scan and translate in batch from **Incode Translate Master → Strings**.

== Frequently Asked Questions ==

= Is this plugin a trial version? =

No. Everything described here works with no key, no account and no expiry date. Nothing is time-limited or disabled waiting for a payment.

= Is there a paid version? =

Yes, and it changes nothing about this one. The free plugin is complete and permanent: original language plus one translation language, with every feature listed above. Pro adds more simultaneous languages, translated slugs, visitor language detection, a multilingual sitemap, Rank Math support and email translation. You can see it at [wptranslate.es](https://wptranslate.es/precios/).

= Do I need an API key? =

No. A built-in keyless engine translates with no configuration. If you prefer, you can add your own key for Google Translate, DeepL or Gemini in Settings, so the translation cost is billed to you directly by the provider.

= What languages does my site end up with? =

Two: the original language your content is written in, plus the translation language you choose. The translation is published under its own URL prefix, and you can change the translation language whenever you want from the Languages screen.

= Will Google index the translated versions? =

Yes. The translated version is published under its own URL prefix, with reciprocal hreflang tags and a self-referencing canonical.

= Does it slow the site down? =

No. Translations are stored in your database and served as regular HTML. There is no API call while a visitor loads the page.

= Does it work with Elementor and WooCommerce? =

Yes. Elementor designs are read from their own JSON so no string is missed, including Elementor Pro widgets. For WooCommerce it covers product and page texts.

= What happens to my translations if I remove the plugin? =

They are yours. You can export them before uninstalling, and the uninstall routine asks whether to keep or delete the plugin tables.

== Screenshots ==

1. Visual editor: click any text on your own page and translate it while looking at the real design.
2. Dashboard: total strings, translated, pending and progress by language at a glance.
3. Languages: your source language and the translated one, each with its own URL prefix.
4. 77 languages to choose from, with a live search.
5. Translation manager: original and translation side by side, with search and one-click auto-translation.
6. String manager: every string found on the site, with its context, its source and the post it came from.
7. Settings: translation providers. Free (Google) needs no API key; Gemini, DeepL and Google Cloud use your own.
8. Auto-translate on save: publish or update a page, even from Elementor, and the translation runs in the background.
9. Language switcher: flag and name, flags only or language code, with your own colours and corner radius.
10. Translate and replace: rewrites the real content in the database to migrate a whole site to another language.
11. The site in its original language, at the root URL.
12. The same page in English at /en/ - same design, translated content.

== External services ==

This plugin can send your content to third-party machine-translation services to translate it. A request is made only when you actively translate a string, run a batch translation or save a post with auto-translate enabled, and it contains the text to translate plus the target language code. No translation service is contacted while simply viewing already-translated pages.

You choose the engine in Settings → Translation provider. Depending on your choice, the plugin connects to:

* **Free engine (default, no API key).** Uses Google's public translation endpoint and, as a fallback, MyMemory. Sends the text to translate and the target language.
  * Google Translate — Terms: https://policies.google.com/terms — Privacy: https://policies.google.com/privacy
  * MyMemory (Translated s.r.l.) — Terms: https://mymemory.translated.net/terms-and-conditions — Privacy: https://translated.com/confidentiality
* **Google Cloud Translation API** (optional, your own API key) — Terms: https://cloud.google.com/terms — Privacy: https://policies.google.com/privacy
* **DeepL API** (optional, your own API key) — Terms: https://www.deepl.com/pro-license — Privacy: https://www.deepl.com/privacy
* **Google Gemini API** (optional, your own API key) — Terms: https://ai.google.dev/gemini-api/terms — Privacy: https://policies.google.com/privacy

Only the engine you select is contacted. If you never trigger a translation, no external service receives any data.

== Changelog ==

= 2.8.1 =
* Changed: the Pro notice now takes you straight to the licence it is offering, with it ready in the basket, instead of to a page of plans. Nothing changes in how the plugin translates.

= 2.8.0 =
* Fixed: on most pages the plugin was not telling Google that a translated version existed, so those translations were left out of the search index. The check that decided it counted only the strings currently filed under that page, and that filing moves on its own as the site is scanned.
* Fixed: "page not found" screens and search results announced a translated version of a page that does not exist.
* Fixed: pages built with Elementor filed their texts under a different key than the rest of the plugin, so the same sentence could be stored — and paid for — twice. Existing duplicates are merged automatically when you update.
* Fixed: bold text and links inside a paragraph were being stripped out when the paragraph was translated. Formatting is now put back into the translated sentence. If a link cannot be placed with certainty, the paragraph is left in the original language instead of published without its link.
* Fixed: any address containing the word "sitemap" was skipped, so pages like /blog/how-to-create-a-sitemap/ were never translated and never got a language prefix. Only real sitemap files are skipped now.
* Fixed: the visual editor showed strings as pending even when they were already translated, which invited overwriting good work. It now normalises text the same way the server does, and falls back to the context-free index.
* Fixed: auto-translate on save never ran in the block editor, which saves through the REST API. It now runs there too. Elementor keeps its own path and is unaffected.

= 2.7.9 =
* Fixed: the Pro notice was invisible on the plugin's own screens. It is now printed as an inline notice, so WordPress no longer moves it inside the app container where it was being wiped out on the first repaint.
* The notice shows the launch offer for Pro while it lasts, with a live countdown to the end date. When the offer is over the notice goes back to its normal text on its own, with no update needed.
* Countdown is driven by the server clock, so a wrong clock on the visitor's computer cannot make it run fast or slow.
* The new strings are translated into Spanish, French, German, Italian and Brazilian Portuguese.

= 2.7.8 =
* Added a dismissible notice about the Pro version, shown only to administrators, only on the Dashboard, the Plugins screen and the plugin's own screens, and only after the plugin has been installed for a week.
* The notice honours "prefers-reduced-motion" and remembers your choice per user: "Maybe later" hides it for 30 days and the ✕ hides it for good. Both preferences are removed when the plugin is uninstalled.
* Added a "Go Pro" link to the plugin's row in the Plugins list.

= 2.7.7 =
* 🌍 **New:** The whole plugin is now translatable, and ships translated into Spanish, French, German, Italian and Brazilian Portuguese.
* The admin interface, the setup wizard and the front-end visual editor now follow your WordPress language instead of always showing the same texts.
* Every user-facing string is internationalized with the `incode-translate-master` text domain, including the JavaScript, so translate.wordpress.org contributors can translate it into any other language.

= 2.7.6 =
* Clearer bilingual model: the site has its original language plus one translation language, and changing it is now an explicit, documented action in the Languages screen.
* The memory limit is only raised while processing a confirmed large page or a heavy scan task, never globally.
* Hardened output escaping in the language switcher (wp_kses allowlist) and CSS color sanitization.

= 2.7.5 =
* The plugin is now called "Incode Translate Master".

= 2.6.0 =
* ✨ **New:** Auto-translate on save — new and changed texts of a post are translated automatically in the background when you save it.
* 🏷️ **New:** Yoast SEO integration — the meta title of each page is translated.
* 🌐 **Improved:** Translation engines — built-in keyless engine, or your own Google Translate, DeepL or Gemini API key, switchable any time.
* 🧭 **Improved:** Simpler language management.

= 2.5.0 =
* 🧙 **New:** Setup wizard on activation — pick your source language, choose the free engine (or your own key) and run the first scan, all in guided steps.

= 2.4.0 =
* 🎉 **First release:** front-end visual editor, full-site scan, batch translation, keyless free engine, translation memory, language switcher, and Elementor / WooCommerce support.

== Upgrade Notice ==

= 2.8.1 =
Cosmetic release: the Pro notice now links straight to the licence it offers. Nothing changes in how the plugin translates.

= 2.8.0 =
Recommended for everyone. Your translated pages are announced to Google again — most of them were not, so they were never indexed. Also: links and bold text no longer disappear from translated paragraphs, pages whose address contains "sitemap" are translated again, and auto-translate on save now works in the block editor.

= 2.7.9 =
Fixes the Pro notice, which was invisible on the plugin's own screens, and shows the launch offer while it lasts. Nothing changes in how the plugin translates.

= 2.7.8 =
Housekeeping release. No change to how the plugin translates; it only adds a dismissible notice about the Pro version.

= 2.7.7 =
The interface is now translated into Spanish, French, German, Italian and Brazilian Portuguese, and follows your WordPress language.

= 2.6.0 =
Adds auto-translate on save and Yoast SEO title translation. Recommended for everyone.
