WPML

Changelog

What's New

  • Searching WPML's settings for "scan" or "theme strings" now finds the theme and plugin string scan.
  • The block editor and the Site Editor have a native Language panel in the sidebar, with every control of the old Language box, for posts, pages, templates, template parts, synced patterns and navigation menus.
  • Automatic translations have a new delivery. The translation service tells your site when work is ready, your site collects it, and each side knows what the other holds.
  • Your site also checks for finished translations on its own, so a firewall or security plugin that blocks the service's calls no longer stops them.
  • WPMLSupport has a new Translation delivery box. It shows where your translations are, what is wrong and what you can do now.
  • When translations wait for you, the dashboard and the admin bar say why: out of words, a pending or declined payment, the spending limit, the payment method or a blocked account. A link takes you to the fix.
  • When a delivery problem needs you, you get one email that names the fix.
  • The Translation Dashboard's Taxonomy section is complete. It shows each taxonomy's status and volume, lists terms as a tree you can search, and sends them with every method: automatic, translate myself, a translator or a translation service.
  • Texts that belong to an item now travel with it, so they are sent and charged once. For example, the Yoast SEO texts of a term ride with the term's job.
  • With a directory for the default language, the root URL has a new option: Redirect to the default language.
  • WPML warns when a multisite sub-site's path is the same as a language directory. New sites cannot use such a path, and the setup wizard shows which language URLs a sub-site would take.
  • WPMLSupport and WP-CLI can repair internal links that older versions rewrote to ?page_id= addresses.
  • The Language Switcher blocks can hide the current language from the list, and their Display settings are easier to follow.
  • WPML can remember the language a visitor picked in a language switcher, and can suggest the visitor's browser language in a bar instead of redirecting; both work with page caching.
  • A translation taken over with Translate independently stays in the WordPress editor, with no warning about losing edits, and the Translation Dashboard opens it there.
  • WPML now states PHP 7.4 as its minimum and, on older PHP, shows a notice instead of stopping the site with an error.
  • SettingsAI Translation lets you choose, per type of content such as Elementor templates, whether automatic translation waits until the content appears on the site.
  • New WP-CLI command wp wpml appearance shows and resets what WPML has recorded as appearing on the site.
  • The WPML Language Switcher widget for Elementor has new style options: a hover background, an Active style for the current language and a Dropdown style for the language list.
  • Elementor: the site name and tagline from Site Settings can be translated from the Translation Dashboard, and the Site Title widget's text translates with its header.
  • Security hardening.

Performance

  • Every page request runs two fewer database queries, and checking WPML's languages table on multisite is cheaper.
  • The Translation Dashboard's content list loads its posts and their languages in one query each, not two queries per row.
  • The language counts above admin lists and the queries for content shown in the default language do less work.
  • When the translation service does not support one of a site's language pairs, WPML keeps that answer for an hour instead of asking again on every admin page.
  • Saving a post no longer clears WPML's language cache, so the next requests do not rebuild it.
  • Saving a translated post resolves each of its links once, and only when the links changed, instead of once per language.
  • With a persistent object cache, such as Redis or Memcached, translation lookups stay cached across requests and saves.
  • Saving a large Elementor page on a site with a big media library no longer ends in a server timeout.
  • Page loads no longer rewrite WPML's record of active plugins when nothing changed.
  • Pages with large category menus, such as shop menus, load much faster.
  • Saving a post on a site with thousands of translatable custom fields no longer runs out of memory or time.
  • Multisite: switching between sites reads WPML's settings once per site and no longer clears the option cache.
  • Avada: pages with Off Canvas display conditions load faster.
  • Translations from translation services are saved faster: WPML reads a job's fields once instead of once per field.
  • Stores with many product images no longer overload the database: WPML finds an image's language with its own indexed lookup.
  • The WPML Multilingual CMS package has about 1,400 fewer files, and updating from WPML 4.9 still works.
  • WPML reads its small every-request options with one query at startup.
  • Block themes: a page list filters pages by language with one query per page load, and the Navigation block reads its links' targets and translations together.
  • Slug lookups on a translated taxonomy read the slugs in one query.
  • The URL resolution cache stops rebuilding on every page load, and its table stays small.
  • When WPML rebuilds its language cache, it saves the language settings once per request instead of on every change.

Fixes for Automatic Translation and Translate Everything

  • Removing your credentials for a translation service now really removes them, instead of the old ones coming back.
  • With Translate Everything on, saving a post no longer waits for the Advanced Translation Editor, which made slow saves time out.
  • A site that is not registered for automatic translation is told so, instead of "Unable to authenticate" or "Connection Error".
  • Registering the site for automatic translation no longer ends in a fatal error when the reply is not valid.
  • The AI Translation settings no longer show "Saved" when the save was refused, and WPML registers the site again when its signature is rejected.
  • While the translation service has the site restricted, WPML stops resending its waiting jobs every ten minutes, and gives up on a job after a day of failed tries.
  • A restriction on automatic translation is lifted only when the translation service lifts it, not by any successful call.
  • The dashboard no longer counts manual jobs, or jobs the translation service no longer holds, as translations on their way.
  • A failed read of the translation engines is retried soon, instead of making every automatic job's word count fail for a day.
  • With Translate Everything on, adding a language no longer re-opens categories and other taxonomies for automatic translation.
  • Translate Everything translates block-editor pages that have another plugin's meta box, such as ACF fields, with the values just saved.
  • The "Adjust content limits" dialog no longer opens by itself on every Translation Dashboard load while a post type is excluded from Translate Everything.
  • The post editor shows a job that is waiting to be sent as in progress, instead of saying that sending it for automatic translation did not go through.
  • "Pick up translations now" reports what it brought in within seconds.
  • A new site that sends content to automatic translation before it is connected to the translation service now connects and translates, instead of staying stuck with an authentication error.
  • A Translate Everything job whose first send or word count failed is no longer sent again with 0 words.
  • Translate Everything no longer leaves a post stuck as waiting for translator with no job when an automatic send is interrupted, and posts already stuck are sent again by an hourly check.
  • Saving a post whose automatic translation is waiting for a retry no longer creates a second translation job.
  • Jobs waiting for a retry are all sent on the next admin page view, not ten at a time.
  • The "Your update replaced a translation in progress" notice shows right after the save, not one page load later.
  • Translate Everything sends a block-editor page that has extra field boxes even when WP-Cron runs late.
  • Cancel in-progress automatic jobs in Troubleshooting also releases strings left in progress by an automatic translation that ended.
  • Automatic translation of a short page with large saved content no longer fails with "Failed to parse because your job is above the file size limit".
  • Saving a post no longer waits for WPML to pick up finished translations, on any host.
  • Translate Everything no longer sends unchanged content again on every save after the translation service gave up on it. It tries twice, then waits until the content changes.
  • When Translate Everything replaces an unfinished job, it also cancels the old job at the translation service.
  • Applying a changed custom field preference to existing translations no longer sends the same post two or three times when several admin screens are open.
  • Translate Everything sends no term jobs to a language paused for automatic translation.
  • A job held back from an automatic Translation Dashboard send is retried as automatic work, not as a manual job.
  • Translate Everything no longer gives a string batch the content of a string package with the same ID, which left those strings untranslated while the job read complete.
  • A string package already translated in String Translation is no longer translated and charged again when it is sent on its own.
  • A text translated as part of a package, such as an Elementor site's title and tagline, is translated and charged once. String Translation shows where to translate it.
  • Jobs that never reached the translation service no longer take up room in its status checks.
  • The Translate Everything estimate prices exactly what the run sends. Duplicates and discarded jobs are not priced.
  • The Translate Everything estimate counts product terms, and the Translation Dashboard sends and counts a shared term once. The Dashboard's cost finishes loading.
  • The setup wizard's estimate counts page-builder texts, attributes, ACF term fields and forms.
  • A post saved while WPML reconnects to the translation service gets a waiting translation job, sent as soon as the service answers again.
  • A translation is no longer applied twice when its delivery takes longer than 30 seconds.
  • With "WordPress Editor" set as the translation editor for all content, Translate Everything follows that choice, as its estimate does, instead of translating some pages and then never translating new ones.
  • Translate Everything no longer sends taxonomy terms that did not change to translation again.
  • Automatic translations of terms into a hidden language are saved again.
  • The automatic translation estimate prices an existing translation that has no translation status at 0, as the run charges it.
  • Retrying the connection to the translation service makes one attempt at a time.
  • A translation that waited under an earlier spending limit, or under a block that was lifted since, is collected without a new spending-limit pause.

Fixes in the Translation Editors and Translation Jobs

  • A translation job is no longer refused with "Missing or wrong data: target" when a field holds only punctuation, symbols or shortcodes.
  • When a delivered translation leaves one text without a translation, the rest of the translation is applied, that text keeps its original, and the job log names it.
  • A Gravity Forms or other string package job opens in WPML's translation editor, never in a post that has the same ID, so its translations are no longer lost.
  • A string package's translation job no longer includes the image texts of a post that has the same ID.
  • When a translation returns for a job that was cancelled, the refusal is now written to the job log.
  • The Classic Translation Editor saves again on servers that escape the separators between form fields, instead of answering "Permission denied".
  • Fields with no text are no longer sent to the Advanced Translation Editor, and a stored translation of such a field is kept.
  • The translation job log keeps the lines of cancels, editor opens, Classic Translation Editor saves and upgrades.
  • In the translation job log, an action started inside another one is nested under it, and the outer action's lines no longer disappear.
  • A translation job is no longer left unreadable when its texts fail to save.
  • Updating to WPML 5.x no longer switches sites that translate in the WordPress editor or the Classic Translation Editor to the Advanced Translation Editor.
  • A job in progress in the Advanced Translation Editor reopens with its work, also when its original changed.
  • Sending a translation again while its review is open, or editing a translation after its review closed, keeps it in the review queue.
  • A note for translators that contains "&" reaches the translation job intact.
  • Re-opening a completed translation in the Advanced Translation Editor a second time delivers the edit instead of failing.
  • Editing an original after a translation was opened in the editor and left unfinished rebuilds that translation job from the latest content.
  • Sending content to translation no longer fails with a server error when the XLIFF file for the notification email cannot be written.
  • A translation service error on one cancelled job no longer holds back the other cancellations, and you are told when a cancellation could not be completed.
  • A cancellation the translation service keeps failing on, while it answers other calls, is given up, so the "could not cancel" warning goes away. During a reconnect, the translation screens show one notice instead of two.
  • In the Advanced Translation Editor, the post title label and the group names such as "Main Content" follow the admin language.
  • A translation delivered for a page that was edited while the job was in progress is saved on the page, or marked as needing an update when a text changed too much.
  • A translation edited from the front end and completed in the Advanced Translation Editor is applied again. When a delivery fails, the page says why.
  • A re-sent field no longer splits at line breaks.
  • Re-sending a translation made in the Advanced or Classic Translation Editor no longer treats the previous translation as a WordPress editor edit.
  • A send stops when WPML cannot write the language record, instead of failing later with "send not confirmed".
  • A send to a translation service that stops partway no longer leaves its jobs stuck in progress.
  • The Advanced Translation Editor no longer opens a translation job that the translation service delivered long ago.
  • A Custom HTML block whose inline script contains a < sign no longer stalls its translation job.
  • Coming back from the Advanced Translation Editor no longer logs a PHP warning for a job the translation service no longer holds.
  • Collecting translations from a translation service goes on when one translation fails to save, and a save that stops the request is counted and named.

Fixes in Translation Management and the Translation Dashboard

  • The Translation Jobs list shows its jobs again on sites where it showed "No Data" with many pages of results.
  • In Translation Tasks, a scheduled translation is labelled Scheduled and a private one Private, instead of "Draft – Pending review".
  • The Translation Dashboard's engine switch dialog says when a switch to Private Translation Cloud was refused, instead of confirming it.
  • The engine switch dialog shows a failed save's message where you can see it.
  • Translation Tasks and the Translation Dashboard show the translated item's ID, and View opens the translation editor for post types without an edit screen, such as TablePress tables.
  • The manager email shows the words to translate for updated posts and string packages, not their full word count.
  • Sending content to translation yourself from the Translation Dashboard no longer fails with "WPML could not count the words in these items" when prices cannot be read.
  • An updated string counts the words added since its last translation, not 0, on the Translation Dashboard, in the cost estimate and in the manager email.
  • Translator capabilities stay consistent: setting language pairs updates the saved pairs, removing a translator releases their unfinished jobs, and new administrators can translate.
  • When the Advanced Translation Editor refuses a new Translation Manager, the screen shows why.
  • Choosing a Translation Manager or translator no longer times out on sites with many users, in Settings and in the setup wizard.
  • The translators table shows a plain-text summary for translators who have all language pairs, and works when there is only one translator.
  • The new-job email notification setting on a user profile appears and saves only for users who are translators or managers.
  • Translation Tasks shows a dismissible message with a link to hire an experienced translator to review translations.
  • The translation summary and overdue jobs emails to managers include strings sent from the Translation Dashboard.
  • The daily overdue jobs report is sent even when the translation service cannot be reached.
  • The Translation Dashboard lists held content that has not appeared on the site yet separately, with "Show them", and labels where strings were seen as "Appears on the site" or "Seen in the admin".
  • The Translation Dashboard no longer shows a misleading "Map to known languages" row, and tells languages that only support manual translation apart from languages treated as the same as the default.
  • The Title search in Translation Tasks and Translation Jobs also finds jobs by their translated title.
  • Translators who turned off new-job notifications no longer get the new-job email, and Send to translation no longer fails with an HTTP 500 error because of it on servers that cannot send mail.
  • The "already translated" box follows an edit made in another tab, and is offered for edited posts too.
  • A taxonomy ticked on the Translation Dashboard no longer counts as "not showing" on the bottom bar.
  • Translate myself says that the editor may start from a machine translation that uses your words, and how to clear it.
  • The status icon says "review in progress" while a translation is edited from its review page.
  • Translation Tasks lists your own jobs in progress first, and the Pages list offers to continue them.
  • Keyboard focus stays inside WPML's dialogs.

Fixes for Page Builders

  • Page builder texts are saved when a translation is delivered through WP-CLI, instead of the job completing with an empty translation.
  • Divi and other page builders: WPML keeps the "built with page builder" patterns of every configuration file, not only the last one.
  • WPBakery: the page preview shows the latest unsaved changes instead of an older revision.
  • Divi: pages migrated from Divi 4 to Divi 5 open in the Advanced Translation Editor with their existing translations.
  • Cornerstone: Translate Everything translates headers, footers, layouts and components.
  • Avada: forms are translated by Translate Everything on sites that ran an older WPML version.
  • Elementor: Translate Everything waits to translate templates until they appear on the site, and translates only the custom attributes visitors read.
  • Shortcode attributes declared as links in wpml-config.xml show the target page in the current language.
  • When a link changes on a page-builder page, its translations get the new link again, unless a translator changed that link by hand.
  • Elementor V4: the media of video elements (the video and its poster image) is translated.
  • WPBakery: a block-editor comment inside a shortcode no longer adds raw shortcode markup to the strings to translate.
  • Avada: with Media Translation, an image set with a size (for example "medium") shows the translated image and keeps its size.
  • Shortcode content made only of other shortcodes is no longer registered as a string to translate, while markup such as a video still reaches the translation job.
  • Pages built with shortcodes declared in a custom XML configuration get their shortcode texts translated when the translation job completes.
  • Elementor: a custom XML configuration entry for a widget such as the container adds to WPML's built-in settings instead of replacing them.
  • Elementor: the container link in the translation editor shows the name of its element.
  • In the Advanced Translation Editor, the image texts of WPBakery, Divi, Enfold and Avada elements show the right thumbnail.
  • WPBakery: translations keep the page's custom JS and editor settings, and duplicates point buttons and links to the translated pages.
  • WPBakery and other shortcode builders: links to a translated row or element id (#id) follow the translated id.
  • WPBakery: every grid on a translated page, masonry and media grids included, uses the translated grid template.
  • On sites with Divi and WPBakery, saving a WPBakery page with a chart, progress bar, button or gallery no longer stops with a PHP error.
  • WPBakery and other shortcode builders: a page whose content holds a block-editor comment gets its translation applied.
  • WPBakery: a translation delivered from the Advanced Translation Editor keeps buttons with a custom onclick action.
  • WPBakery: Post Grid and Media Grid pagination, load more, lazy loading and filters work on translated pages.
  • WPBakery: a translation edited in the front-end editor is kept, not overwritten by the next update from the original.
  • WPBakery: with Media Translation, Design Options background images of sections, rows and columns show their translated version.
  • WPBakery: the custom link of a Single Image points to the translated page, also on WPBakery 9, and plain links saved by older WPBakery versions stay links in the translation.
  • Elementor: texts of a widget with an empty dynamic-content setting reach the translation job again.
  • Enfold: a duplicate of a page links to the pages in its own language.
  • Page builders: translated shortcode attributes and ids are applied when the builder writes spaces around "=" (for example Tatsu Builder).
  • Beaver Themer: a translated layout keeps its translated visibility rules after every update of the translation.
  • Beaver Builder: visibility rules such as "post in category" or "post is this page" use the translated category or page, so modules no longer disappear on translations.
  • Beaver Builder: row and column backgrounds, callout and parallax images, background videos and video modules use the translated media.
  • Beaver Builder: more module texts reach the translation editor, such as subscribe form, pricing table, post carousel, popup, menu and box texts.
  • Beaver Builder: visitors see a translation updated in String Translation at once, with no manual cache clearing.
  • Beaver Builder: the edits-lost warning shows with the iFrame UI off too, and Save Draft on a translation counts as a manual edit.
  • Beaver Builder: a module deleted and added again keeps its translation.
  • Beaver Builder: the translation editor shows the images of photo and callout modules, and an unpublished Beaver draft of a translation is kept.
  • Beaver Builder: "Copy content from original" works on the add-translation screen and the copied links point to the translated pages.
  • Page builders: a duplicated page converts links written as a path, like /about/, and the Beaver Builder draft gets converted links too.
  • Elementor: in headers and footers, the menu name, the search button text and custom attribute values are translated.
  • Elementor: Loop Grid, taxonomy loops and the Posts widget use translated terms, posts and loop items, and the Posts meta separator is translated.
  • Elementor: translated popups keep the display settings of the original, and the editor of a translation shows the translated popup.
  • Elementor Pro forms: the server message, the second email's sender name, Slack and Discord texts and field default values are translated, and reCAPTCHA shows in the page's language.
  • Elementor: the Template widget shows the translated template in the editor of a translation.
  • Elementor: video URLs and URL fields inside repeater items are translated as links, and controls hidden by the widget's settings, such as the video link of a Media Carousel image slide, are no longer sent to translation.
  • Avada: a layout assigned to a category also applies to the translated category and to its translated posts and products.
  • Elementor V4: a translated page shows the styles of the translated component, also when it was translated before the component or duplicated.
  • Elementor V4 forms: emails sent from a translated page list the visitor's answers again, and broken translated form emails are repaired after the update.
  • Elementor V4: images given by URL, image and video overrides of components and container query links are translated.
  • Divi 5: modules shown only for a category or a post also show on the translated posts.
  • Divi 5: a text that mixes words with dynamic content keeps both the words and every dynamic item in the translation.
  • Divi 5: the Visual Builder shows the translated global module on a translated page.
  • Cornerstone: background images and their alt texts of sections, rows and columns are translated, also in headers, footers, layouts and their duplicates.
  • Cornerstone: a header, footer or layout with no translation in the current language shows the original, not another language's copy.
  • Cornerstone: saving the original in the builder updates its complete translations again.
  • Cornerstone: components and their parameters reach translation.
  • Cornerstone: every text and link of headlines, testimonials, images and tables reaches the translation editor.
  • Cornerstone: headers, footers and layouts keep their links after automatic translation, their styles refresh, the preview warns before edits are lost, and jobs show images.
  • Cornerstone: a style-only change keeps the translation complete.
  • SiteOrigin: translated layouts keep every backslash, such as in regexes, paths and code.
  • SiteOrigin: Image and Gallery widgets and row, cell and widget backgrounds use the translated images.
  • SiteOrigin: a background save of a translation counts as a manual edit, so a later update warns before it overwrites it.
  • SiteOrigin: the "Clone Page" tab lists only pages in the language of the page you edit, and the widget list no longer offers widgets WPML removed.
  • SiteOrigin: a duplicate keeps its layout, can be edited in SiteOrigin, and its links point to the duplicate's language.
  • SiteOrigin: widgets inside a Layout Builder widget, and widgets that move, keep their own texts and translations.
  • Cornerstone, Beaver Builder and SiteOrigin: translated pages store their content in the translated language, so search, excerpts, feeds, the REST API and SEO plugins read the translation.
  • Avada: editing a translated page no longer overwrites the global elements of other languages.
  • Avada: the fallback texts of dynamic data reach the translator.
  • Avada: when English is a secondary language, the English Global Options and String Translation stay in sync.
  • Avada: portfolio URLs work in every language after the permalinks are saved in any language, also when the portfolio slug is translated.
  • Avada and other shortcode builders: a duplicated page points button and other shortcode links to the duplicate's language.
  • Avada: a translated page that mixes blocks and an Avada layout keeps the layout of the original.
  • Avada: the Off Canvas list shows the language column, WPML styles load on Layout Sections, and Avada Live previews of translations, Post Cards included, show the translated content.
  • Elementor: the editor opens normally, not in Safe Mode, for posts whose permalink a plugin such as Premmerce Permalink Manager rewrites.
  • Elementor Pro: a lightbox opened from an image or link shows the translated picture.
  • SiteOrigin: links to posts in SiteOrigin Widgets Bundle widgets and widgets inside builder fields are translated.
  • Enfold: HTML entities typed in text and code blocks stay as typed in the translation.
  • Elementor: links to an Elementor Landing Page point to the translated landing page.
  • Divi 5: a canvas of a Theme Builder header or footer shows on translated pages, so Interactions that open it work again.
  • A WPBakery page that also uses an Elementor theme template sends its content to translation, not only its title.
  • Divi: with the profile language set to "Site Default", the Visual Builder opens in the site language on translated pages too.
  • Divi 5: saving a translation in the Visual Builder no longer changes, moves or deletes the original's off-canvas content and popups.
  • BeTheme: a translated header, footer or popup template shows in its language as soon as its translation completes.
  • Elementor Pro: a page that embeds a template with the [elementor-template] shortcode loads the translated template's styles.
  • WoodMart: a layout with no translation in the current language shows the original layout.
  • Divi 5 blocks: links, background images and product ids declared for the whole block family are translated together with each block's own settings.
  • Elementor: ids inside repeater items, such as WoodMart banner carousel images, point to the translated items.
  • Saving an Elementor template on a site with many languages no longer times out: the editor gets its answer before WPML registers the texts and updates the translations.
  • A page builder page translated automatically gets its translated images, also on PHP-FPM servers.
  • Divi 5: a local canvas (off-canvas content or a popup that belongs to one page) is translated with its page.
  • Divi 5: canvases of archives and the blog home stay in their own language, and a builder save on a translation no longer overwrites the original.
  • Divi: Theme Builder templates added after a translation apply in every language. WPMLSupport and WP-CLI repair sites that held one list per language.
  • Divi, WPBakery and Beaver Builder: visitors see published templates, layouts and saved modules translated.
  • Elementor V4: a page showing a template loads the translated template's styles.
  • Elementor and the Advanced Translation Editor: repeater item texts, such as accordion and tabs, are no longer wrapped in extra paragraph tags.
  • WoodMart: a label limited to products or categories prints on their translations.

Fixes for Blocks and the Block Editor

  • Links inside nested self-closing blocks are converted to the translation's language.
  • Links in a block nested in another block, such as navigation submenus and GenerateBlocks containers, are converted to the translation's language.
  • On block themes, a language without its own version of a customized template or template part uses the default language's version, then the original's, before the theme's file, the same way on the site and in the editors.
  • Block settings such as ids, classes, colours, image files and CSS values (for example in GenerateBlocks containers) are no longer sent to translation.
  • Fewer technical block defaults, such as px, % and _self, appear in String Translation.
  • No fatal error when BuddyPress Multilingual or another plugin cleans up an unused string package.
  • A YouTube or other embed translated in the Classic Translation Editor shows the video player, not a plain link.
  • The block editor's Language panel shows in the admin's language.
  • The block editor's Language and CMS Navigation panels have proper spacing, and the duplicate notice reads as one sentence.
  • The Language Switcher block no longer crashes in AppearanceWidgets and in the Site Editor on "All languages".
  • WPML's styles no longer change the look of other plugins' elements in the block editor, the classic post editor and the front-end review bar.
  • On WordPress 7.2, a double-quoted shortcode inside an HTML attribute stays out of the visual editor.

Fixes for the Language Switcher

  • Custom language switcher PHP templates are loaded only from WPML's own templates folder, the theme or child theme, or folders a plugin registers for scanning.
  • The Language Switcher block marks each language name with its language and each link with hreflang, for screen readers and accessibility checks.
  • Two language switchers on one page are announced to screen readers with different names.

Fixes for Categories, Tags and Other Taxonomies

  • When automatic translation of a category or tag fails, the job says why; an existing term in the target language with no translation link is used as the translation.
  • A term translation delivered with a regional code, such as en-us for en, is applied to the site's language instead of being refused.
  • A translated term name longer than WordPress allows is reported with its reason, and is not sent again until the name changes.
  • A term description written by a post's translation job keeps its HTML.
  • A post's translation job includes its categories' term fields whose names start with "_", such as SEO titles.
  • A term element no longer resolves to an unrelated term, which gave wrong hreflang links in the Yoast SEO sitemap.

Fixes for Menus

  • Saving a menu no longer removes all its items on sites where term IDs and term taxonomy IDs differ.
  • Users allowed to sync menus can open TranslationsMenus, the old Menus address leads there, and Translation Managers no longer get access errors when they sync menus.
  • Navigation menus are no longer duplicated on sites with Redis or another persistent object cache.
  • A menu imported with the WordPress importer keeps its page and category items.
  • Syncing menus keeps the "Automatically add new top-level pages" setting of each menu.
  • A translated WooCommerce or custom endpoint no longer breaks a longer endpoint that ends with the same word, which gave a 404 in that language.
  • On sites installed in a subfolder, saving a translated page (for example in Divi) no longer rewrites internal links to broken ?page_id= addresses.
  • Links to the current page with query parameters keep their address again when untranslated content is shown in the default language.
  • An untranslated root page shown in the default language no longer redirects to a page with the same slug deeper in the site.
  • With the language as a URL parameter, internal links in translated content keep their #anchor.
  • With a root HTML file, searches and REST API calls at the root URL reach WordPress. A root HTML file that cannot be loaded, or an unpublished root page, works as if no root page were set.
  • A link to a product category whose base is translated per language is converted in the translation.
  • Links in existing translations now point to pages that were translated later, also for content created before WPML was installed.
  • Translated category archives, WooCommerce product categories included, no longer redirect to themselves in a loop on hosts that limit large database queries.
  • The links WPML gives other tools for opening a translation in the WordPress editor are full addresses, so they no longer lead to a page not found.
  • Links in translated content to addresses another plugin serves, such as WP File Download links, are no longer replaced by an unrelated post's link.
  • Saving a translation no longer changes links to private pages into links to the original language.
  • With a root page and a directory for the default language, feed addresses with a query string, such as /?feed=rss2, lead to the site's feeds.

Fixes for Languages and the Setup Wizard

  • The setup wizard's Languages step saves again on a finished site that uses a different domain per language, instead of asking for a domain for English.
  • The setup wizard's Languages step marks a custom language with a regional code, such as zh-tw-x, as "Manual translation only" when automatic translation does not support it, as the cost step does.
  • A language the built-in list no longer offers, such as Amharic, can be added as a custom language.
  • When deleting a language's content is refused because it became the default language, the removal no longer stays marked as running.
  • Updating to WPML 5.x no longer replaces a custom language locale, such as German (formal), with a regional one, so String Translation keeps working for that language.
  • A setup wizard tab left open, or an older settings request, can no longer overwrite a finished setup.
  • Removing the last secondary language no longer sends a set-up site back to the setup wizard: WPML opens SettingsLanguages, and the Setup menu item shows only until setup is finished.
  • A language can no longer be mapped onto the site's default language, which made the Advanced Translation Editor translate into the source language; sites with such a mapping are repaired on update.
  • A language that still had an outdated locale from an old WPML version, such as Catalan or Urdu, gets the current locale once; a locale you chose yourself is kept.
  • A swapped mapping pair, such as en to fr and fr to en, is removed in one step.
  • A failed read of the active languages no longer replaces the stored list.
  • A set-up site no longer loses its setup state, and the Strings screen shows the setup notice.
  • A settings save no longer replaces a stored setting it could not read.
  • Yiddish and Dari are shown right to left.
  • Removing a former default language together with its translations no longer deletes content in the current default language.
  • On wide screens, the setup wizard's Back and Continue buttons stay next to the form.

Fixes for Registration and Updates

  • The site key is no longer cleared between admin logins, so the 'A New Site Key Is Required' notice stops coming back.
  • Multisite: a subsite with a different domain per language no longer sends its own address in site key checks, which could unregister the whole network.
  • Sites with a different domain per language no longer lose their site key when it is checked again in the background.
  • A sub-site made by duplicating another one presents its own address to the translation service.
  • Updating from WPML 5.x no longer stops with a "Class not found" error.
  • The Translation Management upgrade no longer runs on top of a core upgrade that is in progress.
  • A WPML plugin left incomplete by an interrupted update shows a notice instead of a fatal error on every request.
  • Updating from WPML 5.2.0 finishes on sites with very many Translation Priority entries, instead of running out of memory on every request. The new WP-CLI command wp wpml upgrade remove-translation-priority runs that clean-up at once.
  • A site key refused by an automatic check, such as the daily one, is kept and flagged instead of being removed. Refresh license in WPMLSupport removes it or restores the subscription.
  • Multisite: a subsite of a network with no WPML site key explains that the network uses one site key.
  • The "Renew your account" banner shown in the 30 days after your WPML account expires can be closed, and stays closed.

Fixes for WooCommerce Sites

  • A Copy custom field changed through the WooCommerce product API or WP-CLI is copied to the product's translations.
  • The product category shortcode lists the default-language products on translated pages when products use "display as translated".
  • A Cart or Checkout page template customized for a secondary language is used on that language's cart and checkout pages.

Fixes for Custom Fields and Advanced Custom Fields

  • A custom field row without a name no longer writes PHP deprecation notices on every term sync and post copy.
  • A translated custom field keeps its backslashes when the translation is saved.
  • Custom fields that hold ids inside a list convert the first item of the list too.
  • Copy custom fields whose value only looks serialized are no longer emptied or cut short in translations.
  • The "custom fields became translatable" notice lists each field once and drops fields set back to Don't translate.
  • A "Copy once" custom field deleted from a translation stays deleted instead of coming back on the next save.

Fixes for Media and Images

  • In the Media Library grid view, "Delete permanently" in the attachment window works again.
  • Media Translation's "Use a different file" and String Translation's language changes work for languages whose code has capital letters, such as de-AT.
  • Images whose address is percent-encoded in the content, such as file names with Japanese characters, are found, so each translation uses the image of its language.

Fixes for Posts and Pages

  • A root page that is a draft or in the Trash is listed in Pages and in the Trash again, the notice about it offers to restore it, and an unpublished root page no longer breaks the home pages and links.
  • "Connect with translations" no longer ticks "Make <language> the original language for this post" by default.
  • PostsAll Posts and the post editor no longer show a fatal error when WPML's translations table lost its keys; WPMLSupport offers a repair and a notice tells you about it.
  • "Overwrite with <language> content" asks for confirmation in a WPML dialog instead of the browser's.
  • The post editor always works in the post's own language, even when its link names another language.
  • A page whose first translation was cancelled can be connected with an existing translation again.
  • Adding the same translation from two tabs no longer removes the language of the first one; the second lands on the refreshed list with a warning.
  • On a new site, deleting a translated product, or an original of another type a plugin or theme adds, asks what to do with its translations, as it does for posts and pages.
  • The dialog that asks whether to delete the translations too links to the setting that answers it once for all deletes.

Fixes for Compatibility with Other Plugins and Themes

  • Avada: the theme options work again with WPML active on a Blog account, where the Translation Dashboard is not available.
  • Themes and plugins that ask WPML for the translation of a list of ids or a text value of content WPML does not translate, such as WoodMart product labels, get their value back unchanged.
  • Google XML Sitemaps: with the language as a URL parameter, the sitemap lists translated posts and pages with their translated slugs.
  • BetterDocs: category blocks and "BetterDocs Order" list the right categories and every translated doc on secondary-language pages.
  • WordPress 7.2: no more deprecation notices from numbered slugs or from the Classic Translation Editor.
  • Queries that use suppress_filters, such as Content Views lists, show the current language's posts when they filter by a category.
  • Query filters by category slug or name, such as the ACF Relationship field, work in secondary languages with Adjust IDs off.
  • Admin screens that load posts over the REST API with All languages selected, such as Avada's, list the posts of every language.

Fixes for Admin Screens and Settings

  • The WPML admin bar icon shows a green play icon while Translate Everything runs with nothing to do, and a red counter only when something needs your action.
  • Links from WPML's screens to wpml.org open the documentation page or section the screen describes.
  • More admin texts, such as language switcher style names and some buttons and messages, are shown in your admin language.
  • SettingsTranslators shows the XLIFF version in use, the old "Multilingual WordPress with WPML" footer credit is removed, and new sites no longer store unused settings.
  • The Page URL option under URLs and SEO shows for every admin language.
  • SupportClear cache also refreshes the list of translation services.
  • Clear cache in WPMLSupport also clears the site title and tagline translations and the caches of WPML CMS Navigation and ACF Multilingual.
  • WPML's debug information and the Support screen show the real MariaDB version instead of MySQL 5.5.5.
  • Admin screens no longer log an "Undefined array key" warning for requests without a login cookie, such as WP-CLI.

Fixes for Databases and Multisite

  • Multisite: a network site that has WPML's tables but has not finished the setup no longer queries the languages table on every request.
  • Multisite: a network site whose WPML tables are gone stops querying them on every request and tells its administrators.
  • The troubleshooting repair for element types now removes a translation record together with its status and jobs, leaving nothing broken behind.
  • When the database refuses a WPML table update, WPML fixes the common zero-date case itself; otherwise an admin notice shows the error and a Try again button, instead of translation jobs failing silently.
  • The unsolvable jobs table is created on older MariaDB and MySQL versions.

Other Fixes

  • The site's check-in with wpml.org reports sites that translate in the WordPress editor correctly.
  • No more "WP_User_Query::query was called incorrectly" PHP notice when WPML enables translator capabilities.
  • No more "Undefined array key 2" PHP warning when a plugin or theme checks a post capability without naming a post.
  • With a persistent object cache, comment and review lists show the comments of the current language.
  • The notice about custom Twig templates links to the section on PHP templates.

Update or Download

The update is available to all WPML clients with an active subscription — it appears on the Plugins page in your WordPress admin within 24 hours of release. You can also check for it right away under PluginsAdd New PluginCommercial. To download and install manually, go to Downloads in your wpml.org account (see the installation instructions) and remember to update all components together without mixing versions.

Need Help with This Release?

Ask a support question