Dokumentacja

Ustaw język strony

Ustaw język strony

Atrybut lang w znaczniku <html> mówi, w jakim języku napisana jest strona: <html lang="pl">. Czytniki ekranu wybierają na jego podstawie właściwy głos i wymowę; bez niego polską stronę czyta angielski głos i trudno ją zrozumieć. Przeglądarka decyduje na jego podstawie, czy zaproponować tłumaczenie, a wyszukiwarki traktują go jako jeden z sygnałów, do kogo strona jest skierowana.

To jeden atrybut, zwykle ustawiany w jednym miejscu dla całej witryny. Lista kontrolna strony ostrzega, gdy strona główna go nie ma.

Jaka powinna być wartość

Wartość to kod języka (BCP 47): dwuliterowe oznaczenie języka, w razie potrzeby z regionem.

Wartość Znaczenie
en angielski
en-GB, en-US angielski z regionem, gdy różnica ma znaczenie
sl słoweński
pl polski
de-AT niemiecki w wersji austriackiej

Częste błędy:

  • pl_PL, en_US z podkreślnikiem to nazwy lokalizacji na serwerze, a nie kody języka w HTML. Użyj łącznika: pl-PL albo po prostu pl.
  • si to syngaleski, nie słoweński. Słoweński to sl.
  • Jedna wartość dla wszystkich języków. W witrynie wielojęzycznej polskie strony potrzebują pl, a angielskie en; lang="pl" na każdej stronie jest na większości z nich błędne.

Lista kontrolna sprawdza tylko, czy atrybut istnieje. Czy wartość pasuje do treści, musisz potwierdzić sam.

Sprawdź sam

Zamiast example.com wpisz swoją stronę:

curl -s https://example.com | grep -io '<html[^>]*>'

Wynik powinien zawierać lang="…" z właściwym kodem, na przykład <html lang="pl">. W witrynie wielojęzycznej uruchom polecenie dla jednej strony w każdym języku.

Jak to naprawić

Wybierz, na czym zbudowana jest Twoja strona. Na większości platform język pochodzi z jednego ustawienia; we własnym kodzie to jedna linia w głównym szablonie.

WordPress

WordPress sam wypisuje atrybut na podstawie ustawienia Settings → General → Site Language, przez funkcję language_attributes() w motywie. Jeśli atrybutu brakuje, sprawdź dwie rzeczy.

1. Język witryny. Otwórz Settings → General, wybierz właściwy Site Language i kliknij Save Changes.

2. Motyw. Motywy blokowe (Twenty Twenty-Two i nowsze) zawsze go wypisują. Motyw klasyczny musi wywołać language_attributes() w header.php, a niektóre starsze lub tworzone na zamówienie motywy wypisują samo <html>. Otwórz header.php (w motywie potomnym, aby aktualizacja nie nadpisała zmiany) i popraw linię tak:

<!DOCTYPE html>
<html <?php language_attributes(); ?>>

Witryny wielojęzyczne. WPML i Polylang przełączają język dla każdej strony przez tę samą funkcję, więc z motywem, który wywołuje language_attributes(), każde tłumaczenie dostaje własny kod bez dodatkowej konfiguracji. Jeśli wszystkie języki mają ten sam kod, wartość jest zapisana na sztywno w motywie: popraw header.php jak wyżej.

Następnie wyczyść pamięć podręczną stron (WP Rocket, LiteSpeed Cache, W3 Total Cache, cache Twojego hostingu).

Node.js i Next.js

Next.js, App Router. Znacznik <html> wypisuje główny layout. W app/layout.tsx (lub .js):

export default function RootLayout({ children }) {
    return (
        <html lang="pl">
            <body>{children}</body>
        </html>
    );
}

Jeśli każdy język ma własną ścieżkę (app/[lang]/layout.tsx), weź wartość ze ścieżki. W Next.js 15 i nowszych params jest promise:

export default async function RootLayout({ children, params }) {
    const { lang } = await params;

    return (
        <html lang={lang}>
            <body>{children}</body>
        </html>
    );
}

Next.js, Pages Router. Z ustawieniem i18n w next.config.js Next.js sam ustawia lang. Bez niego ustaw go w pages/_document.js:

import { Html, Head, Main, NextScript } from 'next/document';

export default function Document() {
    return (
        <Html lang="pl">
            <Head />
            <body>
                <Main />
                <NextScript />
            </body>
        </Html>
    );
}

Inne aplikacje Node.js (Express z silnikiem szablonów, Nuxt, Astro, SvelteKit): ustaw go tam, gdzie wypisywany jest znacznik <html>. W SvelteKit to src/app.html, w Astro główny layout, w Nuxt app.head.htmlAttrs w nuxt.config.

Laravel

Nowe projekty Laravel mają to już w szablonach, projekty zaczęte od własnego szablonu często nie. W głównym layoucie (na przykład resources/views/layouts/app.blade.php):

<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

app()->getLocale() to język aplikacji z config/app.php (APP_LOCALE w .env) albo ten, który dla żądania ustawia Twój middleware językowy. str_replace zamienia lokalizację w rodzaju pl_PL na poprawne pl-PL.

Statyczny HTML

Każdy plik HTML zaczyna się od tego samego znacznika. Dodaj do niego atrybut na każdej stronie:

<!DOCTYPE html>
<html lang="pl">

Jeśli stronę buduje generator (Hugo, Jekyll, Eleventy), zmień to raz w szablonie bazowym. W Hugo ustaw languageCode w konfiguracji witryny i użyj <html lang="{{ site.Language.LanguageCode }}"> w szablonie bazowym.

Shopify

Motywy Shopify wypisują atrybut na podstawie języka sklepu: Dawn i inne aktualne motywy używają <html lang="{{ request.locale.iso_code }}">. Języki ustawia się w Settings → Languages.

Jeśli go brakuje, motyw został zmodyfikowany albo jest stary. Otwórz Online Store → Themes → … → Edit code, znajdź layout/theme.liquid i zmień znacznik <html> na:

<html lang="{{ request.locale.iso_code }}">

Wix

Wix wypisuje atrybut na podstawie języka witryny, a z Wix Multilingual przełącza go dla każdego języka. Znacznika <html> nie można edytować. Jeśli lista kontrolna pokazuje zły język, zmień język witryny w ustawieniach językowych w panelu; jeśli nie pokazuje żadnego, skontaktuj się z pomocą Wix.

Webflow

Webflow bierze wartość z głównej lokalizacji witryny: w Site settings → Localization ustaw główną lokalizację (primary locale) i opublikuj witrynę ponownie. Z Webflow Localization każda lokalizacja dostaje na swoich stronach własny kod.

Squarespace

Squarespace wypisuje atrybut na podstawie języka witryny w Settings → Language & Region. Jeśli jest błędny, zmień go tam. Znacznika <html> nie można edytować bezpośrednio.

Potwierdź poprawkę

Uruchom ponownie polecenie curl z sekcji Sprawdź sam, potem otwórz cel w PulseKeeper i kliknij Sprawdź teraz na zakładce Lista kontrolna. Pozycja zmieni się na OK w ciągu kilku minut, a nie dopiero przy kolejnym codziennym sprawdzeniu.