Author:
    Creation:2026-08-29Last update:2026-08-29

    Hreflang: рдмрд╣реБрднрд╛рд╖реА SEO рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб

    рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдРрдк рдХреЛ translate рдХрд┐рдпрд╛ред рдЖрдкрдиреЗ /en, /fr, /es ship рдХрд┐рдПред рдФрд░ рдлреНрд░рд╛рдВрд╕реАрд╕реА users рдЕрднреА рднреА English рдкреЗрдЬ рдкрд░ рд▓реИрдВрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВред

    рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рдЖрдзрд╛ рд╣реИред рдХрдард┐рди рдЖрдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрдЪ рдЗрдВрдЬрди рдХреЛ рдмрддрд╛рдпрд╛ рдЬрд╛рдП рдХрд┐ рдпреЗ рдкреЗрдЬ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╣реА рдкреЗрдЬ рд╣реИрдВ, рддреАрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ hreflang рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдЗрдЯреЗрдВ рдЪреБрдк-рдЪрд╛рдк рдЕрдкрдиреА рдЯреНрд░реИрдлрд┐рдХ рдЦреЛ рджреЗрддреА рд╣реИрдВред

    Hreflang рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ

    рдПрдХ рдкреЗрдЬ рдкрд░ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛ рдХрд╣рддрд╛ рд╣реИ: рдЗрд╕ URL рдХреЗ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред

    html
    <link rel="alternate" hreflang="en" href="https://example.com/about" />
    <link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
    <link rel="alternate" hreflang="es" href="https://example.com/es/about" />
    <link rel="alternate" hreflang="x-default" href="https://example.com/about" />
    

    рдпрд╣ рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬреЗрдВ рджреЗрддрд╛ рд╣реИ: рд╕рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛, рдФрд░ рдЖрдкрдХреЗ locales рдХреЛ рдПрдХ cluster рдореЗрдВ consolidated рдХрд░рдирд╛ рдмрдЬрд╛рдп duplicates рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ cannibalize рдХрд░рдиреЗ рдХреЗред

    рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ redirect рдирд╣реАрдВ рд╣реИ тАФ рдпрд╣ рдПрдХ hint рд╣реИ, рдФрд░ Google рдЗрд╕реЗ override рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ ranking boost рдирд╣реАрдВ рд╣реИ тАФ рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ рдХреМрди рд╕рд╛ version ranks рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреНрдпрд╛ рдЖрдк rank рдХрд░рддреЗ рд╣реИрдВред рдФрд░ Bing рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ ignore рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп content-language рдФрд░ geo-targeting рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реИред

    рдЗрд╕реЗ рдХрд╣рд╛рдБ declare рдХрд░реЗрдВ

    рддреАрди placements, рд╕рднреА valid рд╣реИрдВред рдПрдХ рдЪреБрдиреЗрдВ рдФрд░ рд╡рд╣реАрдВ рд░рд╣реЗрдВ тАФ рдПрдХ рд╣реА cluster рдХреЛ рджреЛ рдЬрдЧрд╣реЛрдВ рдкрд░ declare рдХрд░рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ sets рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

    HTML <head> рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИред рдПрдХ caveat: hydration рдХреЗ рдмрд╛рдж inject рдХрд┐рдП рдЧрдП tags unreliable рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХрд╛ framework рдХреЗрд╡рд▓ client-side рдкрд░ рдЙрдиреНрд╣реЗрдВ add рдХрд░рддрд╛ рд╣реИ, рддреЛ crawler рдЙрдиреНрд╣реЗрдВ рдХрднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

    XML sitemap рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмреЗрд╣рддрд░ рд╣реИред рджрд╕ locales рдХреЛ 5,000 pages рдореЗрдВ рдлреИрд▓рд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ 50,000 <link> elements рдХреЛ browsers рдореЗрдВ рдмреЗрдХрд╛рд░ рднреЗрдЬрдирд╛; рдПрдХ sitemap рдореЗрдВ рдЗрд╕рдХреА рдХреАрдордд рдЖрдкрдХреА pages рд╕реЗ рд╢реВрдиреНрдп bytes рд╣реИред

    HTTP Link header PDFs рдЬреИрд╕реА рдЧреИрд░-HTML files рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред

    рдирд┐рдпрдо

    Self-reference рдФрд░ reciprocity

    /fr/about рдкрд░ рд╕реЗрдЯ рдореЗрдВ hreflang="fr" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ /fr/about рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗред рдФрд░ рдЕрдЧрд░ /about /fr/about рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ /fr/about рдХреЛ рд╡рд╛рдкрд╕ рдЗрд╢рд╛рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Google рдПрдХрддрд░рдлрд╛ reference рдХреЛ "no return tag" рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ drop рдХрд░ рджреЗрддрд╛ рд╣реИред

    рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ cluster рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ page identical links рдХрд╛ рд╕реЗрдЯ рднреЗрдЬрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ shared locale list рд╕реЗ generate рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд╣реА рд░рд╣рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ locales рд╣реЛрдВред

    Absolute URLs, рд╣рдореЗрд╢рд╛

    html
    <!-- рдореВрдХ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ -->
    <link rel="alternate" hreflang="fr" href="/fr/about" />
    
    <!-- рд╕рд╣реА -->
    <link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
    

    рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдмрдЬрд╛рдп рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗред hreflang рдПрдХ cross-document reference рд╣реИ: search engines рдПрдХ cluster рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ URL рд╕реЗ keyed рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣рд░ page рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ relative path рдХрд╛ рдХреЗрд╡рд▓ рдЙрд╕ document рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрд░реНрде рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдмреИрдард╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕реЗ express рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдПрдХ host рдХреЛ рднреА cross рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ тАФ рдФрд░ рдПрдХ alternate рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдПрдХ locale example.fr рдпрд╛ fr.example.com рдкрд░ рд░рд╣рддрд╛ рд╣реИред рдПрдХ sitemap рдпрд╛ рдПрдХ HTTP header рдореЗрдВ resolve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ base document рдирд╣реАрдВ рд╣реИред

    рдЗрд╕рдХрд╛ рдХреЛрдб рдореЗрдВ рд╕реАрдзрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред getLocalizedUrl("/about", "fr") /fr/about рджреЗрддрд╛ рд╣реИ тАФ relative in, relative outред hreflang рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ absolute URL рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

    ts
    getLocalizedUrl("/about", "fr"); // тЖТ "/fr/about"          тЭМ dropped
    getLocalizedUrl("https://example.com/about", "fr"); // тЖТ "https://example.com/fr/about"  тЬЕ
    

    рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ рдПрдХ framework рдЬреЛ rendering рд╕реЗ рдкрд╣рд▓реЗ relative values рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП resolve рдХрд░рддрд╛ рд╣реИ: Next.js relative alternates рдХреЛ metadataBase рдХреЗ рд╡рд┐рд░реБрджреНрдз expand рдХрд░рддрд╛ рд╣реИред рдареАрдХ рд╣реИ тАФ рд▓реЗрдХрд┐рди рдирд┐рдпрдо emitted HTML рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП curl рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, DevTools inspector рдирд╣реАрдВред

    рднрд╛рд╖рд╛ рдХреЛрдб

    ISO 639-1 рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, ISO 3166-1 Alpha 2 optional region рдХреЗ рд▓рд┐рдП: fr, fr-CA, pt-BRред

    рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ region рдЕрдорд╛рдиреНрдп рд╣реИ тАФ hreflang="ca" рдХрд╛рддрд╛рд▓рд╛рди рд╣реИ, рдХрдирд╛рдбрд╛ рдирд╣реАрдВ; рдЖрдкрдХреЛ en-CA рдпрд╛ fr-CA рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ en-UK рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ: рдпреВрдирд╛рдЗрдЯреЗрдб рдХрд┐рдВрдЧрдбрдо рдХреЗ рд▓рд┐рдП country code GB рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ en-GB рд╣реИред

    рдХреЗрд╡рд▓ рддрднреА рдПрдХ region рдЬреЛрдбрд╝реЗрдВ рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ region рдХреЛ рдЕрд▓рдЧ content provide рдХрд░рддреЗ рд╣реЛрдВ тАФ рдЕрд▓рдЧ рдХреАрдорддреЗрдВ, рдЕрд▓рдЧ рдХрд╛рдиреВрдиреА рдиреЛрдЯрд┐рд╕ред fr рдФрд░ fr-FR рд╕рдорд╛рди content рдкрд░ рд╢реЛрд░ рд╣реИред

    x-default

    html
    <link rel="alternate" hreflang="x-default" href="https://example.com/" />
    

    рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рднреВрд▓реА рд╣реБрдИ рд╣реИ, рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭреА рдЬрд╛рддреА рд╣реИ, рд╡рд╣ рд╣реИ x-default тАФ 30% рд╕реЗ рднреА рдХрдо apps рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

    рдпрд╣ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП fallback рд╣реИ рдЬрд┐рдирдХреА рднрд╛рд╖рд╛ рдЖрдкрдХреЗ рд╕реЗрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреАред рдПрдХ рдбрдЪ рднрд╛рд╖реА рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдРрд╕реА рд╕рд╛рдЗрдЯ рдкрд░ рдЬреЛ рдЕрдВрдЧреНрд░реЗрдЬреА, рдлреНрд░реЗрдВрдЪ рдФрд░ рд╕реНрдкреЗрдирд┐рд╢ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдХрд┐рд╕реА рднреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛; рдмрд┐рдирд╛ x-default рдХреЗ, Google рдЖрдкрдХреЗ рд▓рд┐рдП рдЪреБрдирддрд╛ рд╣реИред

    рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЧрд▓рдд рд╕рдордЭрддреЗ рд╣реИрдВред x-default "рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг" рдирд╣реАрдВ рд╣реИ рдФрд░ "рдбрд┐рдлреЙрд▓реНрдЯ locale" рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╡рд╣рд╛рдВ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╣ рд╕реЗрдЯ cover рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ legitimate рд╣реИ тАФ рдФрд░ рдЕрдХреНрд╕рд░ рдмреЗрд╣рддрд░ рд╣реИ тАФ рдЗрд╕реЗ /en рдХреЗ рдмрдЬрд╛рдп рдПрдХ language-selector рдпрд╛ geo-redirecting landing page рдкрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдирд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рдкреГрд╖реНрда рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреА primary language рдПрдХ sensible рдЙрддреНрддрд░ рд╣реИред

    рджреЛ рдЪреАрдЬреЗрдВ рд╕реНрдкрд╖реНрдЯ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП: x-default рд╕реЗрдЯ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд entry рд╣реИ, self-referencing рд╡рд╛рд▓реЗ рдХреА рдЬрдЧрд╣ рдирд╣реАрдВ, рдФрд░ рд╣рд░ рджреВрд╕рд░реА entry рдХреА рддрд░рд╣ рдЗрд╕реЗ cluster рдХреЗ рд╣рд░ рдкреЗрдЬ рдкрд░ identically рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

    рдХреИрдиреЛрдирд┐рдХрд▓ рдЯреНрд░реИрдк

    рдкреНрд░рддреНрдпреЗрдХ localized рдкреЗрдЬ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ canonical рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

    html
    <!-- https://example.com/fr/about рдкрд░ -->
    <link rel="canonical" href="https://example.com/fr/about" />
    <link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
    <link rel="alternate" hreflang="en" href="https://example.com/about" />
    

    рд╣рд░ locale рдХреЗ canonical рдХреЛ English version рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

    html
    <!-- https://example.com/fr/about рдкрд░ тАФ рдкреЗрдЬ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ -->
    <link rel="canonical" href="https://example.com/about" />
    

    рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдлреНрд░реЗрдВрдЪ рдкреЗрдЬ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ hreflang рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлреНрд░реЗрдВрдЪ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реЛрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рд╣реИред рд╕рд┐рдЧреНрдирд▓ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИрдВ, canonical рдЬреАрддрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рдлреНрд░реЗрдВрдЪ рдкреЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддреЗ рд╣реИрдВред

    Canonical рд╕реНрд╡-рд╕рдВрджрд░реНрднреА рд╣реИ рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓ред hreflang рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

    URL рд╕рдВрд░рдЪрдирд╛ рдЪреБрдирдирд╛

    hreflang URLs рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рдЖрддреА рд╣реИред

    рд╕рдВрд░рдЪрдирд╛рдЙрджрд╛рд╣рд░рдгTrade-off
    Subdirectoriesexample.com/fr/рдПрдХ рдбреЛрдореЗрди, рд╕рд╛рдЭрд╛ authority тАФ рдХрдордЬреЛрд░ geo-signal
    Subdomainsfr.example.comрд▓реЛрдХреЗрд▓ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рд╣рдЯрд╛рдирд╛ рдЖрд╕рд╛рди тАФ рдЕрд▓рдЧ рд╕рд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
    ccTLDsexample.frрд╕рдмрд╕реЗ рдордЬрдмреВрдд рджреЗрд╢ рд╕рдВрдХреЗрдд тАФ рдкреНрд░рддреНрдпреЗрдХ domain рдХреЗ рд▓рд┐рдП authority рдмрдирд╛рдИ рдЧрдИ

    Subdirectories рдЕрдзрд┐рдХрд╛рдВрд╢ projects рдХреЗ рд▓рд┐рдП рд╕рд╣реА default рд╣реИрдВред ccTLDs рддрдХ рдХреЗрд╡рд▓ рддрдм рдкрд╣реБрдВрдЪреЗрдВ рдЬрдм рдЖрдк рд╡рд╛рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреЗрд╢реЛрдВ рдХреЗ businesses рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВред

    рдПрдХ structure рдЬрд┐рд╕рд╕реЗ рдмрдЪрдирд╛ рд╣реИ: same URL рдкрд░ рд╡рд┐рднрд┐рдиреНрди languages рдХреЛ Accept-Language рдпрд╛ IP рдХреЗ рдЖрдзрд╛рд░ рдкрд░ serve рдХрд░рдирд╛ред Crawlers рдПрдХ version рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ version рдХреЛ index рдХрд░рддреЗ рд╣реИрдВ; рдмрд╛рдХреА рд╕рдм рдЕрджреГрд╢реНрдп рд╣реИред

    Intlayer рддреАрдиреЛрдВ рдХреЛ routing.mode рдФрд░ routing.domains рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ cover рдХрд░рддрд╛ рд╣реИред custom domains рдФрд░ configuration reference рджреЗрдЦреЗрдВред

    Implementation

    рдЗрди рдЯреИрдЧреНрд╕ рдХреЛ рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦрдирд╛ рджреВрд╕рд░реЗ locale рдХреЗ рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдирд╣реАрдВ рдЯрд┐рдХрддрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА locale рд╕реВрдЪреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

    1. рд╣рд░ рдкреЗрдЬ рдкрд░ cluster emit рдХрд░реЗрдВ

      рд╣рд░ рдЬрдЧрд╣ рдПрдХ рд╣реА рд╕реЗрдЯ, рд╣рд░ locale рдХреЗ рд▓рд┐рдП canonical, absolute URLs, x-default рд╢рд╛рдорд┐рд▓ред

      Metadata API alternates.languages рдХреЛ expose рдХрд░рддрд╛ рд╣реИ, рдФрд░ getMultilingualUrls рдЖрдкрдХреА configured locales рд╕реЗ рдкреВрд░рд╛ record рдмрдирд╛рддрд╛ рд╣реИ:

      src/app/[locale]/about/page.tsx
      import { getMultilingualUrls } from "intlayer";
      import type { Metadata } from "next";
      import type { LocalPromiseParams } from "next-intlayer";
      
      const SITE_URL = "https://example.com";
      
      export const generateMetadata = async ({
        params,
      }: LocalPromiseParams): Promise<Metadata> => {
        const { locale } = await params;
      
        /**
         * getMultilingualUrls(`${SITE_URL}/about`) returns:
         * {
         *   en: 'https://example.com/about',
         *   fr: 'https://example.com/fr/about',
         *   es: 'https://example.com/es/about',
         * }
         */
        // getMultilingualUrls(`${SITE_URL}/about`) рдпрд╣ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ:
        // {
        //   en: 'https://example.com/about',
        //   fr: 'https://example.com/fr/about',
        //   es: 'https://example.com/es/about',
        // }
        const multilingualUrls = getMultilingualUrls(`${SITE_URL}/about`);
      
        return {
          alternates: {
            canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
            languages: { ...multilingualUrls, "x-default": `${SITE_URL}/about` },
          },
        };
      };
      

      рдкреВрд░рд╛ рд╕реЗрдЯрдЕрдк: Next.js 16 i18n guide.

      route рдХрд╛ head рдлрд╝рдВрдХреНрд╢рди links рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред localeMap рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП locales рдХреЛ iterate рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП config рдореЗрдВ рдПрдХ locale рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рд╕рднреА рдЬрдЧрд╣ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ:

      src/routes/{-$locale}/about.tsx
      import { createFileRoute } from "@tanstack/react-router";
      import { defaultLocale, getLocalizedUrl, localeMap } from "intlayer";
      
      const SITE_URL = "https://example.com";
      
      export const Route = createFileRoute("/{-$locale}/about")({
        head: ({ params }) => {
          const { locale = defaultLocale } = params;
          // URL рдХреЛ define рдХрд░реЗрдВ
          const url = `${SITE_URL}/about`;
      
          return {
            links: [
              // canonical link рдХреЛ set рдХрд░реЗрдВ
              { rel: "canonical", href: getLocalizedUrl(url, locale) },
      
              // рд╕рднреА configured locales рдХреЗ рд▓рд┐рдП alternate links generate рдХрд░реЗрдВ
              ...localeMap(({ locale: mapLocale }) => ({
                rel: "alternate",
                hrefLang: mapLocale,
                href: getLocalizedUrl(url, mapLocale),
              })),
      
              {
                rel: "alternate",
                hrefLang: "x-default",
                href: getLocalizedUrl(url, defaultLocale),
              },
            ],
          };
        },
      });
      

      head рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреИрдЧ рдкреНрд░рд╛рд░рдВрднрд┐рдХ HTML рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдкреВрд░реНрдг рд╕реЗрдЯрдЕрдк: TanStack Start i18n guideред

    2. рдпрд╛ рдЗрд╕реЗ рд╕рднреА рдХреЛ sitemap рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ

      рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░, annotations рдХреЛ рдЕрдкрдиреЗ pages рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдмрд╛рд╣рд░ рд░рдЦреЗрдВред generateSitemap рдкреНрд░рддреНрдпреЗрдХ entry рдХреЗ рд▓рд┐рдП xhtml:link alternates emit рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ config рд╕реЗ locales рдФрд░ routing mode рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ:

      src/routes/sitemap[.]xml.ts
      import { generateSitemap } from "intlayer";
      
      const sitemap = generateSitemap(
        [
          { path: "/", changefreq: "daily", priority: 1.0 },
          { path: "/about", changefreq: "monthly", priority: 0.8 },
        ],
        { siteUrl: "https://example.com" }
      );
      

      рджреЛ рд╡рд┐рдХрд▓реНрдк рдЬрд╛рдирдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВ:

      • xhtmlLinks (рдбрд┐рдлрд╝реЙрд▓реНрдЯ true) тАФ alternates рдХреЗрд╡рд▓ рд╡рд╣реАрдВ emit рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ locale URLs рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред no-prefix рдореЛрдб рдореЗрдВ рд╣рд░ locale рдПрдХ рд╣реА URL рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рддрдм рддрдХ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ routing.domains locales рдХреЛ рдЙрдирдХреЗ рдЕрдкрдиреЗ hostnames рдирд╣реАрдВ рджреЗрддрд╛ред
      • entryPerLocale (default false) тАФ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ <url> entry рд╕рднреА alternates рдХреЛ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ forms рд╡реИрдз рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ URL рдЬреЛ <loc> рдХреЗ рд░реВрдк рдореЗрдВ listed рд╣реИ рд╡рд╣ Search Console рдореЗрдВ submitted рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ; alternate-only locales discoverable рд░рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА sitemap рдХреЛ attributed рдирд╣реАрдВ рд╣реЛрддреЗред рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рд╣рд░ localized URL рдХреЛ рдЕрдкрдирд╛ entry рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреВрд░рд╛ alternate set рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ entries рдХреЛ locale count рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 50,000 URL / 50 MB limit рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЗрд╕рд╕реЗ рдЖрдЧреЗ sitemap index рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред
    3. Verify рдХрд░реЗрдВ рдХрд┐ crawler рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ

      hreflang silently fail рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ assume рдХрд░рдиреЗ рдХреА рдмрдЬрд╛рдп check рдХрд░реЗрдВред

      рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝реЗрдВ, рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЛ рдирд╣реАрдВ тАФ curl https://example.com/fr/about | grep hreflang рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ crawler рдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ; DevTools JavaScript рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж DOM рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ alternate рдХреЛ follow рдХрд░реЗрдВ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рдорд╛рди set рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА redirect рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред Search Console рдХреА International Targeting report рдкреВрд░реА рд╕рд╛рдЗрдЯ рдореЗрдВ рдмрд╛рдХреА рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИред

      рдПрдХ multilingual-specific crawl рдХреЗ рд▓рд┐рдП, Intlayer SEO Scanner рдЖрдкрдХреЗ localized pages рдореЗрдВ missing tags, broken alternates, рдФрд░ canonical conflicts рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред

    Checklist

    • рдкреНрд░рддреНрдпреЗрдХ locale рдХреЗ рдкрд╛рд╕ рдПрдХ distinct, crawlable URL рд╣реИ
    • рд╣рд░ page self-references рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ reference reciprocal рд╣реИ
    • рд╕рдорд╛рди set cluster рдореЗрдВ рд╣рд░ page рдкрд░ ship рд╣реЛрддрд╛ рд╣реИ
    • рд╕рднреА href values emitted HTML рдореЗрдВ absolute рд╣реИрдВ
    • Codes ISO 639-1 + ISO 3166-1 Alpha 2 рд╣реИрдВ (en-GB, en-UK рдирд╣реАрдВ)
    • x-default present рд╣реИ, рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ unmatched users рдХреЛ рдХрд╣рд╛рдБ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
    • Canonical рдкреНрд░рддреНрдпреЗрдХ locale рдХреЗ рд▓рд┐рдП self-referential рд╣реИ
    • Tags server-rendered рд╣реИрдВ, hydration рдХреЗ рдмрд╛рдж inject рдирд╣реАрдВ рдХрд┐рдП рдЧрдП
    • рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬрдЧрд╣ declared рд╣реИрдВ
    • рдХреЛрдИ alternate redirects рдирд╣реАрдВ

    рдирд┐рд╖реНрдХрд░реНрд╖

    hreflang рд╕рд░рд▓ рдФрд░ unforgiving рд╣реИред рдПрдХ missing return tag, рдПрдХ relative URL, рдПрдХ cross-locale canonical, рдФрд░ cluster рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА error рдХреЗ discard рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╕рднреА tags рдХреЛ manually рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЖрддреЗ рд╣реИрдВред

    рдПрдХ рдПрдХрд▓ locale list рд╕реЗ set рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕реЗ server-side рдкрд░ render рдХрд░реЗрдВ, canonical рдХреЛ self-referential рд░рдЦреЗрдВ, рдФрд░ x-default рдХреЛ рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рджреЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдРрд╕рд╛ рдПрдХ рдмрд╛рд░ рдХрд░реЗрдВ рдФрд░ correctness рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝ рдмрди рдЬрд╛рдПрдЧреА рдЬрд┐рд╕реЗ рдЖрдк maintain рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

    рдЖрдЧреЗ рдмрдврд╝рдирд╛

    рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

    рдЕрднреА рддрдХ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдмрдиреЗрдВред

    рд╕рдВрдмрдВрдзрд┐рдд рдкреЛрд╕реНрдЯ

    рдирд╡реАрдирддрдо рдкреЛрд╕реНрдЯ