Come impostare più domini per una lingua


15

Ho un sito multilingue con Drupal 7 che utilizza sottodomini come en.example.com per rilevare la lingua. Tutto funziona come previsto, ma ho una versione mobile del sito Web che desidero essere accessibile da domini come en.m.example.com ecc. Come posso fare? Posso impostare admin/config/regional/languageun solo dominio per lingua, ma dovrei impostarne due per farlo funzionare, come:

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

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

(Vorrei avere la stessa struttura di Wikipedia.) Il problema è che, usando i sottodomini per la selezione della lingua, Drupal crea tutti i collegamenti interni come percorsi assoluti. Ad esempio, verrà creato un collegamento al menu come:

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

Quindi, potrei creare un alias di dominio con Apache, per inviare richieste da en.m.example.com a en.example.com, ma tutti i collegamenti interni porterebbero l'utente dalla versione mobile alla normalità. Come posso risolvere questo problema?


1
Questo non risponde esattamente alla tua domanda, ma sarebbe meglio non avere siti mobili separati. Sarebbe meglio avere un layout reattivo che cambia per dispositivi mobili. Offre un'esperienza migliore, è più facile da mantenere e salti gli aspetti negativi del rilevamento del browser e del cambio di sito. - Tuttavia, richiederà un po 'di investimento in design / temi.
rooby

Grazie, so che questo è generalmente il migliore. Ma il caso d'uso del mio sito Web è diverso per gli utenti mobili e normali. Quindi anche le funzioni e il contenuto che verranno consegnati differiscono. Ecco perché non ho questa opzione.
user5950

Non lo capisco! Questa è una cosa fondamentale. Deve essere possibile utilizzare Drupal con dominio di lingue in combinazione con sottodomini per un tema mobile. Non c'è nessuno là fuori che lo fa con Drupal?
user5950

Risposte:


5

Dopo aver impostato Drupal per servire lingue diverse in domini diversi, devi istruire il tuo server web a inviare richieste da più domini allo stesso sito Drupal.

In Apache, dovrai modificare il .conf (httpd.conf)file e aggiungere alias a tutti i diversi domini. Per esempio:

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

Inoltre, dovrai puntare il DNS (Domain Name Server) al tuo server per tutti i nomi di dominio in diverse lingue.


Questo non funziona per me. Il problema è che l'utilizzo di domini diversi per la selezione della lingua come descritto sopra comporta la creazione di tutti i collegamenti interni come percorsi assoluti. Quindi posso raggiungere la pagina con en.example.com e en.m.example.com, ma tutti i link interni in en.m.example.com non hanno il secondo dominio secondario, ad esempio un collegamento a una sottopagina appare come en.example.com/node/1234, ma dovrebbe apparire come en.m.example.com/node/1234.
user5950

2

La risposta è: l'utilizzo di più domini per una lingua non è possibile con Drupal 7 e non esiste, per quanto ne so, nessun modulo che aggiunge tale funzionalità.

Ma per raggiungere questo obiettivo c'è comunque una soluzione: come accennato in precedenza, il problema con i domini di lingua è che tutti i percorsi interni che hanno un alias di percorso specifico della lingua e sono creati con la funzione core Drupal url () sono creati come percorsi assoluti. Responsabile di tale comportamento è la funzione :

locale_language_url_rewrite_url(&$path, &$options)
  1. Non impostare un dominio di lingua per quella lingua predefinita. Se non lo fai, Drupal non creerà percorsi assoluti per la lingua predefinita se, ad esempio, utilizza il dominio xyz.example.com , dove xyz.example.com non è impostato come dominio per nessuna lingua, Drupal creerà tutti gli URL relativi e quindi facendo clic su qualsiasi link interno manterrà il sottodominio. Ma non puoi usare quel metodo, se vuoi avere sottodomini sensibili al linguaggio come descritto sopra:

    per l'inglese: en.example.com e en.m.example.com

    per il tedesco: de.example.com & de.m.example.com ecc.

  2. Quindi il secondo metodo sarebbe quello di modificare la lingua corrente di tutti i tipi con la funzione: hook_language_init . Uso il seguente codice per far funzionare l'esempio sopra:

:

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

Credo che questo modulo faccia qualcosa di simile: drupal.org/project/language_multidomain MA ... Mi chiedo perché non sia possibile usare questo hook: api.drupal.org/api/drupal/modules!system!language.api.php/ ... (che è quello che utilizza il modulo locale) per definire il provider di negoziazione della lingua che gestisce più domini ??
leon.nk,

@ leon.nk Non ho trovato quel modulo, grazie per quel suggerimento. Forse hai ragione e hook_language_negotiation_info è l'hook giusto da usare. Lo proverò.
user5950

Apparentemente il modulo language_multidomain non esiste più.
Matthias Urlichs,

L'hook sopra non dovrebbe essere hook_language_init () ? Non esiste hook_api_language_init () . È inoltre necessario aggiornare i collegamenti del selettore di lingua con hook_language_switch_links_alter () .
colan,

@colan Viene chiamato il modulo personalizzato custom_apie l'hook hook_language_init(). Insieme lo è custom_api_language_init(). Può essere confuso, quindi ho modificato l'esempio per chiarire questo punto. Hai ragione, usare ´hook_language_switch_links_alter () ´ potrebbe essere il modo migliore. Ma poiché sembra che quasi nessuno sia interessato a questo problema, penso che non valga la pena riscrivere questo esempio.
user5950
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.