So legen Sie mehrere Domains für eine Sprache fest

15

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 der Website, auf die ich über Domains wie en.m.example.com usw. zugreifen möchte. Wie mache ich das? Ich kann admin/config/regional/languagenur eine Domain pro Sprache festlegen, müsste aber zwei festlegen, damit das funktioniert, wie zum Beispiel:

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 Drupal alle internen Links als absolute Pfade erstellt, indem Subdomains für die Sprachauswahl verwendet werden. Beispielsweise wird ein Menülink wie folgt erstellt:

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

So könnte ich mit Apache einen Domain-Alias ​​erstellen, um Anfragen 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 zurückbringen. Wie kann ich dieses Problem lösen?

user5950
quelle
1
Dies beantwortet Ihre Frage nicht wirklich genau, aber es ist besser, keine separaten mobilen Websites zu haben. Es wäre besser, ein ansprechendes Layout zu haben, das sich für Mobilgeräte ändert. Es bietet eine bessere Erfahrung, ist einfacher zu warten und Sie überspringen die Nachteile der Browsererkennung und des Seitenwechsels. - Es wird jedoch ein wenig Investition in Design / Thematisierung erforderlich sein.
Rooby
Danke, ich weiß, dass dies im Allgemeinen das Beste ist. Der Anwendungsfall meiner Website unterscheidet sich jedoch für mobile und normale Benutzer. Daher unterscheiden sich auch die Funktionen und der Inhalt, die geliefert werden. Deshalb habe ich diese Option nicht.
user5950
Ich verstehe das nicht! Das ist eine grundlegende Sache. Es muss möglich sein, Drupal mit einer Sprachdomäne in Kombination mit Subdomänen für ein mobiles Thema zu verwenden. Gibt es da draußen niemanden, der das mit Drupal macht?
user5950

Antworten:

5

Nachdem Sie Drupal so eingerichtet haben, dass verschiedene Sprachen in verschiedenen Domänen bereitgestellt werden, müssen Sie Ihren Webserver anweisen, Anforderungen von mehreren Domänen an dieselbe Drupal-Site zu senden.

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

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.

monymirza
quelle
Das geht bei mir nicht. Das Problem ist, dass bei Verwendung verschiedener Domänen für die Sprachauswahl, wie oben beschrieben, alle internen Links als absolute Pfade erstellt werden. So kann ich die Seite mit en.example.com & en.m.example.com erreichen, aber alle internen Links unter en.m.example.com haben nicht die zweite Subdomain, zum Beispiel sieht ein Link zu einer Subseite aus Wie en.example.com/node/1234, sollte aber wie en.m.example.com/node/1234 aussehen.
user5950
2

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 dennoch zu erreichen, gibt es eine Problemumgehung: Wie oben erwähnt, besteht das Problem bei Sprachdomänen darin, dass alle internen Pfade, die einen sprachspezifischen Pfadalias haben und mit der Drupal-Kernfunktion url () erstellt werden, als absolute Pfade erstellt werden. 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 verwenden , wobei xyz.example.com für keine Sprache als Domain festgelegt ist Alle relativen URLs und das Klicken auf einen internen Link behalten die Subdomain. Sie können diese Methode jedoch nicht verwenden, wenn Sie sprachempfindliche Unterdomänen 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 benutze 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;
    }
  }
}
user5950
quelle
Ich glaube, dieses Modul macht etwas Ähnliches: drupal.org/project/language_multidomain ABER ... Ich frage mich, warum es nicht möglich ist, diesen Hook zu verwenden: api.drupal.org/api/drupal/modules!system!language.api.php/ … (Welches ist, was das Gebietsschemamodul verwendet), um einen Sprachaushandlungsanbieter zu definieren, der mehrere Domänen verarbeitet?
leon.nk
@ leon.nk Ich habe dieses Modul nicht gefunden, danke für diesen Hinweis. Vielleicht haben Sie Recht und die hook_language_negotiation_info ist der richtige Hook. Ich werde es versuchen.
Benutzer5950
Anscheinend existiert das language_multidomain-Modul nicht mehr.
Matthias Urlichs
Sollte der obige Haken nicht hook_language_init () sein ? Es gibt kein hook_api_language_init () . Sie sollten auch die Sprachumschalter-Links mit hook_language_switch_links_alter () aktualisieren .
Colan
@colan Das benutzerdefinierte Modul wird aufgerufen custom_apiund der Hook hook_language_init(). Zusammen ist es custom_api_language_init(). Vielleicht ist das verwirrend, deshalb habe ich das Beispiel bearbeitet, um diesen Punkt zu verdeutlichen. Sie haben Recht, wenn Sie ´hook_language_switch_links_alter () ´ verwenden, ist dies möglicherweise der bessere Weg. Da sich aber anscheinend fast niemand für dieses Problem interessiert, ist es meines Erachtens möglicherweise nicht sinnvoll, dieses Beispiel umzuschreiben.
user5950