A multilingual site is several sites sharing one database. The mistakes are all variations of one thing: something meant for one language reaching a visitor reading another.
Everything here is about keeping languages apart while they share a database.
Cached pages are keyed by language, so a visitor reading German is never served the French copy because it happened to be cached first. Language is resolved before the cache lookup, not after.
Six languages means roughly six times the posts, the meta and the term relationships. Storage and query tuning start from that number rather than from the page count you would guess from the menu.
Those tags have to be present on what most visitors actually receive, not injected by something that only runs on a cache miss. They are part of the cached response.
Clone the site to work through a new language without half-finished translations appearing live, then push it back when the language is complete.
Translation work is expensive to redo. Daily backups cover the full database, so a bad string import is recoverable.
Almost every multilingual problem is content from one language reaching a reader of another — in the cache, in a menu, in a search result, or in the tags search engines read.
Multilingual sites are not slower because they are translated. They are slower when the database was sized for one language and the cache cannot tell them apart.
Multiply the content by the number of languages, then make sure the cache never confuses two of them. That is the whole job.
| Setting | What we do | Why |
|---|---|---|
| Cache key | Includes the active language | Without it the first language cached wins, and every other reader is served the wrong translation. |
| Language resolution | Happens before the cache lookup | Detecting language after a cache hit is too late, because the wrong copy has already been chosen. |
| Database sizing | Planned from posts multiplied by languages | A six-language site holds roughly six times the rows, and sizing from the visible page count under-provisions it. |
| Alternate-language tags | Rendered into the cached response | Tags injected only on a cache miss are absent for the majority of visitors and crawlers. |
| String tables | Kept in the object cache | Interface string lookups happen many times per render and are identical for every visitor in that language. |
Every plan includes free migration, daily backups, SSL and 24/7 support.
Bring the multilingual site across — migration is free, every language included.