在 Drupal 网站系统里面中文语言的默认前缀是 zh-hans, 一般形式如 http://域名/zh-hans/... . 而浏览器的语言, 以中文版 Firefox 为例 : 中文的语言的选择仅有
汉语 [zh];
汉语/新加坡 [zh-sg];
汉语/中国 [zh-cn];
汉语/中国台湾 [zh-tw];
汉语/中国香港 [zh-hk].
当 Drupal 在用 zh-hans 匹配时, 无法找到匹配的浏览器中文语言选择. 所以你会发现虽然在 Drupal 语言配置选择了 : 使用路径前缀,及后备语言(先通过检查路径中的语言代码,或与每种语言所定义的路径前缀相匹配的字串,来决定站点使用哪种语言显示。如果没有找到合适的前缀,则使用当前用户我的帐号页面中的偏好语言设置,或者使用用户浏览器的偏好语言设置。如果没有找到任何用户定义的偏好语言设置,则使用默认语言。) 还是不能匹配到浏览器设置的中文语言.
第二种:直接修改 includes 下的 language.inc 文件, 加入代码判断, 把 zh 开头的都视为是 zh-hans 中文语言. 例如在language_from_browser()函数里加入:
<?php
// $Id: language.inc,v 1.14.2.1 2009/01/02 23:37:48 dries Exp $
/**
* @file
* Multiple language handling functionality.
*/
/**
* Choose a language for the page, based on language negotiation settings.
*/
function language_initialize() {
global $user;
// Configured presentation language mode.
$mode = variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE);
// Get a list of enabled languages.
$languages = language_list('enabled');
$languages = $languages[1];
switch ($mode) {
case LANGUAGE_NEGOTIATION_NONE:
return language_default();
case LANGUAGE_NEGOTIATION_DOMAIN:
foreach ($languages as $language) {
$parts = parse_url($language->domain);
if (!empty($parts['host']) && ($_SERVER['HTTP_HOST'] == $parts['host'])) {
return $language;
}
}
return language_default();
case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
case LANGUAGE_NEGOTIATION_PATH:
// $_GET['q'] might not be available at this time, because
// path initialization runs after the language bootstrap phase.
$args = isset($_GET['q']) ? explode('/', $_GET['q']) : array();
$prefix = array_shift($args);
// Search prefix within enabled languages.
foreach ($languages as $language) {
if (!empty($language->prefix) && $language->prefix == $prefix) {
// Rebuild $GET['q'] with the language removed.
$_GET['q'] = implode('/', $args);
return $language;
}
}
if ($mode == LANGUAGE_NEGOTIATION_PATH_DEFAULT) {
// If we did not found the language by prefix, choose the default.
return language_default();
}
break;
}
// User language.
if ($user->uid && isset($languages[$user->language])) {
return $languages[$user->language];
}
// Browser accept-language parsing.
if ($language = language_from_browser()) {
return $language;
}
// Fall back on the default if everything else fails.
return language_default();
}
/**
* Identify language from the Accept-language HTTP header we got.
*/
function language_from_browser() {
// Specified by the user via the browser's Accept Language setting
// Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5"
$browser_langs = array();
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$browser_accept = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
for ($i = 0; $i < count($browser_accept); $i++) {
// The language part is either a code or a code with a quality.
// We cannot do anything with a * code, so it is skipped.
// If the quality is missing, it is assumed to be 1 according to the RFC.
if (preg_match("!([a-z-]+)(;q=([0-9\\.]+))?!", trim($browser_accept[$i]), $found)) {
$browser_langs[$found[1]] = (isset($found[3]) ? (float) $found[3] : 1.0);
}
}
}
foreach($browser_langs as $langcode=>$q) {
if(is_integer(strpos($langcode, 'zh'))) {
$browser_langs['zh-hans'] = $q;
unset($browser_langs[$langcode]);
}
}
// Order the codes by quality
arsort($browser_langs);
// Try to find the first preferred language we have
$languages = language_list('enabled');
foreach ($browser_langs as $langcode => $q) {
if (isset($languages['1'][$langcode])) {
return $languages['1'][$langcode];
}
}
}
/**
* Rewrite URL's with language based prefix. Parameters are the same
* as those of the url() function.
*/
function language_url_rewrite(&$path, &$options) {
global $language;
// Only modify relative (insite) URLs.
if (!$options['external']) {
// Language can be passed as an option, or we go for current language.
if (!isset($options['language'])) {
$options['language'] = $language;
}
switch (variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE)) {
case LANGUAGE_NEGOTIATION_NONE:
// No language dependent path allowed in this mode.
unset($options['language']);
break;
case LANGUAGE_NEGOTIATION_DOMAIN:
if ($options['language']->domain) {
// Ask for an absolute URL with our modified base_url.
$options['absolute'] = TRUE;
$options['base_url'] = $options['language']->domain;
}
break;
case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
$default = language_default();
if ($options['language']->language == $default->language) {
break;
}
// Intentionally no break here.
case LANGUAGE_NEGOTIATION_PATH:
if (!empty($options['language']->prefix)) {
$options['prefix'] = $options['language']->prefix .'/';
}
break;
}
}
}
评论
if(is_integer(strpos($langcod
嗯 为了统一没有做繁体中文,汉语只做了简体中文。
发表新评论