2026-06-11
Three languages, one URL
This site speaks English, Russian and Kazakh. None of them appear in the URL.
The common pattern is /ru/about, /kk/about, sometimes ?lang=ru on top. Every variant multiplies the URL surface: more routes to redirect, more links that break when you restructure, more cache keys, more sitemap entries. The address bar becomes a config file.
I wanted the opposite. A URL here names a thing, not a presentation of a thing. The blog has its own host, and each note has one stable address. How it is rendered — language and theme — is your preference, and preferences belong to the client. So both live in cookies: two small, honest ones, set only when you click.
The first visit is sniffed from Accept-Language and never written anywhere. Switching is one click and survives the session. The server reads the cookie, renders your language, and the URL stays clean enough to write on a business card.
There is a cost, and it is worth naming: search engines see one language per URL — the default. The Russian and Kazakh versions are for humans who clicked, not for crawlers. For a personal site, that trade is easy.
Fewer variables, fewer states. Quiet systems start at the address bar.