Cách đặt nhiều tên miền cho một ngôn ngữ


15

Tôi có một trang web đa ngôn ngữ với Drupal 7 bằng cách sử dụng các tên miền phụ như en.example.com để phát hiện ngôn ngữ. Mọi thứ hoạt động như mong đợi, nhưng tôi có một phiên bản di động của phù thủy trang web mà tôi muốn có thể truy cập bằng các tên miền như en.m.example.com, v.v. Làm thế nào để tôi làm điều này? Tôi chỉ có thể đặt admin/config/regional/languagemột tên miền cho mỗi ngôn ngữ, nhưng sẽ phải đặt hai tên miền để hoạt động, như:

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

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

(Tôi muốn có cấu trúc giống như Wikipedia có.) Vấn đề là, bằng cách sử dụng tên miền phụ để lựa chọn ngôn ngữ, Drupal tạo ra tất cả các liên kết nội bộ dưới dạng đường dẫn tuyệt đối. Ví dụ: một liên kết menu sẽ được tạo như:

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

Vì vậy, tôi có thể tạo bí danh tên miền với Apache, để gửi yêu cầu từ en.m.example.com đến en.example.com, nhưng tất cả các liên kết nội bộ sẽ đưa người dùng trở lại từ phiên bản di động trở lại bình thường. Làm thế nào tôi có thể giải quyết vấn đề này?


1
Điều này không thực sự trả lời chính xác câu hỏi của bạn nhưng tốt hơn là không nên có các trang web di động riêng biệt. Sẽ tốt hơn nếu có một bố cục đáp ứng thay đổi cho điện thoại di động. Nó mang lại trải nghiệm tốt hơn, dễ bảo trì hơn và bạn bỏ qua những tiêu cực của việc phát hiện và chuyển đổi trang web trình duyệt. - Nó sẽ đòi hỏi một chút đầu tư vào thiết kế / chủ đề mặc dù.
rooby

Cảm ơn bạn, tôi biết rằng điều này nói chung là tốt nhất. Nhưng trường hợp sử dụng trang web của tôi là khác nhau cho người dùng di động và người dùng bình thường. Vì vậy, các chức năng và nội dung, sẽ được cung cấp khác nhau là tốt. Đó là lý do tại sao tôi không có lựa chọn đó.
dùng5950

Tôi không hiểu điều này! Đây là một điều cơ bản. Có thể sử dụng Drupal với miền ngôn ngữ kết hợp với subdomin cho chủ đề di động. Không có ai ngoài đó làm điều này với Drupal?
dùng5950

Câu trả lời:


5

Khi bạn đã thiết lập Drupal để phục vụ các ngôn ngữ khác nhau trong các miền khác nhau, bạn cần hướng dẫn máy chủ web của mình gửi yêu cầu từ nhiều tên miền đến cùng một trang web Drupal.

Trong Apache, bạn sẽ cần chỉnh sửa .conf (httpd.conf)tệp và thêm bí danh cho tất cả các miền khác nhau. Ví dụ:

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

Ngoài ra, bạn cũng cần trỏ máy chủ tên miền (DNS) đến máy chủ của mình cho tất cả các tên miền bằng các ngôn ngữ khác nhau.


Điều đó không làm việc cho tôi. Vấn đề là việc sử dụng các tên miền khác nhau để lựa chọn ngôn ngữ như được mô tả ở trên, dẫn đến tất cả các liên kết nội bộ được tạo dưới dạng đường dẫn tuyệt đối. Vì vậy, tôi có thể truy cập trang bằng en.example.com & en.m.example.com, nhưng tất cả các liên kết nội bộ trong en.m.example.com không có sự thống trị phụ thứ hai, ví dụ: liên kết đến trang phụ trông như en.example.com/node/1234, nhưng sẽ giống như en.m.example.com/node/1234.
dùng5950

2

Câu trả lời là: không thể sử dụng nhiều tên miền cho một ngôn ngữ với Drupal 7 và có - theo như tôi biết - không có mô-đun nào thêm chức năng đó.

Nhưng dù sao để đạt được mục đích này, vẫn có cách giải quyết: Như đã đề cập ở trên, vấn đề với các miền ngôn ngữ là, tất cả các đường dẫn bên trong có bí danh đường dẫn cụ thể của ngôn ngữ và được tạo bằng url chức năng lõi Drupal () được tạo như các đường dẫn tuyệt đối. Chịu trách nhiệm cho hành vi đó là chức năng :

locale_language_url_rewrite_url(&$path, &$options)
  1. Đừng đặt miền ngôn ngữ cho ngôn ngữ mặc định đó. Nếu bạn không làm điều đó, Drupal sẽ không tạo đường dẫn tuyệt đối cho ngôn ngữ mặc định nếu - ví dụ - sử dụng tên miền xyz.example.com , trong đó xyz.example.com không được đặt làm tên miền cho bất kỳ ngôn ngữ nào, Drupal sẽ tạo al url tương đối và vì vậy nhấp vào bất kỳ liên kết nội bộ sẽ giữ tên miền phụ. Nhưng bạn không thể sử dụng phương pháp đó, nếu bạn muốn có các tên miền phụ nhạy cảm với ngôn ngữ như được mô tả ở trên:

    đối với tiếng Anh: en.example.com & en.m.example.com

    đối với tiếng Đức: de.example.com & de.m.example.com, v.v.

  2. Vì vậy, phương thức thứ hai sẽ là, để thay đổi ngôn ngữ hiện tại của tất cả các loại với hàm: hook_lingu_init . Tôi sử dụng mã sau đây, để làm cho ví dụ trên hoạt động:

:

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

Tôi tin rằng mô-đun này thực hiện một cái gì đó tương tự: drupal.org/project/lingu_multidomain NHƯNG ... Tôi tự hỏi tại sao không thể sử dụng hook này: api.drupal.org/api/drupal/modules!system!lingu.api.php/ Càng (đó là những gì mô-đun địa phương sử dụng) để xác định nhà cung cấp đàm phán ngôn ngữ xử lý nhiều tên miền ??
leon.nk

@ leon.nk Tôi không tìm thấy mô-đun đó, cảm ơn bạn đã gợi ý đó. Có lẽ bạn đã đúng và hook_lingu_negotiation_info là hook đúng để sử dụng. Tôi sẽ thử nó.
dùng5950

Rõ ràng mô-đun ngôn ngữ_multidomain không còn tồn tại nữa.
Matthias Urlichs

Không nên hook ở trên là hook_lingu_init () ? Không có hook_api_lingu_init () . Bạn cũng nên cập nhật các liên kết trình chuyển đổi ngôn ngữ với hook_lingu_switch_links_alter () .
colan

@colan Mô-đun tùy chỉnh được gọi custom_apivà hook hook_language_init(). Nó là cùng nhau custom_api_language_init(). Có thể điều này là khó hiểu, vì vậy tôi đã chỉnh sửa ví dụ để làm rõ quan điểm đó. Bạn nói đúng, sử dụng ỉhook_lingu_switch_links_alter () ọ có thể là cách tốt hơn. Nhưng dường như hầu như không ai quan tâm đến vấn đề này, tôi nghĩ có thể không đáng để viết lại ví dụ này.
dùng5950
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.