Як встановити кілька доменів для однієї мови


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, але всі внутрішні посилання повернуть користувача з нормальної версії до нормального. Як я можу вирішити цю проблему?


1
Це насправді не відповідає точно на ваше запитання, але було б краще не мати окремих мобільних сайтів. Було б краще мати чуйний макет, який змінюється для мобільних пристроїв. Це дає кращий досвід, простіше у обслуговуванні та ви пропускаєте негативи веб-сайтів виявлення та переключення веб-переглядачів. - Однак це зажадає трохи інвестицій в дизайн / тематику.
рубін

Дякую, я знаю, що це взагалі найкраще. Але випадки використання мого веб-сайту відрізняються для мобільних та звичайних користувачів. Тож функції та зміст, який буде поставлений, відрізняється також. Ось чому я не маю такого варіанту.
user5950

Я цього не розумію! Це основна річ. Потрібно мати можливість використовувати Drupal з мовами домену в поєднанні з субдомінами для мобільної теми. Хіба ніхто там не робить це з Drupal?
user5950

Відповіді:


5

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

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

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

На додаток до цього вам також потрібно вказати сервер доменних імен (DNS) на ваш сервер для всіх імен домену різними мовами.


Це не працює для мене. Проблема полягає в тому, що використання різних доменів для вибору мови, як описано вище, призводить до того, що всі внутрішні посилання створюються як абсолютні шляхи. Тож я можу дійти до сторінки за допомогою 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 створить al URL URL і тому натискання будь-якого внутрішнього посилання збереже субдомен. Але ви не можете використовувати цей метод, якщо ви хочете мати субдомени, чутливі до мови, як описано вище:

    для англійської: en.example.com & en.m.example.com

    для німецької: de.example.com & de.m.example.com тощо.

  2. Таким чином, другим методом було б - змінити поточну мову всіх типів за допомогою функції: kuk_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;
    }
  }
}

Я вважаю, що цей модуль робить щось подібне: drupal.org/project/language_multidomain АЛЕ ... Цікаво, чому не можна використовувати цей гачок: api.drupal.org/api/drupal/modules!system!language.api.php/ … (Для чого використовується модуль локалізації) для визначення постачальника мовних переговорів, який обробляє декілька доменів ??
leon.nk

@ leon.nk я не знайшов цей модуль, дякую за цю підказку. Можливо, ви маєте рацію, і гак_language_negotiation_info - це правильний гачок. Я спробую.
user5950

Мабуть, модуль language_multidomain вже не існує.
Маттіас Урліхс

Чи не повинен вищевказаний гачок бути ho_language_init () ? Немає гачок_api_language_init () . Ви також повинні оновити посилання для перемикача мови за допомогою гачок_language_switch_links_alter () .
колан

@colan Викликається користувацький модуль custom_apiі гачок hook_language_init(). Разом це custom_api_language_init(). Це може заплутати, тому я змінив приклад, щоб зрозуміти це. Ви маєте рацію, і кращий спосіб використання „hook_language_switch_links_alter ()“ може бути. Але оскільки здається, що майже ніхто не цікавиться цією проблемою, я думаю, що не варто переписувати цей приклад.
user5950
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.