Bir dil için birden çok alan adı nasıl ayarlanır?


15

Dili tespit etmek için en.example.com gibi alt alan adlarını kullanarak Drupal 7 ile çok dilli bir sitem var . Her şey beklendiği gibi çalışıyor, ancak en.m.example.com vb. Alan adları tarafından erişilebilir olmasını istediğim web sitesi cadının mobil bir sürümüne sahibim. Bunu nasıl yapabilirim? admin/config/regional/languageHer dil için yalnızca bir etki alanı ayarlayabilirim, ancak bu şekilde çalışabilmek için iki tane ayarlamanız gerekir:

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

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

(Wikipedia ile aynı yapıya sahip olmak istiyorum.) Sorun şu ki, dil seçimi için alt etki alanlarını kullanarak Drupal, tüm iç bağlantıları mutlak yollar olarak oluşturuyor. Örneğin, bir menü bağlantısı şu şekilde oluşturulur:

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

Bu nedenle, en.m.example.com'dan en.example.com'a istek göndermek için Apache ile bir alan takma adı oluşturabilirim, ancak tüm dahili bağlantılar kullanıcıyı mobil sürümden normale geri döndürür. Bu sorunu nasıl çözebilirim?


1
Bu, sorunuza tam olarak cevap vermiyor, ancak ayrı mobil sitelere sahip olmamak daha iyi olurdu. Mobil cihazlar için değişen duyarlı bir düzene sahip olmak daha iyi olur. Daha iyi bir deneyim sunar, bakımı daha kolaydır ve tarayıcı algılama ve geçiş sitelerinin negatiflerini atlarsınız. - Yine de tasarım / tema üzerine biraz yatırım gerektirecektir.
rooby

Teşekkür ederim, bunun genellikle en iyisi olduğunu biliyorum. Ancak web sitemin kullanım durumu mobil ve normal kullanıcılar için farklıdır. Dolayısıyla, sunulacak işlevler ve içerik de farklıdır. O yüzden bu seçeneğim yok.
user5950

Bunu anlamıyorum! Bu temel bir şey. Mobil tema için Drupal'ın alt etki alanlarıyla birlikte diller etki alanıyla birlikte kullanılabilmesi gerekir. Drupal'la bunu yapan kimse yok mu?
user5950

Yanıtlar:


5

Drupal'ı farklı alan adlarında farklı diller sunmak üzere ayarladıktan sonra, web sunucunuzdan aynı Drupal sitesine birden çok alandan istek göndermesini istemeniz gerekir.

Apache'de .conf (httpd.conf)dosyayı düzenlemeniz ve tüm farklı alan adlarına takma adlar eklemeniz gerekir . Örneğin:

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

Buna ek olarak, farklı dillerdeki tüm etki alanı adları için etki alanı adı sunucusunu (DNS) sunucunuza da yönlendirmeniz gerekir.


Bu benim için işe yaramıyor. Sorun, yukarıda açıklandığı gibi dil seçimi için farklı alanların kullanılması, tüm dahili bağlantıların mutlak yollar olarak oluşturulmasına neden olmasıdır. Bu nedenle, en.example.com ve en.m.example.com ile sayfaya ulaşabilirim, ancak en.m.example.com altındaki tüm dahili bağlantı ikinci alt egemenliğe sahip değildir, örneğin bir alt sayfaya bağlantı görünüyor en.example.com/node/1234 gibi, ancak en.m.example.com/node/1234 gibi görünmelidir.
user5950

2

Cevap: Drupal 7 ile bir dil için birden fazla etki alanı kullanmak mümkün değildir ve bildiğim kadarıyla bu işlevselliği ekleyen bir modül yoktur.

Ancak yine de bu hedefe ulaşmak için geçici bir çözüm vardır: Yukarıda belirtildiği gibi, dil alanlarıyla ilgili sorun, dile özgü yol takma adı olan ve Drupal çekirdek işlevi url () ile oluşturulan tüm dahili yolların mutlak yollar olarak oluşturulmasıdır. Bu davranıştan sorumlu olan işlevdir :

locale_language_url_rewrite_url(&$path, &$options)
  1. Bu varsayılan dil için bir dil alanı ayarlamayın. Bunu yapmazsanız, Drupal varsayılan dil için mutlak yollar oluşturmazsa - örneğin , xyz.example.com etki alanını kullanırsa, xyz.example.com herhangi bir dil için etki alanı olarak ayarlanmazsa, Drupal al urls göreli ve böylece herhangi bir dahili bağlantı tıklandığında alt etki alanı kalır. Ancak, yukarıda açıklandığı gibi dile duyarlı alt alan adlarına sahip olmak istiyorsanız bu yöntemi kullanamazsınız:

    İngilizce için: en.example.com ve en.m.example.com

    Almanca için: de.example.com ve de.m.example.com vb.

  2. İkinci yöntem, şu türdeki tüm dillerin geçerli dilini şu işlevle değiştirmek olacaktır: hook_language_init . Yukarıdaki örnek çalışma almak için aşağıdaki kodu kullanın:

:

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

Bu modülün benzer bir şey yaptığını düşünüyorum: drupal.org/project/language_multidomain AMA ... Neden bu kancayı kullanmanın mümkün olmadığını merak ediyorum: api.drupal.org/api/drupal/modules!system!language.api.php/ ... dil müzakere sağlayıcı kolları birden fazla alan olduğunu tanımlamak için (yerel modül kullanır ne olduğunu) ??
leon.nk

@ leon.nk Bu modülü bulamadım, bu ipucu için teşekkür ederim. Belki haklısınız ve hook_language_negotiation_info kullanmak için doğru kanca. Deneyeceğim.
user5950

Görünüşe göre language_multidomain modülü artık mevcut değil.
Matthias Urlichs

Yukarıdaki kanca hook_language_init () olmamalı mı? Hiçbir yoktur hook_api_language_init () . Dil değiştirici bağlantılarını hook_language_switch_links_alter () ile de güncellemelisiniz .
colan

@colan Özel modül çağrılır custom_apive çağrılır hook_language_init(). Birlikte öyle custom_api_language_init(). Belki kafa karıştırıcı olabilir, bu yüzden bu noktayı netleştirmek için örneği düzenledim. Haklısınız, ´hook_language_switch_links_alter () ´ kullanmak daha iyi bir yol olabilir. Ancak neredeyse hiç kimsenin bu sorunla ilgilenmediği anlaşılıyor, bence bu örneği yeniden yazmaya değmeyebilir.
user5950
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.