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 } |