рдЕрдкрдиреЗ рдкреНрд░рд╢реНрди рдХреЛ рдкреВрдЫреЗрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕ рдкреГрд╖реНрда рдФрд░ рдЖрдкрдХреЗ рдЪреБрдиреЗ рд╣реБрдП AI рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдЗрд╕ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдПрдХ AI рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреА рдЧрдИ рд╣реИред
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВрдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ GitHub рдкрд░ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░рдХреЗ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП GitHub рд▓рд┐рдВрдХрджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ Markdown рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
Hreflang: рдмрд╣реБрднрд╛рд╖реА SEO рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб
рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдРрдк рдХреЛ translate рдХрд┐рдпрд╛ред рдЖрдкрдиреЗ /en, /fr, /es ship рдХрд┐рдПред рдФрд░ рдлреНрд░рд╛рдВрд╕реАрд╕реА users рдЕрднреА рднреА English рдкреЗрдЬ рдкрд░ рд▓реИрдВрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рдЖрдзрд╛ рд╣реИред рдХрдард┐рди рдЖрдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрдЪ рдЗрдВрдЬрди рдХреЛ рдмрддрд╛рдпрд╛ рдЬрд╛рдП рдХрд┐ рдпреЗ рдкреЗрдЬ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╣реА рдкреЗрдЬ рд╣реИрдВ, рддреАрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ hreflang рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдЗрдЯреЗрдВ рдЪреБрдк-рдЪрд╛рдк рдЕрдкрдиреА рдЯреНрд░реИрдлрд┐рдХ рдЦреЛ рджреЗрддреА рд╣реИрдВред
Hreflang рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ
рдПрдХ рдкреЗрдЬ рдкрд░ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛ рдХрд╣рддрд╛ рд╣реИ: рдЗрд╕ URL рдХреЗ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдпрд╣ рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬреЗрдВ рджреЗрддрд╛ рд╣реИ: рд╕рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛, рдФрд░ рдЖрдкрдХреЗ 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, рд╣рдореЗрд╢рд╛
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдмрдЬрд╛рдп рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗред 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 рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ рдПрдХ 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
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рднреВрд▓реА рд╣реБрдИ рд╣реИ, рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭреА рдЬрд╛рддреА рд╣реИ, рд╡рд╣ рд╣реИ 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 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рд╣рд░ locale рдХреЗ canonical рдХреЛ English version рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдлреНрд░реЗрдВрдЪ рдкреЗрдЬ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ hreflang рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлреНрд░реЗрдВрдЪ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реЛрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рд╣реИред рд╕рд┐рдЧреНрдирд▓ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИрдВ, canonical рдЬреАрддрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рдлреНрд░реЗрдВрдЪ рдкреЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
Canonical рд╕реНрд╡-рд╕рдВрджрд░реНрднреА рд╣реИ рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓ред hreflang рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
URL рд╕рдВрд░рдЪрдирд╛ рдЪреБрдирдирд╛
hreflang URLs рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рдЖрддреА рд╣реИред
рд╕рднреА рдбреЗрдЯрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдореЛрдбрд▓ рдореЗрдВ рдЦреЛрд▓реЗрдВ
| рд╕рдВрд░рдЪрдирд╛ | рдЙрджрд╛рд╣рд░рдг | Trade-off |
|---|---|---|
| Subdirectories | example.com/fr/ | рдПрдХ рдбреЛрдореЗрди, рд╕рд╛рдЭрд╛ authority тАФ рдХрдордЬреЛрд░ geo-signal |
| Subdomains | fr.example.com | рд▓реЛрдХреЗрд▓ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рд╣рдЯрд╛рдирд╛ рдЖрд╕рд╛рди тАФ рдЕрд▓рдЧ рд╕рд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ |
| ccTLDs | example.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 рд╕реВрдЪреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рд╣рд░ рдкреЗрдЬ рдкрд░ cluster emit рдХрд░реЗрдВ
рд╣рд░ рдЬрдЧрд╣ рдПрдХ рд╣реА рд╕реЗрдЯ, рд╣рд░ locale рдХреЗ рд▓рд┐рдП canonical, absolute URLs,
x-defaultрд╢рд╛рдорд┐рд▓редMetadata API
alternates.languagesрдХреЛ expose рдХрд░рддрд╛ рд╣реИ, рдФрд░getMultilingualUrlsрдЖрдкрдХреА configured locales рд╕реЗ рдкреВрд░рд╛ record рдмрдирд╛рддрд╛ рд╣реИ:src/app/[locale]/about/page.tsxрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдкреВрд░рд╛ рд╕реЗрдЯрдЕрдк: Next.js 16 i18n guide.
route рдХрд╛
headрдлрд╝рдВрдХреНрд╢рди links рдХреЛ рдмрдирд╛рддрд╛ рд╣реИредlocaleMapрдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП locales рдХреЛ iterate рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП config рдореЗрдВ рдПрдХ locale рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рд╕рднреА рдЬрдЧрд╣ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ:src/routes/{-$locale}/about.tsxрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
headрд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреИрдЧ рдкреНрд░рд╛рд░рдВрднрд┐рдХ HTML рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдкреВрд░реНрдг рд╕реЗрдЯрдЕрдк: TanStack Start i18n guideредрдпрд╛ рдЗрд╕реЗ рд╕рднреА рдХреЛ sitemap рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ
рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░, annotations рдХреЛ рдЕрдкрдиреЗ pages рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдмрд╛рд╣рд░ рд░рдЦреЗрдВред
generateSitemapрдкреНрд░рддреНрдпреЗрдХ entry рдХреЗ рд▓рд┐рдПxhtml:linkalternates emit рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ config рд╕реЗ locales рдФрд░ routing mode рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ:src/routes/sitemap[.]xml.tsрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рджреЛ рд╡рд┐рдХрд▓реНрдк рдЬрд╛рдирдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВ:
xhtmlLinks(рдбрд┐рдлрд╝реЙрд▓реНрдЯtrue) тАФ alternates рдХреЗрд╡рд▓ рд╡рд╣реАрдВ emit рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ locale URLs рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВредno-prefixрдореЛрдб рдореЗрдВ рд╣рд░ locale рдПрдХ рд╣реА URL рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рддрдм рддрдХ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХrouting.domainslocales рдХреЛ рдЙрдирдХреЗ рдЕрдкрдиреЗ hostnames рдирд╣реАрдВ рджреЗрддрд╛редentryPerLocale(defaultfalse) тАФ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ<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 рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред
Verify рдХрд░реЗрдВ рдХрд┐ crawler рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
hreflangsilently 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 рд╣реЛрддрд╛ рд╣реИ
- рд╕рднреА
hrefvalues emitted HTML рдореЗрдВ absolute рд╣реИрдВ - Codes ISO 639-1 + ISO 3166-1 Alpha 2 рд╣реИрдВ (
en-GB,en-UKрдирд╣реАрдВ) -
x-defaultpresent рд╣реИ, рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ 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 рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЧреЗ рдмрдврд╝рдирд╛
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдЕрднреА рддрдХ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдмрдиреЗрдВред
