=== Lang Forge – Multilingual, Translation & hreflang SEO ===
Contributors: avakodeforge
Donate link: https://avakode.com/?utm_source=wporg&utm_medium=readme&utm_campaign=langforge&utm_content=donate
Tags: multilingual, translation, language switcher, hreflang, woocommerce
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.2.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Make your site multilingual — translate posts, WooCommerce products and strings, add a language switcher and correct hreflang SEO.

== Description ==

**Lang Forge** is a modern multilingual plugin that handles multilingual URL routing (4 URL formats), manual post and string translation, a language switcher, hreflang SEO, RTL layouts, a glossary, WooCommerce, unlimited languages, and one-click migration from WPML / Polylang / TranslatePress. It ships a REST API and WP-CLI commands and is a drop-in WPML compatibility layer. AI translation is available as the **Lang Forge Pro** add-on.

= Switching from WPML, Polylang or TranslatePress? =

Lang Forge imports your existing setup instead of making you start over. The migration tool reads your current plugin's data and recreates it: translated posts and their language links, string translations, taxonomy translations, and your language URL structure.

The migration is non-destructive. Your current plugin stays installed and untouched until you confirm the result, so you can compare both side by side and roll back if anything looks wrong.

If you are coming from WPML, you can also keep your existing theme and plugin code. Lang Forge ships a WPML compatibility layer that implements the functions third-party code expects — `icl_object_id()`, `icl_get_languages()`, `icl_get_current_language()` and `icl_get_default_language()` — so integrations built against WPML call the same functions without edits. One difference to check: unlike WPML, a translation that is still a draft counts as “no translation” for visitors, so `icl_object_id()` gives back the original page (or nothing) until you publish the translation.

= Free =
* Unlimited languages
* Multilingual URL routing — 4 formats (directory `/fr/`, query `?lang=fr`, subdomain, domain mapping)
* Manual post / page / CPT translation linking
* Manual string translation (auto-registered via gettext)
* Language switcher (widget / shortcode / admin bar)
* hreflang tags with x-default, plus an hreflang sitemap
* Glossary
* WooCommerce product and store string translation
* WPML compatibility layer (`icl_object_id()`, `icl_get_languages()`, etc.)
* REST API + WP-CLI commands
* One-click migration from WPML / Polylang / TranslatePress
* RTL support (ar/he/fa/ur/ku)

= Pro =
* AI translation with translation memory
* Visual editor (side-by-side WYSIWYG translation)
* Frontend translation
* Elementor + ACF integration
* Content diff + Translation QA
* Analytics dashboard
* Import / export XLIFF + CSV
* Bulk AI translation, translator roles, media/comment translation, live preview
* Priority email support with an active Pro licence

Part of the **Forge Suite** — bundle includes Rank Forge, Form Forge, Field Forge.

== External services ==

Every outbound request this plugin makes is listed below. Activating it, and opening its screens, contacts nobody.


**The Forge API at https://api.avakode.com, when you open the Forge Suite screen or answer the feedback card:**

* **Health check — `/health`.** Only when an administrator presses "Run diagnostics" in Setup & Health on the Forge Suite screen, or a repair button next to it, which runs the diagnostics again. It asks https://api.avakode.com/health whether the service is up: an ordinary GET with no body, no licence key and nothing about your site in the request itself. It sends its own User-Agent (`ForgeSuite/health-check`) instead of WordPress's default one, so neither your WordPress version nor your site's address is in it. As with any HTTP request, our server also sees the network address it came from.
* **Feedback card — `/feedback`.** The card appears in the admin footer of the Forge screens, to administrators only, not before the plugin has been installed for thirty days, at most once every sixty days for each administrator, and not for fourteen days after you dismiss it. Pressing "Send feedback" posts your 0–10 score, whatever you typed in the comment box, which product's screen the card was shown on, and the plugin and WordPress version numbers. No licence key, e-mail address or content of yours is sent, and pressing "Not now" sends nothing at all. The request has no User-Agent of its own, so it carries WordPress's default one, which names your WordPress version and your site's address.

**The Forge API at https://api.avakode.com, only when the Lang Forge Pro add-on asks for it:**

* **Licence check, free trial and AI translation — `/licenses/validate`, `/public/trial/activate`, `/ai/process`.** The free plugin carries the client of the Forge API that the Pro add-on uses for these three, and nothing in the free plugin itself calls it: Lang Forge on its own never sends a request to these paths, and without the add-on there is no licence key to send. With the add-on active, they are asked for from the add-on's own screens and buttons, and its readme says when, what is sent and why. When the add-on asks for an AI translation, api.avakode.com passes the content of the request on to OpenAI, through Cloudflare AI Gateway, to produce the translation; your licence key is not passed on. OpenAI's terms: https://openai.com/policies/terms-of-use/ — OpenAI's privacy policy: https://openai.com/policies/privacy-policy/; Cloudflare's terms: https://www.cloudflare.com/website-terms/ — Cloudflare's privacy policy: https://www.cloudflare.com/privacypolicy/.

The free plugin sends no usage statistics. The Pro add-on has an optional statistics feature that is off until you say yes; it is described in the add-on's readme. When the last Forge plugin or add-on on a site is deleted, everything Forge stored on the site is removed, on every site of a network (the statistics settings and the install ID included); a plugin's own content follows its own “delete data” setting. While another Forge product stays, only the deleted one's own share goes.

Terms: https://avakode.com/terms — Privacy: https://avakode.com/privacy

== Installation ==

1. Upload `langforge` to `/wp-content/plugins/`, or install via Plugins → Add New.
2. Activate the plugin.
3. Go to **Lang Forge → Settings** and enable your target languages.
4. (Optional) AI translation comes with the separate Lang Forge Pro add-on; the add-on adds its own Connect screen.

== Frequently Asked Questions ==

= How do I make my WordPress site multilingual? =

Install Lang Forge, go to Lang Forge → Settings and add the languages you need. Pick how language URLs should look — subdirectories like /fr/, a query parameter, subdomains, or a separate domain per language. From there every post, page and custom post type gets a Language panel where you link or create its translations.

= How do I translate WooCommerce products and categories? =

Lang Forge translates WooCommerce product content, product categories and tags, and store strings such as cart and checkout labels. Open any product in the editor and use the Language panel the same way you would for a post.

= How do I add hreflang tags to WordPress? =

Lang Forge outputs hreflang tags automatically in `wp_head` for every translated URL, including the x-default entry, and generates an hreflang sitemap. No manual markup and no separate SEO plugin configuration needed.

= Can I use a separate domain for each language? =

Yes. Domain mapping is one of the four supported URL formats, alongside subdirectories, subdomains and query parameters. You can point example.fr and example.de at the same WordPress install and Lang Forge will serve the correct language on each.

= How do I migrate from Polylang without losing translations? =

Run the built-in migration tool. It imports your translated posts, the links between them, your string translations and your language URL structure. Polylang stays installed and untouched until you confirm the migration, so nothing is lost if you change your mind.

= Can I migrate from WPML? =

Yes, and your existing code can keep calling the same functions. Beyond importing your content, Lang Forge provides a WPML compatibility layer implementing `icl_object_id()`, `icl_get_languages()` and related functions, so themes and plugins written against WPML work without modification. One difference: unlike WPML, a translation that is still a draft counts as “no translation” for visitors, so these functions return the original page (or nothing) until the translation is published; editors previewing the draft still see it.

= Will my URLs change if I switch from TranslatePress? =

Only if you want them to. The migration tool reads your current language URL format and reproduces it, so existing links and search rankings stay intact. You can change the format later from Settings if you decide to.

= Does it support right-to-left languages like Arabic and Hebrew? =

Yes. Lang Forge includes RTL support for Arabic, Hebrew, Persian, Urdu and Kurdish, switching text direction and adjusting the admin and switcher layout automatically.

= How do I add a language switcher to my menu? =

The switcher is available three ways: as a widget, as a shortcode you can drop anywhere, and in the admin bar. It can display flags, native language names, or both.

= How do I translate strings from my theme or another plugin? =

Any string passed through WordPress translation functions is registered automatically via gettext and appears in the String Translation screen, where you can translate it per language. No .po file editing required.

= Can I translate my site from the command line? =

Yes. Lang Forge ships WP-CLI commands for listing languages, linking and unlinking translations, importing and exporting translation data, and running bulk operations — useful for staging deployments and scripted workflows.

= Is there a way to export translations to XLIFF or CSV? =

Import and export of XLIFF and CSV files is available in Lang Forge Pro, for sending content to external translators or translation agencies.

= How many languages can I use on the free version? =

Unlimited. There is no plan-based cap on the number of languages in the free version.

= Does Lang Forge work with my theme? =

Yes. Lang Forge uses standard WordPress hooks — `the_content`, `get_the_title`, hreflang via `wp_head` — so no theme-specific integration is needed.

= Does it work with Elementor and ACF? =

Elementor and ACF field translation is available in Lang Forge Pro. The free version handles standard post content, custom post types and taxonomies.

= Does it slow down my site? =

Basic translation, the language switcher, string translation and hreflang all run locally with no external requests.
The free plugin contacts the Forge API (api.avakode.com) only when an administrator presses "Run diagnostics" (or the repair button beside it) on the Forge Suite screen, or "Send feedback" on the feedback card; see External services above. AI features are a Pro add-on.

= Is AI translation included in the free version? =

No. The free version covers manual translation of posts, strings, taxonomies and WooCommerce content. AI translation, translation memory and bulk AI translation are part of the Lang Forge Pro add-on.

= How much does AI translation cost? =

AI translations consume Forge Credits (separate from the subscription). One credit ≈ one short paragraph. Credits don't expire.

= Is my content sent to OpenAI? =

Only when you run an AI feature of the Pro add-on: the text being translated, with the licence key and your site's address, goes to api.avakode.com, which passes the text on to OpenAI, through Cloudflare AI Gateway; your licence key is not passed on. See External services above for the policies of both. The Pro add-on's own readme lists everything that travels with it.

= What is a glossary and when do I need one? =

A glossary locks specific terms to a fixed translation — brand names, product names, industry terminology — so they stay consistent across every translated page instead of varying between passes.

== Screenshots ==

1. Multilingual setup — add unlimited languages, set language codes, display labels, switcher visibility and the default language.
2. Post translation — the Language panel lists every linked translation and creates missing ones in one click.
3. Translation management — a language column on the posts list with per-language filters, counts and translation shortcuts.
4. Multilingual URL structure — choose subdirectory, query parameter, subdomain or domain mapping, and set the language fallback chain.
5. Language switcher — the front-end switcher with flags and native language names.
6. Migration — Lang Forge detects an existing WPML, Polylang or TranslatePress install and imports it without touching the original data.

== Changelog ==

= 1.2.0 =
* The Strings page no longer reads the files of your theme looking for `lf_e()` and `lf__()` calls (it did so on every load of the page). These two functions, kept for old themes, now register their strings when a page that prints them is shown on the site, as `__()` and `_e()` do, and only for the text domains listed under Settings → String Auto-Registration Domains. The domain `default` is never registered, so a new `lf_e('Text')` call without a domain no longer shows up on the Strings page; strings registered earlier stay in the list.
* With Lang Forge Pro 1.3.0 or newer, AI translation no longer fills a part that did not come back with the source text: the whole request fails with its own message and nothing is written. The parts that did come back are kept for an hour, so a second try pays only for the parts that failed, and a post with no content (or no title and excerpt) sends no empty request.
* With Lang Forge Pro 1.3.0 or newer, a kept draft with a failure record has a Retry AI translation button on its language row (post box and posts column), and a second click on an AI button while its request is out does nothing.
* The record of a failed translation is kept per language, so two jobs of one post can no longer drop each other's record. A record written by an older version is still read and moved.
* WP-CLI export: --output must be a plain file name with one dot and an export extension (csv, xliff or xlf) and --lang a plain language code; a refused call stops before any query is run or any folder is made.
* Deleting the last Forge plugin or add-on on a site now removes everything Forge stored on the site, on every site of a network: the statistics settings and the install ID, the shared job queue with its scheduled events, and the other settings and caches the Forge plugins share. While another Forge product stays, only this plugin's own share goes.
* Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before.

= 1.1.1 =
* Recent activity on the Forge Suite dashboard measures every entry on one clock. On a site whose time zone differs from the database server's, a translation or a form submission from a minute ago could read “5 hours ago”. Entries from the same second keep a fixed order, and a “fields saved” entry shows when its post was last saved instead of an invented time.

= 1.1.0 =
* The functions that WPML-style theme code calls — `icl_object_id()`, the `wpml_object_id` filter and `langforge_get_translation()` (and `langforge_get_post_translations()`) — treat a translation that is not published (a draft, pending, scheduled or private one) as “no translation” when a visitor loads the page: they return the original page when your code asks for it, or nothing, so the address of an unpublished page never reaches the theme. This differs from WPML, which does not hold a draft translation back. In WP-CLI, for a signed-in user who can edit that translation (in the admin, over REST or AJAX) and for an editor previewing the draft they answer as before; a signed-in user who cannot edit it, such as a subscriber, gets the visitor’s answer there too.
* The hreflang sitemap now gives each language the same code as the page head, written the way hreflang wants it: `de` instead of `de-de`, `en-US` instead of `en-us`, and `es-MX` instead of `es-mx` for a language with a region of its own; the page head now says `es-MX` for such a language too, where it said `es_mx`.
* With Rank Math, Yoast SEO, All in One SEO, SEOPress or The SEO Framework active, a page has one canonical link instead of two, and the SEO plugin's own og:locale tag alone instead of two (none where it prints none, as with its Open Graph switched off). The canonical is the page's own language address unless one was typed into the SEO plugin for that page, and the og:locale:alternate tags are printed only where the SEO plugin prints its og:locale.
* A new translation no longer takes over the canonical URL typed in for its source page, and a translation that already holds the same canonical as its source is treated as having none (Rank Math, Yoast SEO, All in One SEO, SEOPress, The SEO Framework, and Rank Forge in a version that asks Lang Forge about it), so its canonical link names its own address. With The SEO Framework this needs version 5.0 or later, and with SEOPress its current versions: an older release does not offer the hook Lang Forge uses for the link, and there the translation keeps the canonical it holds.
* With Yoast SEO, such a translation also names its own address in og:url and in the schema data (the page's url and the ids built on it), where it used to name the source page there.
* A new translation no longer takes over the redirect SEOPress holds for its source page.
* AI translation keeps the shortcodes of your content whole. Before a text goes to the AI, the tag of every shortcode on your site (`[contact-form-7 id="12"]`, `[gallery ids="1,2"]`, `[button]…[/button]`) is swapped for a placeholder, and the answer gets the tags back exactly as they were. If the AI changes or drops one, the translation is not saved and you are told so, instead of a broken form or gallery going into the translated page. Text inside a shortcode's attributes, such as the label of `[button text="Buy"]`, is not translated and stays in the source language; the words between an opening and a closing tag are translated. A shortcode that a plugin registers only on the front end is not known during an AI translation in the admin: add its name with the `langforge_ai_shortcode_tags` filter to protect it too.
* “Create + AI Translate”: when the AI does not translate the page it has just created, the edit screen of that page now says so, and why (out of credits, a shortcode the AI could not keep, or another failure), where the message used to vanish with the screen you left.

= 1.0.41 =
* Deleting the plugin leaves the job queue the Forge plugins share in place while another Forge plugin or add-on is still on the site. The check used to miss add-ons, and Rank Forge installed from wordpress.org, so the queue could be dropped while a neighbour still had jobs in it.
* Deleting the plugin now also removes the site's Avakode account binding and the hourly statistics event when it is the last Forge plugin on the site. With another Forge plugin or add-on left, both stay for it.
* The dashboard's “Run diagnostics” request to api.avakode.com/health no longer carries your site's address: it identifies itself as ForgeSuite/health-check instead of using WordPress's default User-Agent, which includes the address.
* The Forge Suite screen lists Renew Forge, shows Guard Forge and Velocity Forge as available on wordpress.org, and carries the other products' current plans and taglines.
* The readme's External services section lists every request the plugin can make and what goes with it, and says that an AI request is passed on to OpenAI through Cloudflare AI Gateway, with the licence key held back.

= 1.0.40 =
* **This release needs Lang Forge Pro 1.1.4 or newer if you run the add-on.** The licence screen, the upgrade prompt and the upgrade banner moved into the separate Lang Forge Pro add-on; this plugin only notes which features the add-on provides, with a link to its product page. An older add-on stays switched off until it is updated, and an admin notice names both versions and where to download the add-on. Translations already saved are untouched.
* String Translation shows no AI Translate button unless the add-on runs AI translation — no locked button. One line says where AI translation comes from.
* Settings and Tools no longer link to an upgrade: AI translation, Translation Memory and one-click site duplication say that they come with the add-on.
* The screens the add-on provides (Visual Editor, Analytics, Translation Memory, Import / Export) name it, with a link, instead of showing a locked page.

= 1.0.39 =
* Glossary opens with no licence check. It has always been part of this plugin, and the menu no longer puts it behind a gate that could only answer yes.
* The PRO badge in the menu and in the section tabs marks a screen the Lang Forge Pro add-on provides and this site does not have. It follows whether the add-on is installed, not the licence.
* The String Translation help shows the [langforge_string] shortcode. The old [lf_string] form keeps working in existing content.
* Fixed: the Forge Suite screen reported Rank Forge as not installed when it came from wordpress.org, which installs it into the rank-forge folder, and its Activate link pointed at a file that is not there.
* The Forge Suite screen looks for installed plugins only where WordPress keeps them, so a site that moved its content or plugin folder is read correctly.
* The Forge Suite licence panel finds Form Forge again: its licence code now ships in Form Forge Pro, so the free plugin is recognised by its own version.

= 1.0.38 =
* Fixed: on a site without WPML or Polylang, the first activation made Russian the default language and added English under /en/, whatever language the site was written in. A fresh install now starts with the site's own language (Settings → General → Site Language) as its only language, so an English site stays English; add more languages under Lang Forge → Languages.

= 1.0.37 =
* **This release needs Lang Forge Pro 1.1.0 or newer.** An older add-on is switched off whole rather than left running, because beside this core it would be present and wrong rather than absent. Until you update it AI translation, bulk AI translation, translation memory, translation QA and the frontend editor are unavailable. Translations already saved are untouched, an admin notice names both versions and what stopped, and installing the current add-on brings all of it back.
* Deleting the last Forge product on a site now clears the job queue the Forge plugins share — its table, its two scheduled events and its version marker. While any other Forge product is still installed, deleting this one leaves the queue exactly as it is, because the pending jobs in those rows are that product's too.
* Fixed: Lang Forge → Tools stopped with a fatal error on a site whose licence includes bulk duplication while the Pro add-on is not loaded. The card shows the Pro teaser instead.
* The Forge Suite dashboard links Guard Forge, Velocity Forge and Flow Forge to their sites: guardforge.app, velocityforge.app and flowforgewp.app.

= 1.0.36 =
* Suite banner: the eleven products and the three-step set discount are up to date.

= 1.0.35 =
* Forge Suite dashboard: results are the first screen — each tool's own results with window and completeness, detected and confirmed apart, a Needs-attention filter and a local CSV export for administrators.
* Set discounts in the Suite banner follow the three-step ladder (2 tools 15%, 3 tools 25%, 4 or more 35%).
* Translations refreshed for all catalogues.

= 1.0.34 =
* Licensing no longer depends on a third-party SDK. The plugin asks avakode.com whether this site is licensed and caches the answer for a day; if the check cannot be completed — a network hiccup, a timeout, our own error — your paid features stay on. Only a clear “this licence is not active” turns them off.
* Deactivating from the Forge Suite dashboard now releases the site slot directly, instead of the three-step fallback the old SDK needed when a licence had been cancelled server-side.
* Smaller package and one less admin surface: the SDK’s own menu, opt-in screen and promotional notices are gone.

= 1.0.33 =
* Forge Suite dashboard: names of the builder-rail tools (Clearway, Profit, Inclusive Forge) no longer truncate next to the “Not installed” badge.

= 1.0.32 =
* The Forge Suite dashboard now shows the whole seven-tool line-up from the product registry — Clearway Forge, Profit Forge and Inclusive Forge join the four WordPress tools — counts active tools against seven, and its cross-sell banner points at the Forge Builder on avakode.com (one checkout, set discount up to 45%) instead of the retired Freemius bundle.

= 1.0.31 =
* Fixed: requesting a URL that doesn't exist answered with a redirect to the homepage instead of a 404. The "missing translation → language homepage" fallback now fires only when the request itself names a language — a language-prefixed URL, a ?lang= parameter, a language subdomain or mapped domain, or the language cookie from an earlier switch. A dead URL with no language signal returns a real 404: your theme's 404 page for visitors, and the correct status code for search engines instead of a soft-404.
* Internal: the feedback widget's styles and script are attached through the WordPress asset pipeline instead of being printed into the page. No visible change.

= 1.0.30 =
* Declares support for WordPress 7.1. Checked against 7.1-RC3, where the post editor canvas moves into an iframe for good: the language panel, the admin-bar switcher and the editor scripts all still work, because they read the post through the editor's own data store rather than reaching into the canvas.
* The sibling plugin formerly called SEO Forge is now Rank Forge, so the shared Forge screens and the cross-links name it correctly.

= 1.0.29 =
* Fixed: the shared Forge interface (dashboard, Connect, credits) could display in a stale translation, or fall back to English, on sites using a community language pack. It was reading the plugin's own bundled catalogue instead of the pack WordPress installs.
* Russian and Ukrainian are no longer bundled with the plugin. Both now have community-reviewed language packs on translate.wordpress.org, which WordPress uses in preference to anything shipped here — so bundling our own copy could only ever serve an older, unreviewed version. The download is 36% smaller than in 1.0.25.
* Translations: a large quality pass across all 13 bundled languages. Terminology now follows each locale's official WordPress glossary, and the Japanese, French, German, Spanish and Brazilian Portuguese catalogues follow their locale's published style guide — Japanese spacing and punctuation, French apostrophes and non-breaking spaces, German and Spanish quotation marks. Corrections made by the Dutch and Polish translation editors have been adopted as-is.

= 1.0.28 =
* Translations: reviewed every locale against WordPress core's own wording and corrected 692 strings. The plugin now uses the same vocabulary core does — the Russian word for "posts", the French term for permalinks, the Italian term for unlinking, and so on — instead of a plausible-but-foreign synonym. Two strings that had been left in English in the Hindi catalogue are translated, and a Hindi string that said the opposite of what it meant ("Disconnect") is fixed.

= 1.0.27 =
* Translations: every bundled language is now complete. 227 missing strings were translated across the 15 supported locales, and 62 plural forms that carried the English two-form shape were rebuilt with the correct number of forms for their language (3 for Russian, Ukrainian and Polish, 6 for Arabic, 1 for Japanese, Korean and Chinese) — those catalogues previously failed to compile and picked the wrong plural at runtime.
* Dropped 49 placeholder language files that were only 1–4% translated. They shipped almost nothing but English and made the download 24% larger. The 15 supported locales are unchanged: Arabic, German, Spanish, French, Hindi, Italian, Japanese, Korean, Dutch, Polish, Portuguese (Brazil), Russian, Turkish, Ukrainian and Chinese (Simplified).

= 1.0.26 =
* Fixed: hreflang alternates pointed at the page being viewed instead of the translation. On an English page the `es`, `de` and `x-default` links all resolved back to the English URL (and the same on every other language), so search engines discarded the annotation. Both the `wp_head` tags and the hreflang sitemap are affected.
* Fixed: the canonical URL on a translated page could resolve to a sibling translation instead of the page itself.
* Fixed: on a non-default-language page, permalinks lost their language prefix, because the language-aware `home_url()` was being used as the base for detecting it.
* Fixed: `/sitemap-hreflang.xml` and `/sitemap-hreflang-N.xml` were redirected to a trailing-slash URL before the sitemap could render.
* Plugin name now mentions hreflang SEO, which the plugin has always handled.

= 1.0.25 =
* readme: clearer plugin title, updated tags and an expanded FAQ covering multilingual setup, WooCommerce, hreflang, migration and RTL.
* No functional changes.

= 1.0.24 =
* Security hardening: all dynamic output is now escaped late with the context-appropriate function (esc_html/esc_attr/esc_url, esc_html__ for translated strings used as format strings, and wp_kses for trusted pre-built admin markup). No behavioural changes.
* The glossary CSV export now neutralises CSV/formula injection in exported cells.

= 1.0.23 =
* Free now supports an unlimited number of languages with no plan-based cap — removed all license-gated language-limit code (no "locked" language rows, no over-limit notice, no limit on saving).
* Tightened the glossary REST list endpoint to the same administrator capability as glossary management.

= 1.0.22 =
* Hardened WP-CLI export: files are now always written to a plugin-slug folder inside the uploads directory (wp-content/uploads/langforge/) instead of an arbitrary path, so nothing is ever written into the plugin folder.
* Uninstall cleanup now only removes data under the plugin's own unambiguous prefix, so unrelated options/metadata belonging to other plugins are never deleted.

= 1.0.18 =
* New: Support menu item that opens the Avakode support dashboard.
* New: Opt-in anonymous usage analytics (OFF by default) — see Third-Party Services.
* New: Contextual, dismissible Pro feature tips on the plugin dashboard (Free users only).


= 1.0.15 =
* WordPress.org compliance and licensing hardening.
* Pro entitlement is now resolved by the Lang Forge Pro add-on; the free plugin bundles no licensing SDK.
* The plugin no longer modifies admin notices belonging to other plugins.
* readme metadata cleanup.

= 1.0.0 =
* Initial release.

== Upgrade Notice ==


= 1.2.0 =
Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before. Failed translations are recorded per language, and deleting the last Forge plugin now removes everything Forge stored on the site, on every site of a network.

= 1.1.1 =
Recent activity on the Forge Suite dashboard tells every entry's age on one clock. If you run Lang Forge Pro, it must be 1.1.4 or newer.

= 1.1.0 =
One canonical link and one og:locale next to Rank Math, Yoast SEO, All in One SEO, SEOPress and The SEO Framework; hreflang codes match between page head and sitemap. Needs Lang Forge Pro 1.1.4 or newer if you run the add-on; Pro 1.2.0 adds shortcode protection for AI translation.

= 1.0.41 =
Deleting the plugin leaves the job queue shared by the Forge plugins alone while another one is still installed. If you run Lang Forge Pro, it must be 1.1.4 or newer.

= 1.0.40 =
Needs Lang Forge Pro 1.1.4 or newer if you run the add-on: the licence screen moved into it, and an older add-on stays switched off until it is updated. String Translation shows no locked AI button.

= 1.0.39 =
Still needs Lang Forge Pro 1.1.0 or newer. Glossary opens with no licence check, the PRO badges follow whether the add-on is installed, and the String Translation help names the shortcode that works.

= 1.0.38 =
Still needs Lang Forge Pro 1.1.0 or newer. A fresh install on a site without WPML or Polylang now starts in the site's own language instead of switching it to Russian; language settings you already have are not changed.

= 1.0.37 =
Needs Lang Forge Pro 1.1.0 or newer — an older add-on is switched off whole, so AI translation, translation memory, QA and the frontend editor stop until you update it. Translations already saved are untouched.

= 1.0.29 =
Fixes shared interface strings showing in a stale language or English on sites with a community language pack. Substantial translation improvements in all 13 languages.

= 1.0.28 =
Translation quality pass: 692 strings across all 15 languages now match WordPress core's own terminology.

= 1.0.27 =
Complete, corrected translations for all 15 supported languages, and a 24% smaller download.

= 1.0.26 =
Important SEO fix: hreflang alternates and canonical URLs on translated pages were pointing at the wrong page. Update if you rely on multilingual SEO.

= 1.0.25 =
Documentation-only update: clearer title, better tags and a much larger FAQ.

= 1.0.18 =
Adds a Support menu, optional anonymous analytics (off by default), and dashboard Pro tips.


= 1.0.15 =
Licensing and WordPress.org compliance improvements.

= 1.0.0 =
Initial release.
