/[web]/nav/lib.php
ViewVC logotype

Contents of /nav/lib.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2042 - (show annotations) (download)
Sat Feb 9 12:32:32 2013 UTC (11 years, 1 month ago) by filip
File size: 7025 byte(s)
added possibility to use intended untranslated strings in navigation
1 <?php
2 // definition
3
4 class NCache
5 {
6 function __construct() { }
7
8 /**
9 * Factory.
10 *
11 * @param string $path where cache file store is located, relative to app path.
12 * @param integer $timeout in seconds
13 *
14 * @return NCache
15 */
16 function build($path, $timeout = 3600)
17 {
18 $path = __DIR__ . '/' . $path;
19
20 if (!is_dir($path))
21 return null;
22
23 if ($timeout < 60)
24 $timeout = 60;
25
26 $i = new self;
27 $i->_path = $path;
28 $i->_timeout = $timeout;
29
30 return $i;
31 }
32
33 /**
34 * Get value for $key.
35 *
36 * @param mixed $key
37 *
38 * @return mixed
39 */
40 function get($key = null)
41 {
42 if (is_null($key))
43 return false;
44
45 $filename = $this->_get_filename($key);
46
47 if ($this->_is_valid_file($filename, $this->_timeout)) {
48 return unserialize(file_get_contents($filename));
49 }
50
51 return null;
52 }
53
54 /**
55 * Save $value under $key.
56 *
57 * @param mixed $key
58 * @param mixed $value
59 */
60 function set($key, $value)
61 {
62 if (is_null($key))
63 return false;
64
65 $filename = $this->_get_filename($key);
66 file_put_contents($filename, serialize($value));
67
68 return true;
69 }
70
71 /**
72 * Get cache file from key.
73 *
74 * @param mixed $key
75 *
76 * @return string
77 */
78 private function _get_filename($key)
79 {
80 $key = hash('sha1', serialize($key));
81
82 return $this->_path . '/' . $key . '.cache';
83 }
84
85 /**
86 * Check that the cache file exists and has not expired.
87 *
88 * @param string $filename
89 *
90 * @return boolean
91 */
92 private function _is_valid_file($filename, $timeout)
93 {
94 if (!file_exists($filename)) {
95 //error_log(sprintf('Could not find %s', $filename), 0);
96 return false;
97 }
98
99 if (filemtime($filename) + $timeout < time()) {
100 //error_log(sprintf('%s timestamp expired (timeout was %ds.).', $filename, $timeout));
101 unlink($filename);
102 return false;
103 }
104
105 //error_log(sprintf('Found %s', $filename));
106 return true;
107 }
108 }
109
110 class l10n
111 {
112 public static $t;
113
114 /**
115 * Load langs/$lang.lang into global $_t array.
116 *
117 * @param string $lang
118 *
119 * @return void
120 */
121 function load($lang)
122 {
123 global $_t;
124 $_t = array();
125
126 if ($lang == 'en')
127 return;
128
129 $lang_file = __DIR__ . '/langs/' . $lang . '.lang';
130 $cache_file = __DIR__ . '/var/tmp/cache/nav_lang_' . $lang . '.php';
131 $lang_ts = filemtime($lang_file);
132
133 if (file_exists($cache_file)) {
134 include $cache_file;
135 if ($_ts > $lang_ts)
136 return;
137 }
138
139 if (file_exists($lang_file)) {
140
141 $f = file($lang_file);
142
143 foreach ($f as $k => $v) {
144
145 if (substr($v, 0, 1) == ';'
146 && !empty($f[$k+1]))
147 {
148 $_t[trim(substr($v, 1))] = trim($f[$k+1]);
149 }
150 }
151
152 //
153 $_t_data = var_export($_t, true);
154 $cache = <<<P
155 <?php
156 /**! Generated. Do not edit. */
157
158 // filemtime($lang_file)
159 \$_ts = $lang_ts;
160
161 // $lang strings
162 global \$_t;
163 \$_t = $_t_data;
164 P;
165 file_put_contents($cache_file, $cache);
166 }
167 }
168
169 /**
170 * Get value for key $s in global array $_t.
171 *
172 * @param string $s
173 *
174 * @return string
175 */
176 function _t($s) {
177 if (trim($s) == '')
178 return '';
179
180 global $_t;
181
182 $_t[$s] = trim(str_replace(array('{ok}', '{OK}', '{Ok}', '{oK}'), '', $_t[$s]));
183 return array_key_exists($s, $_t) ? $_t[$s] : $s;
184 }
185 }
186
187 /**
188 * Produce navigation HTML code.
189 *
190 * @param boolean $wrap = false should it be wrapped in a <header id="nav" /> element?
191 * @param string $lang = 'en'
192 * @param string $inject = null
193 * @param string $vhost = 'www.mageia.org'
194 * @param object $cache
195 *
196 * @return string HTML code
197 */
198 function _mgnav_html($wrap = false, $lang = 'en', $inject = null, $vhost = 'www.mageia.org', $cache = null)
199 {
200 $key = array($wrap, $lang, $inject, $vhost);
201
202 if (!is_null($cache) && ($h = $cache->get($key))) {
203 apache_note('navCacheHit', 1);
204 return $h;
205 }
206
207 apache_note('navCacheHit', 0);
208
209 $lang = _lang_check($lang);
210
211 l10n::load($lang, $cache);
212
213 $tn = array(
214 array('mageia', '//$S/$L/map/', 'Mageia', l10n::_t('Go to mageia.org site map.')),
215 array('about', '//$S/$L/about/', l10n::_t('About&nbsp;us'), l10n::_t('Learn more about Mageia.')),
216 array('downloads', '//$S/$L/downloads/', l10n::_t('Downloads'), l10n::_t('Download Mageia ISO and updates.')),
217 array('support', '//$S/$L/support/', l10n::_t('Support'), l10n::_t('Get support from Mageia community.')),
218 array('community', '//$S/$L/community/', l10n::_t('Community'), l10n::_t('')),
219 array('contribute', '//$S/$L/contribute/', l10n::_t('Contribute'), l10n::_t('You too can build Mageia with us!')),
220 array('you', '//identity.mageia.org/', l10n::_t('You'), l10n::_t('Your Mageia online account.')),
221 array('contact', '//$S/$L/contact/', l10n::_t('Contact'), l10n::_t('Contact Us'))
222 // <search>
223 );
224
225 $s = array();
226 foreach ($tn as $i) {
227 $s[] = sprintf('<li><a href="%s" class="%s" title="%s">%s</a></li>',
228 str_replace(
229 array('$L', '$S'),
230 array($lang, $vhost),
231 $i[1]
232 ),
233 $i[0],
234 $i[3],
235 $i[2]
236 );
237 }
238
239 if (!is_null($inject))
240 $s[] = sprintf('<li>%s</li>', $inject);
241
242 $s = implode($s);
243 $h = sprintf('<!--googleoff: all--><nav id="mgnav"><ul id="nav">%s</ul></nav><!--googleon: all-->', $s);
244
245 if ($wrap)
246 $h = sprintf('<header id="hmgn">%s</header>', $h);
247
248 if (!is_null($cache))
249 $cache->set($key, $h);
250
251 return $h;
252 }
253
254 /**
255 * Returns CSS definition ready to be inserted into a HTML document.
256 *
257 * @return string
258 */
259 function _mgnav_style()
260 {
261 return '<style>' . file_get_contents(__DIR__ . '/css/source.css') . '</style>';
262 }
263
264 /**
265 * Get the primary language subtag only.<p></p>
266 */
267 function _lang_check($s = null)
268 {
269 if (is_null($s)) {
270 return 'en';
271 }
272
273 $supported = array(
274 'cs',
275 'de',
276 'el', 'en', 'eo', 'es', 'et',
277 'fi', 'fr',
278 'id', 'it',
279 'lv',
280 'nb', 'nl',
281 'pl', 'pt', 'pt-br',
282 'ro', 'ru',
283 'sl',
284 'tr',
285 'uk',
286 'zh-cn', 'zh-tw'
287 );
288
289 if (in_array($s, $supported))
290 return $s;
291
292 $sub = explode('-', $s);
293 $sub = strtolower($sub[0]);
294
295 if (in_array($sub, $supported))
296 return $sub;
297
298 return 'en';
299 }

  ViewVC Help
Powered by ViewVC 1.1.30