Title: Multilify
Author: kadirerman
Published: <strong>Tachwedd 18, 2025</strong>
Last modified: Hydref 3, 2026

---

Search plugins

![](https://ps.w.org/multilify/assets/banner-772x250.png?rev=3725915)

![](https://ps.w.org/multilify/assets/icon-256x256.png?rev=3725915)

# Multilify

 Gan [kadirerman](https://profiles.wordpress.org/kadirerman/)

[Llwytho i lawr](https://downloads.wordpress.org/plugin/multilify.1.5.1.zip)

 * [Details](https://cy.wordpress.org/plugins/multilify/#description)
 * [Reviews](https://cy.wordpress.org/plugins/multilify/#reviews)
 *  [Installation](https://cy.wordpress.org/plugins/multilify/#installation)
 * [Development](https://cy.wordpress.org/plugins/multilify/#developers)

 [Cefnogaeth](https://wordpress.org/support/plugin/multilify/)

## Disgrifiad

**Multilify** is a lightweight yet powerful multilingual plugin for WordPress that
allows you to create and manage content in multiple languages with ease.

#### Key Features

 * **Unlimited Languages** – Add as many languages as you need
 * **Custom Slugs** – Set a different URL for every language, including nested pages
 * **hreflang Tags** – `rel="alternate"` tags in `<head>`, plus `x-default`, so 
   search engines index each language correctly
 * **Correct Page Language** – `<html lang>` and a `Content-Language` header follow
   the language being viewed
 * **Browser Language Detection** – First-time visitors land in the language their
   browser asks for; their own choice is remembered afterward
 * **Translation Progress** – The settings page shows how many entries each language
   still needs
 * **Flag Picker** – Choose a flag from a grid instead of hunting for the emoji
 * **Performance First** – Object caching on the slug lookup, with an index to match
 * **Visual Editor** – Translate content using the familiar WordPress editor
 * **Language Switcher** – Built-in switcher with flag-only or flag + name display
 * **Any Post Type** – Posts and pages out of the box, anything else through the`
   multilify_post_types` filter
 * **Shortcode & Template Tag** – Drop the switcher anywhere with `[multilify_switcher]`
 * **Developer Friendly** – Filters for the post type list, the translated title
   and content, the flag choices and the locale

#### Perfect For

 * Blogs and magazines
 * Business websites
 * E-commerce stores (works with WooCommerce)
 * Portfolio sites
 * Any WordPress site that needs multilingual support

#### Why Choose Multilify?

Unlike bloated translation plugins, Multilify focuses on performance and simplicity:

 * **Lightweight** – The switcher’s stylesheet is printed inline, and its script
   loads only where a switcher is shown
 * **Clean Database** – Efficient data storage with proper indexing
 * **No External Services** – All translations stored locally
 * **100% Free** – No premium features, no limitations
 * **Privacy Focused** – Your content stays on your server

#### How It Works

 1. Install and activate the plugin
 2. Add your languages from the Multilify settings page
 3. Edit any post or page to see translation meta boxes
 4. Enter translations for each language
 5. Add the language switcher to your theme

#### Developer Features

 * Object caching on the slug lookup, invalidated when a slug changes
 * Rewrite rules are rebuilt only when the language list changes or the plugin updates
 * Filters: `multilify_post_types`, `multilify_translated_title`, `multilify_translated_content`,`
   multilify_flag_choices`, `multilify_locale`, `multilify_enable_browser_detection`,`
   multilify_is_crawler`
 * Clean, documented code following the WordPress Coding Standards

#### Translating Content

When editing a post or page, you’ll see meta boxes for each active language where
you can:

 * Enter translated title
 * Add translated content using the WordPress editor
 * Set custom URL slugs for each language
 * All fields are optional – fallback to default language if not translated

#### Language Switcher

Add the language switcher to your theme using:

    ```
    <?php if ( function_exists( 'multilify_switcher' ) ) multilify_switcher(); ?>
    ```

Or use the shortcode: `[multilify_switcher]`

To show flags only (no language name):

    ```
    <?php if ( function_exists( 'multilify_switcher' ) ) multilify_switcher( array( 'show_name' => false ) ); ?>
    ```

Or with the shortcode:

    ```
    [multilify_switcher show_name="false"]
    ```

The language name is optional. If you leave it empty when adding a language, the
language code is used as a fallback. You can also edit a language’s name and flag
at any time from the Multilify settings page.

### Support

 * **Website:** [https://multilify.com](https://multilify.com)
 * **Support Forums:** [WordPress.org support forums](https://wordpress.org/support/plugin/multilify/)
 * **GitHub:** [github.com/kadirermantr/multilify](https://github.com/kadirermantr/multilify)

### Contributing

Multilify is open source! Contribute on [GitHub](https://github.com/kadirermantr/multilify).

## Lluniau Sgrin

[⌊Language management page - Add and manage your languages⌉⌊Language management 
page - Add and manage your languages⌉[

Language management page – Add and manage your languages

[⌊Translation meta boxes - Translate content directly in the editor⌉⌊Translation
meta boxes - Translate content directly in the editor⌉[

Translation meta boxes – Translate content directly in the editor

[⌊Language switcher - Display language options to your visitors⌉⌊Language switcher-
Display language options to your visitors⌉[

Language switcher – Display language options to your visitors

[⌊Settings page - Configure your multilingual setup⌉⌊Settings page - Configure your
multilingual setup⌉[

Settings page – Configure your multilingual setup

## Gosod

#### Automatic Installation

 1. Log in to your WordPress admin panel
 2. Navigate to Plugins > Add New
 3. Search for “Multilify”
 4. Click “Install Now” and then “Activate”

#### Manual Installation

 1. Download the plugin zip file
 2. Log in to your WordPress admin panel
 3. Navigate to Plugins > Add New > Upload Plugin
 4. Choose the zip file and click “Install Now”
 5. Activate the plugin

#### After Installation

 1. Go to Multilify in your WordPress admin menu
 2. Add your languages (e.g., English, Turkish, Spanish)
 3. Set your default language
 4. Start translating your content!

## Cwestiynau Cyffredin

### Is Multilify free?

Yes! Multilify is 100% free with no premium version or hidden costs.

### How many languages can I add?

Unlimited! Add as many languages as your site needs.

### Does it work with page builders?

Multilify translates content that runs through the `the_content` filter, which covers
the block editor and the classic editor. Builders that render from their own stored
data, such as Elementor, bypass that filter, so their layouts are not translated.

### Will it slow down my site?

No! Multilify is built with performance in mind. It uses caching and database indexing
to ensure fast page loads.

### Can I use custom URLs for each language?

Yes! You can set custom slugs for each language version of your content.

### Does it support RTL languages?

Multilify sets `dir="rtl"` on the document when WordPress reports an RTL locale,
so an RTL theme renders correctly. It does not ship RTL stylesheets of its own; 
that is your theme’s job.

### Can I translate menus and widgets?

Currently, Multilify focuses on post and page content. Menu and widget translation
support is planned for future releases.

### Is it compatible with WooCommerce?

Translation panels appear on posts and pages by default. To add them to products,
or any other custom post type, use the `multilify_post_types` filter:

    ```
    add_filter( 'multilify_post_types', function ( $types ) { $types[] = 'product'; return $types; } );
    ```

This translates the product title and description. Prices, attributes and variations
are WooCommerce’s own data and are not covered.

### How do I get support?

You can get support through the WordPress.org support forums or by contacting us
directly.

## Adolygiadau

There are no reviews for this plugin.

## Contributors & Developers

“Multilify” is open source software. The following people have contributed to this
plugin.

Cyfranwyr

 *   [ kadirerman ](https://profiles.wordpress.org/kadirerman/)

“Multilify” has been translated into 1 locale. Thank you to [the translators](https://translate.wordpress.org/projects/wp-plugins/multilify/contributors)
for their contributions.

[Translate “Multilify” into your language.](https://translate.wordpress.org/projects/wp-plugins/multilify)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/multilify/), check 
out the [SVN repository](https://plugins.svn.wordpress.org/multilify/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/multilify/) by [RSS](https://plugins.trac.wordpress.org/log/multilify/?limit=100&mode=stop_on_copy&format=rss).

## Cofnod Newid

#### 1.5.1

Fixes
 * In the block editor a translation’s content editor could show an empty 
page. The editor moves the meta boxes into its own panel after they have rendered,
and that reloads each editor’s frame. The text was still there and still saved, 
but could not be seen or edited in the Visual tab. An editor that loses its frame
is now rebuilt with its content, including after a panel is moved

#### 1.5.0

Fixes
 * A password-protected entry served its full translation in every other language
without asking for the password. The password form now stands in every language,
and a translated title keeps the “Protected:” prefix the original shows * A translated
slug could take another entry’s own address under a prefix, which left that entry
unreachable in the language. Another entry’s own name now counts as taken, and the
slug is numbered instead * A page, or an entry of a custom post type, with no translation
in a language returned a 404 under that language’s prefix, although the settings
screen promises the default text there * A post type the plugin does not translate,
such as a WooCommerce product left out of `multilify_post_types`, lost its base 
in links on translated pages and pointed at a 404 * Translated content ran after
WordPress’ own formatting, so paragraphs written in the editor came out joined and
blocks and embeds did not render * The template tag switcher on the blog index, 
an archive or search results linked every language to the first post in the loop
instead of the language homes * A prefixed language still answered on an entry’s
original slug beside its translated one. That address now redirects permanently,
as the default language’s has since 1.4.0 * Embeds, comment pages and trackbacks
of a translated entry returned a 404, and its oEmbed link was refused as an invalid
URL * A search under a language prefix only matched the original title and content*
An item in `/{lang}/feed/` paired a translated title with the original content *
The bundled Turkish and German translations never loaded on WordPress 5.8 to 6.7*`
wp_title()` and `single_post_title()` kept the original title on a translated page*
Renaming an entry through Quick Edit, the REST API or WP-CLI left its translated
addresses pointing at the old name in a persistent object cache * An array in `?
name=` or `?pagename=` raised a PHP warning * The copy buttons on the settings page
dropped keyboard focus to the top of the page, the flag grid ran off a phone screen,
and the page’s intro squeezed into a narrow column beside the tally

Changed
 * hreflang tags are printed only on an entry and on the language homes,
and only for languages the entry has text in. A language with no text of its own
points its canonical at the default address * WordPress switches to the installed
locale of the language being viewed, so its own strings, dates and the comment form
follow the address. Return the site locale from `multilify_locale` to keep a language
on it * A visitor at the site root is sent to the language they picked from the 
switcher before, ahead of their browser’s preference. Logged-in users and crawlers
are never redirected, and the answer is no longer kept by a shared cache for the
next visitor * The switcher’s stylesheet is printed inline, and its script loads
only on a page that shows a switcher * Focus rings on the settings page follow the
admin color scheme * Index creation and the first rewrite flush after an update 
run once, from the admin, instead of on every request until they succeeded

Added
 * A sitemap for every language other than the default, listing its home and
each entry with text in that language * The `multilify_is_crawler` filter

#### 1.4.0

Changed
 * An entry given a custom slug in the default language now answers on that
address alone. Its WordPress slug returns a permanent redirect to it, the way WordPress
answers any renamed entry, and page numbers, feeds and embeds are carried across.
Both addresses used to return 200, and inconsistently: the paged form already redirected,
because WordPress only runs its canonical check on a request carrying a page number*
An entry with no custom slug in the default language is untouched, and so is every
prefixed language, which has one address already

#### 1.3.3

Fixes
 * Renaming an entry left the cached answer to “does a real entry already 
live at this address” untouched for both the address it left and the address it 
took. A rename is not a status change, so nothing cleared it. On a site with a persistent
object cache, an entry whose own translated slug was the freed address returned 
a 404 for up to an hour. Measured against a persistent cache on MySQL, before and
after

#### 1.3.2

Fixes
 * The marker added to a translation panel heading in 1.3.0 was written as
markup. The block editor lists the same heading in its preferences panel and renders
it as text, so the tag showed there verbatim. It is plain text now, and reads the
same in the panel heading, the preferences list and Screen Options

#### 1.3.1

Fixes
 * A paged page nested under a translated parent had no working address at
all. `/{lang}/parent/entry/2/` returned a 404 and `/{lang}/parent/entry/page/2/`
redirected to it, so the redirect landed on the 404 as well. Both now serve the 
right page, and a child page whose own slug is a number still resolves ahead of 
either * The address a visitor asked for is restored once routing has matched it.
It was being left rewritten to the untranslated path, which put a paged entry into
a redirect loop with itself and handed every other plugin an address nobody requested

#### 1.3.0

Fixes
 * A custom slug in the default language produced a link that 404ed. Every
link to the entry pointed at an address nothing resolved, while the entry itself
stayed reachable only at its old one * A child page with no translated slug of its
own returned a 404 under a translated parent, so a half-translated page tree lost
every page below the first * `?lang=` on any address forced the front page onto 
it, which turned archives, search results and date listings into the blog index *
An unknown language code from `?lang=` reached the `<html lang>` attribute and the`
Content-Language` header unchanged; only configured codes are honored now * A paged
entry under a language prefix returned a 404, and a feed of one did too, because
both routed through the query variable an archive uses and through a rule WordPress
rejects for a post. `/{lang}/entry/2/` now serves page two, and `/{lang}/entry/page/
2/` reaches it the same way it does without a prefix * Two entries could be given
the same translated slug in one language, leaving the second unreachable. A duplicate
is now numbered the way WordPress numbers a duplicate post slug * Cached routes 
are dropped when an entry is trashed, restored or deleted, instead of answering 
for an hour from a persistent object cache * A language code that WordPress already
serves, or that an existing post or page already lives at, is refused with an explanation
instead of quietly taking the address over * Uninstall removes translation meta 
in batches, so a large site is not held on one unbounded delete

Added
 * Each language on the settings page carries a measure of how much of it 
is done * A translation panel on the post editor says so in its heading when that
language already has something, which a collapsed panel shows

Changed
 * The switcher marks the active language with `aria-current="page"` * The
switcher stylesheet and script are left out entirely on a site with one language

#### 1.2.0

Added
 * Turkish, German and Spanish translations of the admin interface. WordPress
shows the plugin in its own language when the site runs in one of them, and falls
back to English otherwise. * Any other locale can be contributed at translate.wordpress.
org, from the translation template the plugin already ships

#### 1.1.0

Fixes
 * Language detection now works when WordPress is installed in a subdirectory;
the install path is no longer mistaken for a language code * `/{lang}/page/2/` and`/{
lang}/feed/` return content instead of a 404; paged entries, entry feeds and search
under a language prefix now route correctly * Child pages keep their parent path
in translated URLs, so `/{lang}/parent/child/` resolves instead of 404ing * The 
document title on the front page and on archives is no longer overwritten with a
post title from the loop * Translation panels no longer save on revisions or on 
post types they were never added to * Meta box fields no longer inherit the inline
editor’s layout, which shrank their labels and clipped their inputs

Added
 * `rel="alternate"` hreflang tags, including `x-default`, in `<head>` * `
<html lang>` and a `Content-Language` header that follow the language being viewed*
Browser language detection for first-time visitors, remembered per visitor and overridable
with the `multilify_enable_browser_detection` filter * Translation progress per 
language on the settings page * A flag picker in place of the free text emoji field*
Custom post type support through the `multilify_post_types` filter * Filters: `multilify_translated_title`,`
multilify_translated_content`, `multilify_flag_choices`, `multilify_locale`

Changed
 * Rebuilt the settings screen: language entries read as a list with their
code, name, default state and progress * Corrected readme claims that the code did
not support

#### 1.0.5

 * The default language no longer gets a URL prefix, so each post has a single canonical
   address
 * Added uninstall cleanup that removes plugin options, translation meta and the
   lookup index
 * Made the plugin translatable: interface strings now use the multilify text domain
   and a .pot template ships in /languages
 * The default language can no longer be deleted, and only an existing language 
   can be set as default
 * Language switcher is now a nav list with hreflang, aria-current and a screen-
   reader label when only flags are shown
 * Fixed the delete confirmation appearing twice
 * Added a LICENSE file (GPL v2)

#### 1.0.4

 * Tested up to WordPress 7.1
 * Verified compatibility with the always-iframed post editor introduced in WordPress
   7.1
 * Verified compatibility with the jQuery UI 1.14.2 update shipped in WordPress 
   7.1
 * No functional changes

#### 1.0.3

 * Added the ability to edit existing languages (name and flag) from the admin
 * Prevented adding a language with a code that already exists (shows an error)
 * Registered the [multilify_switcher] shortcode (supports show_name and show_flag)
 * Fixed a blank settings page after saving (form handling moved to admin_init so
   redirects work)
 * Fixed PHP warnings in the language switcher when a post object was unavailable
 * Tested up to WordPress 6.9

#### 1.0.2

 * Added flag-only language switcher support via show_name and show_flag arguments
 * Made the language name optional (falls back to the language code when left empty)
 * Fixed an empty/underlined language label appearing in the switcher

#### 1.0.1

 * Added plugin icon for WordPress.org directory
 * Added Plugin URI (https://multilify.vercel.app)
 * Updated support section with website and GitHub links

#### 1.0.0

 * Initial release
 * Unlimited language support
 * Custom slug functionality
 * Performance caching system
 * Database indexing
 * Language switcher
 * SEO optimization
 * Browser language detection
 * Admin interface
 * Translation meta boxes

## Meta

 *  Version **1.5.1**
 *  Last updated **1 diwrnod yn ôl**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.8 neu uwch **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 neu uwch **
 *  Languages
 * [English (US)](https://wordpress.org/plugins/multilify/) a [Spanish (Spain)](https://es.wordpress.org/plugins/multilify/).
 *  [Translate into your language](https://translate.wordpress.org/projects/wp-plugins/multilify)
 * Tags
 * [i18n](https://cy.wordpress.org/plugins/tags/i18n/)[language](https://cy.wordpress.org/plugins/tags/language/)
   [localization](https://cy.wordpress.org/plugins/tags/localization/)[multilingual](https://cy.wordpress.org/plugins/tags/multilingual/)
   [translation](https://cy.wordpress.org/plugins/tags/translation/)
 *  [Advanced View](https://cy.wordpress.org/plugins/multilify/advanced/)

## Graddau

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/multilify/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/multilify/reviews/)

## Cyfranwyr

 *   [ kadirerman ](https://profiles.wordpress.org/kadirerman/)

## Cefnogaeth

Rhywbeth i'w ddweud? Angen help?

 [Gweld y fforwm cefnogi](https://wordpress.org/support/plugin/multilify/)