Jak ustawić wiele domen dla jednego języka

15

Mam wielojęzyczną stronę z Drupalem 7, która używa subdomen takich jak np. Przykład.com, aby wykryć język. Wszystko działa zgodnie z oczekiwaniami, ale mam mobilną wersję witryny, z której chcę być dostępny w domenach takich jak np. Przykład.com. Jak to zrobić? Mogę ustawić admin/config/regional/languagetylko jedną domenę na język, ale musiałbym ustawić dwa, aby to działało, na przykład:

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

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

(Chciałbym mieć taką samą strukturę jak Wikipedia). Problem polega na tym, że używając subdomen do wyboru języka, Drupal tworzy wszystkie wewnętrzne linki jako absolutne ścieżki. Na przykład łącze menu zostanie utworzone jako:

<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>

Mogłem więc utworzyć alias domeny za pomocą Apache, aby wysyłać żądania z en.m.example.com do en.example.com, ale wszystkie wewnętrzne linki przywróciłyby użytkownika z wersji mobilnej do normy. Jak mogę rozwiązać ten problem?

user5950
źródło
1
To tak naprawdę nie odpowiada dokładnie na twoje pytanie, ale lepiej byłoby nie mieć oddzielnych witryn mobilnych. Lepiej byłoby mieć responsywny układ, który zmienia się na urządzenia mobilne. Daje to lepsze wrażenia, jest łatwiejsze w utrzymaniu i pomijasz negatywne strony wykrywania i przełączania stron w przeglądarce. - Będzie to jednak wymagało trochę inwestycji w projektowanie / tworzenie motywów.
rooby
Dziękuję, wiem, że ogólnie jest to najlepsze. Ale przypadek użycia mojej witryny jest inny dla użytkowników mobilnych i zwykłych. Więc funkcje i treść, które zostaną dostarczone, również się różnią. Dlatego nie mam tej opcji.
user5950
Nie rozumiem tego! To jest podstawowa rzecz. Musi być możliwe użycie Drupala z domeną języków w połączeniu z subdomenami dla motywu mobilnego. Czy nikt nie robi tego z Drupalem?
user5950,

Odpowiedzi:

5

Po skonfigurowaniu Drupal do obsługi różnych języków w różnych domenach, musisz poinstruować swój serwer WWW, aby wysyłał żądania z wielu domen do tej samej witryny Drupal.

W Apache musisz edytować .conf (httpd.conf)plik i dodawać aliasy do wszystkich różnych domen. Na przykład:

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

Oprócz tego musisz wskazać serwer nazw domen (DNS) na swój serwer dla wszystkich nazw domen w różnych językach.

monymirza
źródło
To mi nie działa. Problem polega na tym, że użycie różnych domen do wyboru języka, jak opisano powyżej, powoduje, że wszystkie wewnętrzne linki są tworzone jako ścieżki bezwzględne. Mogę więc przejść do strony z en.przyklad.com i en.m.example.com, ale wszystkie łącza wewnętrzne w en.m.example.com nie mają drugiej sub-dominacji, na przykład wygląda link do podstrony na przykład en.example.com/node/1234, ale powinien wyglądać jak en.example.com/node/1234.
user5950
2

Odpowiedź brzmi: używanie wielu domen dla jednego języka nie jest możliwe w Drupal 7 i - o ile mi wiadomo - żaden moduł nie dodaje tej funkcjonalności.

Aby jednak osiągnąć ten cel, istnieje obejście: Jak wspomniano powyżej, problem z domenami językowymi polega na tym, że wszystkie ścieżki wewnętrzne, które mają alias ścieżki specyficzny dla języka i są tworzone za pomocą funkcji rdzenia Drupal url (), są tworzone jako ścieżki bezwzględne. Odpowiedzialnością za to zachowanie jest funkcja :

locale_language_url_rewrite_url(&$path, &$options)
  1. Nie ustawiaj domeny językowej dla tego domyślnego języka. Jeśli tego nie zrobisz, Drupal nie utworzy ścieżek bezwzględnych dla domyślnego języka, jeśli - na przykład - użyje domeny xyz.example.com , gdzie xyz.example.com nie jest ustawiony jako domena dla żadnego języka, Drupal utworzy wszystkie adresy URL są względne, więc kliknięcie dowolnego linku wewnętrznego zachowa poddomenę. Ale nie możesz użyć tej metody, jeśli chcesz mieć subdomeny wrażliwe na język, jak opisano powyżej:

    w języku angielskim: en.example.com i en.m.example.com

    dla języka niemieckiego: de.example.com i de.m.example.com itp.

  2. Tak więc drugą metodą byłoby zmodyfikowanie bieżącego języka wszystkich typów za pomocą funkcji: hook_language_init . Używam następującego kodu, aby powyższy przykład działał:

:

# 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
źródło
Wierzę, że ten moduł robi coś podobnego: drupal.org/project/language_multidomain ALE ... Zastanawiam się, dlaczego nie można użyć tego haka: api.drupal.org/api/drupal/modules!system!language.api.php/ … (Co wykorzystuje moduł ustawień regionalnych) do zdefiniowania dostawcy negocjacji języka, który obsługuje wiele domen?
leon.nk
@ leon.nk Nie znalazłem tego modułu, dziękuję za podpowiedź. Może masz rację, a hook_language_negotiation_info jest właściwym hakiem do użycia. Spróbuję tego.
user5950,
Najwyraźniej moduł language_multidomain już nie istnieje.
Matthias Urlichs
Czy powyższy hook nie powinien być hook_language_init () ? Nie ma hook_api_language_init () . Powinieneś również zaktualizować linki przełącznika języków za pomocą hook_language_switch_links_alter () .
colan
@colan Wywoływany jest moduł niestandardowy custom_apii hak hook_language_init(). Razem to jest custom_api_language_init(). Być może jest to mylące, więc zredagowałem przykład, aby wyjaśnić tę kwestię. Masz rację, użycie „hook_language_switch_links_alter ()” może być lepszym sposobem. Ale ponieważ wydaje się, że prawie nikt nie jest zainteresowany tym problemem, myślę, że może nie warto przepisać tego przykładu.
user5950