Cómo configurar múltiples dominios para un idioma

15

Tengo un sitio multilingüe con Drupal 7 que utiliza subdominios como en.example.com para detectar el idioma. Todo funciona como se esperaba, pero tengo una versión móvil del sitio web que quiero que sea accesible por dominios como en.m.example.com, etc. ¿Cómo hago esto? Puedo configurar admin/config/regional/languagesolo un dominio por idioma, pero tendría que configurar dos para que funcione, como:

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

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

(Me gustaría tener la misma estructura que Wikipedia). El problema es que, al usar subdominios para la selección de idioma, Drupal crea todos los enlaces internos como patrones absolutos. Por ejemplo, se creará un enlace de menú como:

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

Por lo tanto, podría crear un alias de dominio con Apache, para enviar solicitudes de en.m.example.com a en.example.com, pero todos los enlaces internos devolverían al usuario de la versión móvil a la normalidad. ¿Como puedó resolver esté problema?

usuario5950
fuente
1
Esto realmente no responde a su pregunta exactamente, pero sería mejor no tener sitios móviles separados. Sería mejor tener un diseño receptivo que cambie para dispositivos móviles. Ofrece una mejor experiencia, es más fácil de mantener y omite los aspectos negativos de la detección del navegador y el cambio de sitios. - Sin embargo, requerirá un poco de inversión en diseño / tema.
rooby
Gracias, sé que generalmente es lo mejor. Pero el caso de uso de mi sitio web es diferente para usuarios móviles y normales. Por lo tanto, las funciones y el contenido que se entregarán también difieren. Por eso no tengo esa opción.
user5950
No entiendo esto! Esto es algo básico. Debe ser posible utilizar Drupal con dominio de idiomas en combinación con subdomines para un tema móvil. ¿No hay nadie por ahí haciendo esto con Drupal?
user5950

Respuestas:

5

Una vez que haya configurado Drupal para servir diferentes idiomas en diferentes dominios, debe indicarle a su servidor web que envíe solicitudes de múltiples dominios al mismo sitio de Drupal.

En Apache, deberá editar el .conf (httpd.conf)archivo y agregar alias a todos los dominios diferentes. Por ejemplo:

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

Además de esto, también deberá apuntar el servidor de nombres de dominio (DNS) a su servidor para todos los nombres de dominio en diferentes idiomas.

monymirza
fuente
Eso no me funciona. El problema es que el uso de diferentes dominios para la selección del idioma como se describió anteriormente, hace que todos los enlaces internos se creen como rutas absolutas. Entonces puedo llegar a la página con en.example.com y en.m.example.com, pero todos los enlaces internos en en.m.example.com no tienen el segundo subdominio, por ejemplo, se ve un enlace a una subpágina como en.example.com/node/1234, pero debería verse como en.m.example.com/node/1234.
user5950
2

La respuesta es: el uso de múltiples dominios para un idioma no es posible con Drupal 7 y, hasta donde yo sé, no hay ningún módulo que agregue esa funcionalidad.

Pero para lograr este objetivo de todos modos, hay una solución alternativa: como se mencionó anteriormente, el problema con los dominios del lenguaje es que todas las rutas internas que tienen un alias de ruta específico del idioma y se crean con la función principal de Drupal url () se crean como rutas absolutas. El responsable de ese comportamiento es la función :

locale_language_url_rewrite_url(&$path, &$options)
  1. No establezca un dominio de idioma para ese idioma predeterminado. Si no hace eso, Drupal no creará parches absolutos para el idioma predeterminado si, por ejemplo, usa el dominio xyz.example.com , donde xyz.example.com no está configurado como dominio para ningún idioma, Drupal creará todo es relativo y, por lo tanto, al hacer clic en cualquier enlace interno se mantendrá el subdominio. Pero no puede usar ese método, si desea tener subdominios sensibles al lenguaje como se describe anteriormente:

    para inglés: en.example.com y en.m.example.com

    para alemán: de.example.com y de.m.example.com etc.

  2. Entonces, el segundo método sería alterar el idioma actual de todos los tipos con la función: hook_language_init . Utilizo el siguiente código para que funcione el ejemplo anterior:

:

# 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;
    }
  }
}
usuario5950
fuente
Creo que este módulo hace algo similar: drupal.org/project/language_multidomain PERO ... Me pregunto por qué no es posible usar este gancho: api.drupal.org/api/drupal/modules!system!language.api.php/ ... (que es lo que usa el módulo de configuración regional) para definir el proveedor de negociación de idiomas que maneja múltiples dominios?
leon.nk
@ leon.nk No encontré ese módulo, gracias por esa pista. Quizás tengas razón y hook_language_negotiation_info es el gancho correcto para usar. Lo intentaré.
user5950
Aparentemente, el módulo language_multidomain ya no existe.
Matthias Urlichs
¿No debería ser el gancho anterior hook_language_init () ? No hay hook_api_language_init () . También debe actualizar los enlaces del conmutador de idiomas con hook_language_switch_links_alter () .
colan
@colan Se llama al módulo personalizado custom_apiy el gancho hook_language_init(). Juntos lo es custom_api_language_init(). Puede ser confuso, así que edité el ejemplo para aclarar ese punto. Tienes razón, usar 'hook_language_switch_links_alter ()' puede ser la mejor manera. Pero como parece que casi nadie está interesado en este problema, creo que no valdría la pena volver a escribir este ejemplo.
user5950