{"id":304445,"date":"2026-05-12T18:35:01","date_gmt":"2026-05-12T18:35:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/polyglot-for-polylang\/"},"modified":"2026-05-12T18:40:24","modified_gmt":"2026-05-12T18:40:24","slug":"polyglot-for-polylang","status":"publish","type":"plugin","link":"https:\/\/jv.wordpress.org\/plugins\/polyglot-for-polylang\/","author":15049829,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.3.1","stable_tag":"1.3.1","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Polyglot for Polylang","header_author":"Simone Ricci","header_description":"Automatically translate Polylang strings and content using Google Cloud Translation API (Basic v2).","assets_banners_color":"629992","last_updated":"2026-05-12 18:40:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.0":{"tag":"1.2.0","author":"simogol","date":"2026-05-12 18:35:04"},"1.3.1":{"tag":"1.3.1","author":"simogol","date":"2026-05-12 18:40:24"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3530274,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3530274,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3530274,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3530274,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.0","1.3.1"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2336,1734,99,10601,2333],"plugin_category":[48],"plugin_contributors":[262722],"plugin_business_model":[],"class_list":["post-304445","plugin","type-plugin","status-publish","hentry","plugin_tags-google-translate","plugin_tags-localization","plugin_tags-multilingual","plugin_tags-polylang","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-simogol","plugin_committers-simogol"],"banners":{"banner":"https:\/\/ps.w.org\/polyglot-for-polylang\/assets\/banner-772x250.png?rev=3530274","banner_2x":"https:\/\/ps.w.org\/polyglot-for-polylang\/assets\/banner-1544x500.png?rev=3530274","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/polyglot-for-polylang\/assets\/icon-128x128.png?rev=3530274","icon_2x":"https:\/\/ps.w.org\/polyglot-for-polylang\/assets\/icon-256x256.png?rev=3530274","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Polyglot helps administrators run controlled translation jobs from Tools &gt; Polyglot for:<\/p>\n\n<ul>\n<li>Polylang String Translations<\/li>\n<li>Pages, Posts, and public Custom Post Types (CPTs)<\/li>\n<\/ul>\n\n<p>The plugin is designed for safe, incremental translation workflows and does not create missing translated posts.<\/p>\n\n<p>Polyglot is built for projects that use WordPress as a CMS with a clear separation between content and presentation (for example, headless WordPress setups). It is not recommended for page-builder-heavy workflows (such as Elementor) where content and presentation are tightly coupled.<\/p>\n\n<h4>Configuration<\/h4>\n\n<ul>\n<li>Save Google API key in WordPress admin<\/li>\n<li>API key is stored encrypted in WordPress options<\/li>\n<li>Tabs are locked until an API key is configured<\/li>\n<\/ul>\n\n<h4>Translation Strings tab<\/h4>\n\n<ul>\n<li>Select Polylang string group<\/li>\n<li>Select source and target languages<\/li>\n<li>Translate only missing target-language string values<\/li>\n<li>Background queue processing with live progress<\/li>\n<\/ul>\n\n<h4>Pages, Posts and CPT tab<\/h4>\n\n<ul>\n<li>Select one content type (page, post, or one public CPT)<\/li>\n<li>Select source and target languages<\/li>\n<li>Choose translation scope:\n\n<ul>\n<li>default content only (title, content, excerpt)<\/li>\n<li>default content + custom fields<\/li>\n<\/ul><\/li>\n<li>Custom field mode includes:\n\n<ul>\n<li>inline preview of custom field names that Polyglot will attempt to translate<\/li>\n<li>explicit risk acknowledgment checkbox before job start<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Translation rules<\/h4>\n\n<p>For each eligible source\/target pair, a field is translated only when:<\/p>\n\n<ul>\n<li>target value equals source value, or<\/li>\n<li>source value is non-empty and target value is empty.<\/li>\n<\/ul>\n\n<p>If target has different non-empty content, it is treated as edited and skipped.<\/p>\n\n<h4>Custom field safety<\/h4>\n\n<p>When custom-field translation is enabled, Polyglot auto-detects non-protected meta keys and applies safeguards:<\/p>\n\n<ul>\n<li>skips protected\/internal keys<\/li>\n<li>skips technical key patterns (for example id, slug, token, url, hash)<\/li>\n<li>skips values that look serialized\/JSON\/URL\/numeric\/token-like<\/li>\n<li>supports exclusion hook: <code>polyglot_excluded_meta_keys<\/code><\/li>\n<\/ul>\n\n<p>Default excluded keys currently include:<\/p>\n\n<ul>\n<li>item_author<\/li>\n<\/ul>\n\n<h4>Job processing and progress<\/h4>\n\n<ul>\n<li>Jobs run in background batches using WP-Cron<\/li>\n<li>Progress view includes status, remaining, scanned, translatable, translated, skipped, failed, and last error<\/li>\n<li>If no eligible fields are found, Polyglot shows a success notice and does not start a queue<\/li>\n<\/ul>\n\n<h4>Troubleshooting failed jobs<\/h4>\n\n<p>If a job ends with done_with_errors, open the Job Progress panel and review the Failure details list.\nEach row includes:<\/p>\n\n<ul>\n<li>Error category ([API], [SAVE], [OTHER])<\/li>\n<li>Error message<\/li>\n<li>Related identifiers (field key, language, post IDs, or string name)<\/li>\n<\/ul>\n\n<p>To inspect raw job data directly:<\/p>\n\n<ul>\n<li>wp option get polyglot_translation_job --format=json<\/li>\n<\/ul>\n\n<p>Key fields:<\/p>\n\n<ul>\n<li>status<\/li>\n<li>last_error<\/li>\n<li>totals.failed<\/li>\n<li>errors[]<\/li>\n<\/ul>\n\n<p>If errors are API-related, verify:<\/p>\n\n<ul>\n<li>Cloud Translation API is enabled in the same Google Cloud project used by the key<\/li>\n<li>Billing is enabled for that project<\/li>\n<li>API key restrictions allow this WordPress instance (referrer\/IP restrictions and API restriction to Cloud Translation API)<\/li>\n<\/ul>\n\n<h4>Important billing notice<\/h4>\n\n<p>Google Cloud Translation API is a paid service with usage-based pricing.<\/p>\n\n<ul>\n<li>Large translation jobs can generate significant costs<\/li>\n<li>Review quotas, billing settings, and pricing before running bulk jobs<\/li>\n<\/ul>\n\n<h4>Disclaimer<\/h4>\n\n<p>Polyglot is provided as is, without any warranty of any kind.<\/p>\n\n<ul>\n<li>Use this plugin at your own risk.<\/li>\n<li>Always create a full database and files backup before running translation jobs.<\/li>\n<li>Translation jobs can modify content and custom fields; review your settings and previews carefully before starting.<\/li>\n<li>The plugin author is not liable for data loss, site issues, translation quality issues, or other damages resulting from use.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on Google Cloud Translation API (Basic v2) to perform automated translations. The service is the only third-party endpoint contacted by the plugin.<\/p>\n\n<p>What it is used for:<\/p>\n\n<ul>\n<li>Translating Polylang String Translation entries on demand.<\/li>\n<li>Translating post\/page\/CPT title, content, excerpt, and (when explicitly enabled) selected custom field values on demand.<\/li>\n<li>Validating the saved API key by calling the languages list endpoint when the administrator clicks \"Test Saved API Key\".<\/li>\n<\/ul>\n\n<p>What data is sent and when:<\/p>\n\n<ul>\n<li>Each translation request sends the source text, the source language code, and the target language code to https:\/\/translation.googleapis.com\/language\/translate\/v2 along with the configured API key in the request URL. Requests are made only while a translation job is processing or when the administrator clicks \"Test Saved API Key\".<\/li>\n<li>The validation request sends only the API key to https:\/\/translation.googleapis.com\/language\/translate\/v2\/languages.<\/li>\n<li>No personal data, user identifiers, IP addresses, or site visitor data are sent by the plugin. Standard HTTP request metadata (such as referrer set to the site URL) is included so the API key can be restricted by HTTP referrer in Google Cloud.<\/li>\n<\/ul>\n\n<p>Service provider: Google LLC. By using this plugin you agree to Google Cloud's terms.<\/p>\n\n<ul>\n<li>Google Cloud Terms of Service: https:\/\/cloud.google.com\/terms<\/li>\n<li>Google Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<li>Google Cloud Translation documentation: https:\/\/cloud.google.com\/translate\/docs<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Install and activate Polylang first<\/li>\n<li>Activate Polyglot in WordPress admin<\/li>\n<li>Open Tools &gt; Polyglot<\/li>\n<li>Save Google API key in Configuration<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20polyglot%20overwrite%20existing%20translated%20content%3F\"><h3>Does Polyglot overwrite existing translated content?<\/h3><\/dt>\n<dd><p>No. It only translates fields that appear untranslated by its detection rules.<\/p><\/dd>\n<dt id=\"does%20polyglot%20create%20missing%20translated%20posts%3F\"><h3>Does Polyglot create missing translated posts?<\/h3><\/dt>\n<dd><p>No. It only works on already existing Polylang-linked target posts.<\/p><\/dd>\n<dt id=\"who%20can%20run%20translation%20jobs%3F\"><h3>Who can run translation jobs?<\/h3><\/dt>\n<dd><p>By default, only Administrators can access and run Polyglot jobs.<\/p>\n\n<p>If your site customizes roles\/capabilities and grants <code>manage_options<\/code> to Editors (or another role), those users can run jobs too.<\/p><\/dd>\n<dt id=\"which%20api%20is%20used%3F\"><h3>Which API is used?<\/h3><\/dt>\n<dd><p>Google Cloud Translation API Basic (v2), authenticated via API key.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20a%20google%20api%20key%20for%20translation%3F\"><h3>How do I get a Google API key for Translation?<\/h3><\/dt>\n<dd><ol>\n<li>Go to Google Cloud Console and create (or select) a project.<\/li>\n<li>Enable billing for that project.<\/li>\n<li>Enable the Cloud Translation API.<\/li>\n<li>Open APIs &amp; Services &gt; Credentials and create an API key.<\/li>\n<li>Copy the key into Tools &gt; Polyglot &gt; Configuration.<\/li>\n<\/ol>\n\n<p>For security, restrict the API key in Google Cloud:<\/p>\n\n<ul>\n<li>API restrictions: allow only Cloud Translation API.<\/li>\n<li>Application restrictions: limit usage to your required domains\/referrers (or server IPs, based on your setup).<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Renamed text domain from <code>polyglot<\/code> to <code>polyglot-for-polylang<\/code> to match the plugin slug<\/li>\n<li>Moved inline admin scripts to dedicated JS files enqueued via wp_enqueue_script()<\/li>\n<li>Added External services section documenting Google Cloud Translation API usage, terms of service, and privacy policy links<\/li>\n<li>Updated Contributors metadata to use the WordPress.org username<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added uninstall cleanup to remove plugin options, including stored encrypted Google API key, job state, and admin notice data<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Compliance hardening and plugin-check fixes for nonce\/input handling and translation-service SQL safety<\/li>\n<li>Improved readme metadata for WordPress.org checks<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Added string translation workflow<\/li>\n<li>Added Pages\/Posts\/CPT workflow with optional custom field translation and safety checks<\/li>\n<\/ul>","raw_excerpt":"Automatically translate Polylang strings and content using Google Cloud Translation API (Basic v2).","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/304445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=304445"}],"author":[{"embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/simogol"}],"wp:attachment":[{"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=304445"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=304445"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=304445"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=304445"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=304445"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/jv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=304445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}