{"id":383610,"date":"2026-10-10T18:35:47","date_gmt":"2026-10-10T18:35:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lingopress\/"},"modified":"2026-10-13T15:00:50","modified_gmt":"2026-10-13T15:00:50","slug":"ballesdev-lingopress","status":"publish","type":"plugin","link":"https:\/\/ps.wordpress.org\/plugins\/ballesdev-lingopress\/","author":23582960,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1.3","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"BallesDev LingoPress","header_author":"balles.dev","header_description":"Multilingual content for WordPress with AI-powered translations. SEO-first.","assets_banners_color":"","last_updated":"2026-10-13 15:00:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/lingopress.balles.dev","header_author_uri":"https:\/\/balles.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":161,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"ballesdev","date":"2026-10-11 18:32:25","revision":3739951},"1.1.0":{"tag":"1.1.0","author":"ballesdev","date":"2026-10-12 16:08:51","revision":3742094},"1.1.1":{"tag":"1.1.1","author":"ballesdev","date":"2026-10-13 15:00:50","revision":3744261}},"upgrade_notice":{"1.1.1":"<p>Adds an &quot;Import from Polylang&quot; button in LingoPress \u2192 Getting started and a WP-CLI command to bring your languages and translations over from Polylang.<\/p>","1.1.0":"<p>Adds an About tab with links to the documentation and an easy way to report a problem.<\/p>","1.0.1":"<p>Adds the license files (GPLv3 with additional terms). No functional changes.<\/p>","1.0.0":"<p>First WordPress.org release. Licensing has been removed: all features are free and updates now come from WordPress.org.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3738545,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3738545,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"lingopress\/language-switcher":{"name":"lingopress\/language-switcher","title":"Language Switcher (LingoPress)"}},"tagged_versions":["1.0.1","1.1.0","1.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,8583,99,186,2333],"plugin_category":[48,55],"plugin_contributors":[285604],"plugin_business_model":[],"class_list":["post-383610","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-languages","plugin_tags-multilingual","plugin_tags-seo","plugin_tags-translation","plugin_category-language-tools","plugin_category-seo-and-marketing","plugin_contributors-ballesdev","plugin_committers-ballesdev"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ballesdev-lingopress\/assets\/icon-128x128.png?rev=3738545","icon_2x":"https:\/\/ps.w.org\/ballesdev-lingopress\/assets\/icon-256x256.png?rev=3738545","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>BallesDev LingoPress makes your WordPress site multilingual with a proven data model (languages and translation groups as taxonomies, no custom tables) and adds AI translation that actually understands your content. Every feature is included \u2014 there is no paid tier, license key or locked functionality.<\/p>\n\n<p><strong>Multilingual core<\/strong><\/p>\n\n<ul>\n<li>Languages with directory-based URLs (\/es\/, \/en\/) and automatic rewrite rules.<\/li>\n<li>One post per language, linked as translation groups.<\/li>\n<li>Automatic hreflang tags, language-aware 301 canonicals and sitemap support.<\/li>\n<li>Language switcher as a Gutenberg block, shortcode, widget, menu item or PHP function.<\/li>\n<li>Menus per language, media translation with shared files, string translations.<\/li>\n<li>Template translations for block themes (FSE): each language gets its own copy of your templates and template parts.<\/li>\n<li>REST API: <code>lang<\/code> and <code>translations<\/code> fields on wp\/v2, collection filtering with <code>?lang=<\/code>.<\/li>\n<\/ul>\n\n<p><strong>AI translation (optional)<\/strong><\/p>\n\n<ul>\n<li>On WordPress 7.0+, LingoPress uses the AI provider you connected in <strong>Settings \u2192 Connectors<\/strong> through the WordPress AI Client \u2014 no extra API key in LingoPress.<\/li>\n<li>Or bring your own key: Claude (Anthropic), Gemini (Google), OpenAI (ChatGPT) and GroqCloud providers, selectable in settings (also on WordPress 6.5\u20136.9).<\/li>\n<li>Context-aware prompts: the AI reads the whole content, your site description and your glossary before translating a single word \u2014 so an ambiguous word like Spanish \"mu\u00f1eca\" becomes \"wrist\" on a fitness blog, never \"doll\".<\/li>\n<li>Glossary with hard terminology rules.<\/li>\n<li>One-click translation from the editor, bulk translation with a background queue, automatic retry with backoff on provider saturation, and outdated-translation detection with one-click re-translation.<\/li>\n<li>Long content is automatically split into block-aligned chunks.<\/li>\n<li>Every AI translation is created as a draft for human review. Nothing is published automatically.<\/li>\n<\/ul>\n\n<p>The multilingual features work fully without any API key. AI translation is an optional extra that only runs when you ask for it \u2014 see \"External services\" below.<\/p>\n\n<p><strong>Developer friendly<\/strong><\/p>\n\n<ul>\n<li>Public API: <code>lingopress_set_post_language()<\/code>, <code>lingopress_get_post()<\/code>, <code>lingopress_the_languages()<\/code>, <code>lingopress_register_string()<\/code> and more.<\/li>\n<li>Hooks: <code>lingopress_language_defined<\/code>, <code>lingopress_ai_system_prompt<\/code>, <code>lingopress_ai_provider<\/code>, <code>lingopress_switcher_items<\/code>, <code>lingopress_sync_post_meta<\/code>.<\/li>\n<li>Polylang importer included (languages, content languages and translation groups): a button in <strong>LingoPress \u2192 Getting started<\/strong>, or <code>wp lingopress import-polylang<\/code>.<\/li>\n<\/ul>\n\n<h4>License<\/h4>\n\n<p>Copyright 2026 balles.dev. BallesDev LingoPress is free software under the GPL, version 3 or later, with additional terms: copies and modified versions must keep the notice \"Originally developed by balles.dev (https:\/\/balles.dev\/)\", and modified versions must use a different name, without \"BallesDev\", \"balles.dev\" or \"LingoPress\". See LICENSE.txt and NOTICE.txt.<\/p>\n\n<h3>External services<\/h3>\n\n<p>LingoPress can translate your content with an AI provider of your choice. This is optional: no request is made to any AI service until a provider is set up \u2014 a connector in <strong>Settings \u2192 Connectors<\/strong> (WordPress 7.0+) or an API key in <strong>LingoPress \u2192 AI translation<\/strong> (or its constant in <code>wp-config.php<\/code>) \u2014 and a user with editing permissions starts a translation \u2014 from the post editor, the bulk action, the Queue, the Templates tab or the \"Translate missing strings with AI\" button. Queued jobs run in the background through WP-Cron, but only jobs that a user explicitly queued.<\/p>\n\n<p>Only the provider selected in the settings receives data. Each request sends the text being translated (post title, content and excerpt; a theme template; or the registered strings), the source and target languages, your site name and tagline, the \"Site context\" and glossary settings, the post type and the names of the post's categories and tags, together with your API key to authenticate. No other site or visitor data is sent.<\/p>\n\n<ul>\n<li><strong>WordPress AI Client (Settings \u2192 Connectors)<\/strong> \u2014 used when the provider is set to \"WordPress (Connectors)\". LingoPress hands the request to WordPress core, which sends it to the AI service the site owner connected (for example Anthropic, Google or OpenAI) under that service's terms and privacy policy; LingoPress itself does not contact any external server in this mode.<\/li>\n<li><strong>Anthropic Claude API<\/strong> (<code>api.anthropic.com<\/code>) \u2014 used when the provider is set to Claude. <a href=\"https:\/\/www.anthropic.com\/legal\/commercial-terms\">Terms of service<\/a>, <a href=\"https:\/\/www.anthropic.com\/legal\/privacy\">Privacy policy<\/a>.<\/li>\n<li><strong>Google Gemini API<\/strong> (<code>generativelanguage.googleapis.com<\/code>) \u2014 used when the provider is set to Gemini. <a href=\"https:\/\/ai.google.dev\/gemini-api\/terms\">Terms of service<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">Privacy policy<\/a>.<\/li>\n<li><strong>OpenAI API<\/strong> (<code>api.openai.com<\/code>) \u2014 used when the provider is set to OpenAI. <a href=\"https:\/\/openai.com\/policies\/business-terms\/\">Terms of service<\/a>, <a href=\"https:\/\/openai.com\/policies\/privacy-policy\/\">Privacy policy<\/a>.<\/li>\n<li><strong>GroqCloud API<\/strong> (<code>api.groq.com<\/code>) \u2014 used when the provider is set to Groq. <a href=\"https:\/\/groq.com\/terms-of-use\">Terms of service<\/a>, <a href=\"https:\/\/groq.com\/privacy-policy\">Privacy policy<\/a>.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress dashboard go to <strong>Plugins \u2192 Add New<\/strong>, search for \"BallesDev LingoPress\", then install and activate it.<\/li>\n<li>Go to <strong>LingoPress \u2192 Languages<\/strong> and create your languages (the first one becomes the default).<\/li>\n<li>Optional: for AI translation, connect a provider in <strong>Settings \u2192 Connectors<\/strong> (WordPress 7.0+) or add your own API key under <strong>LingoPress \u2192 AI translation<\/strong>; then describe your site in \"Site context\" and add glossary rules.<\/li>\n<li>Assign a language to existing content. Migrating from Polylang? Use <strong>Import from Polylang<\/strong> in <strong>LingoPress \u2192 Getting started<\/strong> (it shows up when Polylang data is found).<\/li>\n<\/ol>\n\n<p>The <strong>Getting started<\/strong> tab walks you through these steps and shows what is still pending.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20ai%20provider%20to%20use%20lingopress%3F\"><h3>Do I need an AI provider to use LingoPress?<\/h3><\/dt>\n<dd><p>No. Languages, URLs, hreflang, the language switcher, menus, media and string translations all work without any API key. AI translation is optional.<\/p><\/dd>\n<dt id=\"does%20the%20ai%20publish%20translations%20automatically%3F\"><h3>Does the AI publish translations automatically?<\/h3><\/dt>\n<dd><p>No. Every translation is created as a draft, linked to the original, for a human to review and publish.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20ai%20provider%20is%20saturated%3F\"><h3>What happens if the AI provider is saturated?<\/h3><\/dt>\n<dd><p>Jobs are retried automatically with increasing backoff. You can also retry failed jobs manually from LingoPress \u2192 Queue.<\/p><\/dd>\n<dt id=\"where%20do%20the%20api%20keys%20live%3F\"><h3>Where do the API keys live?<\/h3><\/dt>\n<dd><p>With the \"WordPress (Connectors)\" provider (WordPress 7.0+), in <strong>Settings \u2192 Connectors<\/strong>: WordPress manages the credentials and LingoPress stores none. With your own key, in the plugin settings, or preferably in <code>wp-config.php<\/code> via the <code>LINGOPRESS_ANTHROPIC_API_KEY<\/code>, <code>LINGOPRESS_GEMINI_API_KEY<\/code>, <code>LINGOPRESS_OPENAI_API_KEY<\/code> or <code>LINGOPRESS_GROQ_API_KEY<\/code> constants (constants take precedence).<\/p><\/dd>\n<dt id=\"can%20i%20migrate%20from%20polylang%3F\"><h3>Can I migrate from Polylang?<\/h3><\/dt>\n<dd><p>Yes. With Polylang still installed (active or not), go to <strong>LingoPress \u2192 Getting started<\/strong> and click <strong>Import from Polylang<\/strong>. It migrates languages, post\/term languages and translation groups, never changes Polylang's data, and is safe to run again: anything already imported is skipped. On large sites you can run <code>wp lingopress import-polylang<\/code> instead.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Import from Polylang from the dashboard: when LingoPress finds Polylang data, LingoPress \u2192 Getting started shows an \"Import from Polylang\" button. It brings over your languages, the language of your posts, pages, categories and tags, and the links between translations, without changing Polylang's data. You can run it again: anything already imported is skipped, and the default language you set in LingoPress is kept.<\/li>\n<li>New WP-CLI command for large sites: <code>wp lingopress import-polylang<\/code>.<\/li>\n<li>The documentation links in the About tab point to the new documentation site.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New About tab: who makes LingoPress, links to the documentation, and a \"Report a problem\" card. The Email us button opens your email app with your site details (LingoPress, WordPress and PHP versions, theme, locale, site languages and AI provider) already in the message, and the same details are ready to copy for webmail. Your site URL, emails and API keys are never included.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>License: added LICENSE.txt (full GPLv3 text) and NOTICE.txt with additional terms under GPLv3 section 7 \u2014 keep the \"Originally developed by balles.dev\" notice, mark modified versions as changed, and use a different name (without BallesDev, balles.dev or LingoPress) for modified versions.<\/li>\n<li>No functional changes.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release on WordPress.org, as BallesDev LingoPress.<\/li>\n<li>New \"WordPress (Connectors)\" AI provider: on WordPress 7.0+ translations use the AI provider configured in Settings \u2192 Connectors through the WordPress AI Client (default on new installs). Claude, Gemini, OpenAI and Groq with your own key remain available.<\/li>\n<li>Public API and stored data use the <code>lingopress_<\/code> prefix, e.g. <code>lingopress_get_post()<\/code>, <code>lingopress_set_post_language()<\/code>.<\/li>\n<li>Admin styles and scripts load only on LingoPress screens; inline scripts moved to enqueued files.<\/li>\n<li>Translations are now delivered through translate.wordpress.org.<\/li>\n<li>Removed the licensing system and the self-hosted update channel: every feature is free and updates are delivered through WordPress.org.<\/li>\n<li>Security hardening: AI provider responses are sanitized before they are saved (posts, templates and string translations), and the language switcher output is escaped where it is printed.<\/li>\n<\/ul>","raw_excerpt":"Multilingual content for WordPress with AI-powered, context-aware translations. SEO-first.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/383610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=383610"}],"author":[{"embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ballesdev"}],"wp:attachment":[{"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=383610"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=383610"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=383610"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=383610"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=383610"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ps.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=383610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}