Language Switcher
Multiple ways to let visitors switch languages, all fully accessible.

Gutenberg Block
Drop the PerfLocale Switcher block into any page, post, or widget area. Choose from inline, simple list, or dropdown display modes.

Shortcode and Nav Menu
Use the shortcode anywhere shortcodes are supported, or add languages directly to any WordPress navigation menu as automatic menu items.

Customization Options
Show or hide country flags, display names in native or current language, choose from size presets, and pick horizontal, vertical, or dropdown layouts.
Fully Accessible
Every switcher variant supports keyboard navigation, Escape to close, arrow keys to navigate, and screen readers announce the current and available languages. When View Transitions are enabled, the cross-document animation respects prefers-reduced-motion. See the dedicated Accessibility page for the full WCAG 2.1 AA story, axe-core release gate, ARIA listbox pattern details, and RTL support.
<!-- wp:site-title /-->
<!-- wp:perflocale/language-switcher -->
<!-- /wp:perflocale/language-switcher -->
# Toggle in Settings → Language Switcher:
[x] Auto-insert in FSE headers
# Or redirect to a different anchor:
add_filter( 'perflocale/switcher/auto_insert_anchor',
fn() => [ 'core/navigation', 'last_child' ]
);Block Hooks auto-insert (FSE themes)
On block themes, PerfLocale uses the WordPress Block Hooks API to drop the language switcher block right after the site title in your header — no manual placement required. Users running Twenty Twenty-Four, Twenty Twenty-Five, or any FSE theme that includes the Site Title block get a working switcher the moment they activate the plugin.
Per-context defaults: the auto-inserted block uses a compact dropdown display with a 16-pixel flag so it fits inside header bars without dominating them. Themes can retarget the insertion point (e.g. last child of the navigation block) via perflocale/switcher/auto_insert_anchor or override the per-context attrs via perflocale/switcher/auto_insert_attrs. Setting toggle lets operators opt out entirely.