Completed
Push — master ( 8b5a3c...b0cbd6 )
by cam
01:56
created
ecrire/public/cacher.php 2 patches
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -14,7 +14,7 @@  discard block
 block discarded – undo
14 14
 use Spip\Component\Hasher\Hash32;
15 15
 
16 16
 if (!defined('_ECRIRE_INC_VERSION')) {
17
-	return;
17
+    return;
18 18
 }
19 19
 
20 20
 /**
@@ -23,24 +23,24 @@  discard block
 block discarded – undo
23 23
  * @internal Temporary fonction until DI in SPIP
24 24
  */
25 25
 function cache_instance(): CacheInterface {
26
-	static $cache = null;
27
-	return $cache ??= new LimitedFilesystem('calcul', _DIR_CACHE);
26
+    static $cache = null;
27
+    return $cache ??= new LimitedFilesystem('calcul', _DIR_CACHE);
28 28
 }
29 29
 
30 30
 /**
31 31
  * Returns a key cache (id) for this data
32 32
  */
33 33
 function cache_key(array $contexte, array $page): string {
34
-	static $hasher = null;
35
-	$hasher ??= new Hash32();
36
-	return $hasher->hash([$contexte, $page]) . '.cache';
34
+    static $hasher = null;
35
+    $hasher ??= new Hash32();
36
+    return $hasher->hash([$contexte, $page]) . '.cache';
37 37
 }
38 38
 
39 39
 /**
40 40
  * Écrire le cache dans un casier
41 41
  */
42 42
 function ecrire_cache(string $cache_key, array $valeur): bool {
43
-	return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]);
43
+    return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]);
44 44
 }
45 45
 
46 46
 /**
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
  * @return null|mixed null: probably cache miss
50 50
  */
51 51
 function lire_cache(string $cache_key): mixed {
52
-	return cache_instance()->get($cache_key)['valeur'] ?? null;
52
+    return cache_instance()->get($cache_key)['valeur'] ?? null;
53 53
 }
54 54
 
55 55
 /**
@@ -58,16 +58,16 @@  discard block
 block discarded – undo
58 58
  * Parano : on signe le cache, afin d'interdire un hack d'injection dans notre memcache
59 59
  */
60 60
 function cache_signature(&$page): string {
61
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
62
-		include_spip('inc/acces');
63
-		ecrire_meta(
64
-			'cache_signature',
65
-			hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
66
-			'non'
67
-		);
68
-	}
69
-
70
-	return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']);
61
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
62
+        include_spip('inc/acces');
63
+        ecrire_meta(
64
+            'cache_signature',
65
+            hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
66
+            'non'
67
+        );
68
+    }
69
+
70
+    return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']);
71 71
 }
72 72
 
73 73
 /**
@@ -79,14 +79,14 @@  discard block
 block discarded – undo
79 79
  * on positionne un flag gz si on comprime, pour savoir si on doit decompresser ou pas
80 80
  */
81 81
 function gzip_page(array $page): array {
82
-	if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) {
83
-		$page['gz'] = true;
84
-		$page['texte'] = gzcompress((string) $page['texte']);
85
-	} else {
86
-		$page['gz'] = false;
87
-	}
88
-
89
-	return $page;
82
+    if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) {
83
+        $page['gz'] = true;
84
+        $page['texte'] = gzcompress((string) $page['texte']);
85
+    } else {
86
+        $page['gz'] = false;
87
+    }
88
+
89
+    return $page;
90 90
 }
91 91
 
92 92
 /**
@@ -97,10 +97,10 @@  discard block
 block discarded – undo
97 97
  * de decompresser deux fois de suite un cache (ce qui echoue)
98 98
  */
99 99
 function gunzip_page(array &$page): void {
100
-	if ($page['gz']) {
101
-		$page['texte'] = gzuncompress($page['texte']);
102
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
103
-	}
100
+    if ($page['gz']) {
101
+        $page['texte'] = gzuncompress($page['texte']);
102
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
103
+    }
104 104
 }
105 105
 
106 106
 /**
@@ -114,72 +114,72 @@  discard block
 block discarded – undo
114 114
  *  - -1 si il faut calculer sans stocker en cache
115 115
  */
116 116
 function cache_valide(array &$page, int $date): int {
117
-	$now = $_SERVER['REQUEST_TIME'];
118
-
119
-	// Apparition d'un nouvel article post-date ?
120
-	if (
121
-		isset($GLOBALS['meta']['post_dates'])
122
-		&& $GLOBALS['meta']['post_dates'] == 'non'
123
-		&& isset($GLOBALS['meta']['date_prochain_postdate'])
124
-		&& $now > $GLOBALS['meta']['date_prochain_postdate']
125
-	) {
126
-		spip_log('Un article post-date invalide le cache');
127
-		include_spip('inc/rubriques');
128
-		calculer_prochain_postdate(true);
129
-	}
130
-
131
-	if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
132
-		return -1;
133
-	}
134
-	if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
135
-		return -1;
136
-	}
137
-	if (defined('_NO_CACHE')) {
138
-		return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
139
-	}
140
-
141
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
142
-	if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
143
-		return _IS_BOT ? -1 : 1;
144
-	}
145
-
146
-	// controle de la signature
147
-	if ($page['sig'] !== cache_signature($page)) {
148
-		return _IS_BOT ? -1 : 1;
149
-	}
150
-
151
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
152
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
153
-	// Cache invalide par la meta 'derniere_modif'
154
-	// sauf pour les bots, qui utilisent toujours le cache
155
-	if (
156
-		(!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
157
-		&& (
158
-			!_IS_BOT
159
-			&& $GLOBALS['derniere_modif_invalide']
160
-			&& isset($GLOBALS['meta']['derniere_modif'])
161
-			&& $date < $GLOBALS['meta']['derniere_modif']
162
-		)
163
-	) {
164
-		return 1;
165
-	}
166
-
167
-	// Sinon comparer l'age du fichier a sa duree de cache
168
-	$duree = (int) $page['entetes']['X-Spip-Cache'];
169
-	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
170
-	if ($duree == 0) {  #CACHE{0}
171
-	return -1;
172
-	} // sauf pour les bots, qui utilisent toujours le cache
173
-	else {
174
-		if (
175
-			!_IS_BOT && $date + $duree < $now
176
-			|| $date < $cache_mark
177
-		) {
178
-			return _IS_BOT ? -1 : 1;
179
-		} else {
180
-			return 0;
181
-		}
182
-	}
117
+    $now = $_SERVER['REQUEST_TIME'];
118
+
119
+    // Apparition d'un nouvel article post-date ?
120
+    if (
121
+        isset($GLOBALS['meta']['post_dates'])
122
+        && $GLOBALS['meta']['post_dates'] == 'non'
123
+        && isset($GLOBALS['meta']['date_prochain_postdate'])
124
+        && $now > $GLOBALS['meta']['date_prochain_postdate']
125
+    ) {
126
+        spip_log('Un article post-date invalide le cache');
127
+        include_spip('inc/rubriques');
128
+        calculer_prochain_postdate(true);
129
+    }
130
+
131
+    if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
132
+        return -1;
133
+    }
134
+    if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
135
+        return -1;
136
+    }
137
+    if (defined('_NO_CACHE')) {
138
+        return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
139
+    }
140
+
141
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
142
+    if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
143
+        return _IS_BOT ? -1 : 1;
144
+    }
145
+
146
+    // controle de la signature
147
+    if ($page['sig'] !== cache_signature($page)) {
148
+        return _IS_BOT ? -1 : 1;
149
+    }
150
+
151
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
152
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
153
+    // Cache invalide par la meta 'derniere_modif'
154
+    // sauf pour les bots, qui utilisent toujours le cache
155
+    if (
156
+        (!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
157
+        && (
158
+            !_IS_BOT
159
+            && $GLOBALS['derniere_modif_invalide']
160
+            && isset($GLOBALS['meta']['derniere_modif'])
161
+            && $date < $GLOBALS['meta']['derniere_modif']
162
+        )
163
+    ) {
164
+        return 1;
165
+    }
166
+
167
+    // Sinon comparer l'age du fichier a sa duree de cache
168
+    $duree = (int) $page['entetes']['X-Spip-Cache'];
169
+    $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
170
+    if ($duree == 0) {  #CACHE{0}
171
+    return -1;
172
+    } // sauf pour les bots, qui utilisent toujours le cache
173
+    else {
174
+        if (
175
+            !_IS_BOT && $date + $duree < $now
176
+            || $date < $cache_mark
177
+        ) {
178
+            return _IS_BOT ? -1 : 1;
179
+        } else {
180
+            return 0;
181
+        }
182
+    }
183 183
 }
184 184
 
185 185
 /**
@@ -193,58 +193,58 @@  discard block
 block discarded – undo
193 193
  */
194 194
 function creer_cache(&$page, &$cache_key) {
195 195
 
196
-	// Ne rien faire si on est en preview, debug, ou si une erreur
197
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
198
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
199
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
200
-	if (
201
-		defined('_VAR_NOCACHE') && _VAR_NOCACHE
202
-		|| defined('spip_interdire_cache')
203
-	) {
204
-		return;
205
-	}
206
-
207
-	// Si la page a un invalideur de session, utiliser un cache_key spécifique
208
-	if (
209
-		isset($page['invalideurs'])
210
-		&& isset($page['invalideurs']['session'])
211
-	) {
212
-		// on verifie que le contenu du chemin cache indique seulement
213
-		// "cache sessionne" ; sa date indique la date de validite
214
-		// des caches sessionnes
215
-		if (!$tmp = lire_cache($cache_key)) {
216
-			spip_log('Creation cache sessionne ' . $cache_key);
217
-			$tmp = [
218
-				'invalideurs' => ['session' => ''],
219
-				'lastmodified' => $_SERVER['REQUEST_TIME']
220
-			];
221
-			ecrire_cache($cache_key, $tmp);
222
-		}
223
-		$cache_key = cache_key(
224
-			['cache_key' => $cache_key],
225
-			['session' => $page['invalideurs']['session']]
226
-		);
227
-	}
228
-
229
-	// ajouter la date de production dans le cache lui meme
230
-	// (qui contient deja sa duree de validite)
231
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
232
-
233
-	// compresser le contenu si besoin
234
-	$pagez = gzip_page($page);
235
-
236
-	// signer le contenu
237
-	$pagez['sig'] = cache_signature($pagez);
238
-
239
-	// l'enregistrer, compresse ou non...
240
-	$ok = ecrire_cache($cache_key, $pagez);
241
-
242
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour "
243
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
244
-
245
-	// Inserer ses invalideurs
246
-	include_spip('inc/invalideur');
247
-	maj_invalideurs($cache_key, $page);
196
+    // Ne rien faire si on est en preview, debug, ou si une erreur
197
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
198
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
199
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
200
+    if (
201
+        defined('_VAR_NOCACHE') && _VAR_NOCACHE
202
+        || defined('spip_interdire_cache')
203
+    ) {
204
+        return;
205
+    }
206
+
207
+    // Si la page a un invalideur de session, utiliser un cache_key spécifique
208
+    if (
209
+        isset($page['invalideurs'])
210
+        && isset($page['invalideurs']['session'])
211
+    ) {
212
+        // on verifie que le contenu du chemin cache indique seulement
213
+        // "cache sessionne" ; sa date indique la date de validite
214
+        // des caches sessionnes
215
+        if (!$tmp = lire_cache($cache_key)) {
216
+            spip_log('Creation cache sessionne ' . $cache_key);
217
+            $tmp = [
218
+                'invalideurs' => ['session' => ''],
219
+                'lastmodified' => $_SERVER['REQUEST_TIME']
220
+            ];
221
+            ecrire_cache($cache_key, $tmp);
222
+        }
223
+        $cache_key = cache_key(
224
+            ['cache_key' => $cache_key],
225
+            ['session' => $page['invalideurs']['session']]
226
+        );
227
+    }
228
+
229
+    // ajouter la date de production dans le cache lui meme
230
+    // (qui contient deja sa duree de validite)
231
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
232
+
233
+    // compresser le contenu si besoin
234
+    $pagez = gzip_page($page);
235
+
236
+    // signer le contenu
237
+    $pagez['sig'] = cache_signature($pagez);
238
+
239
+    // l'enregistrer, compresse ou non...
240
+    $ok = ecrire_cache($cache_key, $pagez);
241
+
242
+    spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour "
243
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
244
+
245
+    // Inserer ses invalideurs
246
+    include_spip('inc/invalideur');
247
+    maj_invalideurs($cache_key, $page);
248 248
 }
249 249
 
250 250
 /**
@@ -272,132 +272,132 @@  discard block
 block discarded – undo
272 272
  */
273 273
 function public_cacher_dist($contexte, &$use_cache, &$cache_key, &$page, &$lastmodified) {
274 274
 
275
-	# fonction de cache minimale : dire "non on ne met rien en cache"
276
-	# $use_cache = -1; return;
277
-
278
-	// Second appel, destine a l'enregistrement du cache sur le disque
279
-	if (isset($cache_key)) {
280
-		creer_cache($page, $cache_key);
281
-		return;
282
-	}
283
-
284
-	// Toute la suite correspond au premier appel
285
-	$contexte_implicite = $page['contexte_implicite'];
286
-
287
-	// Cas ignorant le cache car completement dynamique
288
-	if (
289
-		!empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
290
-		|| _request('connect')
291
-	) {
292
-		$use_cache = -1;
293
-		$lastmodified = 0;
294
-		$cache_key = '';
295
-		$page = [];
296
-
297
-		return;
298
-	}
299
-
300
-	// Controler l'existence d'un cache nous correspondant
301
-	$cache_key = cache_key($contexte, $page);
302
-	$lastmodified = 0;
303
-
304
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
305
-	if (!$page = lire_cache($cache_key)) {
306
-		$page = [];
307
-	}
308
-
309
-	// s'il est sessionne, charger celui correspondant a notre session
310
-	if (
311
-		isset($page['invalideurs'])
312
-		&& isset($page['invalideurs']['session'])
313
-	) {
314
-		$cache_key_session = cache_key(
315
-			['cache_key' => $cache_key],
316
-			['session' => spip_session()]
317
-		);
318
-		if (
319
-			($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified']
320
-		) {
321
-			$page = $page_session;
322
-		} else {
323
-			$page = [];
324
-		}
325
-	}
326
-
327
-
328
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
329
-	// ne le faire que si la base est disponible
330
-	$invalider = false;
331
-	if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
332
-		$invalider = true;
333
-	}
334
-
335
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
336
-	// on supprime le cache
337
-	if (
338
-		defined('_VAR_MODE')
339
-		&& _VAR_MODE
340
-		&& (
341
-			isset($_COOKIE['spip_session'])
342
-			|| isset($_COOKIE['spip_admin'])
343
-			|| @file_exists(_ACCESS_FILE_NAME)
344
-		)
345
-	) {
346
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
347
-		$invalider = true;
348
-	}
349
-	if ($invalider) {
350
-		include_spip('inc/invalideur');
351
-		retire_caches($cache_key); # API invalideur inutile
352
-		cache_instance()->delete($cache_key);
353
-		if (isset($cache_key_session) && $cache_key_session) {
354
-			cache_instance()->delete($cache_key_session);
355
-		}
356
-	}
357
-
358
-	// $delais par defaut
359
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
360
-	// qui sont a cache nul par defaut
361
-	if (!isset($GLOBALS['delais'])) {
362
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
363
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
364
-		}
365
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
366
-	}
367
-
368
-	// determiner la validite de la page
369
-	if ($page) {
370
-		$use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
371
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
372
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
373
-		$page['contexte_implicite'] = $contexte_implicite;
374
-		if (!$use_cache) {
375
-			// $page est un cache utilisable
376
-			gunzip_page($page);
377
-
378
-			return;
379
-		}
380
-	} else {
381
-		$page = ['contexte_implicite' => $contexte_implicite];
382
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
383
-	}
384
-
385
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
386
-	if (!spip_connect()) {
387
-		if (isset($page['texte'])) {
388
-			gunzip_page($page);
389
-			$use_cache = 0;
390
-		} else {
391
-			spip_log("Erreur base de donnees, impossible utiliser $cache_key");
392
-			include_spip('inc/minipres');
393
-
394
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
395
-		}
396
-	}
397
-
398
-	if ($use_cache < 0) {
399
-		$cache_key = '';
400
-	}
401
-
402
-	return;
275
+    # fonction de cache minimale : dire "non on ne met rien en cache"
276
+    # $use_cache = -1; return;
277
+
278
+    // Second appel, destine a l'enregistrement du cache sur le disque
279
+    if (isset($cache_key)) {
280
+        creer_cache($page, $cache_key);
281
+        return;
282
+    }
283
+
284
+    // Toute la suite correspond au premier appel
285
+    $contexte_implicite = $page['contexte_implicite'];
286
+
287
+    // Cas ignorant le cache car completement dynamique
288
+    if (
289
+        !empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
290
+        || _request('connect')
291
+    ) {
292
+        $use_cache = -1;
293
+        $lastmodified = 0;
294
+        $cache_key = '';
295
+        $page = [];
296
+
297
+        return;
298
+    }
299
+
300
+    // Controler l'existence d'un cache nous correspondant
301
+    $cache_key = cache_key($contexte, $page);
302
+    $lastmodified = 0;
303
+
304
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
305
+    if (!$page = lire_cache($cache_key)) {
306
+        $page = [];
307
+    }
308
+
309
+    // s'il est sessionne, charger celui correspondant a notre session
310
+    if (
311
+        isset($page['invalideurs'])
312
+        && isset($page['invalideurs']['session'])
313
+    ) {
314
+        $cache_key_session = cache_key(
315
+            ['cache_key' => $cache_key],
316
+            ['session' => spip_session()]
317
+        );
318
+        if (
319
+            ($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified']
320
+        ) {
321
+            $page = $page_session;
322
+        } else {
323
+            $page = [];
324
+        }
325
+    }
326
+
327
+
328
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
329
+    // ne le faire que si la base est disponible
330
+    $invalider = false;
331
+    if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
332
+        $invalider = true;
333
+    }
334
+
335
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
336
+    // on supprime le cache
337
+    if (
338
+        defined('_VAR_MODE')
339
+        && _VAR_MODE
340
+        && (
341
+            isset($_COOKIE['spip_session'])
342
+            || isset($_COOKIE['spip_admin'])
343
+            || @file_exists(_ACCESS_FILE_NAME)
344
+        )
345
+    ) {
346
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
347
+        $invalider = true;
348
+    }
349
+    if ($invalider) {
350
+        include_spip('inc/invalideur');
351
+        retire_caches($cache_key); # API invalideur inutile
352
+        cache_instance()->delete($cache_key);
353
+        if (isset($cache_key_session) && $cache_key_session) {
354
+            cache_instance()->delete($cache_key_session);
355
+        }
356
+    }
357
+
358
+    // $delais par defaut
359
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
360
+    // qui sont a cache nul par defaut
361
+    if (!isset($GLOBALS['delais'])) {
362
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
363
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
364
+        }
365
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
366
+    }
367
+
368
+    // determiner la validite de la page
369
+    if ($page) {
370
+        $use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
371
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
372
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
373
+        $page['contexte_implicite'] = $contexte_implicite;
374
+        if (!$use_cache) {
375
+            // $page est un cache utilisable
376
+            gunzip_page($page);
377
+
378
+            return;
379
+        }
380
+    } else {
381
+        $page = ['contexte_implicite' => $contexte_implicite];
382
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
383
+    }
384
+
385
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
386
+    if (!spip_connect()) {
387
+        if (isset($page['texte'])) {
388
+            gunzip_page($page);
389
+            $use_cache = 0;
390
+        } else {
391
+            spip_log("Erreur base de donnees, impossible utiliser $cache_key");
392
+            include_spip('inc/minipres');
393
+
394
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
395
+        }
396
+    }
397
+
398
+    if ($use_cache < 0) {
399
+        $cache_key = '';
400
+    }
401
+
402
+    return;
403 403
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -33,7 +33,7 @@  discard block
 block discarded – undo
33 33
 function cache_key(array $contexte, array $page): string {
34 34
 	static $hasher = null;
35 35
 	$hasher ??= new Hash32();
36
-	return $hasher->hash([$contexte, $page]) . '.cache';
36
+	return $hasher->hash([$contexte, $page]).'.cache';
37 37
 }
38 38
 
39 39
 /**
@@ -62,12 +62,12 @@  discard block
 block discarded – undo
62 62
 		include_spip('inc/acces');
63 63
 		ecrire_meta(
64 64
 			'cache_signature',
65
-			hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
65
+			hash('sha256', $_SERVER['DOCUMENT_ROOT'].($_SERVER['SERVER_SIGNATURE'] ?? '').creer_uniqid()),
66 66
 			'non'
67 67
 		);
68 68
 	}
69 69
 
70
-	return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']);
70
+	return (new Hash32())->hash($GLOBALS['meta']['cache_signature'].$page['texte']);
71 71
 }
72 72
 
73 73
 /**
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
 		// "cache sessionne" ; sa date indique la date de validite
214 214
 		// des caches sessionnes
215 215
 		if (!$tmp = lire_cache($cache_key)) {
216
-			spip_log('Creation cache sessionne ' . $cache_key);
216
+			spip_log('Creation cache sessionne '.$cache_key);
217 217
 			$tmp = [
218 218
 				'invalideurs' => ['session' => ''],
219 219
 				'lastmodified' => $_SERVER['REQUEST_TIME']
@@ -239,8 +239,8 @@  discard block
 block discarded – undo
239 239
 	// l'enregistrer, compresse ou non...
240 240
 	$ok = ecrire_cache($cache_key, $pagez);
241 241
 
242
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour "
243
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
242
+	spip_log((_IS_BOT ? 'Bot:' : '')."Creation du cache $cache_key pour "
243
+		. $page['entetes']['X-Spip-Cache'].' secondes'.($ok ? '' : ' (erreur!)'), _LOG_INFO);
244 244
 
245 245
 	// Inserer ses invalideurs
246 246
 	include_spip('inc/invalideur');
Please login to merge, or discard this patch.
ecrire/lang/spip_en.php 1 patch
Indentation   +672 added lines, -672 removed lines patch added patch discarded remove patch
@@ -5,243 +5,243 @@  discard block
 block discarded – undo
5 5
 
6 6
 return [
7 7
 
8
-	// A
9
-	'access_interface_graphique' => 'Back to the full graphic interface',
10
-	'access_mode_texte' => 'Show the simplified text interface',
11
-	'admin_debug' => 'debug',
12
-	'admin_modifier_article' => 'Modify this article',
13
-	'admin_modifier_auteur' => 'Modify this author',
14
-	'admin_modifier_breve' => 'Modify this news item',
15
-	'admin_modifier_mot' => 'Modify this keyword',
16
-	'admin_modifier_rubrique' => 'Modify this section',
17
-	'admin_recalculer' => 'Re-process this page',
18
-	'afficher_calendrier' => 'Show the calendar',
19
-	'afficher_trad' => 'show translations',
20
-	'alerte_maj_impossible' => '<b>Warning!</b> Failed to update the SQL database to version @version@. This may be due to a permissions problem on the database. Please contact your ISP.',
21
-	'alerte_modif_info_concourante' => 'WARNING: This information has been modified elsewhere. The current value is :',
22
-	'analyse_xml' => 'XML parsing',
23
-	'annuler' => 'Cancel',
24
-	'antispam_champ_vide' => 'Please leave this field empty:',
25
-	'articles_recents' => 'Most recent articles',
26
-	'attention_champ_mini_nb_caractères' => 'Warning! At least @nb@ characters',
27
-	'avis_1_erreur_saisie' => 'Your entry contains an error, please check your information.',
28
-	'avis_archive_incorrect' => 'archive is not a valid SPIP file',
29
-	'avis_archive_invalide' => 'archive file is not valid',
30
-	'avis_attention' => 'CAUTION!',
31
-	'avis_champ_incorrect_type_objet' => 'Invalid field name @name@ for object of type @type@',
32
-	'avis_colonne_inexistante' => 'Column @col@ does not exist',
33
-	'avis_erreur' => 'Error: see below',
34
-	'avis_erreur_connexion' => 'Connection error',
35
-	'avis_erreur_cookie' => 'cookie problem',
36
-	'avis_erreur_fonction_contexte' => 'Programming error. This function cannot be called in this context.',
37
-	'avis_erreur_mysql' => 'SQL error',
38
-	'avis_erreur_sauvegarde' => 'Error in backup (@type@ @id_objet@)!',
39
-	'avis_erreur_visiteur' => 'Problem entering the back-office',
40
-	'avis_nb_erreurs_saisie' => 'Your entry contains @nb@ errors, please check your information.',
8
+    // A
9
+    'access_interface_graphique' => 'Back to the full graphic interface',
10
+    'access_mode_texte' => 'Show the simplified text interface',
11
+    'admin_debug' => 'debug',
12
+    'admin_modifier_article' => 'Modify this article',
13
+    'admin_modifier_auteur' => 'Modify this author',
14
+    'admin_modifier_breve' => 'Modify this news item',
15
+    'admin_modifier_mot' => 'Modify this keyword',
16
+    'admin_modifier_rubrique' => 'Modify this section',
17
+    'admin_recalculer' => 'Re-process this page',
18
+    'afficher_calendrier' => 'Show the calendar',
19
+    'afficher_trad' => 'show translations',
20
+    'alerte_maj_impossible' => '<b>Warning!</b> Failed to update the SQL database to version @version@. This may be due to a permissions problem on the database. Please contact your ISP.',
21
+    'alerte_modif_info_concourante' => 'WARNING: This information has been modified elsewhere. The current value is :',
22
+    'analyse_xml' => 'XML parsing',
23
+    'annuler' => 'Cancel',
24
+    'antispam_champ_vide' => 'Please leave this field empty:',
25
+    'articles_recents' => 'Most recent articles',
26
+    'attention_champ_mini_nb_caractères' => 'Warning! At least @nb@ characters',
27
+    'avis_1_erreur_saisie' => 'Your entry contains an error, please check your information.',
28
+    'avis_archive_incorrect' => 'archive is not a valid SPIP file',
29
+    'avis_archive_invalide' => 'archive file is not valid',
30
+    'avis_attention' => 'CAUTION!',
31
+    'avis_champ_incorrect_type_objet' => 'Invalid field name @name@ for object of type @type@',
32
+    'avis_colonne_inexistante' => 'Column @col@ does not exist',
33
+    'avis_erreur' => 'Error: see below',
34
+    'avis_erreur_connexion' => 'Connection error',
35
+    'avis_erreur_cookie' => 'cookie problem',
36
+    'avis_erreur_fonction_contexte' => 'Programming error. This function cannot be called in this context.',
37
+    'avis_erreur_mysql' => 'SQL error',
38
+    'avis_erreur_sauvegarde' => 'Error in backup (@type@ @id_objet@)!',
39
+    'avis_erreur_visiteur' => 'Problem entering the back-office',
40
+    'avis_nb_erreurs_saisie' => 'Your entry contains @nb@ errors, please check your information.',
41 41
 
42
-	// B
43
-	'barre_a_accent_grave' => 'Insert a capital A with grave accent',
44
-	'barre_aide' => 'Use the typographic short cuts to refine your layout',
45
-	'barre_e_accent_aigu' => 'Insert a capital E with acute accent',
46
-	'barre_eo' => 'Insert an oe-ligature',
47
-	'barre_eo_maj' => 'Insert a capital EO-ligature',
48
-	'barre_euro' => 'Insert a € symbol',
49
-	'barre_gras' => 'Put in {{bold type}}',
50
-	'barre_guillemets' => 'Place between "double quotes"',
51
-	'barre_guillemets_simples' => 'Place between ‘single quotes’',
52
-	'barre_intertitre' => 'Turn into a {{{subheading}}}',
53
-	'barre_italic' => 'Put in {italics}',
54
-	'barre_lien' => 'Turn into a [hyperlink->http://...]',
55
-	'barre_lien_input' => 'Please enter the link address. You may use either an external URL (http://www.mysite.com) or reference another article on this site by simplying entering its number.',
56
-	'barre_note' => 'Turn into a [[Footnote]]',
57
-	'barre_paragraphe' => 'Create a paragraph',
58
-	'barre_quote' => '<quote>Quote a message</quote>',
59
-	'bouton_changer' => 'Change',
60
-	'bouton_chercher' => 'Search',
61
-	'bouton_choisir' => 'Select',
62
-	'bouton_deplacer' => 'Move',
63
-	'bouton_download' => 'Download',
64
-	'bouton_enregistrer' => 'Save',
65
-	'bouton_radio_desactiver_messagerie_interne' => 'Disable internal messaging',
66
-	'bouton_radio_envoi_annonces' => 'Send editorial announcements',
67
-	'bouton_radio_non_envoi_annonces' => 'Do not send any announcements',
68
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Do not send latest news list',
69
-	'bouton_recharger_page' => 'reload this page',
70
-	'bouton_telecharger' => 'Upload',
71
-	'bouton_upload' => 'Upload',
72
-	'bouton_valider' => 'Submit',
42
+    // B
43
+    'barre_a_accent_grave' => 'Insert a capital A with grave accent',
44
+    'barre_aide' => 'Use the typographic short cuts to refine your layout',
45
+    'barre_e_accent_aigu' => 'Insert a capital E with acute accent',
46
+    'barre_eo' => 'Insert an oe-ligature',
47
+    'barre_eo_maj' => 'Insert a capital EO-ligature',
48
+    'barre_euro' => 'Insert a € symbol',
49
+    'barre_gras' => 'Put in {{bold type}}',
50
+    'barre_guillemets' => 'Place between "double quotes"',
51
+    'barre_guillemets_simples' => 'Place between ‘single quotes’',
52
+    'barre_intertitre' => 'Turn into a {{{subheading}}}',
53
+    'barre_italic' => 'Put in {italics}',
54
+    'barre_lien' => 'Turn into a [hyperlink->http://...]',
55
+    'barre_lien_input' => 'Please enter the link address. You may use either an external URL (http://www.mysite.com) or reference another article on this site by simplying entering its number.',
56
+    'barre_note' => 'Turn into a [[Footnote]]',
57
+    'barre_paragraphe' => 'Create a paragraph',
58
+    'barre_quote' => '<quote>Quote a message</quote>',
59
+    'bouton_changer' => 'Change',
60
+    'bouton_chercher' => 'Search',
61
+    'bouton_choisir' => 'Select',
62
+    'bouton_deplacer' => 'Move',
63
+    'bouton_download' => 'Download',
64
+    'bouton_enregistrer' => 'Save',
65
+    'bouton_radio_desactiver_messagerie_interne' => 'Disable internal messaging',
66
+    'bouton_radio_envoi_annonces' => 'Send editorial announcements',
67
+    'bouton_radio_non_envoi_annonces' => 'Do not send any announcements',
68
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Do not send latest news list',
69
+    'bouton_recharger_page' => 'reload this page',
70
+    'bouton_telecharger' => 'Upload',
71
+    'bouton_upload' => 'Upload',
72
+    'bouton_valider' => 'Submit',
73 73
 
74
-	// C
75
-	'cal_apresmidi' => 'afternoon (p.m.)',
76
-	'cal_jour_entier' => 'entire day',
77
-	'cal_matin' => 'morning (a.m.)',
78
-	'cal_par_jour' => 'daily calendar',
79
-	'cal_par_mois' => 'monthly calendar',
80
-	'cal_par_semaine' => 'weekly calendar',
81
-	'choix_couleur_interface' => 'colour',
82
-	'choix_interface' => 'choice of interface',
83
-	'colonne' => 'Column',
84
-	'confirm_changer_statut' => 'Warning: You are about to change this article’s status. Do you wish to continue?',
85
-	'correcte' => 'correct',
74
+    // C
75
+    'cal_apresmidi' => 'afternoon (p.m.)',
76
+    'cal_jour_entier' => 'entire day',
77
+    'cal_matin' => 'morning (a.m.)',
78
+    'cal_par_jour' => 'daily calendar',
79
+    'cal_par_mois' => 'monthly calendar',
80
+    'cal_par_semaine' => 'weekly calendar',
81
+    'choix_couleur_interface' => 'colour',
82
+    'choix_interface' => 'choice of interface',
83
+    'colonne' => 'Column',
84
+    'confirm_changer_statut' => 'Warning: You are about to change this article’s status. Do you wish to continue?',
85
+    'correcte' => 'correct',
86 86
 
87
-	// D
88
-	'date_aujourdhui' => 'today',
89
-	'date_avant_jc' => 'B.C.',
90
-	'date_dans' => 'in @delai@',
91
-	'date_de_mois_1' => '@j@ @nommois@',
92
-	'date_de_mois_10' => '@j@ @nommois@',
93
-	'date_de_mois_11' => '@j@ @nommois@',
94
-	'date_de_mois_12' => '@j@ @nommois@',
95
-	'date_de_mois_2' => '@j@ @nommois@',
96
-	'date_de_mois_3' => '@j@ @nommois@',
97
-	'date_de_mois_4' => '@j@ @nommois@',
98
-	'date_de_mois_5' => '@j@ @nommois@',
99
-	'date_de_mois_6' => '@j@ @nommois@',
100
-	'date_de_mois_7' => '@j@ @nommois@',
101
-	'date_de_mois_8' => '@j@ @nommois@',
102
-	'date_de_mois_9' => '@j@ @nommois@',
103
-	'date_demain' => 'tomorrow',
104
-	'date_fmt_heures_minutes' => '@h@:@m@',
105
-	'date_fmt_heures_minutes_court' => '@h@:@m@',
106
-	'date_fmt_jour' => '@nomjour@ @jour@',
107
-	'date_fmt_jour_heure' => '@jour@ at @heure@',
108
-	'date_fmt_jour_heure_debut_fin' => '@jour@ from @heure_debut@ to @heure_fin@',
109
-	'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ from @heure_debut@@dtabbr@ to @dtend@@heure_fin@@dtabbr@',
110
-	'date_fmt_jour_mois' => '@jourmois@',
111
-	'date_fmt_jour_mois_annee' => '@jourmois@ @annee@',
112
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
113
-	'date_fmt_nomjour' => '@nomjour@ @date@',
114
-	'date_fmt_nomjour_date' => 'on @nomjour@ @date@',
115
-	'date_fmt_periode' => 'From @date_debut@ to @date_fin@',
116
-	'date_fmt_periode_abbr' => 'From @dtart@@date_debut@@dtabbr@ to @dtend@@date_fin@@dtabbr@',
117
-	'date_fmt_periode_from' => 'From',
118
-	'date_fmt_periode_to' => 'to',
119
-	'date_fmt_saison_annee' => '@saison@ @annee@',
120
-	'date_heures' => 'hours',
121
-	'date_hier' => 'yesterday',
122
-	'date_il_y_a' => '@delai@ ago',
123
-	'date_jnum1' => '1',
124
-	'date_jnum10' => '10',
125
-	'date_jnum11' => '11',
126
-	'date_jnum12' => '12',
127
-	'date_jnum13' => '13',
128
-	'date_jnum14' => '14',
129
-	'date_jnum15' => '15',
130
-	'date_jnum16' => '16',
131
-	'date_jnum17' => '17',
132
-	'date_jnum18' => '18',
133
-	'date_jnum19' => '19',
134
-	'date_jnum2' => '2',
135
-	'date_jnum20' => '20',
136
-	'date_jnum21' => '21',
137
-	'date_jnum22' => '22',
138
-	'date_jnum23' => '23',
139
-	'date_jnum24' => '24',
140
-	'date_jnum25' => '25',
141
-	'date_jnum26' => '26',
142
-	'date_jnum27' => '27',
143
-	'date_jnum28' => '28',
144
-	'date_jnum29' => '29',
145
-	'date_jnum3' => '3',
146
-	'date_jnum30' => '30',
147
-	'date_jnum31' => '31',
148
-	'date_jnum4' => '4',
149
-	'date_jnum5' => '5',
150
-	'date_jnum6' => '6',
151
-	'date_jnum7' => '7',
152
-	'date_jnum8' => '8',
153
-	'date_jnum9' => '9',
154
-	'date_jour_1' => 'Sunday',
155
-	'date_jour_1_abbr' => 'Sun.',
156
-	'date_jour_1_initiale' => 'S.',
157
-	'date_jour_2' => 'Monday',
158
-	'date_jour_2_abbr' => 'Mon.',
159
-	'date_jour_2_initiale' => 'M.',
160
-	'date_jour_3' => 'Tuesday',
161
-	'date_jour_3_abbr' => 'Tue.',
162
-	'date_jour_3_initiale' => 'T.',
163
-	'date_jour_4' => 'Wednesday',
164
-	'date_jour_4_abbr' => 'Wed.',
165
-	'date_jour_4_initiale' => 'W.',
166
-	'date_jour_5' => 'Thursday',
167
-	'date_jour_5_abbr' => 'Thu.',
168
-	'date_jour_5_initiale' => 'T.',
169
-	'date_jour_6' => 'Friday',
170
-	'date_jour_6_abbr' => 'Fri.',
171
-	'date_jour_6_initiale' => 'F.',
172
-	'date_jour_7' => 'Saturday',
173
-	'date_jour_7_abbr' => 'Sat.',
174
-	'date_jour_7_initiale' => 'S.',
175
-	'date_jours' => 'days',
176
-	'date_minutes' => 'minutes',
177
-	'date_mois' => 'months',
178
-	'date_mois_1' => 'January',
179
-	'date_mois_10' => 'October',
180
-	'date_mois_10_abbr' => 'Oct',
181
-	'date_mois_11' => 'November',
182
-	'date_mois_11_abbr' => 'Nov',
183
-	'date_mois_12' => 'December',
184
-	'date_mois_12_abbr' => 'Dec',
185
-	'date_mois_1_abbr' => 'Jan',
186
-	'date_mois_2' => 'February',
187
-	'date_mois_2_abbr' => 'Feb',
188
-	'date_mois_3' => 'March',
189
-	'date_mois_3_abbr' => 'Mar',
190
-	'date_mois_4' => 'April',
191
-	'date_mois_4_abbr' => 'Apr',
192
-	'date_mois_5' => 'May',
193
-	'date_mois_5_abbr' => 'May',
194
-	'date_mois_6' => 'June',
195
-	'date_mois_6_abbr' => 'Jun',
196
-	'date_mois_7' => 'July',
197
-	'date_mois_7_abbr' => 'Jul',
198
-	'date_mois_8' => 'August',
199
-	'date_mois_8_abbr' => 'Aug',
200
-	'date_mois_9' => 'September',
201
-	'date_mois_9_abbr' => 'Sep',
202
-	'date_saison_1' => 'winter',
203
-	'date_saison_2' => 'spring',
204
-	'date_saison_3' => 'summer',
205
-	'date_saison_4' => 'autumn',
206
-	'date_secondes' => 'seconds',
207
-	'date_semaines' => 'weeks',
208
-	'date_un_mois' => 'month',
209
-	'date_une_heure' => 'hour',
210
-	'date_une_minute' => 'minute',
211
-	'date_une_seconde' => 'second',
212
-	'date_une_semaine' => 'week',
213
-	'dirs_commencer' => ' in order to start installation for real',
214
-	'dirs_preliminaire' => 'Preliminary: <b>Setting up access permissions</b>',
215
-	'dirs_probleme_droits' => 'Problem with access permissions',
216
-	'dirs_repertoires_absents' => '<p><b>The following directories were not found: </b></p><ul>@bad_dirs@.</ul>
87
+    // D
88
+    'date_aujourdhui' => 'today',
89
+    'date_avant_jc' => 'B.C.',
90
+    'date_dans' => 'in @delai@',
91
+    'date_de_mois_1' => '@j@ @nommois@',
92
+    'date_de_mois_10' => '@j@ @nommois@',
93
+    'date_de_mois_11' => '@j@ @nommois@',
94
+    'date_de_mois_12' => '@j@ @nommois@',
95
+    'date_de_mois_2' => '@j@ @nommois@',
96
+    'date_de_mois_3' => '@j@ @nommois@',
97
+    'date_de_mois_4' => '@j@ @nommois@',
98
+    'date_de_mois_5' => '@j@ @nommois@',
99
+    'date_de_mois_6' => '@j@ @nommois@',
100
+    'date_de_mois_7' => '@j@ @nommois@',
101
+    'date_de_mois_8' => '@j@ @nommois@',
102
+    'date_de_mois_9' => '@j@ @nommois@',
103
+    'date_demain' => 'tomorrow',
104
+    'date_fmt_heures_minutes' => '@h@:@m@',
105
+    'date_fmt_heures_minutes_court' => '@h@:@m@',
106
+    'date_fmt_jour' => '@nomjour@ @jour@',
107
+    'date_fmt_jour_heure' => '@jour@ at @heure@',
108
+    'date_fmt_jour_heure_debut_fin' => '@jour@ from @heure_debut@ to @heure_fin@',
109
+    'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ from @heure_debut@@dtabbr@ to @dtend@@heure_fin@@dtabbr@',
110
+    'date_fmt_jour_mois' => '@jourmois@',
111
+    'date_fmt_jour_mois_annee' => '@jourmois@ @annee@',
112
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
113
+    'date_fmt_nomjour' => '@nomjour@ @date@',
114
+    'date_fmt_nomjour_date' => 'on @nomjour@ @date@',
115
+    'date_fmt_periode' => 'From @date_debut@ to @date_fin@',
116
+    'date_fmt_periode_abbr' => 'From @dtart@@date_debut@@dtabbr@ to @dtend@@date_fin@@dtabbr@',
117
+    'date_fmt_periode_from' => 'From',
118
+    'date_fmt_periode_to' => 'to',
119
+    'date_fmt_saison_annee' => '@saison@ @annee@',
120
+    'date_heures' => 'hours',
121
+    'date_hier' => 'yesterday',
122
+    'date_il_y_a' => '@delai@ ago',
123
+    'date_jnum1' => '1',
124
+    'date_jnum10' => '10',
125
+    'date_jnum11' => '11',
126
+    'date_jnum12' => '12',
127
+    'date_jnum13' => '13',
128
+    'date_jnum14' => '14',
129
+    'date_jnum15' => '15',
130
+    'date_jnum16' => '16',
131
+    'date_jnum17' => '17',
132
+    'date_jnum18' => '18',
133
+    'date_jnum19' => '19',
134
+    'date_jnum2' => '2',
135
+    'date_jnum20' => '20',
136
+    'date_jnum21' => '21',
137
+    'date_jnum22' => '22',
138
+    'date_jnum23' => '23',
139
+    'date_jnum24' => '24',
140
+    'date_jnum25' => '25',
141
+    'date_jnum26' => '26',
142
+    'date_jnum27' => '27',
143
+    'date_jnum28' => '28',
144
+    'date_jnum29' => '29',
145
+    'date_jnum3' => '3',
146
+    'date_jnum30' => '30',
147
+    'date_jnum31' => '31',
148
+    'date_jnum4' => '4',
149
+    'date_jnum5' => '5',
150
+    'date_jnum6' => '6',
151
+    'date_jnum7' => '7',
152
+    'date_jnum8' => '8',
153
+    'date_jnum9' => '9',
154
+    'date_jour_1' => 'Sunday',
155
+    'date_jour_1_abbr' => 'Sun.',
156
+    'date_jour_1_initiale' => 'S.',
157
+    'date_jour_2' => 'Monday',
158
+    'date_jour_2_abbr' => 'Mon.',
159
+    'date_jour_2_initiale' => 'M.',
160
+    'date_jour_3' => 'Tuesday',
161
+    'date_jour_3_abbr' => 'Tue.',
162
+    'date_jour_3_initiale' => 'T.',
163
+    'date_jour_4' => 'Wednesday',
164
+    'date_jour_4_abbr' => 'Wed.',
165
+    'date_jour_4_initiale' => 'W.',
166
+    'date_jour_5' => 'Thursday',
167
+    'date_jour_5_abbr' => 'Thu.',
168
+    'date_jour_5_initiale' => 'T.',
169
+    'date_jour_6' => 'Friday',
170
+    'date_jour_6_abbr' => 'Fri.',
171
+    'date_jour_6_initiale' => 'F.',
172
+    'date_jour_7' => 'Saturday',
173
+    'date_jour_7_abbr' => 'Sat.',
174
+    'date_jour_7_initiale' => 'S.',
175
+    'date_jours' => 'days',
176
+    'date_minutes' => 'minutes',
177
+    'date_mois' => 'months',
178
+    'date_mois_1' => 'January',
179
+    'date_mois_10' => 'October',
180
+    'date_mois_10_abbr' => 'Oct',
181
+    'date_mois_11' => 'November',
182
+    'date_mois_11_abbr' => 'Nov',
183
+    'date_mois_12' => 'December',
184
+    'date_mois_12_abbr' => 'Dec',
185
+    'date_mois_1_abbr' => 'Jan',
186
+    'date_mois_2' => 'February',
187
+    'date_mois_2_abbr' => 'Feb',
188
+    'date_mois_3' => 'March',
189
+    'date_mois_3_abbr' => 'Mar',
190
+    'date_mois_4' => 'April',
191
+    'date_mois_4_abbr' => 'Apr',
192
+    'date_mois_5' => 'May',
193
+    'date_mois_5_abbr' => 'May',
194
+    'date_mois_6' => 'June',
195
+    'date_mois_6_abbr' => 'Jun',
196
+    'date_mois_7' => 'July',
197
+    'date_mois_7_abbr' => 'Jul',
198
+    'date_mois_8' => 'August',
199
+    'date_mois_8_abbr' => 'Aug',
200
+    'date_mois_9' => 'September',
201
+    'date_mois_9_abbr' => 'Sep',
202
+    'date_saison_1' => 'winter',
203
+    'date_saison_2' => 'spring',
204
+    'date_saison_3' => 'summer',
205
+    'date_saison_4' => 'autumn',
206
+    'date_secondes' => 'seconds',
207
+    'date_semaines' => 'weeks',
208
+    'date_un_mois' => 'month',
209
+    'date_une_heure' => 'hour',
210
+    'date_une_minute' => 'minute',
211
+    'date_une_seconde' => 'second',
212
+    'date_une_semaine' => 'week',
213
+    'dirs_commencer' => ' in order to start installation for real',
214
+    'dirs_preliminaire' => 'Preliminary: <b>Setting up access permissions</b>',
215
+    'dirs_probleme_droits' => 'Problem with access permissions',
216
+    'dirs_repertoires_absents' => '<p><b>The following directories were not found: </b></p><ul>@bad_dirs@.</ul>
217 217
   <p>It is possible that this is due to inappropriate lower or upper case letters in directory names.
218 218
   Please check that the case of the letters in the names of these directories match what is displayed
219 219
   above. If they don’t, correct the directory names using your FTP client.</p>
220 220
   <p>Once this is done, you can',
221
-	'dirs_repertoires_suivants' => '<p><b>The following directories do not have write permission: </b></p><ul>@bad_dirs@</ul>
221
+    'dirs_repertoires_suivants' => '<p><b>The following directories do not have write permission: </b></p><ul>@bad_dirs@</ul>
222 222
 <p>To change this, use your FTP client to set access permissions for each
223 223
  of these directories. The procedure is detailed in the installation guide.</p>
224 224
   <p>Once you have done this, you can ',
225
-	'double_occurrence' => 'Two instances of @balise@',
225
+    'double_occurrence' => 'Two instances of @balise@',
226 226
 
227
-	// E
228
-	'en_cours' => 'processing',
229
-	'envoi_via_le_site' => 'Sent via the site',
230
-	'erreur' => 'Error',
231
-	'erreur_balise_non_fermee' => 'last tag not closed:',
232
-	'erreur_technique_ajaxform' => 'Ooops. An unexpected error prevented to submit the form. You can try again.',
233
-	'erreur_technique_enregistrement_champs' => 'A technical error prevented the right registration of the field @champs@.',
234
-	'erreur_technique_enregistrement_impossible' => 'A technical error prevented the registration.',
235
-	'erreur_texte' => 'error(s)',
236
-	'etape' => 'Step',
227
+    // E
228
+    'en_cours' => 'processing',
229
+    'envoi_via_le_site' => 'Sent via the site',
230
+    'erreur' => 'Error',
231
+    'erreur_balise_non_fermee' => 'last tag not closed:',
232
+    'erreur_technique_ajaxform' => 'Ooops. An unexpected error prevented to submit the form. You can try again.',
233
+    'erreur_technique_enregistrement_champs' => 'A technical error prevented the right registration of the field @champs@.',
234
+    'erreur_technique_enregistrement_impossible' => 'A technical error prevented the registration.',
235
+    'erreur_texte' => 'error(s)',
236
+    'etape' => 'Step',
237 237
 
238
-	// F
239
-	'fichier_introuvable' => 'File not found: @fichier@',
240
-	'fonction_introuvable' => 'Function @fonction@() not found.',
241
-	'form_auteur_confirmation' => 'Please confirm your email address',
242
-	'form_auteur_email_modifie' => 'Your email address has been changed.',
243
-	'form_auteur_envoi_mail_confirmation' => 'A confirmation email has been sent to @email@. You must visit the URL mentioned in the message to validate your email address.',
244
-	'form_auteur_mail_confirmation' => 'Hello,
238
+    // F
239
+    'fichier_introuvable' => 'File not found: @fichier@',
240
+    'fonction_introuvable' => 'Function @fonction@() not found.',
241
+    'form_auteur_confirmation' => 'Please confirm your email address',
242
+    'form_auteur_email_modifie' => 'Your email address has been changed.',
243
+    'form_auteur_envoi_mail_confirmation' => 'A confirmation email has been sent to @email@. You must visit the URL mentioned in the message to validate your email address.',
244
+    'form_auteur_mail_confirmation' => 'Hello,
245 245
 
246 246
 You have asked to change your email address.
247 247
 To confirm your new address, you need to connect to
@@ -249,347 +249,347 @@  discard block
 block discarded – undo
249 249
 
250 250
     @url@
251 251
 ',
252
-	'form_deja_inscrit' => 'You are already registered.',
253
-	'form_email_non_valide' => 'Your email address is not valid.',
254
-	'form_forum_access_refuse' => 'You no longer have access to this site.',
255
-	'form_forum_bonjour' => 'Hello @nom@,',
256
-	'form_forum_confirmer_email' => 'To confirm your email address, follow this link: @url_confirm@',
257
-	'form_forum_email_deja_enregistre' => 'This email address is already registered. Enter your usual password.',
258
-	'form_forum_identifiant_mail' => 'Your new identifier has just been emailed to you.',
259
-	'form_forum_identifiants' => 'Personal identifiers',
260
-	'form_forum_indiquer_nom_email' => 'Enter your name and email address here. You will receive your personal identifier shortly by email.',
261
-	'form_forum_login' => 'login:',
262
-	'form_forum_message_auto' => '(this is an automated message)',
263
-	'form_forum_pass' => 'password:',
264
-	'form_forum_probleme_mail' => 'Mail problem: the identifier could not be sent.',
265
-	'form_forum_voici1' => 'Here are your identifiers. You may now participate on the site
252
+    'form_deja_inscrit' => 'You are already registered.',
253
+    'form_email_non_valide' => 'Your email address is not valid.',
254
+    'form_forum_access_refuse' => 'You no longer have access to this site.',
255
+    'form_forum_bonjour' => 'Hello @nom@,',
256
+    'form_forum_confirmer_email' => 'To confirm your email address, follow this link: @url_confirm@',
257
+    'form_forum_email_deja_enregistre' => 'This email address is already registered. Enter your usual password.',
258
+    'form_forum_identifiant_mail' => 'Your new identifier has just been emailed to you.',
259
+    'form_forum_identifiants' => 'Personal identifiers',
260
+    'form_forum_indiquer_nom_email' => 'Enter your name and email address here. You will receive your personal identifier shortly by email.',
261
+    'form_forum_login' => 'login:',
262
+    'form_forum_message_auto' => '(this is an automated message)',
263
+    'form_forum_pass' => 'password:',
264
+    'form_forum_probleme_mail' => 'Mail problem: the identifier could not be sent.',
265
+    'form_forum_voici1' => 'Here are your identifiers. You may now participate on the site
266 266
 "@nom_site_spip@" (@adresse_site@):',
267
-	'form_forum_voici2' => 'Here are your identifiers for submitting articles to
267
+    'form_forum_voici2' => 'Here are your identifiers for submitting articles to
268 268
 the site "@nom_site_spip@" (@adresse_login@):',
269
-	'form_indiquer_email' => 'Please enter your email address.',
270
-	'form_indiquer_nom' => 'Please enter your name.',
271
-	'form_indiquer_nom_site' => 'Please enter the name of your site.',
272
-	'form_pet_deja_enregistre' => 'This site is already registered',
273
-	'form_pet_signature_pasprise' => 'Your signature has been ignored.',
274
-	'form_prop_confirmer_envoi' => 'Confirm send',
275
-	'form_prop_description' => 'Description/comment',
276
-	'form_prop_enregistre' => 'Your suggestion has been recorded. It will appear online after being validated by the administrators of this site.',
277
-	'form_prop_envoyer' => 'Send a message',
278
-	'form_prop_indiquer_email' => 'Please enter a valid email address',
279
-	'form_prop_indiquer_nom_site' => 'Please enter the site’s name.',
280
-	'form_prop_indiquer_sujet' => 'Please enter a subject',
281
-	'form_prop_message_envoye' => 'Message sent',
282
-	'form_prop_non_enregistre' => 'Your suggestion has not been recorded.',
283
-	'form_prop_sujet' => 'Subject',
284
-	'form_prop_url_site' => 'Site URL',
285
-	'format_date_attendu' => 'Enter a date in jj/mm/aaaa format.',
286
-	'format_date_incorrecte' => 'The date or its format is incorrect.',
287
-	'format_heure_attendu' => 'Enter a time in hh:mm format.',
288
-	'format_heure_incorrecte' => 'The hour or its format is incorrect.',
289
-	'forum_non_inscrit' => 'Either you are not registered, or the address or password are wrong.',
290
-	'forum_par_auteur' => 'by @auteur@',
291
-	'forum_titre_erreur' => 'Error...',
269
+    'form_indiquer_email' => 'Please enter your email address.',
270
+    'form_indiquer_nom' => 'Please enter your name.',
271
+    'form_indiquer_nom_site' => 'Please enter the name of your site.',
272
+    'form_pet_deja_enregistre' => 'This site is already registered',
273
+    'form_pet_signature_pasprise' => 'Your signature has been ignored.',
274
+    'form_prop_confirmer_envoi' => 'Confirm send',
275
+    'form_prop_description' => 'Description/comment',
276
+    'form_prop_enregistre' => 'Your suggestion has been recorded. It will appear online after being validated by the administrators of this site.',
277
+    'form_prop_envoyer' => 'Send a message',
278
+    'form_prop_indiquer_email' => 'Please enter a valid email address',
279
+    'form_prop_indiquer_nom_site' => 'Please enter the site’s name.',
280
+    'form_prop_indiquer_sujet' => 'Please enter a subject',
281
+    'form_prop_message_envoye' => 'Message sent',
282
+    'form_prop_non_enregistre' => 'Your suggestion has not been recorded.',
283
+    'form_prop_sujet' => 'Subject',
284
+    'form_prop_url_site' => 'Site URL',
285
+    'format_date_attendu' => 'Enter a date in jj/mm/aaaa format.',
286
+    'format_date_incorrecte' => 'The date or its format is incorrect.',
287
+    'format_heure_attendu' => 'Enter a time in hh:mm format.',
288
+    'format_heure_incorrecte' => 'The hour or its format is incorrect.',
289
+    'forum_non_inscrit' => 'Either you are not registered, or the address or password are wrong.',
290
+    'forum_par_auteur' => 'by @auteur@',
291
+    'forum_titre_erreur' => 'Error...',
292 292
 
293
-	// I
294
-	'ical_texte_rss_articles' => 'The site’s backend file for articles is:',
295
-	'ical_texte_rss_articles2' => 'You can also get backend files for individual sections on the site:',
296
-	'ical_texte_rss_breves' => 'Furthermore, there is a file containing the site’s news items. By selecting a section number, you can choose to get news items in that section only.',
297
-	'icone_a_suivre' => 'Launch pad',
298
-	'icone_admin_site' => 'Site administration',
299
-	'icone_agenda' => 'Calendar',
300
-	'icone_aide_ligne' => 'Help',
301
-	'icone_articles' => 'Articles',
302
-	'icone_auteurs' => 'Authors',
303
-	'icone_brouteur' => 'Quick browsing',
304
-	'icone_configuration_site' => 'Configuration',
305
-	'icone_configurer_site' => 'Configure your site',
306
-	'icone_creer_nouvel_auteur' => 'Create a new author',
307
-	'icone_creer_rubrique' => 'Create a section',
308
-	'icone_creer_sous_rubrique' => 'Create a subsection',
309
-	'icone_deconnecter' => 'Log out',
310
-	'icone_discussions' => 'Discussions',
311
-	'icone_doc_rubrique' => 'Documents attached',
312
-	'icone_ecrire_article' => 'Write a new article',
313
-	'icone_edition_site' => 'Edit site',
314
-	'icone_gestion_langues' => 'Language options',
315
-	'icone_informations_personnelles' => 'Personal information',
316
-	'icone_interface_complet' => 'full interface',
317
-	'icone_interface_simple' => 'Simplified interface',
318
-	'icone_maintenance_site' => 'Site maintenance',
319
-	'icone_messagerie_personnelle' => 'Private messages',
320
-	'icone_repartition_debut' => 'Show distribution from the start',
321
-	'icone_rubriques' => 'Sections',
322
-	'icone_sauver_site' => 'Site backup',
323
-	'icone_site_entier' => 'The entire site',
324
-	'icone_sites_references' => 'Referenced sites',
325
-	'icone_statistiques' => 'Site statistics',
326
-	'icone_suivi_activite' => 'Follow site activity',
327
-	'icone_suivi_actualite' => 'Site statistics',
328
-	'icone_suivi_pettions' => 'Manage petitions',
329
-	'icone_suivi_revisions' => 'Article revisions',
330
-	'icone_supprimer_document' => 'Delete this document',
331
-	'icone_supprimer_image' => 'Delete this image',
332
-	'icone_tous_articles' => 'All your articles',
333
-	'icone_tous_auteur' => 'All authors',
334
-	'icone_tous_visiteur' => 'All visitors',
335
-	'icone_visiter_site' => 'View the public site',
336
-	'icone_voir_en_ligne' => 'View online',
337
-	'img_indisponible' => 'image unavailable',
338
-	'impossible' => 'impossible',
339
-	'info_a_suivre' => 'LAUNCH PAD»',
340
-	'info_acces_interdit' => 'Access forbidden',
341
-	'info_acces_refuse' => 'Access denied',
342
-	'info_action' => 'Action: @action@',
343
-	'info_administrer_rubriques' => 'You can manage this section and any subsections',
344
-	'info_adresse_non_indiquee' => 'You did not specify an address to test!',
345
-	'info_aide' => 'HELP:',
346
-	'info_ajouter_mot' => 'Add keyword',
347
-	'info_annonce' => 'ANNOUNCEMENT',
348
-	'info_annonces_generales' => 'General announcements:',
349
-	'info_article_propose' => 'Article submitted',
350
-	'info_article_publie' => 'Article published',
351
-	'info_article_redaction' => 'Article in progress',
352
-	'info_article_refuse' => 'Article rejected',
353
-	'info_article_supprime' => 'Article deleted',
354
-	'info_articles' => 'Articles',
355
-	'info_articles_a_valider' => 'Articles awaiting validation',
356
-	'info_articles_nb' => '@nb@ articles',
357
-	'info_articles_proposes' => 'Articles submitted',
358
-	'info_articles_un' => '1 article',
359
-	'info_auteurs_nombre' => 'author(s):',
360
-	'info_authentification_ftp' => 'Authentication (by FTP).',
361
-	'info_breves_2' => 'news',
362
-	'info_breves_nb' => '@nb@ news items',
363
-	'info_breves_un' => '1 news item',
364
-	'info_connexion_refusee' => 'Connection denied',
365
-	'info_contact_developpeur' => 'Please contact a developer.',
366
-	'info_contenance' => 'This site contains:',
367
-	'info_contribution' => 'contributions',
368
-	'info_copyright' => '@spip@ is free software distributed @lien_gpl@.',
369
-	'info_copyright_doc' => 'For more visit <a href="@spipnet@">@spipnet_affiche@</a>.',
370
-	'info_copyright_gpl' => 'under the GPL license',
371
-	'info_cours_edition' => 'In progress',
372
-	'info_creer_repertoire' => 'Please create a file or a directory called:',
373
-	'info_creer_repertoire_2' => 'inside the sub-directory <b>@repertoire@</b>, then',
374
-	'info_creer_vignette' => 'automatic thumbnail creation',
375
-	'info_creerdansrubrique_non_autorise' => 'You don’t have sufficient rights to create content in this section',
376
-	'info_deplier' => 'Unfold',
377
-	'info_descriptif_nombre' => 'description(s):',
378
-	'info_description' => 'Description:',
379
-	'info_description_2' => 'Description:',
380
-	'info_dimension' => 'Size:',
381
-	'info_documents_nb' => '@nb@ documents',
382
-	'info_documents_un' => '1 document',
383
-	'info_ecire_message_prive' => 'Write a private message',
384
-	'info_email_invalide' => 'Invalid email address.',
385
-	'info_en_cours_validation' => 'Your articles in progress',
386
-	'info_en_ligne' => 'Online now:',
387
-	'info_envoyer_message_prive' => 'Send a private message to this author',
388
-	'info_erreur_requete' => 'Error in query:',
389
-	'info_erreur_squelette2' => 'No <b>@fichier@</b> template available ...',
390
-	'info_erreur_systeme' => 'System error (errno @errsys@)',
391
-	'info_erreur_systeme2' => 'The hard disk may be full or the database damaged. <br />
293
+    // I
294
+    'ical_texte_rss_articles' => 'The site’s backend file for articles is:',
295
+    'ical_texte_rss_articles2' => 'You can also get backend files for individual sections on the site:',
296
+    'ical_texte_rss_breves' => 'Furthermore, there is a file containing the site’s news items. By selecting a section number, you can choose to get news items in that section only.',
297
+    'icone_a_suivre' => 'Launch pad',
298
+    'icone_admin_site' => 'Site administration',
299
+    'icone_agenda' => 'Calendar',
300
+    'icone_aide_ligne' => 'Help',
301
+    'icone_articles' => 'Articles',
302
+    'icone_auteurs' => 'Authors',
303
+    'icone_brouteur' => 'Quick browsing',
304
+    'icone_configuration_site' => 'Configuration',
305
+    'icone_configurer_site' => 'Configure your site',
306
+    'icone_creer_nouvel_auteur' => 'Create a new author',
307
+    'icone_creer_rubrique' => 'Create a section',
308
+    'icone_creer_sous_rubrique' => 'Create a subsection',
309
+    'icone_deconnecter' => 'Log out',
310
+    'icone_discussions' => 'Discussions',
311
+    'icone_doc_rubrique' => 'Documents attached',
312
+    'icone_ecrire_article' => 'Write a new article',
313
+    'icone_edition_site' => 'Edit site',
314
+    'icone_gestion_langues' => 'Language options',
315
+    'icone_informations_personnelles' => 'Personal information',
316
+    'icone_interface_complet' => 'full interface',
317
+    'icone_interface_simple' => 'Simplified interface',
318
+    'icone_maintenance_site' => 'Site maintenance',
319
+    'icone_messagerie_personnelle' => 'Private messages',
320
+    'icone_repartition_debut' => 'Show distribution from the start',
321
+    'icone_rubriques' => 'Sections',
322
+    'icone_sauver_site' => 'Site backup',
323
+    'icone_site_entier' => 'The entire site',
324
+    'icone_sites_references' => 'Referenced sites',
325
+    'icone_statistiques' => 'Site statistics',
326
+    'icone_suivi_activite' => 'Follow site activity',
327
+    'icone_suivi_actualite' => 'Site statistics',
328
+    'icone_suivi_pettions' => 'Manage petitions',
329
+    'icone_suivi_revisions' => 'Article revisions',
330
+    'icone_supprimer_document' => 'Delete this document',
331
+    'icone_supprimer_image' => 'Delete this image',
332
+    'icone_tous_articles' => 'All your articles',
333
+    'icone_tous_auteur' => 'All authors',
334
+    'icone_tous_visiteur' => 'All visitors',
335
+    'icone_visiter_site' => 'View the public site',
336
+    'icone_voir_en_ligne' => 'View online',
337
+    'img_indisponible' => 'image unavailable',
338
+    'impossible' => 'impossible',
339
+    'info_a_suivre' => 'LAUNCH PAD»',
340
+    'info_acces_interdit' => 'Access forbidden',
341
+    'info_acces_refuse' => 'Access denied',
342
+    'info_action' => 'Action: @action@',
343
+    'info_administrer_rubriques' => 'You can manage this section and any subsections',
344
+    'info_adresse_non_indiquee' => 'You did not specify an address to test!',
345
+    'info_aide' => 'HELP:',
346
+    'info_ajouter_mot' => 'Add keyword',
347
+    'info_annonce' => 'ANNOUNCEMENT',
348
+    'info_annonces_generales' => 'General announcements:',
349
+    'info_article_propose' => 'Article submitted',
350
+    'info_article_publie' => 'Article published',
351
+    'info_article_redaction' => 'Article in progress',
352
+    'info_article_refuse' => 'Article rejected',
353
+    'info_article_supprime' => 'Article deleted',
354
+    'info_articles' => 'Articles',
355
+    'info_articles_a_valider' => 'Articles awaiting validation',
356
+    'info_articles_nb' => '@nb@ articles',
357
+    'info_articles_proposes' => 'Articles submitted',
358
+    'info_articles_un' => '1 article',
359
+    'info_auteurs_nombre' => 'author(s):',
360
+    'info_authentification_ftp' => 'Authentication (by FTP).',
361
+    'info_breves_2' => 'news',
362
+    'info_breves_nb' => '@nb@ news items',
363
+    'info_breves_un' => '1 news item',
364
+    'info_connexion_refusee' => 'Connection denied',
365
+    'info_contact_developpeur' => 'Please contact a developer.',
366
+    'info_contenance' => 'This site contains:',
367
+    'info_contribution' => 'contributions',
368
+    'info_copyright' => '@spip@ is free software distributed @lien_gpl@.',
369
+    'info_copyright_doc' => 'For more visit <a href="@spipnet@">@spipnet_affiche@</a>.',
370
+    'info_copyright_gpl' => 'under the GPL license',
371
+    'info_cours_edition' => 'In progress',
372
+    'info_creer_repertoire' => 'Please create a file or a directory called:',
373
+    'info_creer_repertoire_2' => 'inside the sub-directory <b>@repertoire@</b>, then',
374
+    'info_creer_vignette' => 'automatic thumbnail creation',
375
+    'info_creerdansrubrique_non_autorise' => 'You don’t have sufficient rights to create content in this section',
376
+    'info_deplier' => 'Unfold',
377
+    'info_descriptif_nombre' => 'description(s):',
378
+    'info_description' => 'Description:',
379
+    'info_description_2' => 'Description:',
380
+    'info_dimension' => 'Size:',
381
+    'info_documents_nb' => '@nb@ documents',
382
+    'info_documents_un' => '1 document',
383
+    'info_ecire_message_prive' => 'Write a private message',
384
+    'info_email_invalide' => 'Invalid email address.',
385
+    'info_en_cours_validation' => 'Your articles in progress',
386
+    'info_en_ligne' => 'Online now:',
387
+    'info_envoyer_message_prive' => 'Send a private message to this author',
388
+    'info_erreur_requete' => 'Error in query:',
389
+    'info_erreur_squelette2' => 'No <b>@fichier@</b> template available ...',
390
+    'info_erreur_systeme' => 'System error (errno @errsys@)',
391
+    'info_erreur_systeme2' => 'The hard disk may be full or the database damaged. <br />
392 392
 <span style="color:red;">Try <a href=\'@script@\'>repairing the database</a>, or contact your service provider.</span>',
393
-	'info_fini' => 'Done!',
394
-	'info_format_image' => 'Image format to be used for vignettes: @gd_formats@.',
395
-	'info_format_non_defini' => 'undefined format',
396
-	'info_grand_ecran' => 'Large display',
397
-	'info_image_aide' => 'HELP',
398
-	'info_image_process_titre' => 'How to create thumbnails',
399
-	'info_impossible_lire_page' => '<b>Error!</b> The page <tt><html>@test_proxy@</html></tt> cannot be viewed through the proxy',
400
-	'info_installation_systeme_publication' => 'Installing publication system...',
401
-	'info_installer_documents' => 'You can automatically install all documents in the folder @upload@.',
402
-	'info_installer_ftp' => 'As an administrator, you can install files via FTP to the folder @upload@ in order to select them directly from here.',
403
-	'info_installer_images' => 'You can install images in the formats JPEG, GIF, and PNG.',
404
-	'info_installer_images_dossier' => 'Install images in folder @upload@ if you want to select them here.',
405
-	'info_interface_complete' => 'full interface',
406
-	'info_interface_simple' => 'Simplified interface',
407
-	'info_joindre_document_article' => 'You can attach the following types of document to your article',
408
-	'info_joindre_document_rubrique' => 'You can add documents of the following types to this section ',
409
-	'info_joindre_documents_article' => 'You can attach documents of the following types to your article:',
410
-	'info_l_article' => 'the article',
411
-	'info_la_breve' => 'the news item',
412
-	'info_la_rubrique' => 'the section',
413
-	'info_langue_principale' => 'Main language for site',
414
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
415
-	'info_les_auteurs_1' => 'by @les_auteurs@',
416
-	'info_logo_format_interdit' => 'Only logos in these formats @formats@ are allowed.',
417
-	'info_logo_max_poids' => 'Logos must be less than @maxi@ (this file is @actuel@).',
418
-	'info_mail_fournisseur' => '[email protected]',
419
-	'info_message_2' => 'MESSAGE',
420
-	'info_message_supprime' => 'MESSAGE DELETED',
421
-	'info_messages_nb' => '@nb@ messages',
422
-	'info_messages_un' => '1 message',
423
-	'info_mise_en_ligne' => 'Published on:',
424
-	'info_modification_parametres_securite' => 'modifying security parameters',
425
-	'info_mois_courant' => 'During the month:',
426
-	'info_mot_cle_ajoute' => 'The following keyword was added to',
427
-	'info_multi_herit' => 'Default language',
428
-	'info_multi_langues_soulignees' => 'The <u>languages underlined</u> provide partial or total translations for all the interface texts. If you select these languages, many elements of the public site (dates, forms) will be translated automatically. As for the languages that are not underlined, those elements will be displayed using the site’s default language.',
429
-	'info_multilinguisme' => 'Multilingual',
430
-	'info_nom_non_utilisateurs_connectes' => 'Your name does not appear in the list of users online.',
431
-	'info_nom_utilisateurs_connectes' => 'Your name appears in the list of users online.',
432
-	'info_nombre_en_ligne' => 'Online now:',
433
-	'info_non_resultat' => 'No results for "@cherche_mot@"',
434
-	'info_non_utilisation_messagerie' => 'You are not using private messaging on this site.',
435
-	'info_nouveau_message' => 'YOU HAVE A NEW MESSAGE',
436
-	'info_nouveaux_messages' => 'YOU HAVE @total_messages@ NEW MESSAGES',
437
-	'info_numero_abbreviation' => 'No',
438
-	'info_obligatoire' => 'This information is required',
439
-	'info_page_actuelle' => 'Actual page',
440
-	'info_pense_bete' => 'MEMO',
441
-	'info_petit_ecran' => 'Small display',
442
-	'info_petition_close' => 'Petition closed',
443
-	'info_pixels' => 'pixels',
444
-	'info_plusieurs_mots_trouves' => 'Several keywords were found for "@cherche_mot@":',
445
-	'info_portfolio_automatique' => 'Automated portfolio:',
446
-	'info_premier_resultat' => '[First @debut_limit@ results out of @total@]',
447
-	'info_premier_resultat_sur' => '[First @debut_limit@ results out of @total@]',
448
-	'info_propose_1' => '[@nom_site_spip@] Submitted: @titre@',
449
-	'info_propose_2' => 'Article submitted
393
+    'info_fini' => 'Done!',
394
+    'info_format_image' => 'Image format to be used for vignettes: @gd_formats@.',
395
+    'info_format_non_defini' => 'undefined format',
396
+    'info_grand_ecran' => 'Large display',
397
+    'info_image_aide' => 'HELP',
398
+    'info_image_process_titre' => 'How to create thumbnails',
399
+    'info_impossible_lire_page' => '<b>Error!</b> The page <tt><html>@test_proxy@</html></tt> cannot be viewed through the proxy',
400
+    'info_installation_systeme_publication' => 'Installing publication system...',
401
+    'info_installer_documents' => 'You can automatically install all documents in the folder @upload@.',
402
+    'info_installer_ftp' => 'As an administrator, you can install files via FTP to the folder @upload@ in order to select them directly from here.',
403
+    'info_installer_images' => 'You can install images in the formats JPEG, GIF, and PNG.',
404
+    'info_installer_images_dossier' => 'Install images in folder @upload@ if you want to select them here.',
405
+    'info_interface_complete' => 'full interface',
406
+    'info_interface_simple' => 'Simplified interface',
407
+    'info_joindre_document_article' => 'You can attach the following types of document to your article',
408
+    'info_joindre_document_rubrique' => 'You can add documents of the following types to this section ',
409
+    'info_joindre_documents_article' => 'You can attach documents of the following types to your article:',
410
+    'info_l_article' => 'the article',
411
+    'info_la_breve' => 'the news item',
412
+    'info_la_rubrique' => 'the section',
413
+    'info_langue_principale' => 'Main language for site',
414
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
415
+    'info_les_auteurs_1' => 'by @les_auteurs@',
416
+    'info_logo_format_interdit' => 'Only logos in these formats @formats@ are allowed.',
417
+    'info_logo_max_poids' => 'Logos must be less than @maxi@ (this file is @actuel@).',
418
+    'info_mail_fournisseur' => '[email protected]',
419
+    'info_message_2' => 'MESSAGE',
420
+    'info_message_supprime' => 'MESSAGE DELETED',
421
+    'info_messages_nb' => '@nb@ messages',
422
+    'info_messages_un' => '1 message',
423
+    'info_mise_en_ligne' => 'Published on:',
424
+    'info_modification_parametres_securite' => 'modifying security parameters',
425
+    'info_mois_courant' => 'During the month:',
426
+    'info_mot_cle_ajoute' => 'The following keyword was added to',
427
+    'info_multi_herit' => 'Default language',
428
+    'info_multi_langues_soulignees' => 'The <u>languages underlined</u> provide partial or total translations for all the interface texts. If you select these languages, many elements of the public site (dates, forms) will be translated automatically. As for the languages that are not underlined, those elements will be displayed using the site’s default language.',
429
+    'info_multilinguisme' => 'Multilingual',
430
+    'info_nom_non_utilisateurs_connectes' => 'Your name does not appear in the list of users online.',
431
+    'info_nom_utilisateurs_connectes' => 'Your name appears in the list of users online.',
432
+    'info_nombre_en_ligne' => 'Online now:',
433
+    'info_non_resultat' => 'No results for "@cherche_mot@"',
434
+    'info_non_utilisation_messagerie' => 'You are not using private messaging on this site.',
435
+    'info_nouveau_message' => 'YOU HAVE A NEW MESSAGE',
436
+    'info_nouveaux_messages' => 'YOU HAVE @total_messages@ NEW MESSAGES',
437
+    'info_numero_abbreviation' => 'No',
438
+    'info_obligatoire' => 'This information is required',
439
+    'info_page_actuelle' => 'Actual page',
440
+    'info_pense_bete' => 'MEMO',
441
+    'info_petit_ecran' => 'Small display',
442
+    'info_petition_close' => 'Petition closed',
443
+    'info_pixels' => 'pixels',
444
+    'info_plusieurs_mots_trouves' => 'Several keywords were found for "@cherche_mot@":',
445
+    'info_portfolio_automatique' => 'Automated portfolio:',
446
+    'info_premier_resultat' => '[First @debut_limit@ results out of @total@]',
447
+    'info_premier_resultat_sur' => '[First @debut_limit@ results out of @total@]',
448
+    'info_propose_1' => '[@nom_site_spip@] Submitted: @titre@',
449
+    'info_propose_2' => 'Article submitted
450 450
 -----------------',
451
-	'info_propose_3' => 'The article "@titre@" has been submitted for publication.',
452
-	'info_propose_4' => 'You are invited to review it and give your opinion',
453
-	'info_propose_5' => 'in the associated forum. It is available here:',
454
-	'info_publie_01' => 'The article "@titre@" was validated by @connect_nom@.',
455
-	'info_publie_1' => '[@nom_site_spip@] PUBLISHED: @titre@',
456
-	'info_publie_2' => 'Article published
451
+    'info_propose_3' => 'The article "@titre@" has been submitted for publication.',
452
+    'info_propose_4' => 'You are invited to review it and give your opinion',
453
+    'info_propose_5' => 'in the associated forum. It is available here:',
454
+    'info_publie_01' => 'The article "@titre@" was validated by @connect_nom@.',
455
+    'info_publie_1' => '[@nom_site_spip@] PUBLISHED: @titre@',
456
+    'info_publie_2' => 'Article published
457 457
 -----------------',
458
-	'info_rechercher' => 'Search',
459
-	'info_rechercher_02' => 'Search:',
460
-	'info_remplacer_vignette' => 'Replace the default vignette by a customised logo:',
461
-	'info_rubriques_nb' => '@nb@ sections',
462
-	'info_rubriques_un' => '1 section',
463
-	'info_sans_titre_2' => 'untitled',
464
-	'info_selectionner_fichier' => 'You can select a file from the folder @upload@',
465
-	'info_selectionner_fichier_2' => 'Select a file:',
466
-	'info_sites_nb' => '@nb@ sites',
467
-	'info_sites_un' => '1 site',
468
-	'info_supprimer_vignette' => 'delete the vignette',
469
-	'info_symbole_bleu' => 'A <b>blue</b> symbol indicates a <b>memo</b>: i.e. a message for your personal use.',
470
-	'info_symbole_jaune' => 'A <b>yellow</b> symbol indicates an <b>announcement to all editors</b>: it can be edited by all administrators, and is visible to all editors.',
471
-	'info_symbole_vert' => 'A <b>green</b> symbol indicates the <b>messages exchanged with other users</b> of the site.',
472
-	'info_telecharger_nouveau_logo' => 'Upload a new logo:',
473
-	'info_telecharger_ordinateur' => 'Upload from your computer:',
474
-	'info_tous_resultats_enregistres' => '[all the results are recorded]',
475
-	'info_tout_afficher' => 'Show all',
476
-	'info_travaux_texte' => 'This site is not yet set up. Please come back later...',
477
-	'info_travaux_titre' => 'Site under construction',
478
-	'info_trop_resultat' => 'Too many results for "@cherche_mot@"; please refine the search.',
479
-	'info_utilisation_messagerie_interne' => 'You are using the internal message system of this site.',
480
-	'info_valider_lien' => 'validate this link',
481
-	'info_verifier_image' => ', please make sure your images have been transferred correctly.',
482
-	'info_vignette_defaut' => 'Default vignette',
483
-	'info_vignette_personnalisee' => 'Custom vignette',
484
-	'info_visite' => 'visit:',
485
-	'info_vos_rendez_vous' => 'Your future appointments',
486
-	'infos_vos_pense_bete' => 'Your memos',
458
+    'info_rechercher' => 'Search',
459
+    'info_rechercher_02' => 'Search:',
460
+    'info_remplacer_vignette' => 'Replace the default vignette by a customised logo:',
461
+    'info_rubriques_nb' => '@nb@ sections',
462
+    'info_rubriques_un' => '1 section',
463
+    'info_sans_titre_2' => 'untitled',
464
+    'info_selectionner_fichier' => 'You can select a file from the folder @upload@',
465
+    'info_selectionner_fichier_2' => 'Select a file:',
466
+    'info_sites_nb' => '@nb@ sites',
467
+    'info_sites_un' => '1 site',
468
+    'info_supprimer_vignette' => 'delete the vignette',
469
+    'info_symbole_bleu' => 'A <b>blue</b> symbol indicates a <b>memo</b>: i.e. a message for your personal use.',
470
+    'info_symbole_jaune' => 'A <b>yellow</b> symbol indicates an <b>announcement to all editors</b>: it can be edited by all administrators, and is visible to all editors.',
471
+    'info_symbole_vert' => 'A <b>green</b> symbol indicates the <b>messages exchanged with other users</b> of the site.',
472
+    'info_telecharger_nouveau_logo' => 'Upload a new logo:',
473
+    'info_telecharger_ordinateur' => 'Upload from your computer:',
474
+    'info_tous_resultats_enregistres' => '[all the results are recorded]',
475
+    'info_tout_afficher' => 'Show all',
476
+    'info_travaux_texte' => 'This site is not yet set up. Please come back later...',
477
+    'info_travaux_titre' => 'Site under construction',
478
+    'info_trop_resultat' => 'Too many results for "@cherche_mot@"; please refine the search.',
479
+    'info_utilisation_messagerie_interne' => 'You are using the internal message system of this site.',
480
+    'info_valider_lien' => 'validate this link',
481
+    'info_verifier_image' => ', please make sure your images have been transferred correctly.',
482
+    'info_vignette_defaut' => 'Default vignette',
483
+    'info_vignette_personnalisee' => 'Custom vignette',
484
+    'info_visite' => 'visit:',
485
+    'info_vos_rendez_vous' => 'Your future appointments',
486
+    'infos_vos_pense_bete' => 'Your memos',
487 487
 
488
-	// L
489
-	'label_ajout_id_rapide' => 'Quick addition',
490
-	'label_poids_fichier' => 'Size',
491
-	'label_ponctuer' => '@label@:',
492
-	'lien_afficher_icones_seuls' => 'Show only icons',
493
-	'lien_afficher_texte_icones' => 'Show icons and text',
494
-	'lien_afficher_texte_seul' => 'Show only text',
495
-	'lien_aller_a_la_derniere_page' => 'Go to the last page',
496
-	'lien_aller_a_la_page_nb' => 'Go to page @nb@',
497
-	'lien_aller_a_la_page_precedente' => 'Go to the previous page',
498
-	'lien_aller_a_la_page_suivante' => 'Go to the next page',
499
-	'lien_aller_a_la_premiere_page' => 'Go to the first page',
500
-	'lien_liberer' => 'release',
501
-	'lien_liberer_tous' => 'Release all',
502
-	'lien_nouvea_pense_bete' => 'NEW MEMO',
503
-	'lien_nouveau_message' => 'NEW MESSAGE',
504
-	'lien_nouvelle_annonce' => 'NEW ANNOUNCEMENT',
505
-	'lien_petitions' => 'PETITION',
506
-	'lien_popularite' => 'popularity: @popularite@%',
507
-	'lien_racine_site' => 'SITE ROOT',
508
-	'lien_reessayer' => 'try again',
509
-	'lien_repondre_message' => 'Reply to this message',
510
-	'lien_supprimer' => 'delete',
511
-	'lien_tout_afficher' => 'Show all',
512
-	'lien_visite_site' => 'visit this site',
513
-	'lien_visites' => '@visites@ visits',
514
-	'lien_voir_auteur' => 'Check this author',
515
-	'ligne' => 'Line',
516
-	'login' => 'Connection',
517
-	'login_acces_prive' => 'access to the back-office',
518
-	'login_autre_identifiant' => 'use a different ID',
519
-	'login_cookie_accepte' => 'Please configure your browser to accept them for this site.',
520
-	'login_cookie_oblige' => 'For secure identification, your browser must accept cookies.',
521
-	'login_deconnexion_ok' => 'Logged out.',
522
-	'login_erreur_pass' => 'Wrong password.',
523
-	'login_espace_prive' => 'back-office',
524
-	'login_identifiant_inconnu' => 'The identifier "@login@" is unknown.',
525
-	'login_login' => 'Login:',
526
-	'login_login2' => 'Login or e-mail address:',
527
-	'login_login_pass_incorrect' => '(Wrong login or password).',
528
-	'login_motpasseoublie' => 'password forgotten?',
529
-	'login_non_securise' => 'Caution, this form is not secure.
488
+    // L
489
+    'label_ajout_id_rapide' => 'Quick addition',
490
+    'label_poids_fichier' => 'Size',
491
+    'label_ponctuer' => '@label@:',
492
+    'lien_afficher_icones_seuls' => 'Show only icons',
493
+    'lien_afficher_texte_icones' => 'Show icons and text',
494
+    'lien_afficher_texte_seul' => 'Show only text',
495
+    'lien_aller_a_la_derniere_page' => 'Go to the last page',
496
+    'lien_aller_a_la_page_nb' => 'Go to page @nb@',
497
+    'lien_aller_a_la_page_precedente' => 'Go to the previous page',
498
+    'lien_aller_a_la_page_suivante' => 'Go to the next page',
499
+    'lien_aller_a_la_premiere_page' => 'Go to the first page',
500
+    'lien_liberer' => 'release',
501
+    'lien_liberer_tous' => 'Release all',
502
+    'lien_nouvea_pense_bete' => 'NEW MEMO',
503
+    'lien_nouveau_message' => 'NEW MESSAGE',
504
+    'lien_nouvelle_annonce' => 'NEW ANNOUNCEMENT',
505
+    'lien_petitions' => 'PETITION',
506
+    'lien_popularite' => 'popularity: @popularite@%',
507
+    'lien_racine_site' => 'SITE ROOT',
508
+    'lien_reessayer' => 'try again',
509
+    'lien_repondre_message' => 'Reply to this message',
510
+    'lien_supprimer' => 'delete',
511
+    'lien_tout_afficher' => 'Show all',
512
+    'lien_visite_site' => 'visit this site',
513
+    'lien_visites' => '@visites@ visits',
514
+    'lien_voir_auteur' => 'Check this author',
515
+    'ligne' => 'Line',
516
+    'login' => 'Connection',
517
+    'login_acces_prive' => 'access to the back-office',
518
+    'login_autre_identifiant' => 'use a different ID',
519
+    'login_cookie_accepte' => 'Please configure your browser to accept them for this site.',
520
+    'login_cookie_oblige' => 'For secure identification, your browser must accept cookies.',
521
+    'login_deconnexion_ok' => 'Logged out.',
522
+    'login_erreur_pass' => 'Wrong password.',
523
+    'login_espace_prive' => 'back-office',
524
+    'login_identifiant_inconnu' => 'The identifier "@login@" is unknown.',
525
+    'login_login' => 'Login:',
526
+    'login_login2' => 'Login or e-mail address:',
527
+    'login_login_pass_incorrect' => '(Wrong login or password).',
528
+    'login_motpasseoublie' => 'password forgotten?',
529
+    'login_non_securise' => 'Caution, this form is not secure.
530 530
    If you do not want your password to be open to
531 531
    interception on the network, please activate Javascript
532 532
    in your browser and',
533
-	'login_nouvelle_tentative' => 'New attempt',
534
-	'login_par_ici' => 'You are registered... this way...',
535
-	'login_pass2' => 'Password:',
536
-	'login_preferez_refuser' => '<b>If you prefer to refuse cookies</b>, there is another, less secure, method of connection available:',
537
-	'login_recharger' => 'reload this page',
538
-	'login_rester_identifie' => 'Remember me',
539
-	'login_retour_public' => 'Back to the public site',
540
-	'login_retour_site' => 'Back to the public site',
541
-	'login_retoursitepublic' => 'back to the public site',
542
-	'login_sans_cookie' => 'Identification without cookie',
543
-	'login_securise' => 'Secure login',
544
-	'login_sinscrire' => 'Sign up',
545
-	'login_test_navigateur' => 'testing browser/reconnection',
546
-	'login_verifiez_navigateur' => '(However, check that your browser did not memorise your password...)',
533
+    'login_nouvelle_tentative' => 'New attempt',
534
+    'login_par_ici' => 'You are registered... this way...',
535
+    'login_pass2' => 'Password:',
536
+    'login_preferez_refuser' => '<b>If you prefer to refuse cookies</b>, there is another, less secure, method of connection available:',
537
+    'login_recharger' => 'reload this page',
538
+    'login_rester_identifie' => 'Remember me',
539
+    'login_retour_public' => 'Back to the public site',
540
+    'login_retour_site' => 'Back to the public site',
541
+    'login_retoursitepublic' => 'back to the public site',
542
+    'login_sans_cookie' => 'Identification without cookie',
543
+    'login_securise' => 'Secure login',
544
+    'login_sinscrire' => 'Sign up',
545
+    'login_test_navigateur' => 'testing browser/reconnection',
546
+    'login_verifiez_navigateur' => '(However, check that your browser did not memorise your password...)',
547 547
 
548
-	// M
549
-	'masquer_colonne' => 'Hide this column',
550
-	'masquer_trad' => 'hide translations',
551
-	'message_nouveaux_identifiants_echec' => 'New identifiers could not be created.',
552
-	'message_nouveaux_identifiants_echec_envoi' => 'The new connection identifiers could not be sent.',
553
-	'message_nouveaux_identifiants_ok' => 'The new connection identifiers were sent to @email@.',
554
-	'module_fichiers_langues' => 'Language files',
548
+    // M
549
+    'masquer_colonne' => 'Hide this column',
550
+    'masquer_trad' => 'hide translations',
551
+    'message_nouveaux_identifiants_echec' => 'New identifiers could not be created.',
552
+    'message_nouveaux_identifiants_echec_envoi' => 'The new connection identifiers could not be sent.',
553
+    'message_nouveaux_identifiants_ok' => 'The new connection identifiers were sent to @email@.',
554
+    'module_fichiers_langues' => 'Language files',
555 555
 
556
-	// N
557
-	'navigateur_pas_redirige' => 'If you are not automatically redirected, click here to continue.',
558
-	'numero' => 'Number',
556
+    // N
557
+    'navigateur_pas_redirige' => 'If you are not automatically redirected, click here to continue.',
558
+    'numero' => 'Number',
559 559
 
560
-	// O
561
-	'occurence' => 'Instance',
562
-	'onglet_affacer_base' => 'Delete the database',
563
-	'onglet_auteur' => 'The author',
564
-	'onglet_contenu_site' => 'Site content',
565
-	'onglet_evolution_visite_mod' => 'Trend in visits',
566
-	'onglet_fonctions_avances' => 'Advanced functions',
567
-	'onglet_informations_personnelles' => 'Personal Information',
568
-	'onglet_interactivite' => 'Interactivity',
569
-	'onglet_messagerie' => 'Messaging',
570
-	'onglet_repartition_rubrique' => 'Distribution by section',
571
-	'onglet_save_restaur_base' => 'Backup/restore the database',
572
-	'onglet_vider_cache' => 'Empty the cache',
560
+    // O
561
+    'occurence' => 'Instance',
562
+    'onglet_affacer_base' => 'Delete the database',
563
+    'onglet_auteur' => 'The author',
564
+    'onglet_contenu_site' => 'Site content',
565
+    'onglet_evolution_visite_mod' => 'Trend in visits',
566
+    'onglet_fonctions_avances' => 'Advanced functions',
567
+    'onglet_informations_personnelles' => 'Personal Information',
568
+    'onglet_interactivite' => 'Interactivity',
569
+    'onglet_messagerie' => 'Messaging',
570
+    'onglet_repartition_rubrique' => 'Distribution by section',
571
+    'onglet_save_restaur_base' => 'Backup/restore the database',
572
+    'onglet_vider_cache' => 'Empty the cache',
573 573
 
574
-	// P
575
-	'pass_choix_pass' => 'Please choose a new password:',
576
-	'pass_erreur' => 'Error',
577
-	'pass_erreur_acces_refuse' => '<b>Error:</b> you no longer have access to this site.',
578
-	'pass_erreur_code_inconnu' => '<b>Error:</b> this code does not match any visitors with access permission to this site.',
579
-	'pass_erreur_non_enregistre' => '<b>Error :</b> the address <tt>@email_oubli@</tt> is not registered on this site.',
580
-	'pass_erreur_non_valide' => '<b>Error :</b> the e-mail <tt>@email_oubli@</tt> is not valid!',
581
-	'pass_erreur_probleme_technique' => '<b>Error :</b> this e-mail could not be sent due to a technical problem.',
582
-	'pass_espace_prive_bla' => 'The back-office of this site is open to
574
+    // P
575
+    'pass_choix_pass' => 'Please choose a new password:',
576
+    'pass_erreur' => 'Error',
577
+    'pass_erreur_acces_refuse' => '<b>Error:</b> you no longer have access to this site.',
578
+    'pass_erreur_code_inconnu' => '<b>Error:</b> this code does not match any visitors with access permission to this site.',
579
+    'pass_erreur_non_enregistre' => '<b>Error :</b> the address <tt>@email_oubli@</tt> is not registered on this site.',
580
+    'pass_erreur_non_valide' => '<b>Error :</b> the e-mail <tt>@email_oubli@</tt> is not valid!',
581
+    'pass_erreur_probleme_technique' => '<b>Error :</b> this e-mail could not be sent due to a technical problem.',
582
+    'pass_espace_prive_bla' => 'The back-office of this site is open to
583 583
 visitors after registration. Once you have registered,
584 584
 you can review the articles in progress,
585 585
 submit articles and participate in forums.',
586
-	'pass_forum_bla' => 'You have requested to take part in a forum
586
+    'pass_forum_bla' => 'You have requested to take part in a forum
587 587
 reserved for registered visitors.',
588
-	'pass_indiquez_cidessous' => 'Enter the email address with which you
588
+    'pass_indiquez_cidessous' => 'Enter the email address with which you
589 589
 registered. You
590 590
 will receive an email explaining how you
591 591
 can retrieve your password.',
592
-	'pass_mail_passcookie' => '(this is an automated message)
592
+    'pass_mail_passcookie' => '(this is an automated message)
593 593
 
594 594
 To recover your access to the site
595 595
 @nom_site_spip@ (@adresse_site@)
@@ -600,150 +600,150 @@  discard block
 block discarded – undo
600 600
 You can then enter a new password
601 601
 and log in to the site.
602 602
 ',
603
-	'pass_mot_oublie' => 'Password forgotten',
604
-	'pass_nouveau_enregistre' => 'Your new password has been recorded.',
605
-	'pass_nouveau_pass' => 'New password',
606
-	'pass_ok' => 'OK',
607
-	'pass_oubli_mot' => 'Forgotten password',
608
-	'pass_procedure_changer' => 'In order to change your password, we have to check your identity first. Please enter the e-mail address associated with this account.',
609
-	'pass_quitter_fenetre' => 'Close this window',
610
-	'pass_rappel_login' => 'Reminder: your identifier (login) is "@login@".',
611
-	'pass_recevoir_mail' => 'A link to reset your password has been sent to your email address (if it is valid).',
612
-	'pass_retour_public' => 'Back to the public site',
613
-	'pass_rien_a_faire_ici' => 'Nothing to do here.',
614
-	'pass_vousinscrire' => 'Registering with the site',
615
-	'precedent' => 'previous',
616
-	'previsualisation' => 'Preview',
617
-	'previsualiser' => 'Show preview',
603
+    'pass_mot_oublie' => 'Password forgotten',
604
+    'pass_nouveau_enregistre' => 'Your new password has been recorded.',
605
+    'pass_nouveau_pass' => 'New password',
606
+    'pass_ok' => 'OK',
607
+    'pass_oubli_mot' => 'Forgotten password',
608
+    'pass_procedure_changer' => 'In order to change your password, we have to check your identity first. Please enter the e-mail address associated with this account.',
609
+    'pass_quitter_fenetre' => 'Close this window',
610
+    'pass_rappel_login' => 'Reminder: your identifier (login) is "@login@".',
611
+    'pass_recevoir_mail' => 'A link to reset your password has been sent to your email address (if it is valid).',
612
+    'pass_retour_public' => 'Back to the public site',
613
+    'pass_rien_a_faire_ici' => 'Nothing to do here.',
614
+    'pass_vousinscrire' => 'Registering with the site',
615
+    'precedent' => 'previous',
616
+    'previsualisation' => 'Preview',
617
+    'previsualiser' => 'Show preview',
618 618
 
619
-	// R
620
-	'retour' => 'Back',
619
+    // R
620
+    'retour' => 'Back',
621 621
 
622
-	// S
623
-	'spip_conforme_dtd' => 'SPIP finds this page to be in compliance with its DOCTYPE:',
624
-	'squelette' => 'template',
625
-	'squelette_inclus_ligne' => 'included template, line',
626
-	'squelette_ligne' => 'template, line',
627
-	'stats_visites_et_popularite' => '@visites@ visits; popularity: @popularite@',
628
-	'suivant' => 'next',
622
+    // S
623
+    'spip_conforme_dtd' => 'SPIP finds this page to be in compliance with its DOCTYPE:',
624
+    'squelette' => 'template',
625
+    'squelette_inclus_ligne' => 'included template, line',
626
+    'squelette_ligne' => 'template, line',
627
+    'stats_visites_et_popularite' => '@visites@ visits; popularity: @popularite@',
628
+    'suivant' => 'next',
629 629
 
630
-	// T
631
-	'taille_go' => '@taille@ Gb',
632
-	'taille_go_bi' => '@taille@ GiB',
633
-	'taille_ko' => '@taille@ kb',
634
-	'taille_ko_bi' => '@taille@ KiB',
635
-	'taille_mo' => '@taille@ Mb',
636
-	'taille_mo_bi' => '@taille@ MiB',
637
-	'taille_octets' => '@taille@ bytes',
638
-	'taille_octets_bi' => '@taille@ bytes',
639
-	'texte_actualite_site_1' => 'When you are more familiar with the interface, click on "',
640
-	'texte_actualite_site_2' => 'full interface',
641
-	'texte_actualite_site_3' => '" to make more features available.',
642
-	'texte_creation_automatique_vignette' => 'Automatic creation of preview vignettes is enabled. If you use this form to install,  images in the format(s) @gd_formats@, they will be coupled with a vignette whose maximum size is @taille_preview@ pixels.',
643
-	'texte_documents_associes' => 'The following documents are associated with the article,,
630
+    // T
631
+    'taille_go' => '@taille@ Gb',
632
+    'taille_go_bi' => '@taille@ GiB',
633
+    'taille_ko' => '@taille@ kb',
634
+    'taille_ko_bi' => '@taille@ KiB',
635
+    'taille_mo' => '@taille@ Mb',
636
+    'taille_mo_bi' => '@taille@ MiB',
637
+    'taille_octets' => '@taille@ bytes',
638
+    'taille_octets_bi' => '@taille@ bytes',
639
+    'texte_actualite_site_1' => 'When you are more familiar with the interface, click on "',
640
+    'texte_actualite_site_2' => 'full interface',
641
+    'texte_actualite_site_3' => '" to make more features available.',
642
+    'texte_creation_automatique_vignette' => 'Automatic creation of preview vignettes is enabled. If you use this form to install,  images in the format(s) @gd_formats@, they will be coupled with a vignette whose maximum size is @taille_preview@ pixels.',
643
+    'texte_documents_associes' => 'The following documents are associated with the article,,
644 644
     but they were not directly
645 645
     inserted. Depending on the layout of the public site,
646 646
     they may appear as attached documents.',
647
-	'texte_erreur_mise_niveau_base' => 'Database error during the upgrade.
647
+    'texte_erreur_mise_niveau_base' => 'Database error during the upgrade.
648 648
       The image <b>@fichier@</b> did not pass (article @id_article@).<p>
649 649
    Note this reference carefully, try the upgrade procedure again,
650 650
    and check afterwards that the images still appear
651 651
       in the articles.',
652
-	'texte_erreur_visiteur' => 'You have tried to enter the back-office using an unauthorised login.',
653
-	'texte_inc_auth_1' => 'You used the login
652
+    'texte_erreur_visiteur' => 'You have tried to enter the back-office using an unauthorised login.',
653
+    'texte_inc_auth_1' => 'You used the login
654 654
   <b>@auth_login@</b>, but it does not exist in the database.
655 655
   Try to',
656
-	'texte_inc_auth_2' => 'reconnect',
657
-	'texte_inc_auth_3' => ', having quit and
656
+    'texte_inc_auth_2' => 'reconnect',
657
+    'texte_inc_auth_3' => ', having quit and
658 658
   restarted your browser if necessary.',
659
-	'texte_inc_config' => 'Changes made to the options on these pages have a great effect on
659
+    'texte_inc_config' => 'Changes made to the options on these pages have a great effect on
660 660
   the functioning of the site. You are advised not to make any changes unless you are
661 661
  familiar with how SPIP works. <br /><br /><b>In
662 662
  general, you are strongly advised
663 663
  to let the main webmaster of the site deal with these pages.</b>',
664
-	'texte_inc_meta_1' => 'The system encountered an error when trying to write the file <code>@fichier@</code>. As a site administrator, please',
665
-	'texte_inc_meta_2' => 'verify write permissions',
666
-	'texte_inc_meta_3' => 'of the directory <code>@repertoire@</code>.',
667
-	'texte_statut_en_cours_redaction' => 'editing in progress',
668
-	'texte_statut_poubelle' => 'to the dustbin',
669
-	'texte_statut_propose_evaluation' => 'submitted for evaluation',
670
-	'texte_statut_publie' => 'published online',
671
-	'texte_statut_refuse' => 'rejected',
672
-	'titre_ajouter_mot_cle' => 'ADD A KEYWORD:',
673
-	'titre_cadre_raccourcis' => 'SHORTCUTS:',
674
-	'titre_changer_couleur_interface' => 'Changing interface colour',
675
-	'titre_image_admin_article' => 'You can administrate this article',
676
-	'titre_image_administrateur' => 'Administrator',
677
-	'titre_image_aide' => 'Help on this item',
678
-	'titre_image_auteur_supprime' => 'Author deleted',
679
-	'titre_image_redacteur' => 'Editor without access',
680
-	'titre_image_redacteur_02' => 'Editor',
681
-	'titre_image_selecteur' => 'Display list',
682
-	'titre_image_visiteur' => 'Visitor',
683
-	'titre_joindre_document' => 'ATTACH A DOCUMENT',
684
-	'titre_mots_cles' => 'KEYWORDS',
685
-	'titre_probleme_technique' => 'Warning: a technical problem (SQL server) is preventing access to this part of the site. Thank you for your patience.',
686
-	'titre_publier_document' => 'PUBLISH A DOCUMENT IN THIS SECTION',
687
-	'titre_signatures_attente' => 'Signatures awaiting validation',
688
-	'titre_signatures_confirmees' => 'Signatures confirmed',
689
-	'titre_statistiques' => 'Site statistics',
690
-	'titre_titre_document' => 'Document title:',
691
-	'todo' => 'to come',
692
-	'trad_definir_reference' => 'Choose "@titre@" as a reference for translations',
693
-	'trad_reference' => '(reference for translations)',
664
+    'texte_inc_meta_1' => 'The system encountered an error when trying to write the file <code>@fichier@</code>. As a site administrator, please',
665
+    'texte_inc_meta_2' => 'verify write permissions',
666
+    'texte_inc_meta_3' => 'of the directory <code>@repertoire@</code>.',
667
+    'texte_statut_en_cours_redaction' => 'editing in progress',
668
+    'texte_statut_poubelle' => 'to the dustbin',
669
+    'texte_statut_propose_evaluation' => 'submitted for evaluation',
670
+    'texte_statut_publie' => 'published online',
671
+    'texte_statut_refuse' => 'rejected',
672
+    'titre_ajouter_mot_cle' => 'ADD A KEYWORD:',
673
+    'titre_cadre_raccourcis' => 'SHORTCUTS:',
674
+    'titre_changer_couleur_interface' => 'Changing interface colour',
675
+    'titre_image_admin_article' => 'You can administrate this article',
676
+    'titre_image_administrateur' => 'Administrator',
677
+    'titre_image_aide' => 'Help on this item',
678
+    'titre_image_auteur_supprime' => 'Author deleted',
679
+    'titre_image_redacteur' => 'Editor without access',
680
+    'titre_image_redacteur_02' => 'Editor',
681
+    'titre_image_selecteur' => 'Display list',
682
+    'titre_image_visiteur' => 'Visitor',
683
+    'titre_joindre_document' => 'ATTACH A DOCUMENT',
684
+    'titre_mots_cles' => 'KEYWORDS',
685
+    'titre_probleme_technique' => 'Warning: a technical problem (SQL server) is preventing access to this part of the site. Thank you for your patience.',
686
+    'titre_publier_document' => 'PUBLISH A DOCUMENT IN THIS SECTION',
687
+    'titre_signatures_attente' => 'Signatures awaiting validation',
688
+    'titre_signatures_confirmees' => 'Signatures confirmed',
689
+    'titre_statistiques' => 'Site statistics',
690
+    'titre_titre_document' => 'Document title:',
691
+    'todo' => 'to come',
692
+    'trad_definir_reference' => 'Choose "@titre@" as a reference for translations',
693
+    'trad_reference' => '(reference for translations)',
694 694
 
695
-	// U
696
-	'upload_limit' => 'This file is too big for the server: the maximum size allowed for <i>upload</i> is @max@.',
695
+    // U
696
+    'upload_limit' => 'This file is too big for the server: the maximum size allowed for <i>upload</i> is @max@.',
697 697
 
698
-	// Z
699
-	'zbug_balise_b_aval' => ': B tag too late in loop',
700
-	'zbug_balise_inexistante' => 'Tag @balise@ wrongly declared for @from@',
701
-	'zbug_balise_sans_argument' => 'Missing argument in the @balise@ tag',
702
-	'zbug_boucle' => 'loop',
703
-	'zbug_boucle_recursive_undef' => 'undefined recursive loop: @nom@',
704
-	'zbug_calcul' => 'calculation',
705
-	'zbug_champ_hors_boucle' => 'Field @champ@ outside loop',
706
-	'zbug_champ_hors_critere' => 'Field @champ@ outside criterion @critere@',
707
-	'zbug_champ_hors_motif' => 'Field @champ@ outside context @motif@',
708
-	'zbug_code' => 'code',
709
-	'zbug_critere_inconnu' => 'Unknown criterion @critere@',
710
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} on a table without atomic primary key',
711
-	'zbug_distant_interdit' => 'External data forbidden',
712
-	'zbug_doublon_table_sans_cle_primaire' => 'Duplicate entries on a table which does not have a simple primary key',
713
-	'zbug_doublon_table_sans_index' => 'Duplicate entries on a table without an index',
714
-	'zbug_erreur_boucle_double' => 'Loop @id@: double definition',
715
-	'zbug_erreur_boucle_fermant' => 'Loop @id@: missing closing tag',
716
-	'zbug_erreur_boucle_syntaxe' => 'Syntax error in loop (BOUCLE)',
717
-	'zbug_erreur_compilation' => 'Compilation error',
718
-	'zbug_erreur_execution_page' => 'Execution error',
719
-	'zbug_erreur_filtre' => 'Undefined filter @filtre@',
720
-	'zbug_erreur_filtre_nbarg_min' => '@filtre@ filter: @nb@ argument(s) missing',
721
-	'zbug_erreur_meme_parent' => '{meme_parent} only applies to loops (FORUMS) and (RUBRIQUES)',
722
-	'zbug_erreur_squelette' => 'Error(s) in template',
723
-	'zbug_hors_compilation' => 'Uncompiled',
724
-	'zbug_info_erreur_squelette' => 'Error in the site',
725
-	'zbug_inversion_ordre_inexistant' => 'Reversion of non-existent order',
726
-	'zbug_pagination_sans_critere' => '#PAGINATION tag without {pagination} criterion, or used in a recursive loop',
727
-	'zbug_parametres_inclus_incorrects' => 'Wrong inclusion parameter: @param@',
728
-	'zbug_profile' => 'Calculation time: @time@',
729
-	'zbug_resultat' => 'result',
730
-	'zbug_serveur_indefini' => 'Undefined SQL server',
731
-	'zbug_statistiques' => 'SQL query statistics in order of duration',
732
-	'zbug_table_inconnue' => 'Unknown SQL table "@table@"',
733
-	'zxml_connus_attributs' => 'known attributes',
734
-	'zxml_de' => 'from',
735
-	'zxml_inconnu_attribut' => 'unknown attribute',
736
-	'zxml_inconnu_balise' => 'unknown tag',
737
-	'zxml_inconnu_entite' => 'unknown entity',
738
-	'zxml_inconnu_id' => 'unknown ID',
739
-	'zxml_mais_de' => 'but from',
740
-	'zxml_non_conforme' => 'not true to the principle',
741
-	'zxml_non_fils' => 'is not a child of',
742
-	'zxml_nonvide_balise' => 'tag not empty',
743
-	'zxml_obligatoire_attribut' => 'required attribute absent in',
744
-	'zxml_succession_fils_incorrecte' => 'incorrect child inheritance',
745
-	'zxml_survoler' => 'to see the correct ones, hover with the cursor',
746
-	'zxml_valeur_attribut' => 'attribute value',
747
-	'zxml_vide_balise' => 'empty tag',
748
-	'zxml_vu' => 'seen before',
698
+    // Z
699
+    'zbug_balise_b_aval' => ': B tag too late in loop',
700
+    'zbug_balise_inexistante' => 'Tag @balise@ wrongly declared for @from@',
701
+    'zbug_balise_sans_argument' => 'Missing argument in the @balise@ tag',
702
+    'zbug_boucle' => 'loop',
703
+    'zbug_boucle_recursive_undef' => 'undefined recursive loop: @nom@',
704
+    'zbug_calcul' => 'calculation',
705
+    'zbug_champ_hors_boucle' => 'Field @champ@ outside loop',
706
+    'zbug_champ_hors_critere' => 'Field @champ@ outside criterion @critere@',
707
+    'zbug_champ_hors_motif' => 'Field @champ@ outside context @motif@',
708
+    'zbug_code' => 'code',
709
+    'zbug_critere_inconnu' => 'Unknown criterion @critere@',
710
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} on a table without atomic primary key',
711
+    'zbug_distant_interdit' => 'External data forbidden',
712
+    'zbug_doublon_table_sans_cle_primaire' => 'Duplicate entries on a table which does not have a simple primary key',
713
+    'zbug_doublon_table_sans_index' => 'Duplicate entries on a table without an index',
714
+    'zbug_erreur_boucle_double' => 'Loop @id@: double definition',
715
+    'zbug_erreur_boucle_fermant' => 'Loop @id@: missing closing tag',
716
+    'zbug_erreur_boucle_syntaxe' => 'Syntax error in loop (BOUCLE)',
717
+    'zbug_erreur_compilation' => 'Compilation error',
718
+    'zbug_erreur_execution_page' => 'Execution error',
719
+    'zbug_erreur_filtre' => 'Undefined filter @filtre@',
720
+    'zbug_erreur_filtre_nbarg_min' => '@filtre@ filter: @nb@ argument(s) missing',
721
+    'zbug_erreur_meme_parent' => '{meme_parent} only applies to loops (FORUMS) and (RUBRIQUES)',
722
+    'zbug_erreur_squelette' => 'Error(s) in template',
723
+    'zbug_hors_compilation' => 'Uncompiled',
724
+    'zbug_info_erreur_squelette' => 'Error in the site',
725
+    'zbug_inversion_ordre_inexistant' => 'Reversion of non-existent order',
726
+    'zbug_pagination_sans_critere' => '#PAGINATION tag without {pagination} criterion, or used in a recursive loop',
727
+    'zbug_parametres_inclus_incorrects' => 'Wrong inclusion parameter: @param@',
728
+    'zbug_profile' => 'Calculation time: @time@',
729
+    'zbug_resultat' => 'result',
730
+    'zbug_serveur_indefini' => 'Undefined SQL server',
731
+    'zbug_statistiques' => 'SQL query statistics in order of duration',
732
+    'zbug_table_inconnue' => 'Unknown SQL table "@table@"',
733
+    'zxml_connus_attributs' => 'known attributes',
734
+    'zxml_de' => 'from',
735
+    'zxml_inconnu_attribut' => 'unknown attribute',
736
+    'zxml_inconnu_balise' => 'unknown tag',
737
+    'zxml_inconnu_entite' => 'unknown entity',
738
+    'zxml_inconnu_id' => 'unknown ID',
739
+    'zxml_mais_de' => 'but from',
740
+    'zxml_non_conforme' => 'not true to the principle',
741
+    'zxml_non_fils' => 'is not a child of',
742
+    'zxml_nonvide_balise' => 'tag not empty',
743
+    'zxml_obligatoire_attribut' => 'required attribute absent in',
744
+    'zxml_succession_fils_incorrecte' => 'incorrect child inheritance',
745
+    'zxml_survoler' => 'to see the correct ones, hover with the cursor',
746
+    'zxml_valeur_attribut' => 'attribute value',
747
+    'zxml_vide_balise' => 'empty tag',
748
+    'zxml_vu' => 'seen before',
749 749
 ];
Please login to merge, or discard this patch.
ecrire/lang/public_en.php 1 patch
Indentation   +114 added lines, -114 removed lines patch added patch discarded remove patch
@@ -5,118 +5,118 @@
 block discarded – undo
5 5
 
6 6
 return [
7 7
 
8
-	// A
9
-	'accueil_site' => 'Home',
10
-	'article' => 'Article',
11
-	'articles' => 'Articles',
12
-	'articles_auteur' => 'Articles by this author',
13
-	'articles_populaires' => 'Most popular articles',
14
-	'articles_rubrique' => 'Articles in this section',
15
-	'aucun_article' => 'No articles here',
16
-	'aucun_auteur' => 'No authors here',
17
-	'aucun_site' => 'No links here',
18
-	'aucune_breve' => 'No news items here',
19
-	'aucune_rubrique' => 'No sections here',
20
-	'auteur' => 'Author',
21
-	'autres' => 'Others',
22
-	'autres_breves' => 'Other news',
23
-	'autres_groupes_mots_clefs' => 'Other groups of keywords',
24
-	'autres_sites' => 'Other websites',
25
-
26
-	// B
27
-	'bonjour' => 'Hello',
28
-
29
-	// C
30
-	'commenter_site' => 'Comment on this site',
31
-	'contact' => 'Contact',
32
-	'copie_document_impossible' => 'Impossible to copy this document',
33
-
34
-	// D
35
-	'date' => 'Date',
36
-	'dernier_ajout' => 'Latest update',
37
-	'dernieres_breves' => 'Latest news',
38
-	'derniers_articles' => 'Latest articles',
39
-	'derniers_commentaires' => 'Latest comments',
40
-	'derniers_messages_forum' => 'Latest forum posts',
41
-
42
-	// E
43
-	'edition_mode_texte' => 'Text mode only',
44
-	'en_reponse' => 'Replying to:',
45
-	'en_resume' => 'Summary',
46
-	'envoyer_message' => 'Send a message',
47
-	'espace_prive' => 'Back-office',
48
-
49
-	// F
50
-	'formats_acceptes' => 'Valid formats: @formats@.',
51
-
52
-	// H
53
-	'hierarchie_site' => 'Site map',
54
-
55
-	// J
56
-	'jours' => 'days',
57
-
58
-	// L
59
-	'lien_connecter' => 'Log in',
60
-
61
-	// M
62
-	'meme_auteur' => 'By the same author',
63
-	'meme_rubrique' => 'Also in this section',
64
-	'memes_auteurs' => 'By the same authors',
65
-	'message' => 'Message',
66
-	'messages_forum' => 'Forum posts',
67
-	'messages_recents' => 'Most recent forum posts',
68
-	'mots_clef' => 'Keyword',
69
-	'mots_clefs' => 'Keywords',
70
-	'mots_clefs_meme_groupe' => 'Other keywords in this group',
71
-
72
-	// N
73
-	'navigation' => 'Browsing',
74
-	'nom' => 'Name',
75
-	'nouveautes' => 'What’s new',
76
-	'nouveautes_web' => 'What’s new on the Web',
77
-	'nouveaux_articles' => 'New articles',
78
-	'nouvelles_breves' => 'Latest news items',
79
-
80
-	// P
81
-	'page_precedente' => 'previous page',
82
-	'page_suivante' => 'next page',
83
-	'par_auteur' => 'by ',
84
-	'participer_site' => 'You can take active part in this website and write your own articles by signing up here. You will receive an email with your account information for the back-office of the site.',
85
-	'plan_site' => 'Site Map',
86
-	'popularite' => 'Popularity',
87
-	'poster_message' => 'Post a message',
88
-	'proposer_site' => 'You can suggest a website for inclusion in this section:',
89
-
90
-	// R
91
-	'repondre_article' => 'Comment on this article',
92
-	'repondre_breve' => 'Comment on this news item',
93
-	'resultats_recherche' => 'Search results',
94
-	'retour_debut_forums' => 'Back to forum top',
95
-	'rss_abonnement' => 'Simply copy the following URL into your aggregator:',
96
-	'rss_abonnement_titre' => 'Subscribe',
97
-	'rss_abonnement_titre_page' => 'Subscribe to',
98
-	'rss_explication' => 'An RSS thread collects information about a site’s update. It delivers the content of the tickets or the comments or an extract of them, as well as a link to the full versions et some other information. This thread is to be read by an RSS aggregator.',
99
-	'rss_explication_titre' => 'What is an RSS feed?',
100
-	'rubrique' => 'Section',
101
-	'rubriques' => 'Sections',
102
-
103
-	// S
104
-	'signatures_petition' => 'Signatures',
105
-	'site_realise_avec_spip' => 'Site powered by SPIP',
106
-	'sites_web' => 'Websites',
107
-	'sous_rubriques' => 'Subsections',
108
-	'spam' => 'Spam',
109
-	'suite' => 'continue',
110
-	'sur_web' => 'Around the Web',
111
-	'syndiquer_rubrique' => 'Subscribe to this section',
112
-	'syndiquer_site' => 'Subscribe to the whole site',
113
-
114
-	// T
115
-	'texte_lettre_information' => 'Here is the site newsletter',
116
-	'texte_lettre_information_2' => 'This site contains news items published since',
117
-
118
-	// V
119
-	'ver_imprimer' => 'Printable version',
120
-	'voir_en_ligne' => 'View online',
121
-	'voir_squelette' => 'show the template of this page',
8
+    // A
9
+    'accueil_site' => 'Home',
10
+    'article' => 'Article',
11
+    'articles' => 'Articles',
12
+    'articles_auteur' => 'Articles by this author',
13
+    'articles_populaires' => 'Most popular articles',
14
+    'articles_rubrique' => 'Articles in this section',
15
+    'aucun_article' => 'No articles here',
16
+    'aucun_auteur' => 'No authors here',
17
+    'aucun_site' => 'No links here',
18
+    'aucune_breve' => 'No news items here',
19
+    'aucune_rubrique' => 'No sections here',
20
+    'auteur' => 'Author',
21
+    'autres' => 'Others',
22
+    'autres_breves' => 'Other news',
23
+    'autres_groupes_mots_clefs' => 'Other groups of keywords',
24
+    'autres_sites' => 'Other websites',
25
+
26
+    // B
27
+    'bonjour' => 'Hello',
28
+
29
+    // C
30
+    'commenter_site' => 'Comment on this site',
31
+    'contact' => 'Contact',
32
+    'copie_document_impossible' => 'Impossible to copy this document',
33
+
34
+    // D
35
+    'date' => 'Date',
36
+    'dernier_ajout' => 'Latest update',
37
+    'dernieres_breves' => 'Latest news',
38
+    'derniers_articles' => 'Latest articles',
39
+    'derniers_commentaires' => 'Latest comments',
40
+    'derniers_messages_forum' => 'Latest forum posts',
41
+
42
+    // E
43
+    'edition_mode_texte' => 'Text mode only',
44
+    'en_reponse' => 'Replying to:',
45
+    'en_resume' => 'Summary',
46
+    'envoyer_message' => 'Send a message',
47
+    'espace_prive' => 'Back-office',
48
+
49
+    // F
50
+    'formats_acceptes' => 'Valid formats: @formats@.',
51
+
52
+    // H
53
+    'hierarchie_site' => 'Site map',
54
+
55
+    // J
56
+    'jours' => 'days',
57
+
58
+    // L
59
+    'lien_connecter' => 'Log in',
60
+
61
+    // M
62
+    'meme_auteur' => 'By the same author',
63
+    'meme_rubrique' => 'Also in this section',
64
+    'memes_auteurs' => 'By the same authors',
65
+    'message' => 'Message',
66
+    'messages_forum' => 'Forum posts',
67
+    'messages_recents' => 'Most recent forum posts',
68
+    'mots_clef' => 'Keyword',
69
+    'mots_clefs' => 'Keywords',
70
+    'mots_clefs_meme_groupe' => 'Other keywords in this group',
71
+
72
+    // N
73
+    'navigation' => 'Browsing',
74
+    'nom' => 'Name',
75
+    'nouveautes' => 'What’s new',
76
+    'nouveautes_web' => 'What’s new on the Web',
77
+    'nouveaux_articles' => 'New articles',
78
+    'nouvelles_breves' => 'Latest news items',
79
+
80
+    // P
81
+    'page_precedente' => 'previous page',
82
+    'page_suivante' => 'next page',
83
+    'par_auteur' => 'by ',
84
+    'participer_site' => 'You can take active part in this website and write your own articles by signing up here. You will receive an email with your account information for the back-office of the site.',
85
+    'plan_site' => 'Site Map',
86
+    'popularite' => 'Popularity',
87
+    'poster_message' => 'Post a message',
88
+    'proposer_site' => 'You can suggest a website for inclusion in this section:',
89
+
90
+    // R
91
+    'repondre_article' => 'Comment on this article',
92
+    'repondre_breve' => 'Comment on this news item',
93
+    'resultats_recherche' => 'Search results',
94
+    'retour_debut_forums' => 'Back to forum top',
95
+    'rss_abonnement' => 'Simply copy the following URL into your aggregator:',
96
+    'rss_abonnement_titre' => 'Subscribe',
97
+    'rss_abonnement_titre_page' => 'Subscribe to',
98
+    'rss_explication' => 'An RSS thread collects information about a site’s update. It delivers the content of the tickets or the comments or an extract of them, as well as a link to the full versions et some other information. This thread is to be read by an RSS aggregator.',
99
+    'rss_explication_titre' => 'What is an RSS feed?',
100
+    'rubrique' => 'Section',
101
+    'rubriques' => 'Sections',
102
+
103
+    // S
104
+    'signatures_petition' => 'Signatures',
105
+    'site_realise_avec_spip' => 'Site powered by SPIP',
106
+    'sites_web' => 'Websites',
107
+    'sous_rubriques' => 'Subsections',
108
+    'spam' => 'Spam',
109
+    'suite' => 'continue',
110
+    'sur_web' => 'Around the Web',
111
+    'syndiquer_rubrique' => 'Subscribe to this section',
112
+    'syndiquer_site' => 'Subscribe to the whole site',
113
+
114
+    // T
115
+    'texte_lettre_information' => 'Here is the site newsletter',
116
+    'texte_lettre_information_2' => 'This site contains news items published since',
117
+
118
+    // V
119
+    'ver_imprimer' => 'Printable version',
120
+    'voir_en_ligne' => 'View online',
121
+    'voir_squelette' => 'show the template of this page',
122 122
 ];
Please login to merge, or discard this patch.
ecrire/tests/Texte/CouperTest.php 1 patch
Indentation   +65 added lines, -65 removed lines patch added patch discarded remove patch
@@ -13,74 +13,74 @@
 block discarded – undo
13 13
 
14 14
 class CouperTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('inc/texte_mini.php', '', true);
18
-		find_in_path('inc/filtres.php', '', true);
19
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('inc/texte_mini.php', '', true);
18
+        find_in_path('inc/filtres.php', '', true);
19
+    }
20 20
 
21
-	#[DataProvider('providerCouper')]
22
-	public function testCouper($length_expected, $exact, ...$args): void {
23
-		$actual = couper(...$args);
24
-		$length_actual = spip_strlen(filtrer_entites($actual));
25
-		if ($exact) {
26
-			$this->assertEquals($length_expected, $length_actual);
27
-		} else {
28
-			$this->assertLessThanOrEqual($length_expected, $length_actual);
29
-		}
30
-	}
21
+    #[DataProvider('providerCouper')]
22
+    public function testCouper($length_expected, $exact, ...$args): void {
23
+        $actual = couper(...$args);
24
+        $length_actual = spip_strlen(filtrer_entites($actual));
25
+        if ($exact) {
26
+            $this->assertEquals($length_expected, $length_actual);
27
+        } else {
28
+            $this->assertLessThanOrEqual($length_expected, $length_actual);
29
+        }
30
+    }
31 31
 
32
-	public static function providerCouper(): array {
33
-		find_in_path('inc/charsets.php', '', true);
34
-		find_in_path('inc/filtres.php', '', true);
32
+    public static function providerCouper(): array {
33
+        find_in_path('inc/charsets.php', '', true);
34
+        find_in_path('inc/filtres.php', '', true);
35 35
 
36
-		// Phrases de test et éventuel texte de suite.
37
-		$data = [
38
-			'txt1' => ['Une phrase pour tester le filtre |couper bla bli blu'],
39
-			'txt1suite' => ['Une phrase pour tester le filtre |couper bla bli blu', '&nbsp;(etc.)'],
40
-			'txt2' => ['Tést àvéc plêïn d’àççènts bla bli blu'],
41
-			'txt2suite' => ['Tést àvéc plêïn d’àççènts bla bli blu', '&nbsp;(etc.)'],
42
-			'txt3' => ['Supercalifragilisticexpialidocious'],
43
-			'txt3suite' => ['Supercalifragilisticexpialidocious', '&nbsp;(etc.)'],
44
-			'txt4' => ["Un test du filtre |couper\n\navec deux paragraphes"],
45
-			'txt4suite' => ["Un test du filtre |couper\n\navec deux paragraphes", '&nbsp;(etc.)'],
46
-			'txt5' => ['<p>Un test du filtre |couper</p><p>avec deux paragraphes</p>'],
47
-			'txt5suite' => ['<p>Un test du filtre |couper</p><p>avec deux paragraphes</p>', '&nbsp;(etc.)'],
48
-			'txt6' => [
49
-				'Articlé "illustré" : imagés ’céntrées’ avèc un titre long voir très long mais vraiment très long avec dés àçènts',
50
-			],
51
-			'txt6suite' => [
52
-				'Articlé "illustré" : imagés ’céntrées’ avèc un titre long voir très long mais vraiment très long avec dés àçènts',
53
-				'&nbsp;(etc.)',
54
-			],
55
-			'txt7' => ['Article : avec des espaces insecable ; challenge ?'],
56
-			'txt7suite' => ['Article : avec des espaces insecable ; challenge ?', '&nbsp;(etc.)'],
57
-		];
58
-		// Pour chaque phrase de test, itérer sur toutes les longueurs de coupe
59
-		// possibles.
60
-		$tests = [];
61
-		foreach ($data as $i => &$args) {
62
-			$texte = $args[0];
63
-			$suite = $args[1] ?? null;
64
-			$taille_texte = spip_strlen($texte);
65
-			// si la phrase contient du html on aura jamais la longueur exacte d'origine après une coupe
66
-			$exact_si_pluslong = (strlen($texte) === strlen(strip_tags($texte)));
67
-			for ($taille = 1; $taille <= $taille_texte + 10; $taille++) {
68
-				if ($taille < $taille_texte) {
69
-					$tests["{$i}_L$taille"] = [$taille, false, $texte, $taille, $suite];
70
-				} else {
71
-					$tests["{$i}_L{$taille}"] = [$taille_texte, $exact_si_pluslong, $texte, $taille, $suite];
72
-				}
73
-			}
74
-		}
36
+        // Phrases de test et éventuel texte de suite.
37
+        $data = [
38
+            'txt1' => ['Une phrase pour tester le filtre |couper bla bli blu'],
39
+            'txt1suite' => ['Une phrase pour tester le filtre |couper bla bli blu', '&nbsp;(etc.)'],
40
+            'txt2' => ['Tést àvéc plêïn d’àççènts bla bli blu'],
41
+            'txt2suite' => ['Tést àvéc plêïn d’àççènts bla bli blu', '&nbsp;(etc.)'],
42
+            'txt3' => ['Supercalifragilisticexpialidocious'],
43
+            'txt3suite' => ['Supercalifragilisticexpialidocious', '&nbsp;(etc.)'],
44
+            'txt4' => ["Un test du filtre |couper\n\navec deux paragraphes"],
45
+            'txt4suite' => ["Un test du filtre |couper\n\navec deux paragraphes", '&nbsp;(etc.)'],
46
+            'txt5' => ['<p>Un test du filtre |couper</p><p>avec deux paragraphes</p>'],
47
+            'txt5suite' => ['<p>Un test du filtre |couper</p><p>avec deux paragraphes</p>', '&nbsp;(etc.)'],
48
+            'txt6' => [
49
+                'Articlé "illustré" : imagés ’céntrées’ avèc un titre long voir très long mais vraiment très long avec dés àçènts',
50
+            ],
51
+            'txt6suite' => [
52
+                'Articlé "illustré" : imagés ’céntrées’ avèc un titre long voir très long mais vraiment très long avec dés àçènts',
53
+                '&nbsp;(etc.)',
54
+            ],
55
+            'txt7' => ['Article : avec des espaces insecable ; challenge ?'],
56
+            'txt7suite' => ['Article : avec des espaces insecable ; challenge ?', '&nbsp;(etc.)'],
57
+        ];
58
+        // Pour chaque phrase de test, itérer sur toutes les longueurs de coupe
59
+        // possibles.
60
+        $tests = [];
61
+        foreach ($data as $i => &$args) {
62
+            $texte = $args[0];
63
+            $suite = $args[1] ?? null;
64
+            $taille_texte = spip_strlen($texte);
65
+            // si la phrase contient du html on aura jamais la longueur exacte d'origine après une coupe
66
+            $exact_si_pluslong = (strlen($texte) === strlen(strip_tags($texte)));
67
+            for ($taille = 1; $taille <= $taille_texte + 10; $taille++) {
68
+                if ($taille < $taille_texte) {
69
+                    $tests["{$i}_L$taille"] = [$taille, false, $texte, $taille, $suite];
70
+                } else {
71
+                    $tests["{$i}_L{$taille}"] = [$taille_texte, $exact_si_pluslong, $texte, $taille, $suite];
72
+                }
73
+            }
74
+        }
75 75
 
76
-		$tests['utf_4byteschars'] = [
77
-			900,
78
-			true,
79
-			'
Please login to merge, or discard this patch.