Руководства

Многоязычный сайт и несколько стран: одна локация или несколько

Многоязычный сайт и несколько стран: одна локация или несколько

Сайт выходит на несколько стран: добавляется английская версия, казахская, отдельная для Европы. Сразу возникают вопросы, которые переводом не решаются. Как устроить адреса языковых версий? Как объяснить поисковикам, какую версию кому показывать? Нужен ли отдельный сервер в каждой стране, или хватит одного? Ниже — практические ответы: структура URL, разметка hreflang, ошибки с автоопределением языка и схемы размещения от «один сервер и CDN» до серверов в разных регионах.

Как устроить адреса языковых версий

СхемаПримерПлюсыМинусы
Подкаталогиexample.com/en/, example.com/kk/Один домен и сертификат, вес домена общий, проще всего обслуживатьВсе версии на одном сервере и в одной юрисдикции
Поддоменыen.example.comВерсии можно разнести по разным серверамПоисковики частично воспринимают их как отдельные сайты
Отдельные доменыexample.kz, example.deСильный сигнал стране и пользователям, можно разные юрлица и юрисдикцииНесколько доменов и сертификатов, продвижение каждого с нуля

Для большинства проектов разумный выбор по умолчанию — подкаталоги. Отдельные домены оправданы, когда в странах разные компании, ассортимент, цены и законы. Поддомены — промежуточный вариант, удобный, если версии технически живут на разных серверах.

Чего делать не стоит: держать языковую версию по одному и тому же адресу и переключать язык через cookie или параметр. Поисковый робот увидит только одну версию, остальные в поиск не попадут.

Hreflang: как сказать поисковику, кому какая версия

Без разметки поисковик видит несколько похожих страниц и может показать пользователю из Германии русскую версию, а из Москвы — английскую. Разметка hreflang перечисляет все языковые варианты страницы. В <head> каждой версии:

<link rel="alternate" hreflang="ru" href="https://example.com/ru/tarify/">
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing/">
<link rel="alternate" hreflang="kk-KZ" href="https://example.com/kk/tarifter/">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing/">

Правила, на которых чаще всего ошибаются:

  • Связи взаимные. Если русская страница ссылается на английскую, английская обязана ссылаться на русскую. Односторонние ссылки игнорируются.
  • Страница указывает и на себя. Набор одинаковый во всех версиях, включая ссылку на саму страницу.
  • Код языка — ISO 639-1, региона — ISO 3166-1: en, en-GB, es-MX. en-UK или kz вместо kk — ошибки, их молча пропускают.
  • x-default — версия для тех, чей язык не совпал ни с одним вариантом. Обычно английская или страница выбора языка.
  • Canonical каждой версии указывает на неё саму, а не на «главную» языковую версию. Иначе остальные выпадут из индекса.

Если страниц тысячи, разметку удобнее вынести в sitemap: для каждого адреса перечисляются альтернативы через xhtml:link. Google и Яндекс учитывают hreflang. Для Яндекса дополнительно полезно указать регион сайта в Вебмастере, если версии рассчитаны на разные страны.

Автоопределение языка: осторожно

Соблазнительно определять страну по IP и сразу перебрасывать посетителя на «его» версию. На практике это мешает:

  • человек в командировке получает не тот язык и не может переключиться обратно;
  • поисковый робот обходит сайт из одной страны и видит только одну версию;
  • пользователи VPN и корпоративных сетей попадают куда угодно.

Разумнее так: принудительно перенаправлять можно только с корня сайта (/), и только один раз, по языку браузера (заголовок Accept-Language), а не по IP. Внутренние страницы открываются на том языке, который в адресе. Переключатель языка заметен на каждой странице, выбор запоминается в cookie. Если язык браузера не совпадает с языком страницы, можно показать ненавязчивую подсказку «Есть версия на русском», но не перебрасывать.

Язык — это ещё и регион

Английский для США и для Великобритании, русский для России и для Казахстана различаются не только словами. Валюта, формат дат и чисел, способы оплаты, доставка, телефонные форматы, юридические тексты. Цена не в той валюте или отсутствие привычного способа оплаты отталкивают сильнее неидеального перевода. Поэтому версии обычно привязывают не к языку, а к паре «язык + регион».

Один сервер или несколько

Главный технический вопрос. Ответ зависит от того, насколько далеко аудитория и насколько сайт динамический.

Вариант 1. Один сервер + CDN — для большинства

Сервер в точке, удобной для основной аудитории; картинки, стили и скрипты отдаёт CDN с узлов рядом с пользователями. HTML с сервера идёт одним запросом, всё тяжёлое приезжает из ближайшего узла. Для аудитории в Европе и СНГ один сервер в Нидерландах или Финляндии обычно закрывает всё. Сколько стоит расстояние и как его измерить — в статье «Высокая задержка».

Вариант 2. Отдельный сервер на регион

Нужен, когда аудитории на разных континентах, а сайт сильно динамический (личный кабинет, интерактив), или когда законы требуют хранить данные в определённой стране. Самая простая рабочая схема — независимые региональные сайты: свой сервер и своя база в каждом регионе, общий только код. Например, example.com на сервере в Европе и example.us на сервере в США.

Сложнее — один сайт с единой базой на несколько регионов: потребуется репликация базы, решение, где происходят записи, и гео-DNS, который направляет пользователя на ближайший сервер. Это заметно дороже в разработке и обслуживании, и браться за это стоит, только когда простые схемы перестали справляться.

Учитывайте законы о данных

Если одна из версий собирает персональные данные граждан России, по 152-ФЗ они должны записываться и храниться в базе на территории России. Для такого проекта естественная схема: российская версия с базой на сервере в России, международная — на европейском сервере со своей базой. Подробнее о требованиях — в статье «Приватность на VPS».

СитуацияСхема
Аудитория в Европе и СНГ, обычный сайт или магазинОдин сервер в Нидерландах или Финляндии + CDN для статики
Россия + Казахстан и Средняя АзияОдин сервер в России или Казахстане; при требованиях к данным — по серверу в каждой стране
Европа + Северная Америка, сайт с личным кабинетомОтдельные региональные сайты: Нидерланды и США
Данные россиян и международная аудиторияРоссийская версия с базой в России, международная — в Европе

Технические мелочи

  • Кодировка UTF-8 везде — в базе (utf8mb4 в MySQL), в соединении с базой, в заголовках ответа. Иначе казахские, турецкие или немецкие символы превращаются в вопросы.
  • Атрибут lang в теге <html> каждой версии: <html lang="kk">. Его используют браузеры, программы чтения с экрана и переводчики.
  • Сертификат на все домены и поддомены версий — «SSL на VPS».
  • Кэш с учётом языка. Если язык определяется не по адресу, а по cookie, ключ кэша должен его учитывать, иначе одни посетители увидят страницу на чужом языке.
  • Резерв. Сервер в другом регионе может быть и резервной площадкой на случай аварии основного — схема в статье «Сервер для бэкапа».

Площадки под регионы

АудиторияПлощадкаЗадержка из РФ
Европа целикомНидерланды: крупнейший узел обмена трафиком, NVMe40–60 мс
Россия и ЕвропаФинляндия: Xeon Gold 3.0 GHz, NVMe20–40 мс
Казахстан, Средняя АзияКазахстан (Алматы)50–80 мс
Северная АмерикаСША (Нью-Йорк, Лос-Анджелес)100–150 мс

Start в Нидерландах — $10/мес   Start в США — $10/мес   Start в Казахстане — $10/мес

Цены указаны на момент публикации, оплата у провайдера. Start — 2 vCPU и 2 ГБ памяти; для сайта на CMS с несколькими языковыми версиями этого обычно хватает.

Коротко

  • По умолчанию — подкаталоги (/en/, /kk/); отдельные домены, когда в странах разный бизнес.
  • Hreflang взаимный, со ссылкой на себя, с правильными кодами и x-default; canonical каждой версии — на себя.
  • Не перебрасывайте по IP; перенаправление — только с корня и по языку браузера, переключатель на каждой странице.
  • Для большинства хватит одного сервера и CDN; отдельные серверы — для разных континентов с динамикой или из-за законов о данных.
  • Данные россиян — в базе в России; международная версия может жить отдельно.