Определение языка по настройкам пользователя
На сайтах с поддержкой переключения языков нужно определять язык, выставляемый по умолчанию. Для этого мы используем HTTP_ACCEPT_LANGUAGE и cookies.
Структура сайта
Предположим, что сайт имеет разделы на русском, английском и немецком языках по адресам /ru/, /en/ и /de/. Чтобы не ставить лишних редиректов и не терять поисковый эффект от главной страницы, мы используем язык по умолчанию на /. То есть при дефолтном английском это выглядит так:
- Английский: /
- Русский: /ru/
- Немецкий: /de/
Если пользователь введёт запрос /en/about/, он будет автоматически переадресован на /about/ с английским контентом.
Определение языка
Мы определяем язык только при заходе на главную страницу. Это важно, т. к. пользователю, пришедшему по ссылке с указанием языка, нужно включать именно этот язык вне зависимости от настроек.
Алгоритм выглядит примерно так:
- Смотрим cookies. Если указан параметр language, переадресуем на соответствующий язык и обновляем cookie.
- Смотрим HTTP_ACCEPT_LANGUAGE, разбираем его по частям. Важно понимать, что язык en и, к примеру, en-us — все равно английский. Переадресуем на соответствующий язык, ставим cookie с параметром language.
- Если HTTP_ACCEPT_LANGUAGE не указан (часто встречается у поисковых роботов или пользователей, использующих фильтрацию сетевого трафика), то оставляем язык по умолчанию (адрес остаётся /) и ставим cookie с этим языком.
Переключение языка
При любом запросе с указанием языка мы обновляем cookie, выставляя значение указанного языка. Если посетителю нужно переключиться на язык, выставленный по умолчанию (в нашем примере это английский), т. е. который не указывается в URL явно, пользователь отправляется на /en/, по которому сервер отвечает новым значением cookie и редиректом на /. То же справедливо для подразделов, если есть возможность переключать язык на внутренних страницах без выхода на главную.
Т. е. ссылки для переключения языка для раздела about будут такими:
- Английский: /en/about/ → /about/
- Русский: /ru/about/
- Немецкий: /de/about/
Прочие системы
Остальное совсем просто: хранение данных с указанием языка, таблица приоритетности языков, парсер HTTP_ACCEPT_LANGUAGE и т. п. Мы также используем флаг MULTILANGUAGE в конфигурации сайта для включения режима поддержки нескольких языков.
При реализации важно помнить, что поисковые системы тоже приходят на сайт и проходят по редиректам, игнорируя cookies, поэтому по прямым запросам нужно всегда выдавать релевантные данные.
