Пользователь
0,0
рейтинг
18 апреля 2013 в 11:11

Разработка → Разбираемся с построением мультирегиональных сайтов из песочницы

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


Варианты построения URL-ов

Конечно, в жизни существует больше групп, например, часть сайтов хранят региональные настройки в cookie-файлах, другие передают параметром ?lang=ru, однако это непопулярные решения и основными являются:

1. Версия сайта на другом домене:

example.com, example.ru
Самый кардинальный способ. Этот вариант может быть удобен компаниям, имеющим локальные представительства в разных странах и работающих относительно независимо от главного офиса, например, на другом движке сайта.

2. Версия сайта на поддомене:

ru.example.com, ua.example.com
Очень похож на предыдущий вариант, но легче в администрировании. Эти два варианта легко реализуются на физически разных хостах, поэтому могут быть размещены в разных странах.


3. Версия сайта в подкаталоге:

example.com/ru/, example.com/ua/
Самый простой способ, но разделить на разные серверы сложнее.

Часто возникающий вопрос, особенно у администраторов, впервые сталкивающихся с задачей создания мультирегионального сайта, состоит в том, какой подход выбрать для построения структуры URL. Дать однозначный ответ невозможно, слишком много разных факторов влияет на решение, однако, субъективное мнение таково: если ваш сайт для разных стран и языков будет работать на одном движке, используйте третий вариант. Он гораздо удобнее в работе для типичного проекта, к тому же, по этой же схеме работают и такие гиганты, как microsoft, ibm, apple и множество других. Подробная информация по построению URL-структуры легко находится на сайтах поисковых систем, поэтому детально останавливаться на ней нет смысла.

Концепция мультирегионального сайта

Итак, мы хотим создать сайт, который будет, предположим, работать в России, Украине и США. Языками, на которых будет работать наш сайт, будут русский, украинский и английский. Для построения URL-структуры берем третий вариант.

Обычно в примерах Гугла и Яндекса фигурируют простые и ограниченные схемы работы, как-то: в США показываем сайт на английском, в России — на русском, во Франции — на французском и так далее:

example.com/en-us/
example.com/ru-ru/
example.com/fr-fr/


Однако в реальной жизни появляются новые вопросы. А что делать для Украины, какой язык будем показывать? Есть русский и украинский. Хорошо, не проблема, добавляем новую связку

example.com/uk-ua/


А если нужно запустить версию сайта еще и в Канаде? Добавляем еще варианты с английским и французским:

example.com/en-ca/
example.com/fr-ca/


Короче говоря, выясняем, какие языки будем предоставлять для нужной нам территории и добавляем связки «язык — страна».

По этой схеме, кстати, работают и версии сайтов упомянутых компаний:

Microsoft: www.microsoft.com/home/en-ca/locale.aspx
Apple: www.apple.com/choose-your-country
IBM: www.ibm.com/planetwide/select/selector.html

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


Проблема с эмигрантами и высокомобильными людьми

Вернемся к нашему исходному примеру. Очевидно, что в США проживает много русскоговорящих и работать многие из них предпочтут с русскоязычной версией вашего сайта. Вариант «пусть перейдут на русскую версию сайта, example.com/ru-ru/» неверен, потому что они хотят видеть, например, цены на вашем сайте в долларах, видеть американский телефон, адрес и прочую контактную информацию, в общем, видеть все то же, что видят посетители example.com/en-us/, но при этом чтобы все было на русском языке.

Хорошо, можно создать еще одну связку языка со страной:

example.com/ru-us/


Да, но найдутся украинские эмигранты, которые предпочтут работать на американской версии, используя украиноязычную версию сайта. Естественно, многие на этом этапе махнут рукой и скажут «их мало, обойдутся». Однако, какой смысл снижать удобство работы с сайтом, ведь удобство пользователей — привязанность к вашему сайту, если человеку удобнее читать на украинском, он наверняка предпочтет ваш сайт аналогичному сайту конкурента. Тем более, у нас ведь уже есть перевод на украинский, какая проблема добавить и его? Хорошо, делаем еще одну версию:

example.com/uk-us/


Так, стоп, а ведь есть же и те, кто переехал из США в Россию, почему бы и им не дать возможность работать на английском? А ведь еще наверное есть и украиноязычные, живущие в России. Все эти примеры подводят нас к тому, что правильная схема работы сайта получается тогда, когда я сам могу выбрать язык и регион.

Вот, к примеру, сайт Майкрософта. Простой анализ показывает, что всего нам предлагается 96 связок «язык — страна», при этом языков — 38, а стран — 93. То есть выбрать другой язык можно всего лишь для нескольких стран, например, для Канады (английский и французский). Это смешно, но при огромном числе русскоговорящих жителей на Украине, можно выбрать только:

Россия — Русский
Україна — Українська

И всё! Выбрать «Украина — Русский» попросту нет возможности, при том, что большая часть населения разговаривает на русском. Если бы Майкрософт предлагал все возможные языки для любой страны, ему пришлось бы на странице выбора разместить 93 × 38 = 3534 связки «язык — страна». Естественно, что найти нужное на странице с такой простыней текста будет затруднительно.

Аналогичная жесткая структура работает и для упомянутых Apple и IBM.


И каков вывод?

А вывод очень прост — не надо создавать жесткие связки языков и стран. При первом заходе на главную страницу, мы автоматически определяем IP пользователя и его страну. Поскольку почти во всех случаях будет достаточно определить только страну (город нам пока не нужен), то можно использовать бесплатные базы, предоставляемые, например, MaxMind-ом. На основе данных о стране посетителя мы показываем ему версию сайта на самом распространенном языке в данной стране. А дальше пользователи сами выберут, на каком языке им удобнее работать.


И как поисковики отреагируют на это разнообразие?

Google и Яндекс предоставляют владельцу сайта возможность объяснить поисковику, что сайт работает для разных стран и языков, поддерживая атрибуты rel=«alternate» hreflang=«x». Таким образом, если на вашем сайте реализован свободный выбор страны и языка, все возможные варианты нужно добавить на каждую страницу. Это должно помочь поисковику разобраться, какую страницу в результатах поиска нужно показать пользователю. Для нашего примера будет так:

<link rel="alternate" hreflang="x-default" href="http://example.com/"> 
<link rel="alternate" hreflang="ru-ru" href="http://example.com/ru-ru/">
<link rel="alternate" hreflang="ru-us" href="http://example.com/ru-us/">
<link rel="alternate" hreflang="ru-ua" href="http://example.com/ru-ua/">
<ink rel="alternate" hreflang="uk-ru" href="http://example.com/uk-ru/">
<ink rel="alternate" hreflang="uk-us" href="http://example.com/uk-us/">
<ink rel="alternate" hreflang="uk-ua" href="http://example.com/uk-ua/">
<link rel="alternate" hreflang="en-ru" href="http://example.com/en-ru/">
<link rel="alternate" hreflang="en-us" href="http://example.com/en-us/">
<link rel="alternate" hreflang="en-ua" href="http://example.com/en-ua/">


upd. В случае с Майкрософтом пришлось бы добавить 3535 строк на каждую страницу сайта. Чтобы не добавлять такое количество тегов на страницу, лучше поместить их в карту сайта. Похоже, это работает только для Гугла. Ответ на запрос в Яндекс такой: «Указание региональной разметки в файле sitemap в настоящий момент нами не поддерживается.»

Если нужна обязательная поддержка обоих поисковиков, приемлемым вариантом в таком случае видится закрытие от индексации всех страниц, кроме основной связки «язык — страна». Тогда, например, вместо последних трех строк из примера выше останется только

<link rel="alternate" hreflang="en-us" href="http://example.com/en-us/">


Конечно, это приведет к тому, что русскоязычный пользователь в США не увидит в результатах поиска страницу

example.com/ru-us/


Скорее всего, ему будет предложена одна из таких страниц:

example.com/ru-ru/
если будет искать на русском, и

example.com/en-us/
если будет искать на английском.

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

Большинство же сайтов предполагает свою работу в нескольких странах и максимум на 3—4 языках, поэтому можно спокойно пожертвовать дополнительным добавлением десятка строк с тегами для всех версий сайта. С Википедии можно взять правильные коды языков и стран.
@timetogo
карма
12,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (48)

  • –12
    есть перевод на украинский
    example.com/uk-us/
    Исправьте
    UK — United Kingdom / UA — Ukraine
    • +17
      UA используется для обозначения страны и в качестве домена первого уровня. Украинский язык обозначается именно как uk.
      А для обозначения Великобритании используется сокращение GB.

      cat /usr/share/i18n/SUPPORTED
      • –7
        странно, ну да ладно. Просто не привычно
        • +9
          UA — Украина по ISO 3166-1, uk — украинский язык по ISO 639-1.
        • +1
          А что непривычно? Вы привыкли, что языки кодируют кодами стран? Тогда CA — это определенно канадский, а 100500 языков индии не имеют кодов :)
  • 0
    Friday все верно написал, я не зря указываю всегда последовательность «язык — страна», потому что именно в такой последовательности правильно их размещать. К этому нужно внимательно относиться, потому что в некоторых случаях возможны ошибки, которые тяжело будет обнаружить, например, /ru-fr/
    Правильные коды по ссылке в конце статьи можно посмотреть.
  • +16
    Нет! Никогда не определяйте мой язык по IP! Я же передаю отличные заголовки (accept-language:en-US,en;q=0.8). Если я понимаю интерфейс моего браузера на английском, я пойму и сайт на английском.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        К сожалению, иногда определяют. На определение региона согласен, хотя предлагалось «на основе данных о стране посетителя мы показываем ему версию сайта на самом распространенном языке в данной стране». Хорошо в статье то, что она привлекает внимание к нетождественности региона и языка, но механизмы выбора умолчания могли бы быть умнее.
      • +1
        Вы попробуйте хотя бы месяц по миру поездить. Правило простое — использовать ТОЛЬКО хедеры!
    • 0
      Плохая идея. Интерфейс браузера у меня тоже на английском, но это не означает, что мне интересны именно английские версии сайтов. Да, в настройках браузера язык передаваемый в заголовках настраивается, но тем не менее.
      • +5
        Плохая идея — это автоматически менять язык гугла два раза в день с французского на немецкий, когда я еду из французской гостиницы в Женеву и обратно. Плохая идея — это писать на яндекс-маркете «мало предложений с доставкой в регион: Женева». Плохая идея — это заставлять меня выбрать региональный сайт производителя принтера, чтобы потом качать драйверы всё равно с международного. К счастью, большинство сайтов настраивается, но ведь куда проще один раз настроить свой браузер (или ни разу, если сразу использовать его на родном языке).
        • +1
          Но ведь мы определяем регион только при первом заходе, а потом сохраняем его и больше не меняем? У Гугла схема сложнее, но обычному сайту это вряд ли нужно. Определили регион, сохранили в настройках и все.
          • –1
            Вот и берите данные из хедеров.
        • 0
          В Яндекс.Маркете (и вообще в Яндексе) есть галочка «Не уточнять моё местоположение».
    • –2
      Это далеко не всегда так. Множество людей используют английские версии браузера или Фотошопа, при этом они очень далеки от полного понимания языка. Часто так делают, когда хотят нивелировать возможные неточности перевода интерфейса. А настройкой передаваемых заголовков языка занимается, мне кажется, очень мало людей. Поэтому предложена простейшая схема работы, при желании, конечно, ее можно уточнять дальше. Например, определять область Украины и для западных по умолчанию предлагать на украинском, а для восточных — на русском, если сайт работает в Канаде, определять город и показывать для некоторых из них сайт на немецком или итальянском. Возможностей для настройки тут предостаточно.
      • 0
        Браузером и на китайском можно будет пользоваться, о каких неточностях в переводе речь?
        Заголовки автоматически меняются в зависимости от языка интерфейса браузера, почти всегда настраивать больше ничего не нужно.
        • 0
          Речь идет о том, что иногда английские версии программ ставятся русскоговорящими пользователями просто чтобы не было корявого перевода интерфейса с английского на русский, например. В результате вы можете пользоваться браузером на английском, будучи очень далеко от отличного понимания английского текста. И если сайт будет вам открываться на английском только потому, что интерфейс вашего браузера на английском, это часто приведет к закрытию такого сайта пользователем («что это за американский сайт открылся?»)
          • +4
            Если ещё с качеством украинского перевода я кое-как могу согласиться (хотя пользуюсь Opera/FF/Chrome везде приличный перевод), то с русским… вы серьезно?

            Не верю, что рядовой пользователь не понимая английского будет ставить английский интерфейс браузера из-за неточностей русского перевода, ну бред же.

            Ваша позиция в том, что вы против того, чтобы отдавать страницу на языке отличном от интерфейса браузера (мне логичным кажется противоположное)?
            • 0
              1. Вам может это быть не очевидным для браузера, но почти все дизайнеры используют программы с английским интерфейсом, при этом назвать их всех свободно владеющими языком не получится. Например, обучающие материалы идут с примерами только на английском. Насчет браузера — да, знаю людей, принципиально использующих только английские версии программ. Естественно, никакие они не native speakers.

              2. Да нет же, я пытаюсь только сказать, что завязывание языка сайта полностью на язык интерфейса браузера не даст 100% попадания в действительно родной язык пользователя. Более того, я не уверен, что этот способ даст более 50% попаданий, чтобы его можно было рекомендовать как основу. Вполне может быть, что вы правы и надо отдавать исходя из языка интерфейса, но тут нужна статистика.
              • 0
                принципиально использующих только английские версии программ

                Вот и получают принципиально аналогичный контент (если что — могут и поправить приоритеты языков в Accept-Language на такой случай).

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

                Заголовки браузера — это простой и относительно надежный источник информации об языковых предпочтениях пользователя.
            • 0
              А вот и статистика:

              image

              То есть если мы будем выдавать всем пользователям английских версий браузеров сайт на английском языке, мы принимаем, что почти для 5% всех пользователей Рунета родным языком является английский. Вы считаете это похожим на правду? Для каждого двадцатого родной язык — английский?
              • 0
                Я считаю, что 5% ваших посетителей вполне может понять английский интерфейс и найти кнопку переключения на русский.

                И цифра 65+26% сильно выше, чем

                не уверен, что этот способ даст более 50% попаданий


                И на конец, если все будут пользоваться таким механизмом — то станет привычным выставлять вручную русские заголовки, если хочется английский интерфейс.
  • +6
    а почему бы не показывать на том языке, который указан наиболее предпочитаемым в Accept-languages?
  • +4
    Ещё представлять многоязычные страницы можно с помощью Open Graph protocol:

    <meta content="uk_UA" property="og:locale">
    <meta content="en_US" property="og:locale:alternate">
    <meta content="ru_RU" property="og:locale:alternate">
    

    Такое понимает Facebook, и отправляет разные заголовки для того, чтобы получить содержимое на разных языках, надеюсь поисковики тоже научатся.

    А ещё можно отправлять такие заголовки:

    header('Vary: Content-Language,User-Agent,Cookie');
    

    Content-Language значит, что содержимое может меняться в зависимости от языка, такое должен понимать Google.

    Где нашел так сразу не скажу, но копал как-то в этом направлении.
  • +5
    Я сейчас, наверное, выскажу глупую идею, но всё же:
    а почему бы не сделать все возможные варианты «язык-страна» — взять описание на желаемом языке и подставить к нему региональную особенность (цена, комплектация, условия)?
    Пользователю показывать такую страницу, которую он может принять заголовком 'Accept-Language' + IP-адрес, предоставив возможность выбора, если его не удовлетворит автоматика.
    Примеры:
    — для 'Accept-Language: ru-RU,en-US;', но IP пользователя из России, показать 'ru-RU':
    Ноутбук. 3 ядра, 3 гига! Цена 30000 руб.

    — для 'Accept-Language: en-US;', но IP пользователя из России, показать 'en-RU':
    Laptop. 3 Core, 3 GB! Price 30,000 RUR ($945.77)

    — для 'Accept-Language: ru-RU,en-US;', но IP пользователя из США, показать 'ru-US':
    Ноутбук. 3 ядра, 3 гига! Цена $630.51 (20000 руб.)

    — для 'Accept-Language: en-US;', но IP пользователя из США, показать 'en-US':
    Laptop. 3 Core, 3 GB! Price $630.51
  • 0
    > связки «язык — страна». Естественно, что найти нужное на странице с такой простыней текста будет затруднительно.
    Придумали проблему, смешали сущности, а теперь боремся (rofl). Достаточно просто 2 выбора: регион (не обязательно — тут вообще автоопределение справится в большинстве случаев) + все языки (от региона только «дефолтовый»).
    • 0
      Во-первых, это не придуманная проблема, на сайтах указанных крупных ИТ-компаний этот вопрос не решен.

      Во-вторых, простого выбора не достаточно, если вы не объясните структуру вашего сайта поисковой машине, все ваше автоопределение не будет играть никакой роли, потому что поисковик автоматом будет отправлять всех пользователей, которые ввели запрос на русском сразу на /ru-ru/, вне зависимости от вашего географического положения. А остальные страницы вашего сайта на русском он просто посчитает дублями и не будет их никогда выводить в результатах поиска.
  • +3
    Выделяем проблему: иногда регион пользователя и его язык не совпадают.
    Сразу рождается решение: держать отдельно языковые данные, отдельно локаль.
    Тогда в ПИ будет всего две кнопки: «сменить язык» и «сменить регион».
    И не нужно будет плодить парные страницы.

    • 0
      Различать эти кнопки как?
      • 0
        Чем/кем вы хотите из различать? Если человеком, то имхо, семантическая разница между понятиями языка и региона и так понятна. Вот я, к примеру, в Гонконге выберу локаль Гонконг, а язык — русский.

        Ну а если различать скриптом, то — как Вам удобно.
        • 0
          Визуально как их пользователю различать? Когда страна однозначно соответствует языку, то общепринято выводить флаг страны для выбора языка. То есть человек видит страницу на непонятном языке и видит где-то вверху флаг, жамкает на него и появляется список стран (с их флагами). А как визуально отделить выбор языка от выбора страны?
          • 0
            Вы же сами сказали, страну выбирать флагом. Ну а для языков давно придуманы двухбуквенные коды. Можно их еще и расшифровывать, если хотите.
  • 0
    Да, жесткая привязка языка к региону очень раздражает (я в Нидерландах, но почти не знаю голландского).

    Лучшее решение пока я видел на chainreactioncycles.com — там три независимых настройки: страна, язык и валюта.
    • +1
      И на skyscanner тоже все три параметра настраиваются
  • +2
    Не по теме но заявление «преобладающий язык общения на Украине — русский» вкорне неверно. Не бросайтесь такими утверждениями
      • +2
        «В обласных центрах» это уж никак не «преобладающий язык общения на Украине».
        К тому же рассматривать википедию как источник достоверной информации, тем более рускоязывчную вики в вопросах украинского языка, нецелесообразно. Есть уйма прецендентов для спора :)
        • 0
          Наверно, мы в разной Украине живем :)
          • +2
            Я тоже согласен — областные центры, это еще не вся Украина, в регионах преобладает украинский язык. Да и то — областные центры центральных, восточных регионов, ну и Крым, в остальных процент куда меньше
    • +1
      Не холивара ради, а ради статистики: имею немного популярный среди определенного круга людей (бухалтера, рабочие, частные предпрениматели) сайт в Украине, делюсь статистикой по языках, как настроено в браузере посетителя:

      1. 87% — ru, ru-ru, ru-ua (последний — только 8 посетителей выставили в ОС Android)
      2. 11,2% — uk, uk-ua (у меня — uk)

      Выводы напрашиваются такие: украиноязычные пользователи или не знают о такой возможности выбора языка в браузере, или им и так хорошо и понятно, или лентяи, или их просто мало. Последний вариант имеет право на жизнь, так как для браузера Chrome, где при установке в основном предлагается выбор языка интерфейса, 82% — ru и 17% — uk
      • +1
        У большинства пиратская русскоязычная ОС, сборка скачанная с какого нибудь торента. Это же и влияет и на язык браузеров)
  • +1
    Имхо:
    Не важно, как определять язык. Главное, что бы была на видном месте функция смены языка и валюты. А то сейчас, с последним проблема. Иногда думаешь, как поменять регион и язык.
  • –1
    НИКОГДА НЕ ОПРЕДЕЛЯЙТЕ ЛОКАЛЬ ПО IP!!! НИКОГДА!

    Абсолютно все браузеры во всех операционных системах уже присылают вам полную локаль, не е будьте гуглом — не бесите пользователей!
  • 0
    Почему нельзя было сделать это, например, отдельным файлом, как sitemap.xml?

    Так ведь поддерживаются же для Карт сайтов: «rel=«alternate» hreflang=«x»». Правда с Яндекс пока вопрос непонятен.
    • 0
      Точно! Спасибо за уточнение, добавлю в статью. Интересно, когда Яндекс добавит.
  • 0
    Есть еще один вопрос, который должен решаться вместе с регионом и языком — часовой пояс. Было бы полезно продолжение статьи.
    • 0
      Да, часовые пояса тоже смежная тема, с которой не редко возникают различный вопросы. Тут было обсуждение по этой теме.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.