annotate includes/language.inc @ 20:e3d20ebd63d1 tip

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