Como definir vários domínios para um idioma

15

Eu tenho um site multilíngue com o Drupal 7 usando subdomínios como en.example.com para detectar o idioma. Tudo funciona como o esperado, mas eu tenho uma versão móvel do site, que quero estar acessível por domínios como en.m.example.com etc. Como faço para isso? Posso definir admin/config/regional/languageapenas um domínio por idioma, mas precisaria definir dois para que isso funcionasse, como:

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

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

(Gostaria de ter a mesma estrutura da Wikipedia.) O problema é que, usando subdomínios para seleção de idioma, o Drupal cria todos os links internos como caminhos absolutos. Por exemplo, um link de menu será criado 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>

Assim, eu poderia criar um alias de domínio com o Apache, para enviar solicitações de en.m.example.com para en.example.com, mas todos os links internos trariam o usuário de volta da versão móvel para o normal. Como posso resolver este problema?

user5950
fonte
11
Isso realmente não responde exatamente à sua pergunta, mas seria melhor não ter sites para celular separados. Seria melhor ter um layout responsivo que muda para dispositivos móveis. Ele oferece uma experiência melhor, é mais fácil de manter e você pula os negativos dos sites de detecção e troca de navegador. - Isso exigirá um pouco de investimento em design / tema.
precisa
Obrigado, eu sei que isso geralmente é o melhor. Mas o caso de uso do meu site é diferente para usuários móveis e normais. Portanto, as funções e o conteúdo que serão entregues diferem também. Por isso não tenho essa opção.
usar o seguinte comando
Eu não entendo isso! Isso é uma coisa básica. Deve ser possível usar o Drupal com domínio de idiomas em combinação com subdominos para um tema móvel. Não há ninguém lá fora fazendo isso com Drupal?
usar o seguinte comando

Respostas:

5

Depois de configurar o Drupal para servir idiomas diferentes em domínios diferentes, você precisa instruir seu servidor da Web para enviar solicitações de vários domínios ao mesmo site do Drupal.

No Apache, você precisará editar o .conf (httpd.conf)arquivo e adicionar aliases a todos os diferentes domínios. Por exemplo:

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

Além disso, você também precisará apontar o servidor de nomes de domínio (DNS) para o servidor para todos os nomes de domínio em diferentes idiomas.

monymirza
fonte
Isso não funciona para mim. O problema é que o uso de domínios diferentes para a seleção de idioma, conforme descrito acima, resulta na criação de todos os links internos como caminhos absolutos. Para acessar a página com en.example.com e en.m.example.com, mas todos os links internos em en.m.example.com não possuem o segundo subdomínio, por exemplo, parece um link para uma subpágina como en.example.com/node/1234, mas deve ser semelhante a en.m.example.com/node/1234.
user5950
2

A resposta é: o uso de vários domínios para um idioma não é possível com o Drupal 7 e, até onde eu sei, não existe módulo que adicione essa funcionalidade.

Mas, para atingir esse objetivo de qualquer maneira, existe uma solução alternativa: como mencionado acima, o problema com domínios de idioma é que todos os caminhos internos que possuem um alias de caminho específico ao idioma e são criados com a função principal do Drupal url () são criados como caminhos absolutos. Responsável por esse comportamento é a função :

locale_language_url_rewrite_url(&$path, &$options)
  1. Não defina um domínio de idioma para esse idioma padrão. Se você não fizer isso, o Drupal não criará caminhos absolutos para o idioma padrão se - por exemplo - usar o domínio xyz.example.com , em que xyz.example.com não estiver definido como domínio para nenhum idioma, o Drupal criará todos os URLs relativos e, portanto, clicar em qualquer link interno manterá o subdomínio. Mas você não pode usar esse método se quiser ter subdomínios sensíveis ao idioma, conforme descrito acima:

    para inglês: pt.exemplo.com e pt.mexemplo.com

    para alemão: de.example.com e de.m.example.com etc.

  2. Portanto, o segundo método seria alterar o idioma atual de todos os tipos com a função: hook_language_init . Eu uso o código a seguir, para obter o exemplo acima funcionando:

:

# 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
fonte
Acredito que este módulo faça algo semelhante: drupal.org/project/language_multidomain MAS ... Gostaria de saber por que não é possível usar esse gancho: api.drupal.org/api/drupal/modules!system!language.api.php/ … (Que é o que o módulo de localidade usa) para definir o provedor de negociação de idiomas que lida com vários domínios?
Leon.nk
@ leon.nk Não encontrei esse módulo, obrigado por essa dica. Talvez você esteja certo e o hook_language_negotiation_info seja o gancho certo para usar. Eu vou tentar.
user5950
Aparentemente, o módulo language_multidomain não existe mais.
Matthias Urlichs
O gancho acima não deve ser hook_language_init () ? Não há hook_api_language_init () . Você também deve atualizar os links do alternador de idiomas com hook_language_switch_links_alter () .
colan
@colan O módulo personalizado é chamado custom_apie o gancho hook_language_init(). Juntos é isso custom_api_language_init(). Pode ser que isso seja confuso, então editei o exemplo para deixar esse ponto claro. Você está certo, usar ´hook_language_switch_links_alter () ´ pode ser a melhor maneira. Mas, como parece que quase ninguém está interessado nesse problema, acho que pode não valer a pena reescrever este exemplo.
user5950