{"id":393203,"date":"2026-10-29T12:00:02","date_gmt":"2026-10-29T12:00:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/blocklingo-translate-sites-with-ai\/"},"modified":"2026-10-31T08:20:09","modified_gmt":"2026-10-31T08:20:09","slug":"blocklingo","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/blocklingo\/","author":18589565,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.14.1","stable_tag":"0.14.1","tested":"7.1.4","requires":"6.6","requires_php":"8.1","requires_plugins":null,"header_name":"Blocklingo - AI Translation & Multilingual","header_author":"Alex Denysiuk","header_description":"Make your block theme site multilingual: translate pages, menus and SEO with Google, DeepL, Gemini, Claude or WordPress AI, keeping blocks valid.","assets_banners_color":"8a82ec","last_updated":"2026-10-31 08:20:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/alexdenysiuk.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":80,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.14.0":{"tag":"0.14.0","author":"addblack","date":"2026-10-29 11:59:41","revision":3772825},"0.14.1":{"tag":"0.14.1","author":"addblack","date":"2026-10-31 08:20:09","revision":3776473}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3772825,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3772825,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3776473,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3776473,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"addblack-lang\/switcher":{"name":"addblack-lang\/switcher","title":"Language switcher"}},"tagged_versions":["0.14.0","0.14.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3772825,"resolution":"1","location":"assets","locale":"","width":1136,"height":573},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3772825,"resolution":"2","location":"assets","locale":"","width":274,"height":358},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3772825,"resolution":"3","location":"assets","locale":"","width":1112,"height":379},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3772825,"resolution":"4","location":"assets","locale":"","width":1516,"height":661},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3772825,"resolution":"5","location":"assets","locale":"","width":1369,"height":472}},"screenshots":{"1":"Machine translation: pick Google, DeepL, Gemini, Claude or WordPress AI and test the key.","2":"Language panel in the block editor: page language, its translations and one-click re-translation.","3":"Overview: how much of the site is translated, and \"Translate everything\" for the rest.","4":"Language strings: theme and plugin texts without an official translation, translated by hand or by machine.","5":"Language switcher block in the site header."}},"plugin_section":[],"plugin_tags":[220668,148076,99,95,2333],"plugin_category":[48],"plugin_contributors":[289454],"plugin_business_model":[],"class_list":["post-393203","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-translation","plugin_tags-gutenberg","plugin_tags-multilingual","plugin_tags-translate","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-addblack","plugin_committers-addblack"],"banners":{"banner":"https:\/\/ps.w.org\/blocklingo\/assets\/banner-772x250.png?rev=3776473","banner_2x":"https:\/\/ps.w.org\/blocklingo\/assets\/banner-1544x500.png?rev=3776473","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/blocklingo\/assets\/icon-128x128.png?rev=3772825","icon_2x":"https:\/\/ps.w.org\/blocklingo\/assets\/icon-256x256.png?rev=3772825","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/blocklingo\/assets\/screenshot-1.png?rev=3772825","caption":"Machine translation: pick Google, DeepL, Gemini, Claude or WordPress AI and test the key."},{"src":"https:\/\/ps.w.org\/blocklingo\/assets\/screenshot-2.png?rev=3772825","caption":"Language panel in the block editor: page language, its translations and one-click re-translation."},{"src":"https:\/\/ps.w.org\/blocklingo\/assets\/screenshot-3.png?rev=3772825","caption":"Overview: how much of the site is translated, and \"Translate everything\" for the rest."},{"src":"https:\/\/ps.w.org\/blocklingo\/assets\/screenshot-4.png?rev=3772825","caption":"Language strings: theme and plugin texts without an official translation, translated by hand or by machine."},{"src":"https:\/\/ps.w.org\/blocklingo\/assets\/screenshot-5.png?rev=3772825","caption":"Language switcher block in the site header."}],"raw_content":"<!--section=description-->\n<h4>Free AI translation for WordPress<\/h4>\n\n<p>Make your WordPress website multilingual with AI - without paying for another translation subscription.<\/p>\n\n<p>Blocklingo translates pages, posts, Gutenberg blocks, menus and SEO metadata with the translation provider you choose. Connect your own API key for Google Translate, DeepL, Gemini or Claude, or use the AI provider already set up in WordPress (7.0 and later).<\/p>\n\n<p>Whether you build a multilingual site for yourself or manage WordPress sites for clients, Blocklingo keeps the translations, the costs and the content under your control.<\/p>\n\n<h4>AI-powered translation, your own API key<\/h4>\n\n<p>Choose the provider that fits your languages and budget:<\/p>\n\n<ul>\n<li>Google Translate (Google Cloud Translation API)<\/li>\n<li>DeepL<\/li>\n<li>Google Gemini<\/li>\n<li>Anthropic Claude<\/li>\n<li>WordPress AI - the AI provider set up in Settings &gt; Connectors (WordPress 7.0 and later), no separate key<\/li>\n<\/ul>\n\n<p>You pay your provider directly, at their price. Google, DeepL and Gemini offer free allowances. There is no Blocklingo account and no Blocklingo translation subscription.<\/p>\n\n<p>Add a glossary of brand names that must never be translated, a style guide and extra instructions for AI providers.<\/p>\n\n<h4>Gutenberg-friendly translation<\/h4>\n\n<p>Blocklingo is built for the block editor and block themes. Block texts and attributes are translated in the browser and saved back as valid blocks - no \"This block contains unexpected or invalid content\" after translation.<\/p>\n\n<ul>\n<li>\"Translate\" button in the editor's Language panel creates the translation as a draft to review.<\/li>\n<li>Per-language header and footer: header-uk replaces header on Ukrainian pages.<\/li>\n<li>Navigation menus and synced patterns per language.<\/li>\n<li>Shortcodes and Contact Form 7 forms are never sent to translation.<\/li>\n<\/ul>\n\n<h4>SEO-friendly multilingual websites<\/h4>\n\n<ul>\n<li>Language URLs: the default language has no prefix, other languages use \/uk\/, \/de\/ and so on.<\/li>\n<li>Hreflang tags and per-language locale.<\/li>\n<li>SEO titles and descriptions translated for Slim SEO, Yoast SEO, Rank Math and SEOPress.<\/li>\n<li>One sitemap with hreflang alternates (Slim SEO).<\/li>\n<li>Categories and tags with their own translated URLs (\/uk\/category\/novyny\/).<\/li>\n<li>Latin slugs for Cyrillic titles, with a tool that converts existing slugs and redirects the old addresses.<\/li>\n<\/ul>\n\n<h4>Translate more than pages<\/h4>\n\n<ul>\n<li>Pages, posts and custom post types.<\/li>\n<li>Navigation menus.<\/li>\n<li>Categories, tags and other public taxonomies.<\/li>\n<li>Header and footer template parts (block themes) and synced patterns.<\/li>\n<li>SEO metadata.<\/li>\n<li>Site title and tagline.<\/li>\n<li>Theme and plugin texts without an official translation (Language strings).<\/li>\n<\/ul>\n\n<p>WordPress, theme and plugin translation files are installed automatically for every language you add.<\/p>\n\n<h4>Bulk translation<\/h4>\n\n<p>\"Translate everything\" machine-translates the whole site into a language at once: categories, tags, menus, header and footer, pages and posts. Everything is created as drafts, so you review before publishing. It shows progress and time left, and stops with a clear message when something blocks it (a rejected API key, no credit, a rate limit).<\/p>\n\n<h4>Language switcher<\/h4>\n\n<p>A Language switcher block for block themes, the [blocklingo_switcher] shortcode, the blocklingo_language_switcher() template tag, or \"Add to menu\" for classic themes without code.<\/p>\n\n<h4>Built for WordPress developers<\/h4>\n\n<ul>\n<li>One post per language, linked in a translation group. Deleting a post never deletes its translations.<\/li>\n<li>Sync like Polylang: categories, tags, featured image, template, parent and order stay identical across translations.<\/li>\n<li>Public functions, filters and an action to customize what gets translated and how (see \"Developer hooks\" in the FAQ).<\/li>\n<li>Queries accept 'lang' =&gt; 'uk' or 'all'.<\/li>\n<li>API keys can be defined in wp-config.php.<\/li>\n<\/ul>\n\n<h4>Why Blocklingo?<\/h4>\n\n<ul>\n<li>Free multilingual functionality - no mandatory translation subscription.<\/li>\n<li>Bring your own AI - pick the provider, switch any time, pay only for what you translate.<\/li>\n<li>Made for Gutenberg - blocks stay valid after translation.<\/li>\n<li>SEO built in - language URLs, hreflang and translated SEO fields out of the box.<\/li>\n<li>Your content stays yours - translations are ordinary WordPress posts, and nothing goes to a translation provider until you translate.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>Machine translation is optional and off until you choose a provider in Settings &gt; Blocklingo and add your own API key. Only the provider you choose is contacted, and only when you translate (the Translate button, \"Translate everything\", \"Translate empty\" on Language strings, \"Test connection\", \"Load models\"). The plugin sends the texts being translated (page title, excerpt, block texts, SEO fields, menu labels, category names, theme strings), the source and target language, your glossary, style guide and extra instructions, and the page title as context. It sends your API key to that provider to authenticate. Nothing is sent in the background or when visitors browse the site.<\/p>\n\n<ul>\n<li>Google Cloud Translation API (translation.googleapis.com), by Google: <a href=\"https:\/\/cloud.google.com\/terms\">Terms<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">Privacy<\/a>.<\/li>\n<li>DeepL API (api.deepl.com, api-free.deepl.com), by DeepL SE: <a href=\"https:\/\/www.deepl.com\/pro-license\">Terms<\/a>, <a href=\"https:\/\/www.deepl.com\/privacy\">Privacy<\/a>.<\/li>\n<li>Google Gemini API (generativelanguage.googleapis.com), by Google: <a href=\"https:\/\/ai.google.dev\/gemini-api\/terms\">Terms<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">Privacy<\/a>.<\/li>\n<li>Anthropic Claude API (api.anthropic.com), by Anthropic: <a href=\"https:\/\/www.anthropic.com\/legal\/commercial-terms\">Terms<\/a>, <a href=\"https:\/\/www.anthropic.com\/legal\/privacy\">Privacy<\/a>.<\/li>\n<li>WordPress AI (WordPress 7.0 and later): the plugin does not contact any service itself. It passes the same texts to the WordPress AI Client, which sends them to the provider the site owner set up in Settings &gt; Connectors, under that provider's terms and privacy policy.<\/li>\n<\/ul>\n\n<p>Language files: when you add a language, the plugin asks WordPress to install the official translation files for WordPress, themes and plugins from wordpress.org (the same updates WordPress does itself), <a href=\"https:\/\/wordpress.org\/about\/privacy\/\">Privacy<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Plugins &gt; Add New &gt; Upload Plugin, choose the zip, activate.<\/li>\n<li>Settings &gt; Blocklingo:\n\n<ul>\n<li>The default language is taken from Settings &gt; General &gt; Site Language. Add the other languages.<\/li>\n<li>Machine translation: choose a provider, paste the API key, press \"Load models\" and pick a model. Keys can also be set in wp-config.php: define( 'BLOCKLINGO_CLAUDE_KEY', '...' ); (BLOCKLINGO_GEMINI_KEY, BLOCKLINGO_GOOGLE_KEY, BLOCKLINGO_DEEPL_KEY).<\/li>\n<li>Glossary: brand names that must never be translated, one per line.<\/li>\n<\/ul><\/li>\n<li>Settings &gt; Permalinks: any pretty permalink structure (not \"Plain\").<\/li>\n<li>Open a page in the editor, Language panel in the sidebar: \"Translate\" creates the translation as a draft. Review and publish.<\/li>\n<li>Translate the front page and the posts page so every language has its own home.<\/li>\n<li>Header and footer: on the settings page, create language copies of the header and footer, then edit their menus in the Site Editor.<\/li>\n<li>Add the \"Language switcher\" block to the header (Site Editor). Classic theme: Settings &gt; Blocklingo &gt; Header and footer &gt; Language switcher &gt; \"Add to menu\", or use the [blocklingo_switcher] shortcode.<\/li>\n<li>To translate everything at once: Settings &gt; Blocklingo &gt; \"Translate everything into ...\", then review and publish the drafts.<\/li>\n<li>Settings &gt; Language strings: press \"Scan site\", then \"Translate empty\" (or type translations) and save.<\/li>\n<li>If the site already has Cyrillic slugs, use \"Convert to Latin\" at the bottom of the settings page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20happens%20to%20existing%20content%3F\"><h3>What happens to existing content?<\/h3><\/dt>\n<dd><p>On activation every existing post is assigned to the default language. Nothing else changes until you add translations.<\/p><\/dd>\n<dt id=\"does%20it%20need%20the%20block%20editor%20%28gutenberg%29%3F\"><h3>Does it need the block editor (Gutenberg)?<\/h3><\/dt>\n<dd><p>It is made for it: the Language panel, the Translate button and block-safe translation live in the block editor. Content that uses the classic editor is still translated by \"Translate everything\" (on the server), and the plugin tells you which post types have the block editor turned off.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20classic%20themes%3F\"><h3>Does it work with classic themes?<\/h3><\/dt>\n<dd><p>Translations, URLs and SEO work. The language switcher can be added to a theme menu from the settings (no code), with the [blocklingo_switcher] shortcode or with blocklingo_language_switcher(). Per-language header and footer need a block theme.<\/p><\/dd>\n<dt id=\"which%20options%20does%20the%20shortcode%20take%3F\"><h3>Which options does the shortcode take?<\/h3><\/dt>\n<dd><p>[blocklingo_switcher display=\"name\" hide_current=\"1\" hide_missing=\"1\"]. display: code, name, flag, flag-code or flag-name (default code). hide_current hides the current language, hide_missing hides languages without a translation of the page.<\/p><\/dd>\n<dt id=\"which%20strings%20does%20%22language%20strings%22%20cover%3F\"><h3>Which strings does \"Language strings\" cover?<\/h3><\/dt>\n<dd><p>PHP strings (<strong>(), _e(), esc_html<\/strong>(), _x() ...) used while a page renders, when no translation file covers them. Not covered yet: plural forms (_n()), strings in JavaScript, texts saved in plugin settings (e.g. Contact Form 7 form fields).<\/p><\/dd>\n<dt id=\"what%20is%20removed%20when%20i%20delete%20the%20plugin%3F\"><h3>What is removed when I delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing, unless you ask for it. By default the links between translations, the language strings and the settings stay, so installing the plugin again brings everything back. To remove them, turn on \"Remove all data when the plugin is deleted\" (Settings &gt; Blocklingo &gt; Content and sync) before deleting. Posts, terms, menus and template parts in every language always stay - they are content. Deactivating the plugin keeps everything; while it is off, language URLs like \/uk\/ stop working and translations show up as ordinary posts and pages.<\/p><\/dd>\n<dt id=\"developer%20hooks\"><h3>Developer hooks<\/h3><\/dt>\n<dd><p>Functions: blocklingo_languages(), blocklingo_default_lang(), blocklingo_current_lang(), blocklingo_is_language(), blocklingo_is_translatable_type(), blocklingo_get_post_lang(), blocklingo_set_post_lang(), blocklingo_get_post_translations(), blocklingo_get_post_translation(), blocklingo_language_switcher().\nFilters: blocklingo_untranslated_blocks, blocklingo_strings_capture, blocklingo_strings_skip_domains, blocklingo_translatable_block_attributes, blocklingo_translatable_meta, blocklingo_per_language_meta, blocklingo_skip_meta_keys, blocklingo_sync_meta_key, blocklingo_sync_taxonomy, blocklingo_translatable_taxonomies, blocklingo_context_max_chars, blocklingo_pre_provider, blocklingo_support_url. Action: blocklingo_translation_created. Queries accept 'lang' =&gt; 'uk' or 'all'.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.14.1<\/h4>\n\n<ul>\n<li>New name: Blocklingo - AI Translation &amp; Multilingual. Folder, settings and data stay the same.<\/li>\n<li>New plugin description and wordpress.org page: free AI translation with your own API key, no translation subscription.<\/li>\n<\/ul>\n\n<h4>0.14.0<\/h4>\n\n<ul>\n<li>New provider \"WordPress AI\" (WordPress 7.0 and later): translates with the AI provider, key and model set up once for the whole site in Settings &gt; Connectors, through the WordPress AI Client. No key in Blocklingo. When no connector can write text, the error says so and points to Settings &gt; Connectors.<\/li>\n<li>Security: machine translation of a post (in the editor, its SEO fields, or a new translation in machine mode) needs the publish_posts capability (Authors and up), like the block translation already did: Contributors can no longer spend the site's API key.<\/li>\n<li>Fix: the Overview, Header and footer, Language strings and the category list showed machine translation as ready when the saved provider was no longer offered (for example WordPress AI with AI turned off on the site). The category list now also offers machine translation only to Authors and up.<\/li>\n<li>Hardening: the request URL is read through one sanitized helper, and the Language strings queries pass every value through prepared placeholders.<\/li>\n<li>The wordpress.org package no longer includes translation files: they come from translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>0.13.0<\/h4>\n\n<ul>\n<li>Developers: every global name now uses the blocklingo prefix instead of abl (wordpress.org asks for prefixes of 4+ characters). Functions blocklingo_<em>() (e.g. blocklingo_language_switcher()), filters and actions blocklingo_<\/em>, constants BLOCKLINGO_* (wp-config keys: BLOCKLINGO_CLAUDE_KEY, BLOCKLINGO_GEMINI_KEY, BLOCKLINGO_GOOGLE_KEY, BLOCKLINGO_DEEPL_KEY), REST routes blocklingo\/v1, CSS classes blocklingo-* (e.g. .blocklingo-switcher). Settings, tables and translation links are moved to the new names automatically on update; rename abl_* calls, ABL_<em>_KEY constants and .abl-<\/em> CSS in your theme or wp-config.php.<\/li>\n<li>The plugin now installs into the folder blocklingo\/ with the main file blocklingo.php and the text domain blocklingo (the wordpress.org slug). After this update WordPress shows the plugin as inactive once: click Activate - settings and translations stay.<\/li>\n<li>Fix: texts on the settings screen added by JavaScript (Testing..., Loading..., model list) stayed in English in the Ukrainian admin; their translation file was saved under a wrong name.<\/li>\n<li>Fix: the posts page (Settings &gt; Reading &gt; Posts page, e.g. \/journal\/ and \/uk\/zhurnal\/) listed posts in every language; it now shows only posts in its own language.<\/li>\n<li>Translate everything: when it finishes without errors, the page reloads, so the overview, the steps and the buttons show the new state, and a notice links to the new drafts (Pages, Posts... in that language). When it was stopped or some items failed, the list stays on screen.<\/li>\n<li>Machine translation settings: \"Load models\" and \"Test connection\" use the key and model typed in the form, before saving (the key is not stored until you click Save). \"Not saved yet\" shows next to Save while there are changes.<\/li>\n<li>\"WordPress translation files\" moved from the Languages tab to the Language strings screen, with an \"Install now\" button. Files are still installed automatically when you add a language.<\/li>\n<li>Failsafe: a bug in Blocklingo no longer takes the site down. An error in one of its hooks is logged and that step is skipped (the page still loads); if the plugin cannot start at all (for example a file missing after a broken upload), it switches itself off for that request and shows administrators a notice with the details. Visitors see nothing. Developers: the plugin's callbacks are wrapped, so use AddBlack\\Lang\\Hooks::remove() instead of remove_action().<\/li>\n<li>The plugin's tables are checked once an hour and recreated if they disappeared (a migration or a partial restore), so post lists do not come back empty.<\/li>\n<li>Security: machine translations cannot add code - scripts, event handlers, javascript: links and embeds that the original text did not have are removed (post content and Language strings).<\/li>\n<li>Security: saved API keys are no longer printed in the settings page. The field shows the last characters; leave it empty to keep the key, or tick \"Remove the saved key\".<\/li>\n<li>Security: translating text in the editor needs the publish_posts capability (Authors and up), so Contributors cannot use the site's API key; the editor does not offer them machine translation.<\/li>\n<li>Fix: shortcodes ([contact-form-7 ...] and others) are never sent to machine translation. Shortcode blocks and Contact Form 7 blocks are skipped (filter blocklingo_untranslated_blocks adds more), and shortcodes inside text stay exactly as written.<\/li>\n<li>Machine translation: every provider card shows whether it has a free allowance (Google, DeepL, Gemini) or is paid (Claude), and links to the page where you create the API key.<\/li>\n<li>Removed: OpenAI as a translation provider. Sites that used it show machine translation as Off; choose Claude, Gemini, DeepL or Google and add its key.<\/li>\n<li>Language switcher without blocks: the [blocklingo_switcher] shortcode, and \"Add to menu\" on the Header and footer tab, which adds the languages to a menu location of a classic theme, styled by the theme like its other menu links.<\/li>\n<li>Fix: the preview of a draft translation of the front page used the page template instead of the front-page template, so it looked narrower than the published page will.<\/li>\n<li>Search and feeds per language: on \/uk\/ the search form, search links, feed links (\/uk\/feed\/, \/uk\/comments\/feed\/), author and date archive links keep the \/uk\/ prefix. The site-wide comments feed shows only comments on posts in its language.<\/li>\n<li>The language switcher on search results keeps the search (\/uk\/?s=garden -&gt; \/?s=garden). The home page with latest posts gets hreflang links to every language home.<\/li>\n<li>Deleting the plugin no longer removes the links between translations by default. A new option, \"Remove all data when the plugin is deleted\", does that, and the Plugins screen says what Delete will do.<\/li>\n<li>The Overview counts translated content in the database, a single query per language, so it stays fast on large sites and is no longer limited to 2,000 posts.<\/li>\n<li>Fix: with Twenty Twenty-Five and other themes that keep the header or footer in a theme pattern, the language copy of the part only pointed at the same pattern, so the footer stayed in English. Theme patterns are now copied into the part, then translated.<\/li>\n<li>Translate everything copies only the header and footer parts your templates use. Twenty Twenty-Five has seven parts but shows two; the others (alternative designs) are marked \"Not used by your templates\" on the Header and footer tab and can still be copied by hand.<\/li>\n<li>When wordpress.org cannot be reached or a language file fails to download (firewall, SSL), the notice says so, instead of reporting the language as not available.<\/li>\n<li>First run: the Overview shows the steps - add a language, set up machine translation, translate everything - and marks what is done.<\/li>\n<\/ul>\n\n<h4>0.12.2<\/h4>\n\n<ul>\n<li>Blocklingo is made for the block editor. When the block editor is turned off for translated content (Classic Editor plugin, post types without the editor), the Plugins screen and the settings page say so, and the Content tab marks those post types \"Classic editor\". They are still translated by \"Translate everything\", on the server.<\/li>\n<\/ul>\n\n<h4>0.12.1<\/h4>\n\n<ul>\n<li>Fix: on hosts that cut requests at 60 seconds, a page could fail with \"The response is not a valid JSON response\" (the AI took longer for one big batch). Texts now go in smaller batches (15 texts or 1500 characters), and a batch that times out is split in two and sent again.<\/li>\n<\/ul>\n\n<h4>0.12.0<\/h4>\n\n<ul>\n<li>Errors in plain words: \"The translation provider rejected the API key\", \"Your login session has expired\", \"The site ran into an error\" and so on, with what to do next, a \"Contact the developer\" button, \"Copy details\" and a \"Show technical details\" toggle (error code, HTTP status, PHP error with file and line). Filter blocklingo_support_url sets where \"Contact the developer\" leads.<\/li>\n<li>Translate everything stops by itself when nothing can work (no or rejected API key, empty provider account, rate limit, expired login, no connection) and pauses after 3 failures in a row, asking whether to continue. It shows the time left, and items translated meanwhile count as done.<\/li>\n<li>PHP errors in the plugin's REST requests come back as readable errors instead of a broken response.<\/li>\n<\/ul>\n\n<h4>0.11.3<\/h4>\n\n<ul>\n<li>Fix: Translate everything waited 6 minutes and failed for every item of a post type that does not use the block editor (classic editor, title and custom fields only). Such items are now machine-translated on the server.<\/li>\n<li>A page whose hidden editor does not start fails within a minute instead of 6; a page only times out after 3 minutes without progress.<\/li>\n<\/ul>\n\n<h4>0.11.2<\/h4>\n\n<ul>\n<li>Fix: on sites where WordPress replaces emoji with images, flags showed as broken images in the \"Translate everything\" dialog and in the editor's Language panel. Text added by the plugin's scripts no longer contains emoji flags; the editor draws them with CSS.<\/li>\n<\/ul>\n\n<h4>0.11.1<\/h4>\n\n<ul>\n<li>New name: Blocklingo - Translate Sites with AI (the settings page is Settings &gt; Blocklingo). Folder, settings and data stay the same.<\/li>\n<\/ul>\n\n<h4>0.11.0<\/h4>\n\n<ul>\n<li>Menus per language: create a translated copy of a navigation menu on the Header and footer tab; navigation blocks show the menu of the page language, and language copies of the header and footer point at it.<\/li>\n<li>Categories and tags per language: \"+UK\" in the Language column on the category and tag screens creates a translated version. Translations of posts get the translated terms (also posts translated before), term lists and links follow the page language (\/uk\/category\/novyny\/), term archives get hreflang.<\/li>\n<li>Translate everything also translates categories, tags and menus (first, so pages and the header pick them up).<\/li>\n<li>Synced pattern and navigation refs are found wherever \"ref\" sits among the block attributes.<\/li>\n<li>The plugin's admin screens are translatable, with a Ukrainian translation.<\/li>\n<li>readme: External services section (what is sent to the translation provider and when).<\/li>\n<\/ul>\n\n<h4>0.10.1<\/h4>\n\n<ul>\n<li>The editor shows translated patterns too: synced pattern blocks in translated content point at the pattern's translation. New translations get it right away; publishing a pattern translation relinks pages already in that language; saving a translated page relinks it.<\/li>\n<li>A synced pattern block that points at an unpublished translation shows the original instead of nothing.<\/li>\n<\/ul>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>Synced patterns per language. Turn on \"Patterns\" in Content and sync, open a pattern and translate it like a page. Once the translation is published, pages in that language show it instead of the original. Translate everything includes patterns too.<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>Fix: a published translated page whose translated parent was still a draft showed 404. When a page is published, its unpublished parents now get a slug (they stay drafts), so the URL works, e.g. \/uk\/poslugy\/rozrobka-plaginiv\/.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>New settings screen with tabs: Overview, Languages, Machine translation, Content and sync, SEO and URLs, Header and footer.<\/li>\n<li>Overview shows how much of the site exists in each language (per post type, header and footer), the machine translation status and theme\/plugin texts, with Translate everything right there.<\/li>\n<li>Providers are cards; each one has its key, model, Save and Test connection together. Switches instead of checkboxes, a sticky Save bar, and saving keeps you on the same tab.<\/li>\n<\/ul>\n\n<h4>0.8.1<\/h4>\n\n<ul>\n<li>Flags in the language switcher and the plugin's admin screens stay emoji: WordPress no longer replaces them with images.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Translate the whole site: Settings &gt; Blocklingo has a \"Translate everything into ...\" button per language. It machine-translates every published page and post without a version in that language, plus the header and footer, as drafts - with a confirm dialog, progress, and Stop. Pages are translated in the block editor in the background, the same way as the Translate button, so blocks stay valid.<\/li>\n<\/ul>\n\n<h4>0.7.1<\/h4>\n\n<ul>\n<li>Fixed: the Language panel in the block editor crashed on every edit screen (0.7.0).<\/li>\n<li>Settings: a Save button next to each API key; pressing Enter in a field saves without installing translation files.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Rewritten inside: namespaced classes with a composition root, REST controllers, admin screens with templates. Settings, tables, URLs, REST routes, hooks and the blocklingo_* functions are unchanged.<\/li>\n<li>The legacy BLOCKLINGO_* classes are removed. Code that called them should use the blocklingo_* functions.<\/li>\n<li>Filter blocklingo_pre_provider now returns an object implementing AddBlack\\Lang\\MachineTranslation\\Provider.<\/li>\n<li>New function blocklingo_current_lang().<\/li>\n<li>Requires PHP 8.1.<\/li>\n<li>Fixed: \"Settings saved.\" was shown twice after saving the settings.<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Language strings screen: collect, translate and machine-translate theme and plugin strings.<\/li>\n<li>Translation files for WordPress, themes and plugins are installed when a language is added.<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Default language detected from the site locale; glossary starts with the site name.<\/li>\n<li>Self-install when the activation hook did not run (multisite, FTP deploys).<\/li>\n<li>No site-specific defaults.<\/li>\n<\/ul>","raw_excerpt":"Translate WordPress sites with AI. Supports Gutenberg, multilingual SEO, DeepL, Gemini, Claude and Google. Use your own API keys.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393203","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=393203"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/addblack"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393203"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393203"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393203"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393203"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393203"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}