答案是:Drupal 7无法为一种语言使用多个域,据我所知,没有模块可以添加该功能。
但是无论如何要实现此目标,有一种解决方法:如上所述,语言域的问题在于,所有具有语言特定路径别名并使用Drupal核心函数url()创建的内部路径都被创建为绝对路径。负责该行为的是函数:
locale_language_url_rewrite_url(&$path, &$options)
不要为该默认语言设置语言域。如果您不这样做,则Drupal将不会为默认语言创建绝对路径,例如,如果使用域xyz.example.com,其中xyz.example.com未设置为任何语言的域,则Drupal将创建所有网址都是相对的,因此单击任何内部链接都将保留该子域。但是,如果您要拥有如上所述的语言敏感子域,则不能使用该方法:
对于英语:en.example.com和en.m.example.com
对于德语:de.example.com和de.m.example.com等。
因此,第二种方法是使用函数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;
}
}
}