Linkurile din articole pierd limba și repornesc aplicația
Linkurile din corpurile articolelor sunt scrise fără prefix de limbă și randate ca HTML brut, nu ca navigare de router. Un cititor rus sau englez care apasă un link dintr-un articol pierde limba și pleacă pe versiunea română, cu reîncărcare completă a aplicației.
Ce am găsit
Măsurat pe API-ul de producție, peste toate cele 72 de articole publicate:
| Limbă | Linkuri interne fără prefix | Articole afectate | Adrese distincte |
|---|---|---|---|
ru |
189 | 71 din 72 | 32 |
en |
190 | 71 din 72 | 32 |
Cele mai frecvente: /collections/hypervolt (34x în ru, 35x în en), /collections/normatec (20x), /products/vyper-3 (17x), /collections/hyperice-x (15x), /collections/venom (12x).
De ce se pierde limba
Restul aplicației nu are problema: frontend/src/main.tsx:53 montează <BrowserRouter basename={basename}>, iar basename vine din readLanguage(window.location.pathname) (frontend/src/lib/urlLanguage.ts:36). React Router pune singur prefixul în fața fiecărui <Link to="/...">, deci un link scris în componente e corect în toate cele trei limbi.
Corpurile articolelor nu trec pe acolo. frontend/src/components/HyperhubRichContent.tsx randează fiecare paragraf și fiecare element de listă cu dangerouslySetInnerHTML={{ __html: sanitizeHtml(...) }}, deci ancorele rămân <a href> obișnuite: browserul le tratează ca navigare de document, nu ca navigare în aplicație. Prefixul nu se adaugă și aplicația repornește de la zero.
De ce sunt scrise așa
Adresele vin din HYPERHUB_LINK_REPLACEMENTS (backend/prisma/lib/hyperhub-links.ts) și din textele importate. Toate cele 28 de înlocuiri sunt scrise fără prefix, pentru că tabelul e comun celor trei limbi — aceeași valoare se scrie în articolul român, în cel rus și în cel englez. Nu e o scăpare a unei intrări, e forma tabelului.
De făcut
-
În HyperhubRichContent.tsx, tratează apăsarea pe o ancoră internă ca navigare de router:preventDefaultșinavigate(...)pentruhrefcare începe cu/și nu are țintă externă. Prefixul de limbă vine atunci de labasename, ca peste tot în aplicație. -
Lasă neatinse ancorele externe, cele cu target="_blank", apăsările cu modificator (Ctrl/Cmd/Shift) și click-ul de mijloc — altfel se strică „deschide în filă nouă". -
Test: un articol în rucu un link intern duce la adresa cu prefix, nu la cea română; un link extern rămâne navigare de document.
De ce contează
Linkurile din blog sunt principala sursă de legături interne a magazinului, exact acolo unde interesul cititorului e maxim. Azi, pentru două limbi din trei, fiecare astfel de link scoate cititorul din limba lui.
Criteriu de acceptare
Dintr-un articol deschis pe /ru/blogs/hyperhub/<slug>, apăsarea unui link intern din corpul articolului duce la /ru/..., fără reîncărcarea paginii. Aceeași verificare pe /en/. Ancorele externe se comportă ca înainte.
Desprins din #12 (closed), unde a fost găsit la verificarea reparației.