One postEvery language
Each translation is stored in the post's own meta under its language code, so there is one post and it carries all of its languages with it.
A translation is not a second post.
in most plugins
The post is cloned once per language. Five languages means five posts to keep in step, five sets of meta, and five things to forget when you edit one of them.
here
Nothing is cloned. Every language version sits in the original post's meta, keyed by language code, and one set of rewrite rules resolves each localized address back to it.
One post, four addresses
The whole design is two ideas, and everything else follows from them.
^tr/([^/]+)/?$→index.php?name=$matches[1] &lang=trThe default language keeps WordPress' own prefix-free URLs, so every post has a single canonical address.
Translations live on the post
Every language version is stored in the original post's meta, keyed by language code. There is one post, and it carries all of its translations with it.
A localized URL comes in
A visitor asks for the Turkish address. Nothing has been duplicated, so there is no second post to look up and no pair to reconcile.
Rewrite rules resolve it
Per-language rewrite rules point the localized URL back at the original post, and the stored translation for that language is what gets rendered.
Three steps
From an English-only site to a translated one.
Add your languages
Pick the languages you publish in from the settings screen. Each one gets a URL prefix.
Translate the content
Write each translation in the editor you already use, in the panel on the post itself.
Show the switcher
Drop the shortcode into a post, or call the template tag from your theme.
What it does
Six things, named for what each one touches.
Unlimited languages
Add as many as you need. There is no tier that caps the count.
settings
Custom slugs per language
Set a distinct, translated slug for every language version of a post, nested pages included.
the URL
One cached lookup
The slug lookup is object-cached and indexed, and the cache is dropped when a slug changes.
the query
Stays on your server
No third-party translation API, no outbound calls, nothing to sign up for.
the network
hreflang and lang
Alternate tags with x-default, a lang attribute that follows the page, and a Content-Language header to match.
the head
Gutenberg and Classic
The translation panels appear inside the editor you already use, on the post itself.
the editor
What it will not translate
Here, not after you install. Finding out then is too late.
Page builders that render from their own stored data, such as Elementor. Multilify translates what passes through
the_content, which covers the block editor and the classic editor.Menus and widgets. Post and page content only, for now.
WooCommerce prices, attributes and variations. Product titles and descriptions translate; the rest is WooCommerce's own data.
(of a translation) to stay on the server it was written on.
No translation API, no outbound request, no pro tier, nothing to sign up for.
wp plugin install multilify --activate