วิธีตั้งค่าหลายโดเมนสำหรับหนึ่งภาษา


15

ฉันมีเว็บไซต์พูดได้หลายภาษากับ Drupal 7 โดยใช้โดเมนย่อยเช่น en.example.com เพื่อตรวจหาภาษา ทุกอย่างทำงานได้ตามที่คาดหวัง แต่ฉันมีเว็บไซต์ในมือถือเวอร์ชันแม่มดฉันต้องการเข้าถึงได้โดยโดเมนเช่น en.m.example.com เป็นต้นฉันจะทำสิ่งนี้ได้อย่างไร ฉันสามารถตั้งค่าในadmin/config/regional/languageโดเมนเดียวต่อภาษา แต่จะต้องตั้งสองเพื่อให้ทำงานเช่น:

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

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

(ฉันต้องการมีโครงสร้างแบบเดียวกับที่ Wikipedia มี) ปัญหาคือการใช้โดเมนย่อยสำหรับการเลือกภาษา Drupal สร้างลิงก์ภายในทั้งหมดเป็นเส้นทางที่แน่นอน ตัวอย่างเช่นลิงค์เมนูจะถูกสร้างขึ้นเป็น:

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

ดังนั้นฉันสามารถสร้างชื่อแทนโดเมนกับ Apache เพื่อส่งคำขอจาก en.m.example.com ไปยัง en.example.com แต่ลิงก์ภายในทั้งหมดจะนำผู้ใช้กลับมาจากเวอร์ชันมือถือเป็นปกติ ฉันจะแก้ปัญหานี้ได้อย่างไร


1
สิ่งนี้ไม่ได้ตอบคำถามของคุณอย่างแน่นอน แต่จะดีกว่าถ้าไม่มีไซต์มือถือแยกต่างหาก มันจะเป็นการดีกว่าถ้ามีเลย์เอาต์ที่ตอบสนองต่อการเปลี่ยนแปลงสำหรับมือถือ มันให้ประสบการณ์ที่ดีกว่าดูแลรักษาง่ายขึ้นและคุณข้ามการตรวจจับเชิงลบของการตรวจจับเบราว์เซอร์และไซต์การสลับ - ต้องใช้เงินลงทุนเล็กน้อยในการออกแบบ / การกำหนดธีม
rooby

ขอบคุณฉันรู้ว่านี่เป็นสิ่งที่ดีที่สุด แต่กรณีการใช้งานเว็บไซต์ของฉันนั้นแตกต่างกันสำหรับผู้ใช้มือถือและผู้ใช้ทั่วไป ดังนั้นฟังก์ชั่นและเนื้อหาที่ส่งมอบจะแตกต่างกันเช่นกัน นั่นเป็นเหตุผลที่ฉันไม่มีตัวเลือกนั้น
user5950

ฉันไม่เข้าใจสิ่งนี้! นี่เป็นสิ่งพื้นฐาน ต้องเป็นไปได้ที่จะใช้ Drupal กับโดเมนภาษาร่วมกับ subdomins สำหรับธีมมือถือ ไม่มีใครออกไปทำสิ่งนี้กับ Drupal เหรอ?
user5950

คำตอบ:


5

เมื่อคุณตั้งค่า Drupal เพื่อให้บริการภาษาต่าง ๆ ในโดเมนที่แตกต่างกันคุณต้องสั่งให้เว็บเซิร์ฟเวอร์ของคุณส่งคำขอจากหลายโดเมนไปยังไซต์ Drupal เดียวกัน

ใน Apache คุณจะต้องแก้ไข.conf (httpd.conf)ไฟล์และเพิ่มชื่อแทนไปยังโดเมนต่าง ๆ ทั้งหมด ตัวอย่างเช่น:

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

นอกจากนี้คุณจะต้องชี้เซิร์ฟเวอร์ชื่อโดเมน (DNS) ไปยังเซิร์ฟเวอร์ของคุณสำหรับชื่อโดเมนทั้งหมดในภาษาต่างๆ


นั่นไม่ได้ผลสำหรับฉัน ปัญหาคือการใช้โดเมนที่แตกต่างกันสำหรับการเลือกภาษาตามที่อธิบายไว้ข้างต้นผลลัพธ์ในการเชื่อมโยงภายในทั้งหมดจะถูกสร้างเป็นเส้นทางที่แน่นอน ดังนั้นฉันสามารถเข้าถึงหน้าเว็บด้วย en.example.com & en.m.example.com แต่ลิงก์ภายในทั้งหมดภายใต้ en.m.example.com ไม่มีส่วนย่อยที่สองเช่นลิงก์ไปยังหน้าย่อย เช่น en.example.com/node/1234 แต่ควรมีลักษณะเหมือน en.m.example.com/node/1234
user5950

2

คำตอบคือ: การใช้หลายโดเมนสำหรับภาษาเดียวไม่สามารถทำได้ด้วย Drupal 7 และมีเท่าที่ฉันรู้ไม่มีโมดูลที่เพิ่มฟังก์ชันการทำงานนั้น

แต่เพื่อให้บรรลุเป้าหมายนี้อย่างไรก็ตามมีวิธีแก้ไขปัญหาตามที่กล่าวไว้ข้างต้นปัญหาเกี่ยวกับโดเมนภาษาคือว่าเส้นทางภายในทั้งหมดที่มีนามแฝงเส้นทางภาษาเฉพาะและถูกสร้างขึ้นด้วยurl ()ฟังก์ชันหลักของ Drupal ถูกสร้างขึ้นเป็นเส้นทางสัมบูรณ์ ความรับผิดชอบต่อพฤติกรรมนั้นเป็นหน้าที่ :

locale_language_url_rewrite_url(&$path, &$options)
  1. อย่าตั้งค่าโดเมนภาษาสำหรับภาษาเริ่มต้นนั้น หากคุณไม่ทำเช่นนั้น Drupal จะไม่สร้างเส้นทางแบบสัมบูรณ์สำหรับภาษาเริ่มต้นถ้า - เช่น - ใช้โดเมนxyz.example.comโดยที่ xyz.example.com ไม่ได้ถูกตั้งค่าเป็นโดเมนสำหรับภาษาใด ๆ Drupal จะสร้าง ทุกคนที่เกี่ยวข้องจึงคลิกที่ลิงก์ภายในจะเก็บโดเมนย่อยไว้ แต่คุณไม่สามารถใช้วิธีการนั้นได้หากคุณต้องการให้มีโดเมนย่อยภาษาที่สำคัญตามที่อธิบายไว้ข้างต้น:

    สำหรับภาษาอังกฤษ: en.example.com & en.m.example.com

    สำหรับภาษาเยอรมัน: de.example.com & de.m.example.com เป็นต้น

  2. ดังนั้นวิธีการที่สองจะเป็นในการปรับเปลี่ยนภาษาปัจจุบันทุกประเภทที่มีฟังก์ชั่น: hook_language_init ฉันใช้รหัสต่อไปนี้เพื่อให้ตัวอย่างการทำงานด้านบน:

:

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

ฉันเชื่อว่าโมดูลนี้ทำสิ่งที่คล้ายกัน: drupal.org/project/language_multidomain แต่ ... ฉันสงสัยว่าทำไมจึงไม่สามารถใช้เบ็ดนี้: api.drupal.org/api/drupal/modules!system!language.api.php/ … (ซึ่งเป็นสิ่งที่โมดูลโลแคลใช้) เพื่อกำหนดผู้ให้บริการเจรจาภาษาที่จัดการหลายโดเมน
leon.nk

@ leon.nk ฉันไม่พบโมดูลนั้นขอบคุณสำหรับคำใบ้นั้น บางทีคุณอาจจะถูกและ hook_language_negotiation_info เป็นเบ็ดขวาที่จะใช้ ฉันจะลองดู
user5950

เห็นได้ชัดว่าโมดูล language_multidomain ไม่มีอยู่อีกต่อไป
แมทเธียสชอูลิชส์

ตะขอด้านบนไม่ควรเป็นhook_language_init ()ใช่ไหม ไม่มีเป็นhook_api_language_init () นอกจากนี้คุณยังควรปรับปรุงการเชื่อมโยงสลับภาษาด้วยhook_language_switch_links_alter ()
colan

@colan โมดูลที่กำหนดเองที่เรียกว่าและเบ็ดcustom_api ร่วมกันมันเป็นhook_language_init() custom_api_language_init()อาจเป็นสิ่งที่ทำให้เกิดความสับสนดังนั้นฉันจึงแก้ไขตัวอย่างเพื่อให้ชัดเจน คุณถูกต้องการใช้´hook_language_switch_links_alter () ´อาจเป็นวิธีที่ดีกว่า แต่ดูเหมือนว่าไม่มีใครสนใจปัญหานี้ฉันคิดว่ามันอาจไม่คุ้มค่าที่จะเขียนตัวอย่างนี้
user5950
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.