StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • Audyt SEO i Performance
  • Testy automatyczne i QA
  • Konsultacje Produktowe
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
AstroSEOMarketing

Wielojęzyczność i hreflang w Astro SSG: Zasięg globalny, wdrożenie lokalne

Wielojęzyczna strona w Astro SSG bez chaosu w hreflang — jak poprawnie skonfigurować i18n dla sklepów i serwisów wchodzących na rynki zagraniczne.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
28 maja 2026 08:00
Czytanie
5 min czytania
Aktualizacja
8 czerwca 2026 08:00

Zanim Twoja oferta dotrze do zagranicznych klientów, Twoja strona musi zdać egzamin techniczny. Większość witryn odpada na tym etapie, marnując potencjał nawet najlepszej treści. Sprawdź, jak rygorystycznie skonfigurować wielojęzyczność i hreflang na statycznym Astro, by zasięg globalny szedł w parze z lokalną, błyskawiczną dostawą treści.

Artykuł w skrócie

  • SSG jest właściwym wyborem dla globalnego sklepu internetowego — każdy język to z góry wygenerowany HTML, idealny dla CDN, SEO i indeksacji.
  • Hreflang to serce operacji, bez którego wysyłasz do indeksu niemal duplikaty i prosisz Google, by zgadywało relacje. I robi to, ale z marnym skutkiem.
  • Trzy reguły rygoru: poprawne kody lokalizacji, sensownie ustawiony x-default, canonical dla każdej wersji językowej (a nie na język domyślny).
  • Pułapka częściowych tłumaczeń: standardowe integracje produkują wtedy błędny wynik, czyli emitują alternatywne adresy dla nieistniejących tłumaczeń. Rozwiązaniem są własne pliki generujące sitemapę i hreflang.
  • Niezmienna końcówka adresu (/en/produkt, /de/produkt) to pragmatyczny wybór domyślny. Tłumaczone końcówki rezerwuj dla treści, gdzie sam adres niesie wartość SEO (np. wpis na blogu i długi ogon zapytań).

Dlaczego SSG to właściwy wybór dla globalnego sklepu

Krajobraz 2026 roku sprzyja stronom statycznym w SSG (Static Site Generation) to generowanie kompletnego HTML podczas budowania strony. Gotowe pliki serwujesz z CDN bez renderowania na żądanie — najszybszy i najtańszy model dla treści, która nie zmienia się przy każdej wizycie. w internacjonalizacji z bardzo konkretnych powodów:

  • Każdy język dostaje własny, z góry wygenerowany HTML — optymalny dla SEO i indeksacji, bez tłumaczenia po stronie klienta, które wyszukiwarki widzą gorzej.
  • Łatwość buforowania na CDN — statyczne pliki rozkładają się globalnie, więc użytkownik w Tokio i w Berlinie dostaje stronę z bliskiego węzła.
  • Zero JavaScriptu domyślnie — szybkie ładowanie na całym świecie, co dla sklepu internetowego przekłada się wprost na konwersję.
  • Kolekcje treści Astro (Content Collections) — typowane, walidowane zarządzanie treścią w wielu językach.

Podejście statyczne jest łatwiejsze do buforowania, szybsze w globalnym serwowaniu i bardziej niezawodne niż tłumaczenie po stronie klienta.

Konfiguracja i18n: trasy i języki

Astro ma wbudowaną obsługę tras i18n. Przykładowa konfiguracja deklaruje obsługiwane języki i język domyślny:

Code
// astro.config.mjs
import { defineConfig } from 'astro/config'
 
export default defineConfig({
  site: 'https://twojsklep.com',
  i18n: {
    locales: ['pl', 'en', 'de', 'ja'],
    defaultLocale: 'pl',
    routing: {
      // false = adresy domyślnego języka są krótsze (bez prefiksu /pl/)
      prefixDefaultLocale: false,
    },
  },
})

Decyzja prefixDefaultLocale jest istotna o tyle, że false daje czystsze adresy dla języka domyślnego (/produkt zamiast /pl/produkt), co w większości przypadków wystarcza. true wybieraj wtedy, jeśli szczególnie zależy Ci na spójności struktury (każdy język z prefiksem).

Trasy oparte na prefiksie (/en/, /de/) są prostsze i działają ze statycznym hostingiem. Subdomeny (en.sklep.com) bywają lepsze pod SEO (ale nie zawsze i nie należy ich robić na siłę), ale wymagają konfiguracji DNS i serwera — dla SSG prefiks jest pragmatycznym standardem.

Astro pozwala też zdefiniować języki zapasowe dla poszczególnych języków, by użytkownik zawsze trafił na istniejącą treść, nawet jeśli dana podstrona nie ma jeszcze tłumaczenia.

Organizacja treści wielojęzycznej

Dla sklepu internetowego sprawdza się trzymanie treści w folderach dla każdego języka wewnątrz Kolekcji treści Astro (Content Collections):

Code
src/content/
├── produkty/
│   ├── pl/      # opisy po polsku
│   ├── en/      # opisy po angielsku
│   ├── de/      # opisy po niemiecku
│   └── ja/      # opisy po japońsku

Słowniki interfejsu (etykiety przycisków, komunikaty) trzymaj osobno, np. w src/i18n/*.json, i sięgaj po nie funkcją pomocniczą t('button.dodaj_do_koszyka') w oparciu o Astro.currentLocale.

Hreflang — najważniejszy sygnał SEO międzynarodowego

To jest serce całej operacji. Hreflang to atrybut wskazujący wyszukiwarce językowe i regionalne warianty tej samej strony, np. polski i angielski. Poprawnie ustawiony zapobiega duplikacji i kieruje użytkownika do właściwej wersji językowej. mówi Google, które URL-e są swoimi tłumaczeniami i w jakim są języku. Bez niego wysyłasz do indeksu prawie duplikaty i następnie prosisz Google, by zgadywało relacje. I to robi, ale z marnym skutkiem.

Tagi hreflang generujesz w <head> szablonu, przechodząc po wszystkich językach. Astro daje do tego funkcję pomocniczą getAbsoluteLocaleUrl. W przykładzie poniżej zakładamy, że końcówka adresu jest taka sama w każdym języku, a zmienia się tylko prefiks języka:

Code
---
// src/layouts/BaseLayout.astro
import { getAbsoluteLocaleUrl } from 'astro:i18n';
 
const locales = ['pl', 'en', 'de', 'ja'] as const;
const defaultLocale = 'pl';
const currentLocale = Astro.currentLocale ?? defaultLocale;
 
const localePrefixPattern = new RegExp(`^/(${locales.filter((locale) => locale !== defaultLocale).join('|')})(?=/|$)`);
const routePath = Astro.url.pathname
  .replace(localePrefixPattern, '')
  .replace(/^\/|\/$/g, '');
 
const canonical = getAbsoluteLocaleUrl(currentLocale, routePath);
---
<head>
  <!-- Wersje językowe tej samej strony -->
  {locales.map((locale) => (
    <link
      rel="alternate"
      hreflang={locale}
      href={getAbsoluteLocaleUrl(locale, routePath)}
    />
  ))}
 
  <!-- Wersja domyślna dla nieobsłużonych języków -->
  <link
    rel="alternate"
    hreflang="x-default"
    href={getAbsoluteLocaleUrl(defaultLocale, routePath)}
  />
 
  <!-- Kanoniczny URL bieżącej wersji -->
  <link rel="canonical" href={canonical} />
</head>

Jeśli tłumaczysz końcówki adresów (/produkt/, /en/product/, /de/produkt-de/), nie podmieniaj prefiksu mechanicznie. Wtedy potrzebujesz mapy odpowiedników dla każdego języka i generujesz hreflang z tej mapy, tylko dla realnie istniejących wersji.

Trzy reguły, których pilnuj rygorystycznie:

  • Kody lokalizacji poprawne. Używaj en, de, zh-cn — a nie wymyślonych wariantów. Niespójne kody psują cały mechanizm.

  • x-default jako świadoma wersja zapasowa. Wskazuje stronę dla użytkowników, których języka nie obsługujesz; zwykle będzie to język domyślny albo selektor języka.

  • Canonical dla każdej wersji językowej. Każda wersja wskazuje na siebie jako kanoniczną, nie na język domyślny.

Pułapka, o której mało kto mówi: częściowe tłumaczenia

Teraz uwaga na haczyk, który wywraca standardowe konfiguracje. Dopóki każda strona istnieje w każdym języku i struktura adresów jest jednolita, standardowe integracje (@astrojs/sitemap, @astrojs/rss plus szablon emitujący hreflang) wystarczą.

Problem pojawia się, gdy masz częściowe tłumaczenia, wyświetlasz treść zapasową (interfejs po hiszpańsku, ale konkretny produkt tylko po angielsku) albo masz rozdzielone języki interfejsu i treści. Wtedy standardowe integracje zaczynają produkować błędny wynik, czyli emitują alternatywne adresy dla nieistniejących tłumaczeń i wpisują do sitemapy strony, które tak naprawdę są treścią zapasową.

Standardowy hreflang wystarczy, dopóki każda strona istnieje w każdym języku. W realnym sklepie internetowym, gdzie 30% katalogu czeka na tłumacza, ten warunek nie jest spełniony niemal nigdy.

Rozwiązanie dla dojrzałego, wielojęzycznego sklepu: własne pliki generujące sitemapę i hreflang, które przechodzą po faktycznych Kolekcjach treści Astro, sprawdzają, czy dane tłumaczenie naprawdę istnieje, i emitują wpis tylko dla realnie przetłumaczonych stron. To więcej pracy, ale to różnica między poprawnym a wprowadzającym w błąd sygnałem dla Google.

Tłumaczyć końcówki adresów czy nie?

Teraz wchodzimy w decyzję architektoniczną, która ma konsekwencje zarówno operacyjne, jak i SEO. Jeśli prefiks języka się zmienia, a końcówka adresu nie (/en/produkt, /de/produkt), generowanie hreflang sprowadza się do podmiany fragmentu adresu, przełącznik języka nie potrzebuje mapy odpowiedników, a adresy URL pozostają „kopiowalne”. Dla anglojęzycznego sklepu z tłumaczonym pokryciem to zwykle właściwy wybór.

Warto zaznaczyć natomiast, że dla treści mocno osadzonej w danym języku (np. blog kulinarny celujący w lokalną publiczność) tłumaczone końcówki adresów są warte kosztu operacyjnego, ponieważ same w sobie niosą wartość SEO. To decyzja dla konkretnego projektu i musisz wyważyć koszt utrzymania wobec zysku z lokalnych fraz w adresie.

Sitemap i dane strukturalne

Domknij obraz za pomocą dwóch elementów. Pierwszym jest sitemapa, którą konfigurujesz przez @astrojs/sitemap z opcją i18n, by automatycznie generowała wpisy dla każdego języka. Drugim są dane strukturalne (schema.org), w których wstaw inLanguage zgodne z Astro.currentLocale (to dodatkowy, jednoznaczny sygnał języka dla wyszukiwarki):

Code
---
const articleSchema = {
  '@context': 'https://schema.org',
  '@type': 'Product',
  inLanguage: Astro.currentLocale ?? 'pl',
  // pozostałe pola produktu
};
---
<script type="application/ld+json" set:html={JSON.stringify(articleSchema)} />

Werdykt Labu

Globalny zasięg sklepu internetowego zaczyna się od poprawnej warstwy technicznej, a Astro SSG daje dobry fundament — z góry wygenerowany HTML dla każdego języka, dobrze działający z CDN i SEO. Kluczowe są jednak szczegóły: poprawne kody, świadomie ustawiony x-default i canonical dla każdej wersji językowej. Standardowe integracje wystarczą przy pełnym, jednolitym tłumaczeniu, ale już dla częściowych tłumaczeń i wersji zapasowych musisz przejść na własne pliki generujące sitemapę i hreflang, które emitują tylko realnie istniejące wersje. To różnica między poprawną indeksacją a zalaniem Google duplikatami. Pamiętaj, źle skonfigurowany hreflang mocno wpływa na jakość Twojej strony i może przepalić część budżetu włożonego w tłumaczenia oraz wejście na rynek.

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

SEO & Performance
  • Dlaczego SSG to właściwy wybór dla globalnego sklepu1 min
  • Konfiguracja i18n: trasy i języki1 min
  • Organizacja treści wielojęzycznej1 min
  • Hreflang — najważniejszy sygnał SEO międzynarodowego1 min
  • Pułapka, o której mało kto mówi: częściowe tłumaczenia1 min
  • Tłumaczyć końcówki adresów czy nie?1 min
  • Sitemap i dane strukturalne1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i dokumentacjaZweryfikowano: 8 czerwca 2026

Materiały wykorzystane do weryfikacji konfiguracji i18n, hreflang i sitemapy w Astro SSG dla międzynarodowego sklepu internetowego:

Astro docs: internationalization (i18n), Astro docs: getAbsoluteLocaleUrl, @astrojs/sitemap with i18n, Google Search Central: localized versions of your pages, Schema.org: inLanguage, Astro docs: Content Collections.

Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Hreflang i canonical w Next.js — SEO wielojęzycznych stron bez duplikacji
Hreflang i canonical w Next.js — SEO wielojęzycznych stron bez duplikacji

Błędny hreflang lub canonical w Next.js generuje tysiące zduplikowanych stron. Jak uniknąć tego w App Router przy wielojęzycznej strukturze?

Maciej Sala

Maciej Sala

Founder Strivelab

10 kwietnia 2026
Astro.js vs Next.js w 2026 — kompleksowe porównanie frameworków
Astro.js vs Next.js w 2026 — kompleksowe porównanie frameworków

Astro 6 vs Next.js 16 — zupełnie różne założenia. Które wybrać do strony usługowej, bloga, SaaS i e-commerce? Decydujące kryteria.

Maciej Sala

Maciej Sala

Founder Strivelab

15 kwietnia 2026
Pierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minut
Pierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minut

Od zera do wdrożonej strony w 15 minut — Astro w pigułce dla tych, którzy nie chcą tracić czasu na konfigurację.

Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026
Poprzedni wpisData Science w SQL: Jak wdrażać modele AI w Google BigQuery bez PythonaML bez Pythona — modele AI wdrażane bezpośrednio w BigQuery SQL. Kiedy in-database podejście wygrywa z klasycznym pipeline i ile to kosztuje?
Maciej Sala

Maciej Sala

Founder Strivelab

27 maja 2026
Następny wpisPlik llms.txt: jak wdrożyć i sformatować go w Next.js i Astro w 2026llms.txt to robots.txt dla modeli AI — ale działający zupełnie inaczej. Jak wygenerować go automatycznie w Next.js i Astro w 2026?
Maciej Sala

Maciej Sala

Founder Strivelab

28 maja 2026