{"id":314100,"date":"2026-06-01T14:07:48","date_gmt":"2026-06-01T14:07:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/piedweb-ai-polyglot\/"},"modified":"2026-06-01T14:07:35","modified_gmt":"2026-06-01T14:07:35","slug":"piedweb-ai-polyglot","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/piedweb-ai-polyglot\/","author":17316514,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"6.9.4","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"PiedWeb AI Polyglot","header_author":"PiedWeb","header_description":"Master\/Shadow i18n architecture. One master language, N shadow languages via domain map.","assets_banners_color":"056193","last_updated":"2026-06-01 14:07:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wap.piedweb.com","header_author_uri":"https:\/\/en.piedweb.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.0":{"tag":"2.0.0","author":"piedweb","date":"2026-06-01 14:07:35"}},"upgrade_notice":{"2.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3556861,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3556861,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3556861,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3556861,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3556861,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner.svg":{"filename":"banner.svg","revision":3556861,"resolution":false,"location":"assets","locale":false}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3556861,"resolution":"1","location":"assets","locale":"","width":2330,"height":1394},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3556861,"resolution":"2","location":"assets","locale":"","width":2458,"height":1437},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3556861,"resolution":"3","location":"assets","locale":"","width":2528,"height":1437}},"screenshots":{"1":"Locale filter dropdown and language badge column on the posts admin screen.","2":"Custom permalink metabox in the editor \u2014 each locale's URL is editable.","3":"Front-end language suggestion banner detecting browser locale."}},"plugin_section":[],"plugin_tags":[2993,104,99,2333,286],"plugin_category":[45,48],"plugin_contributors":[265343],"plugin_business_model":[],"class_list":["post-314100","plugin","type-plugin","status-publish","hentry","plugin_tags-hreflang","plugin_tags-i18n","plugin_tags-multilingual","plugin_tags-translation","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-language-tools","plugin_contributors-piedweb","plugin_committers-piedweb"],"banners":{"banner":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/banner-772x250.png?rev=3556861","banner_2x":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/banner-1544x500.png?rev=3556861","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/icon.svg?rev=3556861","icon":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/icon.svg?rev=3556861","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/screenshot-1.png?rev=3556861","caption":"Locale filter dropdown and language badge column on the posts admin screen."},{"src":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/screenshot-2.png?rev=3556861","caption":"Custom permalink metabox in the editor \u2014 each locale's URL is editable."},{"src":"https:\/\/ps.w.org\/piedweb-ai-polyglot\/assets\/screenshot-3.png?rev=3556861","caption":"Front-end language suggestion banner detecting browser locale."}],"raw_content":"<!--section=description-->\n<p><strong>PiedWeb AI Polyglot<\/strong> is the multilingual infrastructure for your WordPress + WooCommerce site \u2014 routing, SEO, admin UI, virtualized stock and reviews \u2014 without duplicating content. It does <strong>not<\/strong> translate text itself: you bring your own translation provider (an LLM, a translation API, or a human translator), and the plugin handles everything else.<\/p>\n\n<p>It uses a <strong>Master\/Shadow architecture<\/strong>: you manage content in your primary language, and the plugin creates linked shadow copies for each target locale. Each language gets its own domain (or subdomain), with full SEO support out of the box. WP-CLI commands expose the master content as JSON so you can pipe it into any LLM or translation API and push the result back.<\/p>\n\n<p>Designed to fit AI-powered translation workflows \u2014 but works just as well with human translators or a flat-file editing loop.<\/p>\n\n<h4>Why PiedWeb AI Polyglot?<\/h4>\n\n<ul>\n<li><strong>No content duplication<\/strong> \u2014 shadows are linked copies, not clones. Update the master, shadows follow.<\/li>\n<li><strong>No separate database<\/strong> \u2014 everything lives in a single WordPress install. No sync headaches.<\/li>\n<li><strong>No performance penalty<\/strong> \u2014 stock, images, and reviews are virtualized at query time, not copied.<\/li>\n<li><strong>No plugin lock-in<\/strong> \u2014 all data is stored as standard WordPress post meta. Remove the plugin, your content stays.<\/li>\n<li><strong>AI-ready<\/strong> \u2014 WP-CLI commands expose master content as JSON, ready to pipe into any translation API or LLM.<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Domain-based routing<\/strong> \u2014 one domain per language, detected via <code>HTTP_HOST<\/code>. Each domain serves only its locale's content.<\/li>\n<li><strong>Virtualized stock<\/strong> \u2014 shadow products read stock from the master in real time. Orders on any domain decrement the same inventory.<\/li>\n<li><strong>Virtualized reviews<\/strong> \u2014 reviews submitted on any domain are stored on the master product. Star ratings are aggregated across all locales.<\/li>\n<li><strong>Virtualized images<\/strong> \u2014 shadow products inherit the master's featured image and gallery without duplicating media files.<\/li>\n<li><strong>Hreflang SEO<\/strong> \u2014 automatic <code>&lt;link rel=\"alternate\" hreflang=\"...\"&gt;<\/code> tags plus sitemap annotations with <code>xhtml:link<\/code>.<\/li>\n<li><strong>Locale-filtered sitemaps and RSS<\/strong> \u2014 each domain's sitemap and feed only expose its own content.<\/li>\n<li><strong>WooCommerce i18n<\/strong> \u2014 shipping labels, checkout legal texts, cart product names, and permalink slugs are all translated per locale.<\/li>\n<li><strong>Human lock<\/strong> \u2014 manually edited translations are protected from automated overwrite (unless you <code>--force<\/code>).<\/li>\n<li><strong>Language suggestion banner<\/strong> \u2014 auto-detects the visitor's browser language and suggests switching locale, with dismiss + localStorage persistence.<\/li>\n<li><strong>Draft link handling<\/strong> \u2014 internal links pointing to drafts are auto-hidden for public visitors and re-activate once the target is published. Editors keep working links.<\/li>\n<li><strong>Language switcher<\/strong> \u2014 drop-in function for your theme with WooCommerce cart session transfer across domains.<\/li>\n<li><strong>Admin UI<\/strong> \u2014 locale filter dropdown, language badge column, shadow warning banner, and translations metabox on masters.<\/li>\n<li><strong>Flat-file export\/import<\/strong> \u2014 bulk export all translations to TSV + HTML files, edit offline, re-import.<\/li>\n<li><strong>WP-CLI powered<\/strong> \u2014 list untranslated content, push translations, manage slugs \u2014 all from the command line.<\/li>\n<\/ul>\n\n<h4>Works without WooCommerce<\/h4>\n\n<p>All WooCommerce features (stock, reviews, cart, slugs) activate only when WooCommerce is present. On a standard WordPress site, the plugin handles routing, hreflang, admin UI, and translation management with no extra dependencies.<\/p>\n\n<h4>Full documentation<\/h4>\n\n<p>For the complete documentation (data model, WP-CLI command reference, hooks, draft link handler, configuration examples), see the <a href=\"https:\/\/github.com\/PiedWeb\/wp-ai-polyglot\">README on GitHub<\/a>.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Brought to you by Robin (<a href=\"https:\/\/en.piedweb.com\">Pied Web<\/a>), inspired by <a href=\"https:\/\/pushword.piedweb.com\">Pushword CMS<\/a>, sponsored by <a href=\"https:\/\/woodrockclimbing.com\">Woodrock Climbing<\/a>.<\/p>\n\n<p>Country flag SVGs in <code>assets\/flags\/<\/code> are from <a href=\"https:\/\/github.com\/lipis\/flag-icons\">flag-icons<\/a> by Panayiotis Lipiridis, licensed under the MIT License.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>wp-content\/plugins\/wp-ai-polyglot\/<\/code>, or install it through the WordPress plugin screen.<\/li>\n<li><p><strong>Before activating<\/strong>, define the <code>POLYGLOT_LOCALES<\/code> constant in <code>wp-config.php<\/code>:<\/p>\n\n<p>define('POLYGLOT_LOCALES', [\n    'www.example.com' =&gt; ['locale' =&gt; 'fr_FR', 'hreflang' =&gt; 'fr', 'label' =&gt; 'Fran\u00e7ais', 'currency' =&gt; 'EUR', 'master' =&gt; true],\n    'en.example.com'  =&gt; ['locale' =&gt; 'en_GB', 'hreflang' =&gt; 'en', 'label' =&gt; 'English',  'currency' =&gt; 'GBP'],\n    'es.example.com'  =&gt; ['locale' =&gt; 'es_ES', 'hreflang' =&gt; 'es', 'label' =&gt; 'Espa\u00f1ol',  'currency' =&gt; 'EUR'],\n]);<\/p><\/li>\n<li><p>Configure your web server (Apache or Nginx) to serve the same WordPress document root for every language domain.<\/p><\/li>\n<li>Set <code>WP_HOME<\/code> and <code>WP_SITEURL<\/code> dynamically in <code>wp-config.php<\/code> based on <code>$_SERVER['HTTP_HOST']<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<\/ol>\n\n<p>See the <a href=\"https:\/\/github.com\/PiedWeb\/wp-ai-polyglot\">GitHub README<\/a> for DNS, SSL, and local-development setup.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20woocommerce%3F\"><h3>Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>No. WooCommerce features (stock virtualization, review aggregation, slug translation) activate only when WooCommerce is present. On a standard WordPress site, the plugin handles routing, hreflang, admin UI, and translation management.<\/p><\/dd>\n<dt id=\"can%20i%20use%20subdirectories%20like%20example.com%2Fen%2F%20instead%20of%20subdomains%3F\"><h3>Can I use subdirectories like example.com\/en\/ instead of subdomains?<\/h3><\/dt>\n<dd><p>No. PiedWeb AI Polyglot uses one domain (or subdomain) per language. Subdirectory routing is not supported by design \u2014 it keeps the routing logic fast and the SEO model clean.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20wordpress%20multisite%3F\"><h3>Is this compatible with WordPress Multisite?<\/h3><\/dt>\n<dd><p>No. The plugin is single-site only and will display an admin notice on Multisite installs.<\/p><\/dd>\n<dt id=\"how%20do%20i%20disable%20the%20language%20suggestion%20banner%3F\"><h3>How do I disable the language suggestion banner?<\/h3><\/dt>\n<dd><p>Add <code>define('POLYGLOT_BAR', false);<\/code> to your <code>wp-config.php<\/code>. Both the asset enqueue and the HTML rendering are skipped.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20content%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens to my content if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>All translation data is stored as standard WordPress post meta. Your shadow posts remain in the database and can be managed manually. Domain routing stops, so each domain will serve the same content until you remove the alias.<\/p><\/dd>\n<dt id=\"how%20does%20the%20ai%20translation%20workflow%20work%3F\"><h3>How does the AI translation workflow work?<\/h3><\/dt>\n<dd><p>The WP-CLI command <code>wp polyglot untranslated --type=product<\/code> lists posts needing translation. <code>wp polyglot translate &lt;id&gt; --target=&lt;locale&gt;<\/code> returns the master content as JSON \u2014 pipe that into any LLM or translation API, then push the result back with <code>--payload='{...}'<\/code>. The plugin does <strong>not<\/strong> call any third-party API itself; you control the translation provider.<\/p><\/dd>\n<dt id=\"are%20manual%20translations%20safe%20from%20being%20overwritten%3F\"><h3>Are manual translations safe from being overwritten?<\/h3><\/dt>\n<dd><p>Yes. Any translation edited through wp-admin (or marked with <code>_translation_mode = manual<\/code>) is protected from automated re-translation. Pass <code>--force<\/code> to override.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Initial public release on WordPress.org<\/li>\n<li>Master\/Shadow architecture with domain-based routing<\/li>\n<li>WooCommerce support: virtualized stock, reviews, images, translated slugs<\/li>\n<li>WP-CLI commands for AI-powered translation workflows<\/li>\n<li>Flat-file export\/import (TSV + HTML) with concurrency lock<\/li>\n<li>Hreflang SEO with sitemap and RSS annotations<\/li>\n<li>Draft link handler \u2014 hide links to unpublished targets, restore on publish<\/li>\n<li>Native permalink resolver (no Custom Permalinks plugin required)<\/li>\n<li><code>check-links<\/code> WP-CLI command for detecting mislocalized internal links<\/li>\n<\/ul>","raw_excerpt":"Multilingual infrastructure for WordPress + WooCommerce. One install, one database, zero duplication. Bring your own translator (AI or human).","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/314100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=314100"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/piedweb"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=314100"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=314100"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=314100"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=314100"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=314100"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=314100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}