Drupal多语言网站在中文语言浏览器的自动本地化

Drupal 6 的核心文件根目录 includes 文件夹下有一个 language.inc 的文件, 它的里面主要是 Drupal 网站语言控制的代码, 包括语言前缀, 浏览器语言判断等等.

在 Drupal 网站系统里面中文语言的默认前缀是 zh-hans, 一般形式如 http://域名/zh-hans/... . 而浏览器的语言, 以中文版 Firefox 为例 : 中文的语言的选择仅有
汉语 [zh];
汉语/新加坡 [zh-sg];
汉语/中国 [zh-cn];
汉语/中国台湾 [zh-tw];
汉语/中国香港 [zh-hk].

当 Drupal 在用 zh-hans 匹配时, 无法找到匹配的浏览器中文语言选择. 所以你会发现虽然在 Drupal 语言配置选择了 : 使用路径前缀,及后备语言(先通过检查路径中的语言代码,或与每种语言所定义的路径前缀相匹配的字串,来决定站点使用哪种语言显示。如果没有找到合适的前缀,则使用当前用户我的帐号页面中的偏好语言设置,或者使用用户浏览器的偏好语言设置。如果没有找到任何用户定义的偏好语言设置,则使用默认语言。) 还是不能匹配到浏览器设置的中文语言. 

有两种方法解决这个问题,
第一种:后台修改语言前缀字符串, 这个修改起来非常简单 : 
管理路径 admin/settings/language/edit/zh-hans
将路径前缀该为和浏览器可以匹配的一个, 如 zh 或 zh-cn.但是只能匹配一个.

第二种:直接修改 includes 下的 language.inc 文件, 加入代码判断, 把 zh 开头的都视为是 zh-hans 中文语言.  例如在language_from_browser()函数里加入: 

foreach($browser_langs as $langcode=>$q) {
if(is_integer(strpos($langcode, 'zh'))) {
$browser_langs['zh-hans'] = $q;
unset($browser_langs[$langcode]);
}
下面是修改后的language.inc的全部代码: 
<?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

if(is_integer(strpos($langcode, 'zh'))) {这句不太对 zh-tw zh-hk是繁体字,应该对应zh-hant等繁体编码
匿名 的头像

嗯 为了统一没有做繁体中文,汉语只做了简体中文。

嗯 为了统一没有做繁体中文,汉语只做了简体中文。

发表新评论

此内容将保密,不会被其他人看见。 如果这是你的 Gravatar 账户,将会显示你的头像。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
  • 允许HTML标签:<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><img>
  • You can use the <go> tags just like the <a> for nicer urls.

更多关于格式化选项的信息

验证码
这是为了测试你是否是一个人类(相对机器来说)的游客,为防止自动的垃圾提交。
3 + 16 =
做一下这个数学题,把答案给我。