
Create a fast translation network on WordPress multisite.
WARNING: MultilingualPress 2 works with WordPress’s latest version, but is incompatible with the Gutenberg editor, which is available as part of WordPress 5.0 and later. BEFORE you update your WordPress to version 5.0, please read our MultilingualPress and WordPress 5.0 guide.
Exciting news! MultilingualPress (version 3 and higher) is available for Pro users! Fully refactored, based on PHP 8, Gutenberg support, improved UI, and optimized for WooCommerce. Get it here!
Have you ever wondered who is behind MultilingualPress?We are Inpsyde, the biggest WordPress Agency in Europe: building plugins and websites with high-quality code for the biggest companies in the World. Our love of WordPress and commitment to 100% remote work, community, and personal development has helped us grow into what we are today. We want you, a proven WordPress Powerhouse, to help us maintain our high standards and reach new heights of success. Apply now, and let’s build something amazing together!
Please note: you can’t update MultilingualPress 2 to the Pro version of MultilingualPress as usual since this is a complete refactor. We are working on a Migration tool available as an alpha version on GitHub. A tutorial for the migration tool can be found here.
Run each language in a separate site of your WordPress multisite and connect the content in a lightweight user interface. Create a language switcher in your custom menu or use a customizable widget to let your users easily select the desired language version.
This plugin lets you connect an unlimited amount of sites with each other. Set a main language for each site, create relationships (connections), and start writing. Now you get a new field to create a linked post on all connected sites automatically.
They are accessible via the post/page editor screen – you can switch back and forth to translate them.
Unlike most other translation plugins, there is no lock-in effect: when you disable our plugin, all sites will still work as separate sites without any data loss or garbage output.
Our Language Manager offers 174 languages, and you can edit them.
MultilingualPress 2 does ot benefit from free or ad hoc support.
We also offer premium support for the Pro version (MultilingualPress version 3 and higher) to save you time.
You get direct help from the developers of the plugin and support from the development. This also includes support for MultilingualPress 2, but no maintenance is provided for this older plugin version.
The team at Inpsyde has been engineering the Web since 2006.
If you’re new to WordPress multisite, you might find our WordPress multisite installation
tutorial helpful.
Use the installer via back-end of your install or …
/wp-content/plugins/ directory.
New columns in the site list table for the Relationships (i.e., connections with other sites) and the Site Language.

New settings tab on the Edit Site page.

New settings tab on the Add New Site page.

Plugin settings, including Custom Post Type translation.

The Language Manager.

Dashboard widget informing about currently untranslated posts.

Translate a post directly from the Edit Post page, and set the translation status and Trasher setting.

Translate a term directly from the Add New Category page.

Edit term translations on the Edit Category page.

New user settings for the sitewide Backend Language and the Language Redirect.

New Language Switcher widget.

Frontend view of a post showing both the Quicklinks and the Language Switcher widget.

MultilingualPress is recommended by WP Engine as a solution for multilingual websites.
No, it will not. It manages relationships between sites and translations, but it doesn’t change the content.
That would require changes to the way WordPress stores post content. Other plugins do that; we think this is wrong,
because it creates a lock-in: you would lose access to your content after the plugin deactivation.
Yes, just have a look at our WordPress multisite installation
tutorial.
multilingualpress.deleted_tables filter to skip table deletion, see #323.__block_editor_compatible_meta_box with false value to translation metabox, see #320.STRICT_TRANS_TABLES in @@sqlmode, see #302 and #303, props @rebeccahum, @nickdaugherty.multilingualpress.is_related_post_editable, for the remote post editing capability check.multilingualpress.remote_post_search_arguments, to manipulate the query arguments for the remote post search.multilingualpress.quicklinks_nofollow, to render nofollow quicklinks, see #251.multilingualpress.active_taxonomies, to modify the allowed taxonomies, see issue #282.multilingualpress.render_hreflang, to force or prevent rendering.multilingualpress.hreflang_post_status, to restrict post translations, and only query published posts, see issue #276 and issue #277.post_status, to restrict post translations.multilingualpress.redirect_post_status, to restrict post redirect targets, and only query published posts, see pull request #278, props @diedexx.$args argument to Mlp_Language_Negotiation::get_redirect_matches() and pass it on to Mlp_Language_Api::get_translations(), see pull request #271, props @diedexx.content_id to redirect matches, see pull request #271, props @diedexx.multilingualpress.redirect_targets, to manipulate the found redirect targets, see pull request #265, props @diedexx.multilingualpress.hreflang_type and multilingualpress.hreflang_translations, see pull request #267, props @diedexx.hreflang HTTP headers to 11.Mlp_Null_Language and Mlp_Null_Translation.Mlp_Null_Translation in favor of null.hreflang HTTP header and HTML element output.Mlp_Helpers::get_language_flag() (and thus mlp_get_language_flag()) throwing a warning for non-custom flag images.strict flag.hreflang HTTP Headers and HTML <link /> tags being provided on paged requests.(get_)home_url() for all front-end requests/URLs, seeMlp_Helpers::show_linked_elements() output, seewp_get_sites() function, seeswitch_theme action when a site has been duplicated.get_term_by_term_taxonomy_id cache for term translator, props vaurdan.get_posts() call, props vaurdan.network_site_new_form action hook (where available) instead of injecting markup with jQuery. Yay!hreflang links and headers, see issue #202, propspost_name through urldecode to account for non-ASCII characters, seeml_type value of duplicated custom post type posts, seemultilingualpress to multilingual-press with the next (major) release. So, in case you arestate_modules site option on uninstall, props tiagoschenkel.realpath() for plugin file in requirements check to allow for symlinked plugin folder, see$wpdb object to inpsyde_mlp_init and inpsyde_mlp_loaded hooks.checkup_blog_message() and checkup_blog().get_relations().get_name().Mlp_Db_Table_List_Interface interface and Mlp_Db_Table_List class.replace_string() in Mlp_Db_Replace.Mlp_Db_Replace class.mlp_hreflang_html and mlp_hreflang_http_header filters in Mlp_Hreflang_Header_Output class.mlp_translations filter in Mlp_Language_Api class.mlp_dashboard_widget_access filter in Mlp_Dashboard_Widget class.Mlp_Term_Translation class.mlp_show_translation_completed_checkbox filter in Mlp_Dashboard_Widget class.README.md file, see issue #86.mlp_linked_element_link filter, seehreflang attribute to quicklinks, seehtml tag, see issue #118.admin-ajax.php or not, seeMlp_Language_Api class, props iamntz.hfreflang attribute for content’s own language, seemlp_pre_save_postdata and mlp_pre_update_post.get_blog_language() in favor of mlp_get_blog_language().SCRIPT_DEBUG and MULTILINGUALPRESS_DEBUG are not set.Mlp_Language_Api::get_translations().glob() on Solaris systems.head element.mlp_site_relations. This is faster than the previouswidth and height for flagsuninstall.php to clean up on deletion properlyca accidentally.readonly, not disabled to make copy and paste easier.inc/language-list.php to get languages in native and English writing by ISO codes.Mlp_Db_Replace to update multiple tables and columns at once.