{"id":307221,"date":"2026-05-28T21:06:49","date_gmt":"2026-05-28T21:06:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/transleti-translator\/"},"modified":"2026-05-28T21:06:35","modified_gmt":"2026-05-28T21:06:35","slug":"transleti-translator","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/transleti-translator\/","author":23471967,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.21","stable_tag":"1.9.21","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Transleti Translator","header_author":"Transleti","header_description":"Automatic WordPress translation built on open-source technology \u2014 fast multilingual sites with hreflang sitemaps, WooCommerce support and unlimited languages.","assets_banners_color":"","last_updated":"2026-05-28 21:06:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/transleti.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.9.21":{"tag":"1.9.21","author":"transleti","date":"2026-05-28 21:06:35"}},"upgrade_notice":{"1.9.21":"<p>Fixes a visual-editor regression where clicks on theme menu items (GeneratePress, Astra, Divi, Elementor Pro) didn&#039;t open the translation panel. Recommended for all users editing menus visually.<\/p>","1.9.20":"<p>Adds visual-editor support for Hebrew, Greek, Hindi, Thai, Georgian and Armenian menus, plus a fix for clicking duplicated strings. Recommended.<\/p>","1.0.6":"<p>Maintenance release with security hardening and Plugin Directory packaging fixes. Recommended for all users.<\/p>","1.0.5":"<p>Important multilingual sitemap fix. After upgrading, purge any sitemap cache from your SEO plugin and resubmit the sitemap to Google Search Console.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3552779,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3552779,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.9.21"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page \u2014 connect to the Transleti API and choose languages.","2":"Visual translation editor \u2014 edit translations on the front-end.","3":"Language switcher \u2014 flag, dropdown or text styles.","4":"Multilingual sitemap output with hreflang alternates."}},"plugin_section":[],"plugin_tags":[12519,2993,99,2333,286],"plugin_category":[45,48],"plugin_contributors":[260218,258631],"plugin_business_model":[],"class_list":["post-307221","plugin","type-plugin","status-publish","hentry","plugin_tags-automatic-translation","plugin_tags-hreflang","plugin_tags-multilingual","plugin_tags-translation","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-language-tools","plugin_contributors-grupobouso","plugin_contributors-transleti","plugin_committers-transleti"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/transleti-translator\/assets\/icon-128x128.png?rev=3552779","icon_2x":"https:\/\/ps.w.org\/transleti-translator\/assets\/icon-256x256.png?rev=3552779","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Transleti Translator is a WordPress translation plugin built on open-source technology. Translations run in parallel batches across all target languages at once, so a multilingual site is fully indexed in minutes rather than hours.<\/p>\n\n<p>Transleti Translator gives you a flat-rate connection to the Transleti translation API and translates posts, pages, custom post types, WooCommerce products, menus, slugs, SEO meta, and theme strings. A built-in visual editor lets you click on any text in the rendered page and refine its translation in a side-by-side panel.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Flat-rate pricing<\/strong> \u2014 single subscription, no per-word fees, no per-language tiers.<\/li>\n<li><strong>Built on open source<\/strong> \u2014 the plugin itself is GPL, fully auditable, no proprietary lock-in.<\/li>\n<li><strong>Parallel translation<\/strong> \u2014 requests fan out to every target language simultaneously. A site with 10 languages translates in roughly the same time as a site with 1.<\/li>\n<li><strong>Theme-agnostic<\/strong> \u2014 works out of the box with Elementor, Gutenberg, classic editor, GeneratePress and any standards-compliant theme.<\/li>\n<li><strong>WooCommerce ready<\/strong> \u2014 translates product titles, descriptions, attributes and variations.<\/li>\n<\/ul>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Multilingual sitemap with hreflang<\/strong> \u2014 separate <code>&lt;url&gt;<\/code> entries per language (the format Google explicitly documents) with self-referential hreflang and <code>x-default<\/code>. Compatible with Yoast SEO, RankMath, SEOPress, AIOSEO and the WordPress core sitemap.<\/li>\n<li><strong>SEO meta translation<\/strong> \u2014 titles and descriptions for SEOPress, Yoast, AIOSEO and RankMath.<\/li>\n<li><strong>Visual translation editor<\/strong> \u2014 open any front-end page in an editor frame, click on any string (titles, paragraphs, menu items, buttons, image alts) and edit its translation in a side panel with live preview.<\/li>\n<li><strong>Manual translation editor<\/strong> \u2014 review and refine translations directly in the WordPress post editor for every language.<\/li>\n<li><strong>Manual edit protection<\/strong> \u2014 your manual fixes survive re-translation cycles.<\/li>\n<li><strong>Slug translation<\/strong> \u2014 translated URLs (e.g. <code>\/es\/contacto\/<\/code>) for clean per-language SEO.<\/li>\n<li><strong>Menu translation<\/strong> \u2014 duplicates and translates navigation menus per language.<\/li>\n<li><strong>HTML entity and shortcode protection<\/strong> \u2014 prevents corruption of <code>&amp;copy;<\/code>, <code>[shortcode]<\/code>, and similar in translated output.<\/li>\n<li><strong>Custom \"do not translate\" word list<\/strong> \u2014 keep brand names, product codes and acronyms intact across all languages.<\/li>\n<li><strong>Language switcher<\/strong> \u2014 widget, block and shortcode in flag, dropdown or text styles.<\/li>\n<\/ul>\n\n<h4>Supported languages<\/h4>\n\n<p>49+ languages including English, Spanish, French, German, Italian, Portuguese (PT\/BR), Dutch, Polish, Romanian, Bulgarian, Hungarian, Finnish, Russian, Ukrainian, Arabic, Hindi, Japanese, Korean, Chinese, Thai, Turkish, and more.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Enter your Transleti API key.<\/li>\n<li>Choose your default language and the languages you want to publish.<\/li>\n<li>The plugin runs a background job that translates posts, menus, slugs and SEO meta automatically.<\/li>\n<li>Optionally edit any translation manually from the WordPress post editor.<\/li>\n<\/ol>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the Transleti translation API (<code>api.transleti.com<\/code>) to translate site content into the languages you select. This is required for the plugin to function.<\/p>\n\n<p><strong>What data is sent:<\/strong> the text strings to translate (post content, titles, excerpts, menu labels, slugs, SEO meta, theme strings) along with the source and target language codes and your API key.<\/p>\n\n<p><strong>When it is sent:<\/strong> when the background translation cron runs, when you save a post that needs re-translation, or when you trigger a manual translation from the settings page.<\/p>\n\n<p><strong>Service provider:<\/strong> Transleti \u2014 <code>https:\/\/transleti.com<\/code><\/p>\n\n<ul>\n<li>Terms of Service: https:\/\/transleti.com\/terms<\/li>\n<li>Privacy Policy: https:\/\/transleti.com\/privacy<\/li>\n<\/ul>\n\n<p>No personal data of site visitors is sent to the service. Only the text content you choose to translate.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>transleti-translator<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install through the WordPress plugin installer.<\/li>\n<li>Activate the plugin via the <em>Plugins<\/em> menu in WordPress.<\/li>\n<li>Go to <em>Settings \u2192 Transleti Translator<\/em>.<\/li>\n<li>Enter your Transleti API key (sign up at https:\/\/transleti.com).<\/li>\n<li>Select your default language and target languages.<\/li>\n<li>Save settings \u2014 translation runs automatically in the background.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20plugin%20really%20fast%20even%20with%20many%20languages%3F\"><h3>Is the plugin really fast even with many languages?<\/h3><\/dt>\n<dd><p>Yes. Translation requests for every target language are fanned out in parallel, so adding more languages does not multiply the wait time. A 10-language site translates in roughly the same time window as a 2-language site.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Product titles, descriptions, short descriptions, attributes and variations are all translated automatically.<\/p><\/dd>\n<dt id=\"does%20it%20support%20elementor%2C%20gutenberg%20and%20the%20classic%20editor%3F\"><h3>Does it support Elementor, Gutenberg and the classic editor?<\/h3><\/dt>\n<dd><p>Yes. Elementor pages translate the underlying <code>_elementor_data<\/code> JSON; Gutenberg parses blocks and translates innerHTML and block attributes; classic posts translate <code>post_content<\/code> directly.<\/p><\/dd>\n<dt id=\"will%20google%20index%20the%20translated%20pages%20correctly%3F\"><h3>Will Google index the translated pages correctly?<\/h3><\/dt>\n<dd><p>Yes. The plugin emits a separate <code>&lt;url&gt;<\/code> element per language in the sitemap (the format Google explicitly documents), with bidirectional hreflang and <code>x-default<\/code>. It also outputs <code>&lt;link rel=\"alternate\" hreflang=\"...\"&gt;<\/code> tags in the HTML head.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20translations%20manually%3F\"><h3>Can I edit translations manually?<\/h3><\/dt>\n<dd><p>Yes. There are two ways: (1) the visual editor, which lets you click on any string in the rendered page and edit its translation in a side panel \u2014 useful for menus, buttons, widgets and theme strings that don't live in the post editor; and (2) each translated post is a standard WordPress post you can edit from the admin like any other content. Manual edits are detected and preserved during re-translation.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20update%20the%20source%20post%3F\"><h3>What happens if I update the source post?<\/h3><\/dt>\n<dd><p>The plugin detects content changes via MD5 hashing and queues a re-translation. Manual edits to translations are detected and preserved (unless the source change is structural).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.21<\/h4>\n\n<ul>\n<li>Fix: visual editor \u2014 clicks on theme menu items (GeneratePress, Astra, Divi, Elementor Pro mega-menus, etc.) now open the translation panel reliably. Listener moved to <code>window<\/code> capture + <code>pointerdown<\/code> so theme menu togglers that call <code>stopPropagation()<\/code> can no longer swallow the selection click.<\/li>\n<\/ul>\n\n<h4>1.9.20<\/h4>\n\n<ul>\n<li>Fix: visual editor now detects menu items in Hebrew, Greek, Hindi, Thai, Georgian and Armenian (menu translation now bails during preview so the renderer can add translatable markers regardless of script).<\/li>\n<li>Fix: visual editor \u2014 clicking on a string with duplicated text on the same page (e.g. a heading and a menu link with the same label) now opens the translation panel for the selected occurrence.<\/li>\n<li>Fix: ignore RSS feed <code>pubDate<\/code>\/<code>lastBuildDate<\/code> strings in the \"stuck translations\" notice.<\/li>\n<li>Improvement: automatic cleanup of orphan sentence segments left over from long-paragraph batching.<\/li>\n<\/ul>\n\n<h4>1.9.x<\/h4>\n\n<ul>\n<li>New: visual translation editor \u2014 click any text in the rendered front-end and edit its translation in a live side panel. Works on menus, buttons, image alts and theme strings.<\/li>\n<li>New: 49+ languages supported via the Transleti translation API.<\/li>\n<li>New: HTML entity and shortcode protection across all translation entry points.<\/li>\n<li>New: \"Do not translate\" word list (brand names, product codes, acronyms).<\/li>\n<li>New: SEO meta translation for SEOPress, Yoast, AIOSEO and RankMath.<\/li>\n<li>Improvement: manual edit protection \u2014 your manual fixes survive re-translation cycles.<\/li>\n<li>Improvement: parallel translation across all target languages.<\/li>\n<\/ul>\n\n<h4>1.4.4<\/h4>\n\n<ul>\n<li>Feature: drag-and-drop reordering of active languages in the Languages tab (also affects the language switcher order).<\/li>\n<li>i18n: added 503 \"pending translation\" page strings for 16 additional languages (Lithuanian, Albanian, Azerbaijani, Basque, Bengali, Catalan, Esperanto, Galician, Irish, Kyrgyz, Latvian, Malay, Persian, Slovenian, Tagalog, Urdu).<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Compliance: wrapped <code>language_has_translations()<\/code> and <code>find_original_slug()<\/code> direct <code>$wpdb<\/code> probes with <code>wp_cache_get<\/code> \/ <code>wp_cache_set<\/code> (5-minute TTL, <code>transleti<\/code> cache group).<\/li>\n<li>Compliance: documented every legitimate direct DB call against core meta tables with <code>phpcs:ignore<\/code> comments explaining why the existing core API can't replace them.<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Hardening: escaped flag-emoji output in the language switcher shortcode (<code>render_switcher<\/code>, <code>render_language_list<\/code>) via <code>esc_html()<\/code>.<\/li>\n<li>Hardening: every <code>ob_start()<\/code> callback buffer is now explicitly closed via a paired <code>ob_end_flush()<\/code> registered through <code>register_shutdown_function()<\/code> in the same function scope (frontend page buffer, AJAX response buffer, sitemap xhtml-namespace buffer).<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Hardening: replaced <code>fopen<\/code>\/<code>fread<\/code>\/<code>fclose<\/code> with <code>WP_Filesystem::get_contents()<\/code> for the diagnostic log reader.<\/li>\n<li>Hardening: switched all custom-table existence checks to <code>$wpdb-&gt;prepare( 'SHOW TABLES LIKE %s', ... )<\/code> (no more single-quote interpolation).<\/li>\n<li>Hardening: switched several <code>$_POST<\/code> reads on HTML-bearing fields to <code>wp_kses_post( wp_unslash( ... ) )<\/code>; integer reads now use <code>absint( wp_unslash( ... ) )<\/code>.<\/li>\n<li>Hardening: added explicit nonce checks (<code>check_admin_referer<\/code>\/<code>wp_nonce_url<\/code>) to the string-export download link.<\/li>\n<li>Compliance: removed redundant <code>load_plugin_textdomain()<\/code> call (WP 4.6+ auto-loads translations from the WP.org directory).<\/li>\n<li>Compliance: documented every legitimate direct-DB query (custom plugin tables) with localised <code>phpcs:disable<\/code>\/<code>enable<\/code> blocks.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Compliance: removed comparative\/superlative marketing phrasing from the readme.<\/li>\n<li>Compliance: extracted inline <code>&lt;script&gt;<\/code> blocks to enqueued JS files (language switcher, editor preview).<\/li>\n<li>Hardening: all <code>$_GET<\/code> \/ <code>$_POST<\/code> \/ <code>$_SERVER<\/code> \/ <code>$_COOKIE<\/code> reads now go through <code>wp_unslash()<\/code> plus a context-appropriate sanitiser (<code>sanitize_text_field<\/code>, <code>esc_url_raw<\/code>).<\/li>\n<li>Hardening: AJAX nonce check in <code>ajax_empty_language()<\/code> now unslashes and sanitises the nonce before passing it to <code>wp_verify_nonce()<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Removed redundant <code>load_plugin_textdomain()<\/code> call \u2014 translations are now auto-loaded by WordPress 4.6+ for plugins hosted in the directory.<\/li>\n<li>Switched front-end language redirect from <code>wp_redirect()<\/code> to <code>wp_safe_redirect()<\/code> for additional protection against open-redirect attempts.<\/li>\n<li>Defense-in-depth: explicit allowlist validation for the language storage key before SQL identifier interpolation in the cache-clearing endpoint.<\/li>\n<li>Packaging: included a <code>.pot<\/code> template in <code>languages\/<\/code> so the Domain Path folder is present in the distributed package.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>New: separate <code>&lt;url&gt;<\/code> entry per language in the sitemap, matching Google's documented hreflang format.<\/li>\n<li>New: AIOSEO sitemap compatibility (<code>aioseo_sitemap_post<\/code>\/<code>_term<\/code>\/<code>_archive_entry<\/code>\/<code>_addl_pages<\/code> filters).<\/li>\n<li>Fix: <code>xmlns:xhtml<\/code> namespace now declared in <code>&lt;urlset&gt;<\/code> so <code>&lt;xhtml:link&gt;<\/code> alternates are valid XML.<\/li>\n<li>Fix: <code>\/sitemap.xml<\/code> no longer redirects to <code>\/en\/sitemap.xml<\/code> when <code>add_subdirectory_to_default=yes<\/code>.<\/li>\n<li>Fix: sitemap <code>&lt;loc&gt;<\/code> URLs now use the canonical default-language URL instead of the redirecting unprefixed permalink.<\/li>\n<li>Fix: HTML head and sitemap hreflang codes now match exactly for bidirectional confirmation.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Parallel translation crawling \u2014 O(1) in number of languages.<\/li>\n<li>Render substitution fixes for raw <code>%1$s<\/code> placeholders and <code>[cookie_*]<\/code> shortcodes leaking to public pages.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>HTML entity and shortcode protection in all translation entry points.<\/li>\n<li>\"Do Not Translate\" word list.<\/li>\n<li>Manual edit protection improvements.<\/li>\n<\/ul>","raw_excerpt":"Automatic WordPress translation with parallel multi-language batches, hreflang sitemap and a visual translation editor.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/307221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=307221"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/transleti"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=307221"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=307221"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=307221"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=307221"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=307221"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=307221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}