Skip to content
multilify

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=tr

The default language keeps WordPress' own prefix-free URLs, so every post has a single canonical address.

  1. 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.

  2. 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.

  3. 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.

  1. Add your languages

    Pick the languages you publish in from the settings screen. Each one gets a URL prefix.

  2. Translate the content

    Write each translation in the editor you already use, in the panel on the post itself.

  3. Show the switcher

    Drop the shortcode into a post, or call the template tag from your theme.

Add a language, give it a prefix, and every post gains a translation field for it. Then the same entry answers at one address per language.

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