2026-05-12 19:09:50 +02:00
|
|
|
<!doctype html>
|
|
|
|
|
<html lang="pl" class="scroll-smooth">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
|
<title>humanAI — ludzka strona AI</title>
|
|
|
|
|
<meta name="description" content="Strategia, automatyzacje, produkty AI i systemy multiagentowe projektowane z człowiekiem w centrum." />
|
|
|
|
|
|
feat: wybór języka przez URL (/en) — reaktywny hook, przełącznik, hreflang
Język wynikał z navigator.language liczonego przy każdym renderze, więc nie
dało się go wybrać ani zalinkować. Teraz nośnikiem języka jest ścieżka.
- src/router.ts: usePathname() na useSyncExternalStore + navigate(). pushState
nie emituje zdarzenia, więc bez tego React nie widzi zmiany URL-a.
- i18n: useLang(), localizePath(), stripLangPrefix(), setLang(). useT() czyta
język ze ścieżki i jest reaktywne na nawigację.
- Detekcja przeglądarki tylko przy pierwszym wejściu na "/" i tylko gdy w
localStorage nic nie ma; wynik zapisujemy od razu, więc przekierowanie na
/en zadziała najwyżej raz i nie nadpisze późniejszego wyboru użytkownika.
Deep linki honorujemy bez ruszania.
- App.tsx: jedna tablica tras dla obu języków (/en/privacy -> '/privacy').
Ustawia też document.documentElement.lang, bo index.html ma na sztywno "pl".
- Header: przełącznik PL/EN (desktop + mobile), <button>, nie <a> — link
przeładowałby dokument.
- Hrefy w Header/Footer/PrivacyPolicyPage/PlatformPage przez localizePath,
inaczej /en jest pułapką jednokierunkową: każdy klik wraca na PL.
- index.html: hreflang pl/en/x-default; og:url z gethumanai.com na .pl
(wskazywał na cudzą domenę).
Bez nowych tłumaczeń treści — to osobny krok.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:54:49 +02:00
|
|
|
<!-- Language alternates. Static: this single index.html is served for every
|
|
|
|
|
route, so all pages advertise the same pair. Per-page alternates would
|
|
|
|
|
need prerendering. -->
|
|
|
|
|
<link rel="alternate" hreflang="pl" href="https://gethumanai.pl/" />
|
|
|
|
|
<link rel="alternate" hreflang="en" href="https://gethumanai.pl/en/" />
|
|
|
|
|
<link rel="alternate" hreflang="x-default" href="https://gethumanai.pl/" />
|
|
|
|
|
|
2026-05-12 19:09:50 +02:00
|
|
|
<!-- Open Graph / Facebook -->
|
|
|
|
|
<meta property="og:type" content="website" />
|
feat: wybór języka przez URL (/en) — reaktywny hook, przełącznik, hreflang
Język wynikał z navigator.language liczonego przy każdym renderze, więc nie
dało się go wybrać ani zalinkować. Teraz nośnikiem języka jest ścieżka.
- src/router.ts: usePathname() na useSyncExternalStore + navigate(). pushState
nie emituje zdarzenia, więc bez tego React nie widzi zmiany URL-a.
- i18n: useLang(), localizePath(), stripLangPrefix(), setLang(). useT() czyta
język ze ścieżki i jest reaktywne na nawigację.
- Detekcja przeglądarki tylko przy pierwszym wejściu na "/" i tylko gdy w
localStorage nic nie ma; wynik zapisujemy od razu, więc przekierowanie na
/en zadziała najwyżej raz i nie nadpisze późniejszego wyboru użytkownika.
Deep linki honorujemy bez ruszania.
- App.tsx: jedna tablica tras dla obu języków (/en/privacy -> '/privacy').
Ustawia też document.documentElement.lang, bo index.html ma na sztywno "pl".
- Header: przełącznik PL/EN (desktop + mobile), <button>, nie <a> — link
przeładowałby dokument.
- Hrefy w Header/Footer/PrivacyPolicyPage/PlatformPage przez localizePath,
inaczej /en jest pułapką jednokierunkową: każdy klik wraca na PL.
- index.html: hreflang pl/en/x-default; og:url z gethumanai.com na .pl
(wskazywał na cudzą domenę).
Bez nowych tłumaczeń treści — to osobny krok.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:54:49 +02:00
|
|
|
<meta property="og:url" content="https://gethumanai.pl/" />
|
2026-05-12 19:09:50 +02:00
|
|
|
<meta property="og:title" content="humanAI — ludzka strona AI" />
|
|
|
|
|
<meta property="og:description" content="Strategia, automatyzacje, produkty AI i systemy multiagentowe projektowane z człowiekiem w centrum." />
|
|
|
|
|
|
|
|
|
|
<!-- Twitter -->
|
|
|
|
|
<meta property="twitter:card" content="summary_large_image" />
|
|
|
|
|
<meta property="twitter:title" content="humanAI — ludzka strona AI" />
|
|
|
|
|
<meta property="twitter:description" content="Strategia, automatyzacje, produkty AI i systemy multiagentowe projektowane z człowiekiem w centrum." />
|
|
|
|
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
|
|
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
|
|
|
|
</head>
|
|
|
|
|
<body class="bg-background text-foreground antialiased selection:bg-primary selection:text-background">
|
|
|
|
|
<div id="root"></div>
|
|
|
|
|
<script type="module" src="/src/main.tsx"></script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|