One code, several languages
Sending people to the page in their own language, how the matching works, and how somebody can ask for a different one.
Setting it up
Open a dynamic code and choose **Serve a different page per language**. Add a language tag and where somebody asking for it should go: `de` and your German page, `fr` and your French one.
The code's own destination is the default. Anybody whose language is not on the list goes there, so the code always works even for a language you never thought about.
Which tag to use
The short form a browser sends. `de`, `fr`, `es`, `pt`, `ja`. Add a region only when it genuinely matters — `pt-BR` for Brazilian Portuguese, `zh-Hant` for traditional Chinese.
Shorter is usually better, because matching falls back on its own. Somebody asking for `pt-BR` at a code offering `pt` gets the Portuguese page. Somebody asking for `de-AT` at a code offering `de` gets the German one. You do not need a row per region.
How the language is worked out
From the languages the browser says it wants, in the order of preference it gives them — not simply the first one in the list. A browser that asks for German at low preference and English at high preference is asking for English, and it is sent to the English page if you offer one.
This is the part most tools get wrong, and it shows up as a visitor landing on a language they can read least well.
Letting somebody choose
Add `?lang=` and a tag to the address and that wins over the browser: `example.com/abc123?lang=es` goes to the Spanish page whatever the phone is set to.
Useful for a link on a page that already has a language switcher, and for the bilingual visitor whose phone is in English but who wants the Spanish menu. A tag you do not offer is ignored rather than forcing the default.
With routing rules
They compose. A routing rule that matches wins; the language list decides where the fallback goes. Most codes have one or the other.