In WordPress, "multilingual" means picking a plugin — WPML (paid), Polylang (freemium), TranslatePress (freemium) — and hoping it plays nicely with your theme, your other plugins, and every future update. Translations live in extra tables bolted onto the schema, URL structures depend on the plugin you chose, and switching plugins later is a migration project.
Contensio takes the opposite approach. Translations are first-class from day one.
Every piece of content — pages, posts, custom types, menus, taxonomies, settings — has a
translations relationship built into the schema. You can't not be multilingual;
the first language is just the first row in the translations table.
What's localized
Titles, slugs, body
Each language has its own title, URL slug, and full body content. Not a translated-on-top overlay — the real thing.
SEO meta per language
Meta title, meta description, OG image — independently editable per language.
Menus & items
Menu labels translate per language. Link the same target, or different targets per locale.
Custom fields & taxonomies
Field values and term names are translatable. Mark fields as "not translatable" to share the value across languages.
URL strategy
The default language sits at the root — no locale prefix, no ugly /en/ segment.
Other languages get a clean /{code}/ prefix, with fully translated path
segments. An English /features/block-editor becomes
/ro/functionalitati/editor-blocuri — not /ro/features/block-editor.
// config/app.php
'locale' => 'en',
'supported_locales' => ['en', 'ro', 'fr', 'de'],
Compared to WordPress
WordPress
- ✗Third-party plugin required
- ✗WPML Pro is paid-only
- ✗Translations stored in plugin-specific tables
- ✗URL structure depends on plugin choice
- ✗Plugin updates can break translations
Contensio
- ✓Built into the core
- ✓Free forever (AGPL)
- ✓First-class Eloquent relationships
- ✓Translated URL segments per locale
- ✓Schema guarantees; no plugin drift
FAQ
Yes. Languages are stored in a languages table — add one from the admin and it's immediately available as a translation target. Existing content stays in the languages it already has.
Perfect — one language just means one row in the translations table. There's zero overhead and you don't need to think about multilingual at all until you do.
Each language record has a direction flag (ltr/rtl). Themes read it to apply the correct layout direction automatically.