{"id":347279,"date":"2026-08-04T21:43:19","date_gmt":"2026-08-04T21:43:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gloty\/"},"modified":"2026-08-13T09:05:33","modified_gmt":"2026-08-13T09:05:33","slug":"gloty","status":"publish","type":"plugin","link":"https:\/\/gd.wordpress.org\/plugins\/gloty\/","author":23539523,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.49.1","stable_tag":"1.49.1","tested":"7.0.4","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Gloty \u2013 AI Translation & Multilingual","header_author":"WP Shelf","header_description":"AI-powered translation for WordPress. Translations are stored in your own database and served locally, with no remote call at render time.","assets_banners_color":"1a67a3","last_updated":"2026-08-13 09:05:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wp-shelf.com\/gloty","header_author_uri":"https:\/\/wp-shelf.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":126,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.29.2":{"tag":"1.29.2","author":"wpshelf","date":"2026-08-04 21:42:57"},"1.32.3":{"tag":"1.32.3","author":"wpshelf","date":"2026-08-05 15:04:45"},"1.49.1":{"tag":"1.49.1","author":"wpshelf","date":"2026-08-13 09:05:33"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3634659,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3634659,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3634659,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3634659,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3634659,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"gloty\/language-switcher":{"name":"gloty\/language-switcher","title":"Language switcher"}},"tagged_versions":["1.29.2","1.32.3","1.49.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3634659,"resolution":"1","location":"assets","locale":"","width":1512,"height":1140},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3634659,"resolution":"2","location":"assets","locale":"","width":1512,"height":1140},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3634659,"resolution":"3","location":"assets","locale":"","width":1512,"height":1080}},"screenshots":{"1":"Dashboard showing translation statistics across languages","2":"Translations screen for reviewing and editing individual translations","3":"Settings page with translation and switcher options"}},"plugin_section":[],"plugin_tags":[22323,1734,99,95,2333],"plugin_category":[48],"plugin_contributors":[274470],"plugin_business_model":[],"class_list":["post-347279","plugin","type-plugin","status-publish","hentry","plugin_tags-language-switcher","plugin_tags-localization","plugin_tags-multilingual","plugin_tags-translate","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-wpshelf","plugin_committers-wpshelf"],"banners":{"banner":"https:\/\/ps.w.org\/gloty\/assets\/banner-772x250.png?rev=3634659","banner_2x":"https:\/\/ps.w.org\/gloty\/assets\/banner-1544x500.png?rev=3634659","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/gloty\/assets\/icon.svg?rev=3634659","icon":"https:\/\/ps.w.org\/gloty\/assets\/icon.svg?rev=3634659","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/gloty\/assets\/screenshot-1.png?rev=3634659","caption":"Dashboard showing translation statistics across languages"},{"src":"https:\/\/ps.w.org\/gloty\/assets\/screenshot-2.png?rev=3634659","caption":"Translations screen for reviewing and editing individual translations"},{"src":"https:\/\/ps.w.org\/gloty\/assets\/screenshot-3.png?rev=3634659","caption":"Settings page with translation and switcher options"}],"raw_content":"<!--section=description-->\n<p>Gloty translates your WordPress site with AI machine translation, then stores every translation in your own database and serves it from there. Rendering a translated page never calls a remote service \u2014 page delivery stays local and deterministic even if the translation service is slow or unreachable.<\/p>\n\n<p>Serving those pages is built to be cheap. Gloty compiles your translations into a PHP cache file that your server's OPcache holds in shared memory, so once it is warm a translated page view costs no database queries for translation at all, and the translations take almost no memory in the request. That is aimed squarely at ordinary shared hosting with no object cache, which is where a translation plugin normally slows a site down most. Where the technique is unavailable, Gloty serves from the database instead and the page is still correct.<\/p>\n\n<p>The picker offers 38 languages, each with the right hreflang code emitted for it. That list is deliberately shorter than it could be: it is the set both AI engines' vendors say their models support, rather than every language code in existence. A translation you cannot judge the quality of is worth less than one you can, so Gloty offers the ones where the engines are known to be strong, and every translation it produces is editable by hand.<\/p>\n\n<p>Producing a translation does require an external service, because machine translation is not something WordPress can do locally. Gloty sends the text that needs translating to the hosted Gloty translator service, which translates it and returns the result to your site in the background. The results land in your WordPress database, are editable by hand, and keep serving with no further external calls.<\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li><strong>38 languages<\/strong> \u2014 the set both AI engines' vendors list as supported, each with the right hreflang code<\/li>\n<li><strong>Your database, your translations<\/strong> \u2014 stored locally in WordPress, never fetched remotely at render time<\/li>\n<li><strong>Fast on slow hosting<\/strong> \u2014 translations compile into a cache your server holds in memory, so serving a translated page costs no database queries once warm; it falls back to the database safely if your host cannot do that<\/li>\n<li><strong>Automatic page translation<\/strong> \u2014 captures page output, extracts translatable text, queues it for translation<\/li>\n<li><strong>Entity-aware<\/strong> \u2014 posts, pages, taxonomies, and template strings are tracked as distinct sources with stale detection<\/li>\n<li><strong>Edit any translation<\/strong> \u2014 review and correct translations from Gloty \u2192 Translations<\/li>\n<li><strong>Prepare a language before publishing it<\/strong> \u2014 translate in the background, check it over, then show it to visitors<\/li>\n<li><strong>Let someone correct translations without making them an administrator<\/strong> \u2014 optionally limited to one language<\/li>\n<li><strong>A different image per language<\/strong> \u2014 for screenshots, diagrams and packaging that carry words<\/li>\n<li><strong>The language switcher in your menu<\/strong> \u2014 as ordinary menu items your theme styles, plus a block<\/li>\n<li><strong>A sitemap of your translated pages<\/strong> \u2014 so search engines can actually find them<\/li>\n<li><strong>Translate content that loads after the page<\/strong> \u2014 load-more, AJAX filters and search panels<\/li>\n<li><strong>Manual edits are protected<\/strong> \u2014 machine sync never silently overwrites a human correction<\/li>\n<li><strong>Glossary<\/strong> \u2014 terms that must never be translated, or that must always render a specific way per language, promotable in one click from any translation you are looking at<\/li>\n<li><strong>SEO-friendly<\/strong> \u2014 hreflang tags, translated meta, clean \/fr\/page\/ URLs, and optional translated page addresses (\/de\/ueber-uns\/)<\/li>\n<li><strong>Language switcher<\/strong> \u2014 floating widget, footer list, shortcode, or sidebar widget<\/li>\n<li><strong>Optional browser-language redirect<\/strong> \u2014 off by default, crawler-safe, remembered per visitor<\/li>\n<li><strong>WooCommerce compatible<\/strong> \u2014 products, cart, checkout, store AJAX fragments, and order emails sent in the language the customer shopped in<\/li>\n<li><strong>Gettext integration<\/strong> \u2014 translates WordPress, theme, and plugin UI strings<\/li>\n<li><strong>AI translation engine<\/strong> \u2014 OpenAI or Google Gemini, selected for you by the service on every plan<\/li>\n<li><strong>Background processing<\/strong> \u2014 queued dispatch with webhook delivery and a polling fallback<\/li>\n<li><strong>Export and import<\/strong> \u2014 hand a language to a translator as XLIFF or CSV, load their corrections back, or simply take a copy of your translations<\/li>\n<li><strong>WP-CLI<\/strong> \u2014 <code>wp gloty export<\/code>, <code>wp gloty import<\/code>, <code>wp gloty languages<\/code><\/li>\n<li><strong>Developer extensible<\/strong> \u2014 filters and a REST API<\/li>\n<\/ul>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<ol>\n<li>Install Gloty and connect your site to the Gloty translator service<\/li>\n<li>Add your target languages<\/li>\n<li>Gloty discovers translatable content from your posts, taxonomies, and template strings<\/li>\n<li>Translation runs in the background and the results are written to your database<\/li>\n<li>Visitors get translated pages under language-prefixed URLs (\/fr\/, \/de\/, \u2026) and can switch languages from the switcher<\/li>\n<\/ol>\n\n<p>Translation requires an external machine-translation service. See <strong>External services<\/strong> below for exactly what is sent and to whom.<\/p>\n\n<p>Documentation: https:\/\/wp-shelf.com\/gloty\/docs\/<\/p>\n\n<h3>External services<\/h3>\n\n<p>Gloty cannot produce translations without an external machine-translation service, because machine translation is not something WordPress can do locally. This section describes every external request the plugin makes, what it sends, and when.<\/p>\n\n<p>Nothing is sent anywhere until you have connected your site and translation has been triggered (by a scan, a Translate action, or scheduled background dispatch). Serving an already-translated page makes no external request at all.<\/p>\n\n<p><strong>1. The Gloty translator service<\/strong><\/p>\n\n<p>All translation work is performed by the hosted Gloty translator service. The plugin does not contact machine-translation providers directly; it sends work to the Gloty service, which selects and calls the translation engine on your behalf and delivers the results back to your site.<\/p>\n\n<ul>\n<li>Service host: <code>https:\/\/gloty-api.wp-shelf.com<\/code> (overridable by defining the <code>GLOTY_SERVICE_URL<\/code> constant, for example to point at a self-hosted instance of the service).<\/li>\n<li>What is sent: the source text to be translated (page, post, taxonomy, and template strings from your site), the source and target language codes, your site URL, and a per-site API token and license key used to identify and authenticate your site.<\/li>\n<li>When: on connection verification, while dispatching queued translation batches, when polling for results, and when the service delivers results back to your site over a signed webhook.<\/li>\n<li>Who: the Gloty translator service, operated by WP Shelf.<\/li>\n<li>Terms of service: https:\/\/wp-shelf.com\/terms<\/li>\n<li>Privacy policy: https:\/\/wp-shelf.com\/privacy<\/li>\n<\/ul>\n\n<p>The Gloty service in turn passes your text to the AI translation engine it selects for the batch \u2014 OpenAI or Google Gemini. Their terms apply to that processing:<\/p>\n\n<ul>\n<li>OpenAI \u2014 https:\/\/openai.com\/policies\/terms-of-use \/ https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<li>Google Gemini \u2014 https:\/\/ai.google.dev\/terms \/ https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>2. WordPress.org translation packs<\/strong><\/p>\n\n<p>When you enable a language, Gloty asks WordPress.org to install the official WordPress and plugin language packs for that locale, using WordPress core's own updater. This is the same request WordPress itself makes and sends no site content.<\/p>\n\n<p>Gloty does not send analytics, telemetry, or usage tracking anywhere.<\/p>\n\n<h3>Filters<\/h3>\n\n<h4>gloty_compiled_map_enabled<\/h4>\n\n<p>Whether Gloty may compile your translations into a PHP cache file for OPcache to hold in memory. The value passed in is Gloty's own verdict on whether the server can benefit \u2014 return <code>false<\/code> to switch the feature off entirely, in which case translations are served from the object cache, a transient, or the database, exactly as in earlier versions.<\/p>\n\n<pre><code>add_filter( 'gloty_compiled_map_enabled', '__return_false' );\n<\/code><\/pre>\n\n<p>Returning <code>true<\/code> forces it on where Gloty could not confirm OPcache is active \u2014 useful when <code>opcache.restrict_api<\/code> hides the OPcache status from plugin code. Do not force it on where OPcache is genuinely off: every request would then compile the cache file from source, which is slower than the database read it replaces.<\/p>\n\n<p>Defining <code>GLOTY_DISABLE_COMPILED_MAP<\/code> as true in <code>wp-config.php<\/code> disables it before any filter can run, and Gloty honours WordPress's own <code>DISALLOW_FILE_MODS<\/code> constant without any configuration.<\/p>\n\n<h4>gloty_compiled_map_max_bytes<\/h4>\n\n<p>The largest cache file Gloty will write, in bytes. Default 8 MB. A translation set that would exceed it keeps using the database.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>The admin interface is compiled from JavaScript sources before release. The uncompiled, human-readable sources for everything in <code>build\/<\/code> ship inside the plugin under <code>src\/<\/code>, together with the build configuration in <code>webpack.config.js<\/code> and <code>package.json<\/code>. The bundles are produced by <code>@wordpress\/scripts<\/code> (webpack) via the <code>build<\/code> script in <code>package.json<\/code>; no minified or obfuscated code is included without its source.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>gloty<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Go to <strong>Gloty &gt; Connection<\/strong> and connect your site to the Gloty translator service<\/li>\n<li>Add your target languages under <strong>Gloty &gt; Languages<\/strong><\/li>\n<li>Visit your site \u2014 translations happen automatically in the background<\/li>\n<\/ol>\n\n<p>The setup guide covers each step in more detail: https:\/\/wp-shelf.com\/gloty\/docs\/getting-started.html<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20account%3F\"><h3>Do I need an account?<\/h3><\/dt>\n<dd><p>Yes. Producing translations requires a connection to the Gloty translator service, set up under Gloty \u2192 Connection. There is a free tier. Without a connection, Gloty can still store, manage, and serve translations you already have, but it cannot create new ones.<\/p><\/dd>\n<dt id=\"how%20much%20does%20it%20cost%3F\"><h3>How much does it cost?<\/h3><\/dt>\n<dd><p>The plugin itself is free and GPL-licensed. Translation runs through the Gloty service, which gives you a one-time free allowance to try it and paid plans for higher volume and more sites. Every plan translates on the same AI engines. Your existing translations continue to serve regardless of plan or status, because they live in your own database.<\/p><\/dd>\n<dt id=\"are%20translations%20stored%20on%20an%20external%20server%3F\"><h3>Are translations stored on an external server?<\/h3><\/dt>\n<dd><p>Your translations are stored in your own WordPress database, and translated pages are served from there with no external call. However, producing a translation in the first place does send the source text to an external machine-translation service \u2014 see <strong>External services<\/strong> above for exactly what is sent and to whom.<\/p><\/dd>\n<dt id=\"my%20language%20isn%27t%20in%20the%20list.%20can%20you%20add%20it%3F\"><h3>My language isn't in the list. Can you add it?<\/h3><\/dt>\n<dd><p>Ask and we will look at it. The list is the set of languages the AI engines' own vendors say their models support, which is why it is shorter than the language list you may have seen on other plugins. Adding one means checking that the current engines actually handle it rather than just producing confident-looking output, so it is a real answer rather than an automatic yes.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20builders%3F\"><h3>Does it work with page builders?<\/h3><\/dt>\n<dd><p>Yes. Gloty captures translatable text from rendered output as well as from WordPress entities, so it works with Elementor, Beaver Builder, Divi, and other page builders.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20translations%20manually%3F\"><h3>Can I edit translations manually?<\/h3><\/dt>\n<dd><p>Yes. Go to Gloty \u2192 Translations, find the string, and edit it. Manual edits are marked as such and are never overwritten by later machine sync.<\/p><\/dd>\n<dt id=\"does%20it%20support%20woocommerce%3F\"><h3>Does it support WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Gloty translates product titles, descriptions, attributes, and the cart and checkout pages, including WooCommerce's AJAX cart fragments.<\/p>\n\n<p>Order emails are not translated. They are sent outside the page rendering that Gloty works through, so a customer who ordered in German still receives the confirmation in your site's source language.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20translations%20if%20i%20deactivate%20gloty%3F\"><h3>What happens to my translations if I deactivate Gloty?<\/h3><\/dt>\n<dd><p>Deactivating stops translated URLs from being served but leaves all data in place. Deleting the plugin runs an uninstall routine that removes Gloty's tables and options, so export anything you want to keep first.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20my%20site%20down%3F\"><h3>Will this slow my site down?<\/h3><\/dt>\n<dd><p>Serving a translated page is designed to cost nothing extra. Gloty compiles your translations and your glossary into a PHP cache file kept in your server's OPcache, so once it is warm a page view runs no database queries to translate, makes no remote call, and holds the translations in shared memory rather than copying them into every request.<\/p>\n\n<p>The cache is written in the background, never during a visitor's page view, and rebuilds within about a minute of a translation changing. Until it exists \u2014 a fresh install, or just after an edit \u2014 pages are served from the database exactly as earlier versions did: correct, just not yet as fast.<\/p>\n\n<p>If your host has no OPcache, if the uploads directory is not writable, or if a cache file is ever damaged, Gloty notices and serves from the database instead, and reports it under Dashboard \u2192 Issues. Nothing about this can make a page render incorrectly, only more slowly.<\/p><\/dd>\n<dt id=\"where%20does%20gloty%20write%20files%3F\"><h3>Where does Gloty write files?<\/h3><\/dt>\n<dd><p>Only one place: a <code>gloty-cache<\/code> folder inside your uploads directory, holding the compiled translation cache described above (with <code>wp-content\/cache\/gloty<\/code> as a fallback if uploads is not writable). The folder carries an index.php and .htaccess so the files are not browsable, and each file refuses to output anything if requested directly. Deactivating the plugin deletes them; uninstalling removes the folder too, and only ever removes files Gloty can prove it wrote.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.49.1<\/h4>\n\n<ul>\n<li>Fixed: on a site updating to 1.43.0 or later, the new sitemap of translated pages returned \"not found\" until you re-saved your permalinks. Updating a plugin replaces its files without running the setup step that registers new addresses, so the sitemap existed and nothing could reach it. It now registers itself once, on the first page load after the update.<\/li>\n<\/ul>\n\n<h4>1.49.0<\/h4>\n\n<ul>\n<li>Added: if you are moving from TranslatePress, Gloty can bring your existing translations across instead of asking you to pay for them twice. Run <code>wp gloty migrate<\/code> to see what is on the site, then <code>wp gloty migrate de<\/code> for each language.<\/li>\n<li>Translations you reviewed by hand come across as manual, so Gloty will not overwrite them later. Machine translations come across as machine, because that is what they are.<\/li>\n<li>Anything Gloty already has a translation for is left alone \u2014 you may have corrected it since, and an import is not a reason to lose that. Running it twice imports nothing the second time.<\/li>\n<li>Note: WPML and Polylang are detected and reported, but cannot be imported. They store a translation as a separate post rather than as a pair of strings, so bringing them across is a different job that is not built. Gloty tells you it found them rather than quietly importing a fraction of your site.<\/li>\n<\/ul>\n\n<h4>1.48.0<\/h4>\n\n<ul>\n<li>Added: Gloty can now translate content your theme loads after the page \u2014 a \"load more\" button, an AJAX product filter, a search panel that opens without a reload. Until now that content arrived in your own language on a page that was otherwise translated.<\/li>\n<li>Under Gloty \u2192 Settings you name the AJAX action, one per line. You only need this if you have the problem: your theme's documentation, or your browser's network tab, will tell you the action name.<\/li>\n<li>It is off until you name something, on purpose. WordPress sends every plugin's AJAX through one address and most of it is data rather than page content \u2014 translating that blindly would break a working screen instead of fixing an untranslated one.<\/li>\n<li>Even once you name an action, anything that comes back as data rather than HTML is passed through untouched, so an action that usually returns content and occasionally returns a status message stays safe.<\/li>\n<li>WooCommerce's own cart and checkout were already handled and are unaffected.<\/li>\n<\/ul>\n\n<h4>1.47.2<\/h4>\n\n<ul>\n<li>Fixed: meta descriptions were the way Gloty was translating its own output, and the checks added in 1.46.0 and 1.47.0 were guarding a different part of the plugin, so they never applied. Where your SEO plugin builds a description from a phrase Gloty has translated, that finished description is no longer collected as a new English source and re-translated into every language.<\/li>\n<\/ul>\n\n<h4>1.47.1<\/h4>\n\n<ul>\n<li>Fixed: the 1.47.0 check only worked when the same page view both translated the phrase and used it. SEO plugins store the finished sentence and print it on later views, so in practice the check almost never fired and these entries kept being created. Gloty now recognises its own phrasing whenever it sees it, not only in the page view that produced it.<\/li>\n<\/ul>\n\n<h4>1.47.0<\/h4>\n\n<ul>\n<li>Fixed: the most common form of Gloty translating its own output. Where a theme builds a sentence by dropping a name into a phrase \u2014 \"Decode a [brand] batch code free\" \u2014 the part Gloty translates is the phrase, and your theme fills the name in afterwards. The finished sentence therefore matches nothing Gloty has stored, so the check added in 1.46.0 could not recognise it and those entries were collected and translated all over again. Gloty now remembers the phrasing it handed out while building a page and recognises the finished sentence as its own.<\/li>\n<li>Changed: the cleanup finds these too, so entries created this way before the fix are removed along with the rest.<\/li>\n<\/ul>\n\n<h4>1.46.2<\/h4>\n\n<ul>\n<li>Fixed: the cleanup added in 1.46.0 timed out on a large site instead of running. It now works through the table a piece at a time and reports where it got to, so a site with tens of thousands of translations finishes it over several runs rather than never.<\/li>\n<\/ul>\n\n<h4>1.46.1<\/h4>\n\n<ul>\n<li>Fixed: the cleanup added in 1.46.0 could remove a legitimate English entry. Where an earlier translation had come back untranslated, the cleanup could mistake a real English source for a copy of it. Those entries are left alone now \u2014 the separate \"identical to their source\" cleanup is the one that handles them.<\/li>\n<\/ul>\n\n<h4>1.46.0<\/h4>\n\n<ul>\n<li>Fixed: Gloty could translate its own translations. On a page in one of your languages, a theme that builds a sentence as the page renders \u2014 a meta description with the product name dropped into it, for example \u2014 can hand that finished sentence back to Gloty. Gloty had no way to tell it apart from a new English string, so it filed the Croatian version as a brand-new source and paid to translate it into every language you have enabled. Text Gloty has already produced for the language being shown is no longer collected as something to translate.<\/li>\n<li>Added: a cleanup for the entries that already happened. It removes the affected translations and the source behind them, so the next sync does not simply re-create them. Run it from the maintenance endpoint; each pass reports how many remain.<\/li>\n<\/ul>\n\n<h4>1.45.2<\/h4>\n\n<ul>\n<li>Changed: the four buttons on every row of the translations screen \u2014 Edit, Translate now, Add to glossary, Delete \u2014 are now one menu at the end of the row. They were reserving a column wide enough for all four on every row, and that space came out of the two columns the screen is actually for: your source text and its translation. Nothing is harder to reach; the edit you do most often is still a single click on the translation itself.<\/li>\n<\/ul>\n\n<h4>1.45.1<\/h4>\n\n<ul>\n<li>Fixed: the Overview's \"Done\" figure no longer opens a list that disagrees with it. Done counts each string once per language you have enabled; the translations table holds more rows than that, so the filtered list it opened reported a larger total than the number that had just been clicked. Done is now a plain figure with an explanation, and every other number on that card still opens exactly the rows it counted.<\/li>\n<\/ul>\n\n<h4>1.45.0<\/h4>\n\n<ul>\n<li>Added: the numbers on the Overview are now links. Click \"Synced\", \"Manually edited\", \"Pending\", \"Processing\", \"Translating\" or \"Out of date\" and the translations table opens showing exactly the rows that were counted, already filtered. The stages before a translation exists \u2014 Collected, Queued, Sent \u2014 open the Sync screen instead, which is where that work is. \"Done\" is not a link: it counts each string once per language, so it is deliberately a smaller number than the rows behind it, and sending you to a list with a different total would be worse than sending you nowhere.<\/li>\n<li>Added: a way to clear out-of-date translations. When you edit a page, its existing translations are marked out of date and keep being served until they are redone. If you would rather they were not, the \"Out of date\" card can now remove them and put those strings back in the queue in one action. It tells you first what that costs: visitors see the original text for those strings until the next sync translates them again, and translating them again spends quota.<\/li>\n<li>Added: a \"Translated (synced or edited)\" filter on the translations screen, covering both machine translations and ones you have edited by hand.<\/li>\n<li>Fixed: buttons that start something now say they are working. Refresh on the Overview and the Sync screen, \"Refresh status\" on Billing, and saving an edit directly in the translations table all showed nothing while the request was in flight, so a slow request looked like a button that had not registered the click. Reordering or switching languages now shows \"Saving\u2026\" as well, since those requests disable the whole table while they run.<\/li>\n<li>Fixed: the language switcher can get you back to your site's own language. Its link to that language is the one address on the site with no language prefix, and Gloty was putting the prefix back on as the page was sent \u2014 so from a translated page, clicking your own language led back to the page you were already reading, with no way out except editing the address by hand. The switcher's links now say which language they lead to, and links that say so are left as they were written.<\/li>\n<\/ul>\n\n<h4>1.44.0<\/h4>\n\n<ul>\n<li>Added: an \"Add to glossary\" button on every row of the translations screen. When you spot a brand or product name being translated when it should not be, or translated inconsistently, one click turns that row into a glossary rule \u2014 no retyping the term and its translation on the other screen. A translation identical to its source becomes a \"never translate\" rule; anything else fixes that exact wording for that one language. Promote the same term again from another language and it is added to the rule you already have, and a value you have set by hand is never overwritten: where the glossary already says something different, Gloty tells you instead of replacing it.<\/li>\n<\/ul>\n\n<h4>1.43.9<\/h4>\n\n<ul>\n<li>Fixed: an untranslated string could come back after being cleared. Gloty reuses a translation it already has for the same text instead of paying for it twice, and it was willing to reuse one that had come back untranslated \u2014 so clearing a bad entry only led the next sync to copy the untranslated text back in, without ever asking the translation service. Text that matches its source is no longer reused, except where you have set it yourself.<\/li>\n<\/ul>\n\n<h4>1.43.8<\/h4>\n\n<ul>\n<li>Fixed: short text taken from your rendered pages \u2014 buttons, headings, banner lines \u2014 is now included in the \"identical to their source\" check. It was only looking at text of 40 characters or more, so a heading like \"Try Before You Buy\" could come back untranslated and be reported as fine, which is exactly the text a visitor reads first. Longer text and translations you have edited yourself are treated as before, and short list values such as place and currency names are still left alone, because those are correctly the same in every language.<\/li>\n<\/ul>\n\n<h4>1.43.7<\/h4>\n\n<ul>\n<li>Fixed: when the translation service asks the site to slow down, the affected batches are no longer reported as failures. They stay queued and go out on the next sync, and the site stops sending for the moment rather than pushing through and collecting an error for every batch. Nothing was ever wrong with those batches, and nothing was charged for them.<\/li>\n<\/ul>\n\n<h4>1.43.6<\/h4>\n\n<ul>\n<li>Added: a repair for strings left part-translated by the bug fixed in 1.43.5. Those strings were marked finished with some languages still missing, and nothing would ever ask for them again. The new maintenance action finds them and puts the missing languages back in the queue \u2014 only the missing ones, so nothing you have already paid for is translated twice.<\/li>\n<\/ul>\n\n<h4>1.43.5<\/h4>\n\n<ul>\n<li>Fixed: a string that translated into some of your languages but not all of them is no longer treated as finished. It was being marked done as soon as the first language came back, so the languages still missing were never asked for again \u2014 and because they had no entry at all, nothing counted them as pending either. That is why a site could sit at 94% with only a few hundred strings reportedly waiting. Those gaps are now picked up on the next sync, and only the missing languages are sent.<\/li>\n<\/ul>\n\n<h4>1.43.4<\/h4>\n\n<ul>\n<li>Fixed: translations that arrived after a batch had been retried are no longer discarded. A retry gave the batch a new internal reference, our service still quoted the old one, and the results came back unrecognised and were thrown away \u2014 work your allowance had already paid for. Results are now matched on the batch itself, so late arrivals land where they belong.<\/li>\n<\/ul>\n\n<h4>1.43.3<\/h4>\n\n<ul>\n<li>Fixed: retrying a batch of translations that failed no longer counts against your character allowance a second time. You are charged when a batch is sent, and a batch our translation service failed to complete used to be re-sent \u2014 and re-counted \u2014 every time the site tried again. Nothing is deducted twice for one translation now, and a retry of work you have already paid for is free.<\/li>\n<\/ul>\n\n<h4>1.43.2<\/h4>\n\n<ul>\n<li>The last step of setup hands the work to people \u2014 and the card about whoever will review your translations now mentions that they do not need an administrator account. Gloty has been able to give a role translation access, in one language if you want, since 1.40.0; the one screen whose job is handing work over was not saying so.<\/li>\n<\/ul>\n\n<h4>1.43.1<\/h4>\n\n<ul>\n<li>Fixed: on a site using Yoast, Rank Math, All in One SEO, SEOPress or The SEO Framework, Gloty was adding a second WebSite block of structured data to every page \u2014 those plugins already emit one. Two of them on a page means a search engine has to pick which to believe. Gloty now leaves that to your SEO plugin, the same way it already leaves the meta tags to it. On a site with no SEO plugin nothing changes.<\/li>\n<\/ul>\n\n<h4>1.43.0<\/h4>\n\n<ul>\n<li>Fixed: your translated pages were not listed in any sitemap, on any site. Gloty was adding them to the WordPress sitemap in a way WordPress does not support \u2014 it accepts four fields per entry and quietly drops anything else \u2014 so the \"Add alternate languages to the sitemap\" setting reported itself as on and emitted nothing, ever. If you have wondered why translated URLs never showed up in Search Console, this is why.<\/li>\n<li>Gloty now publishes its own sitemap of translated pages at \/gloty-sitemap-index.xml, one file per language, and adds it to robots.txt. That is also the only approach that works if you use Yoast, Rank Math, AIOSEO or SEOPress, since each of those replaces the WordPress sitemap with one that knows nothing about translations. The setting is the same one, in the same place; it now does what its label says.<\/li>\n<li>Note: if your SEO plugin manages robots.txt it will replace the line Gloty adds. The SEO screen shows the address so you can submit it to Search Console once.<\/li>\n<\/ul>\n\n<h4>1.42.1<\/h4>\n\n<ul>\n<li>Fixed: when translated page addresses are turned on, the hreflang tags on a translated page pointed at addresses that did not exist. A German page at \/de\/ueber-uns\/ told search engines its English version was at \/ueber-uns\/ \u2014 a 404 \u2014 and said the same for x-default. Every language now declares the same correct set, and the German entry points at \/de\/ueber-uns\/ rather than at the untranslated path.<\/li>\n<\/ul>\n\n<h4>1.42.0<\/h4>\n\n<ul>\n<li>Added: you can put the language switcher in a navigation menu. Go to Appearance \u2192 Menus, add \"Languages\" from the Language switcher box, and each of your published languages appears as a normal menu item \u2014 styled by your theme exactly like the ones beside it, because that is what it now is.<\/li>\n<li>Added: a Language switcher block, so you can drop it anywhere in the editor instead of remembering a shortcode.<\/li>\n<li>The links always point at the page the visitor is on, in the language they picked, and the language they are currently reading is marked so your theme can highlight it.<\/li>\n<li>Note: a language you are still preparing does not appear in either, the same as everywhere else.<\/li>\n<\/ul>\n\n<h4>1.41.0<\/h4>\n\n<ul>\n<li>Added: you can show a different image in each language. Most pictures say the same thing everywhere, but a screenshot of an interface, a labelled diagram or a product shot with words on the packaging does not \u2014 and a page where the text is translated and the picture still says \"Download now\" reads worse than leaving it all in English would have.<\/li>\n<li>Open an image in your media library and you will find a field per language: put in the ID of the version to use, and Gloty serves that one instead. It works for featured images, images in your content, gallery and block images, and WooCommerce product images.<\/li>\n<li>The replacement brings its own size and its own alt text, so the layout is right and a screen reader hears the right description.<\/li>\n<li>Note: nothing changes for images you leave alone, and if you delete a replacement the original comes back rather than the page breaking.<\/li>\n<\/ul>\n\n<h4>1.40.0<\/h4>\n\n<ul>\n<li>Added: you can let someone correct translations without making them an administrator. Until now the only way to give a reviewer access was a full admin account \u2014 the same account that can change your connection, spend your plan and delete your content.<\/li>\n<li>Under Gloty \u2192 Settings, tick which roles may correct translations. They get one screen: the translation list, where they can read and fix text. They cannot change settings, start translations, or delete anything, and none of your account or billing details are sent to their browser. Administrators are always allowed and do not need ticking.<\/li>\n<li>Added: you can limit a person to particular languages. Edit their WordPress profile and tick the ones they work in \u2014 a freelancer hired for German then sees German and nothing else. Tick none to let them work in every language.<\/li>\n<li>Note: a role also has to be able to edit posts before it can be granted this, so ticking Subscriber by accident does not hand out the ability to rewrite published text.<\/li>\n<\/ul>\n\n<h4>1.39.0<\/h4>\n\n<ul>\n<li>Added: you can now prepare a language before anyone sees it. Turning a language on used to publish it in the same instant, and translation takes minutes to hours \u2014 so between the click and the finish, visitors and search engines could land on pages that were still half in your own language, and anything Google saw in that window got indexed that way.<\/li>\n<li>A language being prepared is still translated, which is the whole point; it simply is not offered in the language switcher, not listed in hreflang for search engines, and not in your sitemap. Anyone who can manage the site sees it exactly as visitors eventually will, so you can check it over first.<\/li>\n<li>Note: a visitor who follows an old link to a language you are preparing is sent to the same page in your site's own language, rather than shown a \"not found\" \u2014 they asked for something real, so they get it.<\/li>\n<li>Note: every language you already have stays published. Preparing one is a deliberate choice, not a new default.<\/li>\n<\/ul>\n\n<h4>1.38.0<\/h4>\n\n<ul>\n<li>Added: translated page addresses, off by default. Turn on \"Translate page addresses\" in Settings and \/de\/about-us\/ becomes \/de\/ueber-uns\/ \u2014 the address is in the same language as the page.<\/li>\n<li>Note: it costs no extra translation. The address is worked out from the page's translated title, the same way WordPress makes an address from a title you type.<\/li>\n<li>Note: your existing addresses keep working. Nothing you have shared, and nothing Google has indexed, breaks \u2014 turning this on adds an address rather than moving one, so there is no redirect and nothing to migrate.<\/li>\n<\/ul>\n\n<h4>1.37.0<\/h4>\n\n<ul>\n<li>Added: export a language and import it back. <code>wp gloty export de --file=de.xliff<\/code> writes every string as XLIFF, which is the format translation agencies and their software expect; <code>--format=csv<\/code> writes a spreadsheet instead. <code>wp gloty import de.xliff<\/code> loads corrections back in.<\/li>\n<li>Note: anything you import is stored as a human correction, so background translation will never overwrite it.<\/li>\n<li>Note: this is also how you take your translations with you. They have always lived in your own database rather than on our server, and now there is a way to get them out in a form other software reads \u2014 which is the part that makes that promise worth anything.<\/li>\n<li>Note: an empty translation in an imported file is treated as \"not translated yet\" and leaves your existing text alone, rather than blanking a page.<\/li>\n<\/ul>\n\n<h4>1.36.0<\/h4>\n\n<ul>\n<li>Added: the dashboard now tells you how large your site is in characters \u2014 the unit your plan is measured in \u2014 and roughly what translating it into every language you have enabled would use. Choosing a plan previously meant guessing whether your site was two hundred thousand characters or four million, which is the number the decision turns on.<\/li>\n<li>Note: it counts characters, not bytes, so accented and non-Latin text is counted the way the service actually bills it.<\/li>\n<\/ul>\n\n<h4>1.35.0<\/h4>\n\n<ul>\n<li>Added: WooCommerce order emails now go out in the language the customer shopped in. Somebody who browsed your site in German, checked out in German and paid was then sent an order confirmation in English \u2014 the most visible remaining gap on a translated store, and the one that lands in an inbox rather than on a page they might not visit again. The language is recorded on the order at checkout, because by the time the email is written there is no visitor to ask: it may be sent by a scheduled task, or by you clicking \"Completed\" in wp-admin. Both now send in the customer's language.<\/li>\n<li>Note: orders placed before this update have no recorded language, and their emails are unchanged.<\/li>\n<\/ul>\n\n<h4>1.34.0<\/h4>\n\n<ul>\n<li>Added: a list of pages to leave untranslated, in Settings. One path per line, with * as a wildcard \u2014 \/checkout\/* covers everything below \/checkout\/. Useful for a legal page whose wording was signed off in one language, a landing page built for one market, or a checkout you would rather a machine did not touch. Write the path without a language prefix and it applies in every language you have. Until now the only way to exclude something was a CSS selector, which meant editing your theme to add one.<\/li>\n<li>Note: an excluded page renders in your site's own language and costs no translation quota.<\/li>\n<\/ul>\n\n<h4>1.33.0<\/h4>\n\n<ul>\n<li>Site search now finds pages by the words your visitors actually read. WordPress searches the original text of your posts, and Gloty deliberately never overwrites that \u2014 so a visitor browsing your site in German and typing a German word into the search box got no results, on a page that had just shown them that word. Searching in a translated language now looks through the translations as well as the originals. Searching in your site's own language is unchanged, and password-protected posts stay hidden exactly as before.<\/li>\n<\/ul>\n\n<h4>1.32.5<\/h4>\n\n<ul>\n<li>Fixed: on a WooCommerce store, order confirmation pages were broken in every language except the default one. WooCommerce hangs \"order received\" and \"pay for order\" off the checkout page as endpoints rather than as pages of their own, and a language-prefixed request lost the endpoint on the way in \u2014 so a customer who had shopped in a translated language paid, and was then sent to an empty cart as though the order had failed. Nothing on the site said otherwise, and no purchase reached the store's analytics. Account endpoints such as \"orders\" and \"downloads\" were affected the same way. Found on a live store, where it had been silently costing every non-default-language order its confirmation.<\/li>\n<\/ul>\n\n<h4>1.32.4<\/h4>\n\n<ul>\n<li>Fixed: the Gloty admin screen could go blank, with an error in the browser console, on sites that had used more than 80% of their translation quota. The quota warning added an upgrade button a moment after the notice appeared, and that combination crashed the page \u2014 so the site owners most likely to need the screen were the ones who could not open it. The same fault was fixed in the \"translator service not connected\" notice on the Sync screen before anyone hit it.<\/li>\n<\/ul>\n\n<h4>1.32.3<\/h4>\n\n<ul>\n<li>Dashboard \u2192 Issues now tells you when translated pages are not using the fast path, and what to do about it. The most common cause on shared hosting is that the server's PHP OPcache has no free memory left to hold the cache file \u2014 in which case writing it would make pages slower, not faster, so Gloty declines and says so. Previously it declined silently and you had no way to know.<\/li>\n<\/ul>\n\n<h4>1.32.2<\/h4>\n\n<ul>\n<li>The translation cache now reports why it did not build, if it does not. It previously declined for several different reasons \u2014 no translations to compile yet, a server memory ceiling, a permissions problem \u2014 and recorded only one of them, so \"the cache is empty and nothing says why\" could not be answered without server access. Each reason has a different remedy, so each now names itself.<\/li>\n<\/ul>\n\n<h4>1.32.1<\/h4>\n\n<ul>\n<li>Fixed: on sites that run WordPress's scheduled tasks from a real server cron rather than from page loads \u2014 the setup WordPress itself recommends for production \u2014 the translation cache was never built, so the speed-up in 1.32.0 silently never happened. Nothing was broken and no error was reported, because not building the cache is not a failure: pages simply kept being served from the database. Found on a live site, where the cache stayed empty with every diagnostic reporting healthy.<\/li>\n<li>Added a way to build the cache on demand, so \"the cache is empty and nothing says why\" can be answered without server access.<\/li>\n<\/ul>\n\n<h4>1.32.0<\/h4>\n\n<ul>\n<li>The language picker now offers 38 languages, down from 124 locales. What went was everything the AI engines' vendors do not list as supported \u2014 those produced confident-looking output that nobody had ever checked \u2014 along with the regional variants, which mostly split a language into spellings rather than into genuinely different translations. Any language you have already added keeps working and is unaffected; this only changes what can be added. If one you need is missing, ask us.<\/li>\n<li>Translated pages are faster. Gloty used to re-read your whole translation set from the database on every page view; it now compiles that set into a cache file your server keeps in memory, so a warm page view reads translations without touching the database at all. The gain is largest on hosting without a persistent object cache, which is most shared hosting.<\/li>\n<li>Your glossary is cached the same way. It was previously read from the database on every page view \u2014 including on sites that had never opened the glossary screen, which was the worst version of the problem. Together with the change above, serving an already-translated page now costs no translation-related database queries at all once the cache is warm.<\/li>\n<li>The cache rebuilds itself in the background whenever translations change, and always within a minute of a new translation arriving. Until it has, pages are served from the database exactly as before \u2014 correct, just not yet faster.<\/li>\n<li>Fixed: an edited translation of a post, page or term could keep serving its old text for up to an hour. Editing one now takes effect on the very next page view, as editing a UI string always did. If you have ever corrected a translation and wondered why the page did not change, this was why.<\/li>\n<li>Every part of this is optional and self-correcting. If your server has no OPcache, if the uploads directory is not writable, or if a cache file is ever damaged, Gloty falls back to the database and says so under Dashboard \u2192 Issues rather than failing. You can also turn it off outright with the <code>gloty_compiled_map_enabled<\/code> filter, and Gloty respects <code>DISALLOW_FILE_MODS<\/code>.<\/li>\n<li>Deactivating or uninstalling removes the cache files. Your translations live in the database and are untouched by any of this.<\/li>\n<\/ul>\n\n<h4>1.31.0<\/h4>\n\n<ul>\n<li>The Billing screen now shows the plans you can actually buy, with their real prices, straight from the licensing service. It previously offered a fixed \"Pro \/ Business\" pair that no longer matched the plans on sale, so newer licences were shown no upgrade option at all \u2014 including on the notice that appears when your quota runs out, which now names the cheapest plan that gives you more room.<\/li>\n<li>\"Manage subscription\" only appears when there is a subscription to manage, instead of showing on free licences and failing when clicked.<\/li>\n<li>The translator service now lives at its own address, <code>https:\/\/gloty-api.wp-shelf.com<\/code>. Sites already connected are moved across automatically on the next admin page load; a self-hosted or staging URL you set yourself is left untouched. No action needed, and nothing about how translation works has changed.<\/li>\n<\/ul>\n\n<h4>1.30.1<\/h4>\n\n<ul>\n<li>The plugin now lists itself as \"Gloty \u2013 AI Translation &amp; Multilingual\", and its description says what it does rather than only naming it. Listing copy only \u2014 nothing about how the plugin works has changed.<\/li>\n<\/ul>\n\n<h4>1.29.2<\/h4>\n\n<ul>\n<li>First release on WordPress.org.<\/li>\n<\/ul>","raw_excerpt":"AI translation for WordPress in 38 languages. Every translation is stored in your own database and served locally \u2014 no API call at render time.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347279"}],"author":[{"embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpshelf"}],"wp:attachment":[{"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347279"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347279"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347279"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347279"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347279"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/gd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}