Knowledge about CMS, websites and best practices.
Tips for website editors, product updates and best practices for building modern websites with Siteor CMS.
Multilingualism in the CMS - a new locale chain, 301 redirects and dynamic routing
Siteor CMS has supported multilingual sites for a while. But the language-selection mechanism was scattered - the locale came from a URL parameter, from the domain, from the site settings, and each element had a different priority depending on the context. We have now unified this into one consistent mechanism.
The new locale chain
Selecting a page's language now follows a clear, predictable hierarchy. The system checks, in order:
- page.locale - if a page has its own language set (e.g. "en"), it always renders in English. Regardless of the domain or the URL parameter
-
?lang= from the URL - the parameter in the address, e.g.
?lang=en. Used mainly for previewing and testing - domain.locale - the language assigned to the domain. E.g. company.pl = Polish, company.com = English
- site.locale - the default language of the whole site. The final fallback
The key change: page.locale wins over everything. A page with locale=en will render in English even on a Polish domain. This simplifies management - a page always knows what language it is in and does not depend on the context in which you display it.
Automatic 301 redirects between languages
On multilingual sites with separate domains per language, the system automatically redirects the user to the correct version.
Example: you have a /cennik page (locale=pl) and a /pricing page (locale=en), linked as master/slave. Someone visits company.com/cennik. The system sees: the domain has locale=en, the page has locale=pl - no match. It looks for the English version in the language group, finds /pricing and issues a 301 redirect.
When the redirect kicks in:
- The site has multilang mode enabled
- There is no
?lang=parameter in the URL (an explicit language override is respected) - The domain has a locale assigned
- A version of the page exists in the matching language
As a result, the user always lands on a page in their language, and Google does not index duplicate content.
The same URL in multiple languages
Previously two pages on the same site could not have an identical path - even if they had different locales. Now they can.
Example: /about with locale=en and /about with locale=pl can coexist. The system picks the right version based on the domain. On company.com it shows the English one, on company.pl the Polish one.
Useful for paths that do not require translation (e.g. /contact, /faq, /about) or when you want to keep consistent URLs regardless of language.
Per-language sitemap and llms.txt
sitemap.xml and llms.txt automatically filter content by the domain's language:
- company.pl/sitemap.xml - only Polish and universal pages (without a locale)
- company.com/sitemap.xml - only English and universal ones
Google gets a separate sitemap per language without mixing URLs from different versions.
A 404 page in the user's language
The default 404 page uses the translation system. A user on an English domain sees "Page not found", on a Ukrainian one "Сторінку не знайдено". Supported languages: pl, en, fr, de, es, cs, sk, uk.
Summary
The whole multilingual mechanism has been refactored:
- One locale chain - page.locale > ?lang= > domain.locale > site.locale
- Automatic 301s - a redirect to the correct language version
- Duplicate paths per locale - /about can exist in PL and EN
- Filtered sitemap/llms.txt - separate content per domain
- Localised 404 - an error in the user's language
For existing sites nothing changes - the mechanism is backward compatible. The new features activate automatically when a site has multilang enabled.