Cara mengatur beberapa domain untuk satu bahasa


15

Saya memiliki situs multibahasa dengan Drupal 7 menggunakan subdomain seperti en.example.com untuk mendeteksi bahasa. Semuanya berfungsi seperti yang diharapkan, tetapi saya memiliki versi mobile dari situs web penyihir yang saya inginkan dapat diakses oleh domain seperti en.m.example.com dll. Bagaimana saya melakukan ini? Saya dapat menetapkan admin/config/regional/languagehanya satu domain per bahasa, tetapi harus menetapkan dua domain agar berfungsi, seperti:

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

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

(Saya ingin memiliki struktur yang sama dengan Wikipedia.) Masalahnya adalah, menggunakan subdomain untuk pemilihan bahasa, Drupal membuat semua tautan internal sebagai jalur absolut. Misalnya, tautan menu akan dibuat sebagai:

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

Jadi, saya dapat membuat alias domain dengan Apache, untuk mengirim permintaan dari en.m.example.com ke en.example.com, tetapi semua tautan internal akan mengembalikan pengguna dari versi seluler ke versi normal. Bagaimana saya bisa menyelesaikan masalah ini?


1
Ini tidak benar-benar menjawab pertanyaan Anda dengan tepat tetapi akan lebih baik untuk tidak memiliki situs seluler yang terpisah. Akan lebih baik untuk memiliki tata letak responsif yang berubah untuk seluler. Ini memberikan pengalaman yang lebih baik, lebih mudah untuk mempertahankan, dan Anda melewatkan negatif dari deteksi browser dan berpindah situs. - Ini akan membutuhkan sedikit investasi dalam desain / tema.
rooby

Terima kasih, saya tahu ini umumnya yang terbaik. Tetapi kasus penggunaan situs web saya berbeda untuk pengguna seluler dan normal. Jadi fungsi dan kontennya, yang akan disampaikan juga berbeda. Itu sebabnya saya tidak punya opsi itu.
user5950

Saya tidak mengerti ini! Ini adalah hal dasar. Harus dimungkinkan untuk menggunakan domain Drupal dengan bahasa dalam kombinasi dengan subdomin untuk tema seluler. Apakah tidak ada orang di luar sana yang melakukan ini dengan Drupal?
user5950

Jawaban:


5

Setelah menyiapkan Drupal untuk menyajikan berbagai bahasa di domain yang berbeda, Anda perlu menginstruksikan server web Anda untuk mengirim permintaan dari banyak domain ke situs Drupal yang sama.

Di Apache, Anda harus mengedit .conf (httpd.conf)file dan menambahkan alias ke semua domain yang berbeda. Sebagai contoh:

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

Selain itu, Anda juga harus mengarahkan server nama domain (DNS) ke server Anda untuk semua nama domain dalam berbagai bahasa.


Itu tidak bekerja untuk saya. Masalahnya adalah bahwa menggunakan berbagai domain untuk pemilihan bahasa seperti dijelaskan di atas, menghasilkan semua tautan internal yang dibuat sebagai jalur absolut. Jadi saya dapat membuka halaman dengan en.example.com & en.m.example.com, tetapi semua tautan internal di bawah en.m.example.com tidak memiliki sub dominan kedua, misalnya tautan ke tampilan sub halaman seperti en.example.com/node/1234, tetapi akan terlihat seperti en.m.example.com/node/1234.
user5950

2

Jawabannya adalah: menggunakan beberapa domain untuk satu bahasa tidak dimungkinkan dengan Drupal 7 dan - sejauh yang saya tahu - tidak ada modul yang menambahkan fungsionalitas itu.

Namun untuk mencapai tujuan ini, ada solusi: Seperti disebutkan di atas, masalah dengan domain bahasa adalah, bahwa semua jalur internal yang memiliki alias jalur khusus bahasa dan dibuat dengan url fungsi inti Drupal () dibuat sebagai jalur absolut. Bertanggung jawab untuk perilaku itu adalah fungsinya :

locale_language_url_rewrite_url(&$path, &$options)
  1. Jangan tetapkan domain bahasa untuk bahasa default itu. Jika Anda tidak melakukannya, Drupal tidak akan membuat jalur absolut untuk bahasa default jika - misalnya - menggunakan domain xyz.example.com , di mana xyz.example.com tidak ditetapkan sebagai domain untuk bahasa apa pun, Drupal akan membuat al url relatif dan mengklik tautan internal apa pun akan membuat subdomain. Tetapi Anda tidak dapat menggunakan metode itu, jika Anda ingin memiliki subdomain sensitif bahasa seperti dijelaskan di atas:

    untuk bahasa Inggris: en.example.com & en.m.example.com

    untuk bahasa Jerman: de.example.com & de.m.example.com dll.

  2. Jadi metode kedua adalah, untuk mengubah bahasa saat ini dari semua jenis dengan fungsi: hook_language_init . Saya menggunakan kode berikut, untuk membuat contoh di atas berfungsi:

:

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

Saya percaya modul ini melakukan sesuatu yang serupa: drupal.org/project/language_multidomain NAMUN ... Saya heran mengapa tidak mungkin untuk menggunakan kait ini: api.drupal.org/api/drupal/modules!system!language.api.php/ ... (yang merupakan apa yang digunakan modul lokal) untuk menentukan penyedia negosiasi bahasa yang menangani banyak domain ??
leon.nk

@ leon.nk Saya tidak menemukan modul itu, terima kasih atas petunjuk itu. Mungkin Anda benar dan hook_language_negotiation_info adalah hook yang tepat untuk digunakan. Saya akan mencobanya.
user5950

Rupanya modul language_multidomain tidak ada lagi.
Matthias Urlichs

Bukankah seharusnya kait di atas adalah hook_language_init () ? Tidak ada hook_api_language_init () . Anda juga harus memperbarui tautan pengalih bahasa dengan hook_language_switch_links_alter () .
colan

@olan Modul khusus dipanggil custom_apidan hook hook_language_init(). Bersama itu custom_api_language_init(). Mungkin ini membingungkan, jadi saya mengedit contoh untuk memperjelas hal itu. Anda benar, menggunakan ´hook_language_switch_links_alter () ´ mungkin merupakan cara yang lebih baik. Tetapi sepertinya hampir tidak ada orang yang tertarik dengan masalah ini, saya pikir mungkin tidak layak untuk menulis ulang contoh ini.
user5950
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.