Přeskočit na obsah

Natvrdo psaný odkaz v default-locale slugu 301-uje a přepne uživateli jazyk

import { Aside } from ‘@astrojs/starlight/components’;

Web s lokalizovanými slugy (EN /sign-up, CS /cs/registrace, DE /de/registrieren). Uživatel je na anglické verzi, klikne na „Register / Sign in” — a stránka se přepne do češtiny. Zbytek navigace funguje; rozbité je jen pár odkazů (typicky auth: přihlášení/registrace), které „někdo zapomněl” při i18n migraci.

Default locale (EN) jede bez prefixu, ostatní s prefixem (/cs/…). Slugy se mezi jazyky překládají (registracesign-up). Middleware navíc 301-uje „holé” CS slugy (legacy bookmarky) na /cs/…:

/registrace → 301 → /cs/registrace (čeština!)
/sign-up → 200 (kanonická EN URL)

Rozbitý odkaz byl postavený dvěma způsoby, oba vedou na český slug bez prefixu:

<a href="/prihlaseni/"> // ❌ natvrdo CS slug
withLocale('/registrace', lang) // ❌ jen přidá prefix; pro default locale
// vrátí holé '/registrace' → 301 na /cs

Správné odkazy v navigaci přitom používaly překladač slugů, proto byl rozbitý jen ten dohledaný zbytek.

Použij helper, který přeloží slug podle jazyka (a u default locale vrátí anglický slug bez prefixu):

localizedPath('prihlaseni', lang) // en → /sign-in, cs → /cs/prihlaseni, de → /de/anmelden
localizedPath('registrace', lang) // en → /sign-up, cs → /cs/registrace

Po opravě EN uživatel zůstane v EN (/sign-in/sign-up, oba 200), CS i ostatní beze změny.

Jak se tomu vyvarovat v jiných systémech

Sekce “Jak se tomu vyvarovat v jiných systémech”
  • Detection: grep natvrdo psané lokalizované slugy v odkazech: grep -rnE "href=\"/(prihlaseni|registrace|kosik|…)" src/ a grep -rn "withLocale('/" (prefix-only helper na přeložitelný slug je červená vlajka). Test: pro každý interní odkaz ověř, že curl -I na něj v default locale vrátí 200, ne 301.
  • Anti-pattern: dva helpery — jeden jen přidává prefix (withLocale), druhý překládá slug (localizedPath) — a vývojář sáhne po tom nesprávném. Nebo natvrdo href na slug v jazyce, ve kterém byl web původně psaný.
  • Lepší přístup: jediná funkce pro interní odkazy, která VŽDY přeloží slug i přidá prefix; prefix-only helper drž jen pro cesty bez přeložitelného slugu. CI smoke-test, že žádný odkaz v default locale nevrací 301.

Sister bugs / související

Sekce “Sister bugs / související”

Stejná past u kanonických <link rel="canonical"> a sitemap — když je generuješ z holého slugu, ukážeš Googlu URL, která se 301-uje, a rozmělníš signál. Příbuzné: [[i18n-cookie-overrides-tenant-language]] (jazyk se bere ze špatného zdroje).

Přidal aiarchitekt.cz · 24. 6. 2026 2:00
Provozuje aiarchitekt.cz