Comment définir plusieurs domaines pour une seule langue

15

J'ai un site multilingue avec Drupal 7 utilisant des sous-domaines comme en.example.com pour détecter la langue. Tout fonctionne comme prévu, mais j'ai une version mobile du site Web que je veux être accessible par des domaines comme en.m.example.com etc. Comment dois-je procéder? Je peux définir admin/config/regional/languageun seul domaine par langue, mais je devrais en définir deux pour que cela fonctionne, comme:

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

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

(Je voudrais avoir la même structure que Wikipedia.) Le problème est que, en utilisant des sous-domaines pour la sélection de la langue, Drupal crée tous les liens internes comme des chemins absolus. Par exemple, un lien de menu sera créé comme:

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

Ainsi, je pouvais créer un alias de domaine avec Apache, pour envoyer des demandes de en.m.example.com à en.example.com, mais tous les liens internes ramèneraient l'utilisateur de la version mobile à la normale. Comment puis-je résoudre ce problème?

user5950
la source
1
Cela ne répond pas vraiment à votre question, mais il serait préférable de ne pas avoir de sites mobiles distincts. Il serait préférable d'avoir une mise en page réactive qui change pour le mobile. Il offre une meilleure expérience, il est plus facile à maintenir et vous évitez les points négatifs de la détection de navigateur et du changement de site. - Cela nécessitera un peu d'investissement dans la conception / la thématique.
rooby
Merci, je sais que c'est généralement le meilleur. Mais le cas d'utilisation de mon site Web est différent pour les utilisateurs mobiles et normaux. Ainsi, les fonctions et le contenu qui seront fournis diffèrent également. C'est pourquoi je n'ai pas cette option.
user5950
Je ne comprends pas ça! C'est une chose fondamentale. Il doit être possible d'utiliser Drupal avec le domaine des langues en combinaison avec des sous-domaines pour un thème mobile. N'y a-t-il personne là-bas qui fait ça avec Drupal?
user5950

Réponses:

5

Une fois que vous avez configuré Drupal pour servir différentes langues dans différents domaines, vous devez demander à votre serveur Web d'envoyer des demandes de plusieurs domaines au même site Drupal.

Dans Apache, vous devrez modifier le .conf (httpd.conf)fichier et ajouter des alias à tous les différents domaines. Par exemple:

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

En plus de cela, vous devrez également pointer le serveur de noms de domaine (DNS) vers votre serveur pour tous les noms de domaine dans différentes langues.

monymirza
la source
Ça ne marche pas pour moi. Le problème est que l'utilisation de différents domaines pour la sélection de la langue, comme décrit ci-dessus, entraîne la création de tous les liens internes en tant que chemins absolus. Je peux donc accéder à la page avec en.example.com & en.m.example.com, mais tous les liens internes sous en.m.example.com n'ont pas le deuxième sous-domin, par exemple un lien vers une sous-page ressemble comme en.example.com/node/1234, mais devrait ressembler à en.m.example.com/node/1234.
user5950
2

La réponse est: l'utilisation de plusieurs domaines pour une langue n'est pas possible avec Drupal 7 et il n'y a - à ma connaissance - aucun module qui ajoute cette fonctionnalité.

Mais pour atteindre cet objectif de toute façon, il existe une solution de contournement: Comme mentionné ci-dessus, le problème avec les domaines linguistiques est que tous les chemins internes qui ont un alias de chemin spécifique au langage et qui sont créés avec la fonction de base Drupal url () sont créés comme des chemins absolus. Responsable de ce comportement est la fonction :

locale_language_url_rewrite_url(&$path, &$options)
  1. Ne définissez pas de domaine linguistique pour cette langue par défaut. Si vous ne le faites pas, Drupal ne créera pas de chemins absolus pour la langue par défaut si - par exemple - utilisez le domaine xyz.example.com , où xyz.example.com n'est défini comme domaine pour aucune langue, Drupal créera toutes les URL relatives et ainsi cliquer sur n'importe quel lien interne gardera le sous-domaine. Mais vous ne pouvez pas utiliser cette méthode, si vous voulez avoir des sous-domaines sensibles à la langue comme décrit ci-dessus:

    pour l'anglais: en.example.com & en.m.example.com

    pour l'allemand: de.example.com & de.m.example.com etc.

  2. La deuxième méthode serait donc de modifier le langage courant de tous les types avec la fonction: hook_language_init . J'utilise le code suivant pour faire fonctionner l'exemple ci-dessus:

:

# 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
la source
Je crois que ce module fait quelque chose de similaire: drupal.org/project/language_multidomain MAIS ... je me demande pourquoi il n'est pas possible d'utiliser ce hook: api.drupal.org/api/drupal/modules!system!language.api.php/ … (Qui est ce que le module de paramètres régionaux utilise) pour définir le fournisseur de négociation de langue qui gère plusieurs domaines ??
leon.nk
@ leon.nk Je n'ai pas trouvé ce module, merci pour cet indice. Vous avez peut-être raison et le hook_language_negotiation_info est le bon crochet à utiliser. Je vais l'essayer.
user5950
Apparemment, le module language_multidomain n'existe plus.
Matthias Urlichs
Le crochet ci-dessus ne devrait-il pas être hook_language_init () ? Il n'y a pas de hook_api_language_init () . Vous devez également mettre à jour les liens du sélecteur de langue avec hook_language_switch_links_alter () .
colan
@colan Le module personnalisé est appelé custom_apiet le crochet hook_language_init(). C'est ensemble custom_api_language_init(). Cela peut être déroutant, j'ai donc édité l'exemple pour clarifier ce point. Vous avez raison, utiliser ´hook_language_switch_links_alter () ´ peut être la meilleure façon. Mais comme il semble que presque personne ne s'intéresse à ce problème, je pense qu'il ne vaut peut-être pas la peine de réécrire cet exemple.
user5950