Viewing file: language.inc (4.4 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?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; } } }
|