diff includes/language.inc @ 1:c1f4ac30525a 6.0

Drupal 6.0
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:28:28 +0100
parents
children 3edae6ecd6c6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/language.inc	Tue Dec 23 14:28:28 2008 +0100
@@ -0,0 +1,144 @@
+<?php
+// $Id: language.inc,v 1.14 2008/01/06 16:46:02 goba 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['SERVER_NAME'] == $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);
+      }
+    }
+  }
+
+  // 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;
+    }
+  }
+}