Lifetime license back for a limited time  →

Overview

Phox Translate turns a Breakdance, Oxygen or Bricks site into a multilingual site. It translates your pages, headers, footers, templates, popups, products, menus and SEO with DeepL or OpenAI, and creates real WordPress pages you can edit like any other.

The core idea: every translation is an ordinary WordPress post, linked to its source. There's no proxy, no cloud dashboard and no shortcode soup. Visitors on a translated page get a fully translated experience: the header, footer, templates and popups all swap to their translated variants automatically, post loops show only that language, menus and category labels follow along, and the site locale switches so even WooCommerce checkout strings match.

Site-wide wizard

Audits everything, estimates the cost, then translates the whole site in the background.

33 languages

DeepL or OpenAI with your own API key. You pay provider rates directly, with no markup.

The whole shell

Headers, footers, templates, popups and global blocks all render in the visitor's language.

SEO built in

hreflang tags, translated slugs and translated SEO meta. Real indexed pages, no cloaking.

New in 3.3.0

Full Bricks support — Bricks pages and templates translate, and headers, footers and templates swap language just like Breakdance — plus navigation-menu translation, so menu item links and labels follow the current language automatically. See Page builders and Navigation menus.

One plugin, every builder

Phox Translate detects the active builder each request and adapts automatically — Breakdance, Oxygen (Breakdance in Oxygen mode) and Bricks are all supported, and plain WordPress post content, SEO meta and custom fields are translated even without a builder. The language switcher is available as a shortcode and template tag everywhere, and as a native element in Breakdance and Bricks.

Requirements & installation

RequirementMinimum version
WordPress6.0 or newer
PHP7.4 or newer
Page builderOptional, recommended. Breakdance (tested with 2.8), Oxygen 6+, or Bricks
A DeepL or OpenAI accountFor the API key
  1. Install the plugin. In WordPress go to Plugins → Add New → Upload Plugin, choose the phox-translate.zip file and click Install Now.
  2. Activate it. A new Phox Translate item appears in the main admin menu.
  3. Add your API key. Open Phox Translate → Provider, choose DeepL or OpenAI, paste your key and click Test Connection.
  4. Choose your languages. On the General tab set your default language and tick your target languages.
Permissions

Settings, globals and the wizard require the Administrator capability (manage_options). Translating an individual page from its edit screen requires edit rights on that specific post.

Quick start: your first translation

Let's translate one page into French, end to end.

  1. Configure once. On Phox Translate → General, set your default language (e.g. English) and tick French as a target. On the Provider tab add your API key and test the connection.
  2. Open any page in the WordPress editor. In the sidebar you'll find the Phox Translate box listing your target languages.
  3. Click Translate Page. A new French page is created as a draft, linked to the original, with the builder layout intact and every text element translated. The box shows an Edit link per language.
  4. Review and publish. Open the draft in the builder if you want to tweak anything, then publish it. Its URL will be /fr/page-name.
  5. Add the switcher. Drop the Language Switcher element into your header (search the Breakdance or Bricks element panel), or use the [phox_language_switcher] shortcode. Visitors can now hop between languages.

When you're happy with how one page behaves, use the site-wide wizard to do the whole site in one run.

The admin interface

Everything lives under the Phox Translate top-level menu, organised into six tabs:

TabWhat you configure
GeneralDefault language, target languages, URL style, which post types are translatable, and flag overrides for the switcher.
ProviderDeepL or OpenAI, your API key and a connection test.
GlobalsHeaders, footers, global blocks, templates and popups (or Bricks templates), with per-language status and one-click translate buttons.
WizardThe site-wide translation flow: audit, options, confirm, progress.
AdvancedThe text-key whitelist, HTML preservation, and the SEO / custom fields / WooCommerce toggles.
LicenseActivate your license for updates and the wizard.

In the post lists (Pages, Posts, any enabled type) you also get a Language column and a language filter dropdown, so it's always clear which version of a page you're looking at.

Languages & URLs

Default and target languages

The default language is the language your content is written in. Target languages are the ones you translate into; 33 are supported, covering everything DeepL offers plus additional languages via OpenAI.

URL style

StyleExampleHow it works
Prefix (default)/fr/aboutHierarchical types (pages) are placed under a hidden per-language parent, so URLs read like folders. Non-hierarchical types (posts) get a language suffix on the slug.
Suffix/about-frThe language code is appended to every translated slug.

Slugs themselves are translated: an English page at /landscaping becomes /fr/amenagement-paysager, not /fr/landscaping. For languages that don't romanise cleanly (Japanese, Arabic, Russian and so on) the original slug is kept so URLs never come out empty.

Language hub pages

Prefix mode creates one hidden "hub" page per language (slug fr, de, etc.) to act as the URL parent. Hubs are noindexed, excluded from search and hidden from listings; they exist purely to build the URL structure.

Post types

Choose which public post types are translatable. Pages and posts are enabled by default; add WooCommerce products or any custom post type from the same list. Your builder's own template post types are handled on the Globals tab, so they never appear here (which would translate them twice).

Flag overrides

For languages spoken in several countries, choose which flag the switcher shows: 🇺🇸 or 🇬🇧 for English, 🇧🇷 or 🇵🇹 for Portuguese, and so on.

Translation providers

You bring your own API key and pay the provider directly. Typical cost is pennies per page.

ProviderBest forNotes
DeepLEuropean languages, best-in-class qualityFree keys (ending :fx) and Pro keys are auto-detected and routed to the right endpoint. The free tier includes 500,000 characters per month.
OpenAIBroadest language supportUses GPT-4o-mini with a translation-tuned prompt. Slightly cheaper than DeepL Pro at typical volumes.

Enter the key on the Provider tab and click Test Connection; DeepL responses include your current usage against your quota.

Key storage

API keys are stored encrypted (AES-256 with a per-encryption random IV, keyed off your site's auth salt), never in plain text. The key is write-only in the UI; the field shows a mask once one is saved.

HTML preservation

Rich text often contains inline HTML (links, bold, line breaks). With Preserve HTML on (the default), DeepL is instructed to translate only text nodes, and OpenAI is prompted to leave tags untouched, so your markup survives translation intact.

Page builders

There's nothing to configure — Phox Translate detects your active builder on every request and adapts how it reads content and swaps globals. One plugin covers all of the following:

BuilderHow it's handled
BreakdanceReads the single Breakdance element tree; swaps headers, footers, templates, global blocks and popups through Breakdance's own controller at render time.
OxygenOxygen 6+ is Breakdance running in Oxygen mode — the same engine, with Oxygen's meta keys and post types resolved automatically.
Bricks NewReads Bricks element arrays (a template's header, content and footer areas are read and written separately); swaps active header/footer/section/content/popup templates through the bricks/active_templates filter.
Core WordPressTitle, slug, excerpt, content, SEO meta and custom fields are translated even without a builder, so classic and Gutenberg content works too.
How globals swap per builder

On a translated page the whole shell must switch language. Breakdance and Oxygen do this by swapping post IDs inside Breakdance's ThemelessController before rendering; Bricks does it through its native bricks/active_templates filter. In both cases translated templates have their own display conditions removed at translation time, so they never compete with their sources — the language swap selects them explicitly.

License

Enter your license key on the License tab and click Activate. An active license enables plugin updates and unlocks the site-wide wizard. Translating individual pages and globals works without a license, so you can evaluate the plugin fully before committing to a bulk run.

Single pages & posts

Every translatable post gets a Phox Translate meta box in its editor sidebar showing:

  • The post's language, and its source if it is itself a translation.
  • Existing translations with their publish status and edit links.
  • Checkboxes for each missing language and a Translate Page button.

Translations are created as drafts so you can review before anything goes live. The whole builder layout is carried over; only the text changes. Internal links in the content are rewired to the translated versions of the pages they point at, wherever those exist.

Updating a translation

Once a translation exists, translating again skips it by default (your manual edits are safe). To re-translate after changing the source, use the wizard with Overwrite existing translations ticked, or the Re-translate button on globals. Overwriting replaces the translated content, title, slug and excerpt with a fresh translation of the current source.

Headers, footers, templates & popups

The Globals tab lists every global your builder exposes: on Breakdance/Oxygen that's headers, footers, global blocks (components), templates and popups; on Bricks it's every template in the Bricks template CPT (headers, footers, sections, content and popups). Each row shows a status dot per target language (with draft states flagged), plus Translate and Re-translate buttons.

Translated globals are always published (they're never viewed standalone, and the builder's own managers only list published items). On the front end the correct variant is swapped in at render time based on the page's language, so:

  • A French page renders the French header, footer and any matching templates (blog layouts, archives, search results, 404).
  • Popups render in French too, whether they fire automatically or from a button, link, form action or interaction.
  • Global blocks used as post loop card templates swap as well, so loops on translated pages use the translated card design.
Order matters less than you'd think

If you translate a header before the pages it links to exist, don't worry: after every wizard batch the plugin re-runs its link and reference fix-ups across all translations, so menus, buttons and popup references end up pointing at the right language.

The site-wide wizard

The wizard translates your entire site in one guided flow. It requires an active license, a configured provider key and at least one target language; it will tell you (with links) if anything's missing.

  1. Audit. The wizard scans every enabled post type plus all globals, taxonomy terms and navigation menus, and reports totals, untranslated counts and character counts per type.
  2. Select. Untick any content type, or expand a type to exclude individual pages. Taxonomy terms and navigation menus have their own include toggles.
  3. Options. Choose the target languages for this run, whether translations are created as drafts or published immediately, whether existing translations are overwritten or skipped, and an optional delay between API requests.
  4. Confirm. A summary shows the exact number of jobs, estimated characters and an estimated cost for your chosen provider, before a single API call is made.
  5. Run. A progress bar tracks every job. You can watch it, or click Run in Background and close the tab; processing continues server-side via WP-Cron, and reopening the Wizard tab resumes the progress view automatically.
  6. Finish. The completion screen lists anything that failed (with the reason and a one-click Retry Failed Items), and walks you through next steps: review drafts, add the language switcher, check the Globals tab.

How the batch behaves

  • Without Overwrite, only missing languages are queued per item, so the job count always matches the estimate and nothing you've edited is touched.
  • A database lock guarantees each job runs exactly once, even with the tab open and cron running together.
  • Each job is only removed from the queue once it succeeds, and memory limits are raised for large pages — so a page big enough to exhaust resources simply retries on the next tick rather than saving blank. After three failed attempts a job is logged and skipped so it can never block the queue.
  • After the last job, the plugin re-runs URL and reference fix-ups across all translations so cross-links, global block references and popup references all point at the right language.

Taxonomy terms

Categories, tags and WooCommerce attribute terms are translated with a display-only overlay. Term names and descriptions are translated once (as part of a wizard run) and stored as term meta; on the front end, pages in another language display the translated name while the term itself keeps its ID, slug and taxonomy.

This design is deliberate: because nothing is renamed in the database, queries can't break. Builder query controls, tax queries, Phox Facets filters and archive URLs all keep matching against the real values, while visitors see translated labels on cards, archives, facets and product pages.

Translated posts also carry the same term assignments as their sources, so category archives and filtered loops return the right posts in every language.

Editing term translations

Every translated name is editable by hand. Open the term's edit screen (e.g. Posts → Categories → Edit) and you'll find a Phox Translate section with a name field per target language (and a description field where relevant). Empty a field to fall back to the original name. Note that re-running the wizard's term pass with Overwrite replaces manual edits with fresh machine translations.

Scope

The overlay applies on the front end only. wp-admin, the block editor and REST responses always see the original names, so editing is never confusing.

Classic WordPress menus (built under Appearance → Menus) sit outside the builder tree, so — like taxonomy terms — they're translated as a display overlay, with nothing duplicated. Menu item IDs and structure are never touched; only the URL and label a visitor sees are swapped at render time.

  • Links follow the language. A menu item pointing at a page or post automatically resolves to that page's translation on a translated page. Custom links are matched against the internal link map and swapped when the target has a published translation.
  • Labels translate too. Item labels are translated once (a wizard step, via the include menus option) and stored as item meta. Where a label simply matches the linked page's title, it falls back to the translated title automatically, with no per-item setup.
  • Editable per item. Each menu item on the Menus screen gains a Phox Translate labels field per target language, so you can override any label by hand. Empty a field to fall back to the original.
Same menu, every language

You keep a single menu in Appearance → Menus — there's no need to build one menu per language. The overlay rewrites it on the fly for whatever language the current page is in.

What gets translated

For each post, the plugin translates:

  • The builder tree: every text-bearing property across the element library — headings, rich text, buttons, form labels, placeholders, submit and success/error messages, login form strings, FAQ questions and answers, slider labels, counters, image alt text and ARIA labels. The whitelist ships tuned for both the Breakdance element library and Bricks element keys.
  • Post basics: title, slug (translated naturally, then sanitised), excerpt and post content.
  • SEO meta: Yoast and RankMath titles and descriptions. Source-language SEO values are never copied verbatim onto translations.
  • Custom fields: ACF and Phox Studio text, textarea and WYSIWYG fields, including repeater and group sub-fields.
  • WooCommerce products: custom attribute names and values, and purchase notes. Taxonomy-based attributes are handled by the term overlay.

Alongside the text, the plugin also rewires references inside the copied layout: internal links point at translated pages, global block IDs point at translated global blocks, and popup references point at translated popups.

Custom elements

Text is extracted by property key against a whitelist. If a third-party element stores text under an unusual key, add that key on the Advanced tab and re-translate. The diagnose endpoint shows exactly which keys a page exposes.

The language switcher

The switcher lets visitors change language. One renderer powers four ways of placing it, with identical markup and styling:

MethodWhere
Breakdance elementSearch "Language Switcher" in the Breakdance element panel. Typically placed in the header.
Bricks element NewSearch "Language Switcher" in the Bricks element panel.
Shortcode[phox_language_switcher] anywhere shortcodes work: Gutenberg, widgets, classic editor.
Template tagpt_language_switcher() in theme files.

Options

OptionValuesShortcode attribute
Display styleDropdown, inline links, flags only, flags + textstyle="dropdown"
Flag styleRectangle, circle or noneflags="rectangle"
Show current languageOn / offshow_current="1"
Untranslated pagesLink to that language's homepage, or hide the languagemissing="home"

Smart fallbacks

If the current page has no translation in a given language, the switcher doesn't dead-end. By default it links that language to its translated homepage, so the visitor still lands in a fully translated shell. Fallback links carry a --fallback CSS class if you want to style them differently. A language with no page translation and no translated homepage is simply omitted.

// Shortcode examples
[phox_language_switcher]
[phox_language_switcher style="flags"]
[phox_language_switcher style="inline" show_current="0" missing="hide"]

How pages are served

When a visitor lands on a translated page, several things happen automatically:

  • Globals swap. The header, footer, matching templates and popups are exchanged for their translated variants before rendering — via Breakdance's controller, or the bricks/active_templates filter on Bricks.
  • Queries are scoped. Archives, search results and post loops for translatable post types only return posts in the current language. On default-language pages, translated variants are hidden. Loops can opt out with the pt_skip_lang_filter query var.
  • The locale switches. The plugin calls switch_to_locale() to match the page language, so WordPress core, WooCommerce and other plugins render their own strings (checkout, dates, validation messages) in the right language, provided the relevant language packs are installed.
  • Terms & menus overlay. Category, tag and attribute names, and navigation menu labels and links, all display in the current language.
  • Search stays in language. Search forms on translated pages carry a language marker, so results and the search results template stay in the visitor's language, including Phox Elements search bars with facet parameters.
  • Facets stay in language. Phox Facets refreshes are language-scoped, so filtered loops, counts and ranges match the page's language.

SEO

  • hreflang. Every published page in a language group outputs <link rel="alternate" hreflang="…"> tags for its siblings, plus x-default pointing at the source language.
  • Translated SEO meta. Yoast and RankMath titles and descriptions are translated; canonical URLs and source-language values are never duplicated onto translations, avoiding duplicate-content signals.
  • Clean URLs. Prefix (/fr/page-name) or suffix (/page-name-fr) structures, with translated slugs.
  • Hub pages are noindexed and kept out of search and listings.
  • Real pages. Because translations are ordinary posts, they're crawled and indexed like any other page. No JavaScript translation, no cloaking.

Advanced settings

SettingPurposeDefault
Text keys to extractThe whitelist of builder JSON property keys treated as translatable text. Tuned for the full Breakdance element library and Bricks element keys out of the box; extend it for third-party elements.~90 keys
Preserve HTMLKeep inline markup intact during translation.On
Translate SEO metaYoast / RankMath titles and descriptions.On
Translate custom fieldsACF and Phox Studio fields, including repeaters and groups.On
Translate WooCommerceProduct attributes and purchase notes.On
Careful with keys

Only add keys that hold visible text. Keys like value, url or name often hold identifiers; translating them can break form submissions or queries. When unsure, use the diagnose endpoint to see exactly what the parser extracts from a page.

Automatic key upgrades

When you update the plugin, newly supported text keys are merged into your saved list automatically, so support for new elements arrives without you re-editing this field. Keys you deliberately removed stay removed.

Repairs & self-healing

Opening the Globals tab doubles as a repair pass. Each visit silently runs a set of idempotent fix-ups (they write only when something is actually wrong):

  • Publishes any global translation stuck as a draft.
  • Repairs builder meta on translated posts (template settings, conditions) if a copy was ever corrupted, and strips display conditions from translated Bricks templates.
  • Re-copies taxonomy term assignments from sources to translations.
  • Re-runs the global block / popup ID swap and the internal URL swap across every translation.
Rule of thumb

If anything ever looks out of sync after an update (a missing popup, an English link on a translated page), open the Globals tab once and re-check. It's the first thing support will ask you to do.


Data model

Translations are ordinary posts of the same post type as their source, linked by post meta. Nothing is stored outside your database, and deactivating the plugin leaves every translated page in place.

WhereKeyHolds
Any post_pt_languageThe post's language code (set on sources once they have a translation).
Source post_pt_translationsMap of lang => post ID for its translations.
Translated post_pt_sourceThe source post's ID.
Translated global_pt_is_global_translationMarks headers/footers/templates/popups/blocks so they're excluded from the builder's condition matching.
Hub page_pt_language_hubMarks the hidden per-language URL parent.
Term_pt_name_{lang} · _pt_desc_{lang}Translated term name / description for the display overlay.
Nav menu item_pt_menu_label_{lang}Translated menu label for the overlay.
Optionsphox_translate_settingsAll plugin settings (the API key inside is encrypted).
Builder content

The translated layout is written back in the active builder's own format — _breakdance_data (or _oxygen_data), or the Bricks area keys _bricks_page_header_2 / _bricks_page_content_2 / _bricks_page_footer_2. The plugin invalidates the builder's CSS and dependency caches whenever it writes, so styles regenerate from the translated content.

REST API

Endpoints live under the phox-translate/v1 namespace.

MethodRouteAccessPurpose
POST/translateedit_post on the targetTranslate one post into one or more languages: { post_id, languages: [] }.
POST/wizard-auditAdmin + licenseRun the site audit and return the manifest.
POST/wizard-startAdmin + licenseQueue a batch. Items are derived server-side; the client sends only languages, options and exclusion filters.
GET/wizard-progressAdmin + licenseReport batch progress; each poll also processes one queued job.
GET/batch-errorsAdminThe recent batch error log.
GET/diagnose/{post_id}AdminDump a post's builder data structure and exactly what the parser extracts, including the detected builder mode and content key. Invaluable when tuning text keys.
GET/translation-urls/{post_id}PublicPublished translation URLs for a post (powers external switcher integrations).

Builder facade

All builder differences are resolved by a small facade of functions in phox-translate.php. Everything else — linking, hreflang, query scoping, the switcher, terms, menus and the wizard — is builder-agnostic and sits on top of it. Supporting a new builder (Elementor, Divi, etc.) is mostly a matter of implementing this seam.

FunctionReturns
pt_builder_mode()'breakdance' | 'oxygen' | 'bricks' | 'none'
pt_builder_meta_prefix()The builder's post-meta prefix (e.g. _bricks_).
pt_builder_global_types()[ post_type => label ] for the builder's globals (feeds the Globals tab and auditor).
pt_builder_content_keys( $post_id )The content-area meta keys for a post (a Bricks template returns three; Breakdance/Oxygen return one).
pt_builder_get_content( $id, $key )One content area decoded to a PHP array.
pt_builder_save_content( $id, $key, $data )Write one area back in the builder's native format.
Content areas

Breakdance/Oxygen keep one tree per post; a Bricks template keeps up to three (header, content, footer). During extraction each string's path is prefixed with its area key so it routes back to the right area on reinsert. A single-tree builder just returns one key and rides the same loop.

Hooks, query vars & template tags

Template tags & helpers

// Echo the language switcher anywhere in a theme.
pt_language_switcher( [ 'display_style' => 'inline' ] );
// Current page language ('fr') and the site default ('en').
$lang    = pt_get_current_page_language();
$default = pt_get_default_language();
// Published translation URLs for a post: [ 'en' => url, 'fr' => url ].
$urls = pt_get_translation_urls( $post_id );

Filters

// Change the locale used on translated pages (default maps 'fr' to 'fr_FR' etc).
add_filter( 'pt_switch_locale', function ( $locale, $lang ) {
    return $lang === 'fr' ? 'fr_CA' : $locale;
}, 10, 2 );

Query vars

VarEffect
pt_filter_langSet on a custom WP_Query to opt in to language filtering.
pt_skip_lang_filterSet on a query to opt out of language filtering entirely.
pt_lang (URL param)Marks the request language on URLs with no queried object, such as search results. Added to search forms automatically.

Troubleshooting

The wizard button is greyed out

The wizard needs an active license, a working provider key and at least one target language. Warnings above the button link to whichever tab needs attention.

A translated global isn't showing in the builder's own manager, or a translated page shows an English popup / link / card

Open the Globals tab once. It runs the full repair pass, which fixes stray drafts, re-points references and re-swaps URLs across all translations. Then hard-refresh the front end.

A translated Bricks page or template renders blank

The content saved empty. Call the diagnose endpoint on the source — all_string_leaves_count shows whether there's text on the key being read. Remember a Bricks template keeps its text in the header/footer/content areas, not a single content key.

A loop or archive shows posts from both languages

Language scoping applies to queries for the post types enabled on the General tab. Check the post type is ticked there, and that the loop's query targets that type explicitly. A custom query can opt in with pt_filter_lang.

Checkout or date strings are still in the default language

Locale switching relies on WordPress language packs. In Settings → General, temporarily switch the site language to the target language once; WordPress downloads the core (and WooCommerce) translation files, after which you can switch back.

Some element text wasn't translated

The element probably stores that text under a property key not in the whitelist, common with third-party elements. Call the diagnose endpoint for the page, find the key holding your text in all_string_leaves_sample, add it to Text keys on the Advanced tab, and re-translate with Overwrite.

Menu links or labels are still in the default language

Confirm the linked pages have published translations, and run the wizard's include menus step (or set per-item labels on the Menus screen). Custom links are matched by URL, so they translate only once the target page has a published translation.

The batch seems stuck

Background progress relies on WP-Cron, which advances when the site gets traffic. Reopen the Wizard tab: every progress poll also processes a job and re-arms the background worker. Persistent failures appear on the completion screen with reasons and a retry button; the most common cause is an exhausted provider quota.

The switcher renders nothing

The switcher needs at least two languages with somewhere to link. Check target languages are configured and the homepage is translated (it's the fallback target for untranslated pages).

FAQ

Which builders are supported?

Breakdance, Oxygen (6+) and Bricks are detected automatically, and plain WordPress content is translated too. On a vanilla site you still get post/SEO/custom-field translation, language-scoped queries, hreflang and the shortcode switcher. With a builder you add full element-tree translation and automatic header/footer/template/popup swapping.

Can I edit a translation by hand?

Yes, that's the point. Translations are ordinary posts; open them in the builder or the editor and change anything. Manual edits are preserved unless you deliberately re-translate with Overwrite.

What does it cost to translate my site?

Whatever your provider charges, nothing more. The wizard shows a character count and cost estimate before starting. DeepL's free tier (500,000 characters per month) covers a typical small site in full.

What happens if I deactivate the plugin?

Every translated page remains published at its URL. You'd lose the automatic global swapping, query scoping, hreflang and switcher until you reactivate, but no content is ever removed.

Will translated categories break my product filters?

No. Term translation is a display overlay; IDs, slugs and taxonomies are untouched, so queries, facets and archives keep working exactly as before. Menu translation works the same way.

Do I need a separate menu per language?

No. Keep a single menu in Appearance → Menus — Phox Translate overlays translated labels and links per language automatically.

Can search work per language?

Yes. Searches made from a translated page carry a language marker, return results only in that language, and render through the translated search results template.

Is my API key safe?

It's stored encrypted with a random IV per encryption, never displayed back in full, and only ever sent to your chosen provider over HTTPS.

Changelog

3.3.0

New

  • Bricks support. Bricks is detected automatically alongside Breakdance and Oxygen. Bricks pages and templates translate — including a template's separate header, content and footer areas — and headers, footers, sections and popups swap language on the front end through Bricks' native bricks/active_templates filter.
  • Bricks language switcher element. A native "Language Switcher" element for the Bricks builder, sharing the same renderer and options as the Breakdance element and shortcode.
  • Navigation menu translation. WordPress menu item labels and links follow the current language via a display overlay — a single menu serves every language. Labels are translated as a wizard step and stored as item meta, with an editable field per language on the Menus screen; links resolve to each target's translation automatically.

Improved

  • The site audit and wizard now include navigation menus as their own optional step, with character counts folded into the cost estimate.
  • The text-key whitelist gained Bricks element keys (subtitles, option labels, separator and submit-button text, marker and info text, price prefixes/suffixes, ribbon text and more), merged into existing installs automatically.
  • Translated templates have their display conditions stripped per builder (Breakdance condition removal and Bricks templateConditions), so a translated template never competes with its source.
  • The Globals tab repair pass now also re-strips Bricks template conditions when it re-copies builder meta.

Fixed

  • Bricks content is written back with correct slashing, so translated Bricks pages and templates stay valid and keep appearing in Bricks' own template manager.
  • Front-end query scoping, term overlays and facet refreshes now resolve language correctly under Bricks as well as Breakdance/Oxygen.

3.0.0

New

  • Taxonomy term translation. Categories, tags and attribute names display translated via a safe overlay that never touches slugs or queries, with per-language fields on the term edit screens for manual polish.
  • Language switcher everywhere. New [phox_language_switcher] shortcode and pt_language_switcher() template tag alongside the Breakdance element, all sharing one renderer.
  • Smart switcher fallbacks. Untranslated pages link to that language's homepage instead of showing "no translations", with a per-element choice to hide the language instead.
  • Popup support. Breakdance popups are audited, translated and swapped per language, including popups opened from links, forms and interactions.
  • Locale switching. Translated pages switch the WordPress locale so WooCommerce and core strings follow the page language.
  • Language-aware search. Searches from translated pages return results in that language through the translated search results template.
  • Wizard upgrades. Preflight configuration checks, per-type and per-item selection, provider-aware cost estimates, background resume when reopening the tab, a completion screen with per-item errors and one-click retry, and taxonomy terms as an optional batch step.
  • Top-level admin menu with a translation icon.

Improved

  • Massively expanded text coverage: form messages, login strings, image alt text, ARIA labels, FAQ answers, sliders, counters and more, merged into existing installs automatically.
  • Translated posts now carry their source's taxonomy term assignments, so archives and Phox Facets filters work in every language.
  • Post loops and archives are language-scoped on initial render, matching facet refreshes.
  • Global blocks used as post loop card templates swap per language, and internal URL rewiring covers custom link keys such as header logo links.
  • SEO meta, custom fields and WooCommerce translation are now on by default.
  • The Globals tab acts as a one-click repair pass for statuses, references, term assignments and URLs.

Fixed

  • Translated globals no longer disappear from Breakdance's template and popup managers.
  • Copied Breakdance meta (template settings, conditions) survives intact; existing installs are repaired automatically.
  • Translated templates no longer compete with their sources in Breakdance's condition matching.
  • The switcher element renders correctly in the builder when settings change.
  • Overwrite mode re-translates excerpts; the excerpt is no longer skipped.

Security

  • Per-post capability checks on translation endpoints, license checks on all wizard endpoints, server-derived wizard job lists, stronger API-key encryption with per-encryption IVs, and draft URLs removed from the public translation-URLs endpoint.
Phox Elements contains 130+ unique elements for Breakdance...with more to come

I'm a cat. This is a breakdance popup