it-swarm.com.de

So legen Sie mehrere Domänen für eine Sprache fest

Ich habe eine mehrsprachige Site mit Drupal 7), die Subdomains wie en.example.com verwendet, um die Sprache zu erkennen. Alles funktioniert wie erwartet, aber ich habe eine mobile Version von Website, auf die ich über Domains wie en.m.example.com usw. zugreifen möchte. Wie mache ich das? Ich kann in admin/config/regional/language nur eine Domain pro Sprache, müsste aber zwei festlegen, damit das funktioniert, wie:

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

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

(Ich hätte gerne die gleiche Struktur wie Wikipedia.) Das Problem ist, dass bei Verwendung von Subdomains für die Sprachauswahl Drupal alle internen Links als absolute Pfade erstellt. Beispielsweise wird ein Menü-Link erstellt erstellt werden als:

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

Ich könnte also mit Apache einen Domain-Alias ​​erstellen, um Anforderungen von en.m.example.com an en.example.com zu senden, aber alle internen Links würden den Benutzer von der mobilen Version zur normalen Version zurückbringen. Wie kann ich dieses Problem lösen?

15
user5950

Die Antwort lautet: Die Verwendung mehrerer Domänen für eine Sprache ist mit Drupal 7) nicht möglich, und meines Wissens gibt es kein Modul, das diese Funktionalität hinzufügt.

Um dieses Ziel trotzdem zu erreichen, gibt es eine Problemumgehung: Wie oben erwähnt, besteht das Problem bei Sprachdomänen darin, dass alle internen Pfade einen sprachspezifischen Pfadalias haben und mit der Kernfunktion Drupal) erstellt werden url () werden als absolute Pfade erstellt. Verantwortlich für dieses Verhalten ist die Funktion :

locale_language_url_rewrite_url(&$path, &$options)
  1. Legen Sie keine Sprachdomäne für diese Standardsprache fest. Wenn Sie dies nicht tun, erstellt Drupal keine absoluten Pfade für die Standardsprache, wenn Sie beispielsweise die Domain xyz.example.com , wobei xyz.example.com für keine Sprache als Domain festgelegt ist, Drupal erstellt alle URLs relativ und das Klicken auf einen internen Link behält die Subdomain bei Sie können diese Methode jedoch nicht verwenden, wenn Sie sprachempfindliche Subdomains wie oben beschrieben haben möchten:

    für Englisch: en.example.com & en.m.example.com

    für Deutsch: de.example.com & de.m.example.com etc.

  2. Die zweite Methode wäre also, die aktuelle Sprache aller Typen mit der Funktion zu ändern: hook_language_init . Ich verwende den folgenden Code, um das obige Beispiel zum Laufen zu bringen:

::

# 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;
    }
  }
}
2
user5950

Nachdem Sie Drupal) eingerichtet haben, um verschiedene Sprachen in verschiedenen Domänen bereitzustellen, müssen Sie Ihren Webserver anweisen, Anforderungen von mehreren Domänen an dieselbe Drupal) zu senden Seite? ˅.

In Apache müssen Sie die Datei .conf (httpd.conf) bearbeiten und allen verschiedenen Domänen Aliase hinzufügen. Zum Beispiel:

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

Darüber hinaus müssen Sie den Domain Name Server (DNS) für alle Domainnamen in verschiedenen Sprachen auf Ihren Server verweisen.

5
monymirza