Как настроить несколько доменов для одного языка

15

У меня есть многоязычный сайт с Drupal 7, использующий субдомены, такие как en.example.com, для определения языка. Все работает, как и ожидалось, но у меня есть мобильная версия веб-сайта, где я хочу быть доступным для таких доменов, как en.m.example.com и т. Д. Как мне это сделать? Я могу установить admin/config/regional/languageтолько один домен для каждого языка, но для его работы потребуется установить два, например:

for English:
en.example.com & en.m.example.com

for German:
de.example.com & de.m.example.com
etc.

(Мне бы хотелось иметь ту же структуру, что и в Википедии.) Проблема в том, что, используя субдомены для выбора языка, Drupal создает все внутренние ссылки как абсолютные патчи. Например, ссылка меню будет создана как:

<li class="menu-773"><a href="http://en.example.com/test" >test</a></li>
and not as
<li class="menu-773"><a href="/test" >test</a></li>

Итак, я мог бы создать псевдоним домена с помощью Apache, чтобы отправлять запросы с en.m.example.com на en.example.com, но все внутренние ссылки вернули бы пользователя из мобильной версии в нормальное состояние. Как я могу решить эту проблему?

user5950
источник
1
Это не совсем точно отвечает на ваш вопрос, но было бы лучше не иметь отдельные мобильные сайты. Было бы лучше иметь адаптивный макет, который меняется для мобильных устройств. Это дает лучший опыт, его легче поддерживать, и вы пропускаете негативы при обнаружении браузера и переключении сайтов. - Это потребует немного инвестиций в дизайн / тематику.
Роуби
Спасибо, я знаю, что это вообще самое лучшее. Но вариант использования моего сайта отличается для мобильных и обычных пользователей. Таким образом, функции и контент, который будет доставлен, также различаются. Вот почему у меня нет такой возможности.
user5950
Я не понимаю этого! Это основная вещь. Должна быть возможность использовать Drupal с языковым доменом в сочетании с субдоминами для мобильной темы. Есть ли кто-нибудь, кто делает это с Drupal?
user5950

Ответы:

5

После того, как вы настроили Drupal для обслуживания разных языков в разных доменах, вы должны указать своему веб-серверу отправлять запросы из нескольких доменов на один и тот же сайт Drupal.

В Apache вам нужно отредактировать .conf (httpd.conf)файл и добавить псевдонимы для всех доменов. Например:

ServerName en.example.com
ServerAlias en.m.example.com

В дополнение к этому вам также нужно будет указать сервер доменных имен (DNS) на ваш сервер для всех доменных имен на разных языках.

monymirza
источник
Это не работает для меня. Проблема заключается в том, что при использовании разных доменов для выбора языка, как описано выше, все внутренние ссылки создаются как абсолютные пути. Таким образом, я могу перейти на страницу с en.example.com & en.m.example.com, но все внутренние ссылки на en.m.example.com не имеют второго подчиненного элемента, например, ссылка на страницу выглядит как en.example.com/node/1234, но должен выглядеть как en.m.example.com/node/1234.
user5950
2

Ответ таков: использование нескольких доменов для одного языка невозможно с Drupal 7, и, насколько я знаю, нет модуля, который добавляет эту функциональность.

Но для достижения этой цели в любом случае есть обходной путь: как упоминалось выше, проблема с языковыми доменами состоит в том, что все внутренние патчи, имеющие псевдоним пути для конкретного языка и созданные с помощью базовой функции Drupal url () , создаются как абсолютные патчи. Ответственным за такое поведение является функция :

locale_language_url_rewrite_url(&$path, &$options)
  1. Не устанавливайте языковой домен для этого языка по умолчанию. Если вы этого не сделаете, Drupal не создаст абсолютные пути для языка по умолчанию, если - например - использовать домен xyz.example.com , где xyz.example.com не задан в качестве домена для какого-либо языка, Drupal создаст Все ссылки относительны, поэтому при нажатии любой внутренней ссылки будет сохранен поддомен. Но вы не можете использовать этот метод, если вы хотите иметь чувствительные к языку субдомены, как описано выше:

    для английского языка: en.example.com & en.m.example.com

    для немецкого: de.example.com & de.m.example.com и т. д.

  2. Таким образом, второй метод - изменить текущий язык всех типов с помощью функции: hook_language_init . Я использую следующий код, чтобы приведенный выше пример работал:

:

# hook_language_init()
function my_module_language_init() {
  // Current path
  $url = $_SERVER['SERVER_NAME'];

  // Global language object and get languages
  global $language;
  $languages = language_list();

  // Get all subdomains
  $reg = '/^((?:([^\.]+)\.)?(?:([^\.]+)\.))?([^\.]+\.[^\.]+)$/i';
  preg_match($reg, $url, $up);

  # We won't allow all subdomains, only 'm.' and 'm2.'
  # Change this for an other use case.
  if ($up[3] == "m2" || $up[3] == "m") {

    if (!isset($languages[$up[2]])) {
      $langcode = $language->language;
    } else { 
      $langcode = $up[2];
    }
    $new_language         = $languages[$langcode];
    $new_language->domain = $new_language->language . "." . $up[3] .".". $up[4];

    // Set url options
    $options['language'] = $new_language;
    $types = language_types();

    // Set all language types and language domains
    foreach ($types as $type) {
      $GLOBALS[$type] = $new_language;
      $GLOBALS[$type]->domain = $new_language->domain;
    }
  }
}
user5950
источник
Я полагаю, что этот модуль делает нечто подобное: drupal.org/project/language_multidomain НО ... Интересно, почему невозможно использовать этот хук: api.drupal.org/api/drupal/modules!system!language.api.php/ … (Что использует модуль языкового стандарта) для определения поставщика согласования языков, который обрабатывает несколько доменов ??
leon.nk
@ leon.nk Я не нашел этот модуль, спасибо за подсказку. Возможно, вы правы, и hook_language_negotiation_info - это правильный хук для использования. Я попробую.
user5950
По-видимому, модуль language_multidomain больше не существует.
Матиас Урликс
Разве вышеуказанный хук не должен быть hook_language_init () ? Нет hook_api_language_init () . Вам также следует обновить ссылки на переключатели языка с помощью hook_language_switch_links_alter () .
колан
@colan Пользовательский модуль называется custom_apiи хук hook_language_init(). Вместе это так custom_api_language_init(). Может быть, это сбивает с толку, поэтому я отредактировал пример, чтобы прояснить этот момент. Вы правы, использование «hook_language_switch_links_alter ()» может быть лучшим способом. Но так как кажется, что почти никто не заинтересован в этой проблеме, я думаю, что не стоит переписывать этот пример.
user5950