Skip to content

Linkurile din articole rămân în limba cititorului

Vitalie requested to merge 42_article-links-router into main

Corpurile articolelor sunt HTML brut, randate cu dangerouslySetInnerHTML, deci ancorele lor nu au trecut niciodată prin router: browserul le urma ca navigare de document, iar adresele sunt scrise fără prefix de limbă, pentru că un singur tabel de linkuri servește toate cele trei limbi. Un cititor rus care apăsa /collections/hypervolt ajungea pe versiunea română, cu repornirea completă a aplicației. Măsurat pe API-ul de producție: 189 de linkuri în corpurile ru și 190 în en, în 71 din 72 de articole.

Corectez atributul, nu doar apăsarea. HTML-ul sanitizat trece printr-un <template> inert, unde fiecare ancoră internă își primește prefixul limbii curente; apăsarea principală rămâne interceptată, dar doar ca să evite repornirea aplicației. Așa se repară și „deschide în filă nouă", „copiază adresa linkului" și previzualizarea din bara de stare — niciuna nu ajunge la un gestionar de click.

Rămân pe seama browserului: alt origin (de acolo cad și mailto: și tel:), un #fragment, o adresă servită ca fișier (/uploads/, /assets/, pozele din public/) și o adresă care numește explicit altă limbă — un router montat nu-și poate schimba basename-ul, deci acela chiar are nevoie de încărcare completă.

Verificare rulată

npm run lint, npm run build, npx vitest run în frontend/: 34 de fișiere, 455 de teste, toate trec. Singura avertizare de lint e cea preexistentă de la src/App.tsx:70.

Pe un articol rusesc real, servit din build-ul acestei ramuri cu backendul local:

  • toate linkurile din corp au href="/ru/..."/ru/shop, /ru/collections/hypervolt, /ru/collections/normatec, /ru/collections/venom;
  • apăsarea unuia duce la /ru/collections/hypervolt, iar un martor pus pe window supraviețuiește, deci aplicația nu a repornit;
  • linkurile externe au rămas neatinse.

Closes #42 (closed)

Merge request reports