A multilingual WordPress site is built on a plugin that stores each post's translation as a separate post and links the versions together. The two main options are Polylang and WPML. Here is the difference between them and the setup steps, using a site with Russian, Ukrainian and English versions as an example.
How Polylang differs from WPML
Polylang is free in its base version and covers translating posts, pages, categories and menus. The paid Polylang Pro adds translation of custom post types and URL slugs. WPML is a fully paid plugin with broader coverage out of the box: theme string translation without touching code, a built-in machine translation service and compatibility with almost every major page builder.
In practice, Polylang is enough for a blog or a corporate site with 2-3 languages. WPML pays off when the project needs translated WooCommerce functionality or editors have no access to theme files to edit strings.
How to set up languages in Polylang
After activating the plugin, a setup wizard asks for the site's language list. Add the locales you need under "Languages → Languages" with an ISO 639-1 code: ru, uk, en. Each language gets its own flag and order in the switcher.
wp pll lang create ru "Russian" ru_RU
wp pll lang create uk "Ukrainian" uk
wp pll lang create en "English" en_US
The WP-CLI commands work if the polylang-cli package is installed on the site; without it, languages are added only through the interface.
How to translate posts, menus and widgets
Every post in the editor gets a "Languages" block with flags: clicking the plus sign next to a language creates a linked copy of the post for translation. The slug, title and content are translated independently, while the link between versions is kept through an internal translation ID.
Menus are translated separately under "Appearance → Menus" — a separate menu version must be built for each language and assigned in the theme settings. Widgets, if the theme supports them, are placed through Polylang's built-in "Language Switcher" widget, which fills in links to the translated versions itself.
How to set up SEO for a multilingual site
Polylang adds the hreflang attribute to every page on its own, marking linked translations for search engines. Meta tags (title, description) are translated through the Yoast SEO plugin separately for each language version of a post — detailed setup is described in the article about Yoast SEO. Choose the URL structure in advance: with a language prefix (/en/page/) or on separate subdomains — changing the scheme after launch requires setting up redirects.
Polylang versus WPML: feature comparison
| Feature | Polylang (free) | WPML |
|---|---|---|
| Translating posts and pages | yes | yes |
| Theme string translation without code | no (Pro only) | yes |
| Machine translation | no | yes, a paid service |
| WooCommerce support | partial, needs extra plugins | yes, a separate module |
Common problems after installation
Duplicate pages in search results almost always mean hreflang is set up wrong or the link between translations is missing — check this in the "Languages" block of each post. A drop in site speed after installing WPML is a known trait of the plugin with a large number of posts: turn on translation caching in the String Translation module settings. If the site was moved to a new address before, the steps are described in the article about changing a WordPress domain.
Checklist for launching a multilingual site
- The plugin is chosen: Polylang for a typical site, WPML for complex functionality and theme string translation.
- All language versions are set up with correct ISO 639-1 codes.
- Menus, widgets and meta tags are translated through Yoast SEO for each language.
- The
hreflangattribute is checked on linked pages. - The URL structure is chosen in advance and will not need a scheme change after launch.