Mercurial > defr > drupal > core
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 0:5a113a1c4740 | 1:c1f4ac30525a |
|---|---|
| 1 <?php | |
| 2 // $Id: language.inc,v 1.14 2008/01/06 16:46:02 goba Exp $ | |
| 3 | |
| 4 /** | |
| 5 * @file | |
| 6 * Multiple language handling functionality. | |
| 7 */ | |
| 8 | |
| 9 /** | |
| 10 * Choose a language for the page, based on language negotiation settings. | |
| 11 */ | |
| 12 function language_initialize() { | |
| 13 global $user; | |
| 14 | |
| 15 // Configured presentation language mode. | |
| 16 $mode = variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE); | |
| 17 // Get a list of enabled languages. | |
| 18 $languages = language_list('enabled'); | |
| 19 $languages = $languages[1]; | |
| 20 | |
| 21 switch ($mode) { | |
| 22 case LANGUAGE_NEGOTIATION_NONE: | |
| 23 return language_default(); | |
| 24 | |
| 25 case LANGUAGE_NEGOTIATION_DOMAIN: | |
| 26 foreach ($languages as $language) { | |
| 27 $parts = parse_url($language->domain); | |
| 28 if (!empty($parts['host']) && ($_SERVER['SERVER_NAME'] == $parts['host'])) { | |
| 29 return $language; | |
| 30 } | |
| 31 } | |
| 32 return language_default(); | |
| 33 | |
| 34 case LANGUAGE_NEGOTIATION_PATH_DEFAULT: | |
| 35 case LANGUAGE_NEGOTIATION_PATH: | |
| 36 // $_GET['q'] might not be available at this time, because | |
| 37 // path initialization runs after the language bootstrap phase. | |
| 38 $args = isset($_GET['q']) ? explode('/', $_GET['q']) : array(); | |
| 39 $prefix = array_shift($args); | |
| 40 // Search prefix within enabled languages. | |
| 41 foreach ($languages as $language) { | |
| 42 if (!empty($language->prefix) && $language->prefix == $prefix) { | |
| 43 // Rebuild $GET['q'] with the language removed. | |
| 44 $_GET['q'] = implode('/', $args); | |
| 45 return $language; | |
| 46 } | |
| 47 } | |
| 48 if ($mode == LANGUAGE_NEGOTIATION_PATH_DEFAULT) { | |
| 49 // If we did not found the language by prefix, choose the default. | |
| 50 return language_default(); | |
| 51 } | |
| 52 break; | |
| 53 } | |
| 54 | |
| 55 // User language. | |
| 56 if ($user->uid && isset($languages[$user->language])) { | |
| 57 return $languages[$user->language]; | |
| 58 } | |
| 59 | |
| 60 // Browser accept-language parsing. | |
| 61 if ($language = language_from_browser()) { | |
| 62 return $language; | |
| 63 } | |
| 64 | |
| 65 // Fall back on the default if everything else fails. | |
| 66 return language_default(); | |
| 67 } | |
| 68 | |
| 69 /** | |
| 70 * Identify language from the Accept-language HTTP header we got. | |
| 71 */ | |
| 72 function language_from_browser() { | |
| 73 // Specified by the user via the browser's Accept Language setting | |
| 74 // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5" | |
| 75 $browser_langs = array(); | |
| 76 | |
| 77 if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { | |
| 78 $browser_accept = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']); | |
| 79 for ($i = 0; $i < count($browser_accept); $i++) { | |
| 80 // The language part is either a code or a code with a quality. | |
| 81 // We cannot do anything with a * code, so it is skipped. | |
| 82 // If the quality is missing, it is assumed to be 1 according to the RFC. | |
| 83 if (preg_match("!([a-z-]+)(;q=([0-9\\.]+))?!", trim($browser_accept[$i]), $found)) { | |
| 84 $browser_langs[$found[1]] = (isset($found[3]) ? (float) $found[3] : 1.0); | |
| 85 } | |
| 86 } | |
| 87 } | |
| 88 | |
| 89 // Order the codes by quality | |
| 90 arsort($browser_langs); | |
| 91 | |
| 92 // Try to find the first preferred language we have | |
| 93 $languages = language_list('enabled'); | |
| 94 foreach ($browser_langs as $langcode => $q) { | |
| 95 if (isset($languages['1'][$langcode])) { | |
| 96 return $languages['1'][$langcode]; | |
| 97 } | |
| 98 } | |
| 99 } | |
| 100 | |
| 101 /** | |
| 102 * Rewrite URL's with language based prefix. Parameters are the same | |
| 103 * as those of the url() function. | |
| 104 */ | |
| 105 function language_url_rewrite(&$path, &$options) { | |
| 106 global $language; | |
| 107 | |
| 108 // Only modify relative (insite) URLs. | |
| 109 if (!$options['external']) { | |
| 110 | |
| 111 // Language can be passed as an option, or we go for current language. | |
| 112 if (!isset($options['language'])) { | |
| 113 $options['language'] = $language; | |
| 114 } | |
| 115 | |
| 116 switch (variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE)) { | |
| 117 case LANGUAGE_NEGOTIATION_NONE: | |
| 118 // No language dependent path allowed in this mode. | |
| 119 unset($options['language']); | |
| 120 break; | |
| 121 | |
| 122 case LANGUAGE_NEGOTIATION_DOMAIN: | |
| 123 if ($options['language']->domain) { | |
| 124 // Ask for an absolute URL with our modified base_url. | |
| 125 $options['absolute'] = TRUE; | |
| 126 $options['base_url'] = $options['language']->domain; | |
| 127 } | |
| 128 break; | |
| 129 | |
| 130 case LANGUAGE_NEGOTIATION_PATH_DEFAULT: | |
| 131 $default = language_default(); | |
| 132 if ($options['language']->language == $default->language) { | |
| 133 break; | |
| 134 } | |
| 135 // Intentionally no break here. | |
| 136 | |
| 137 case LANGUAGE_NEGOTIATION_PATH: | |
| 138 if (!empty($options['language']->prefix)) { | |
| 139 $options['prefix'] = $options['language']->prefix .'/'; | |
| 140 } | |
| 141 break; | |
| 142 } | |
| 143 } | |
| 144 } |
