Completed
Push — master ( fb0017...92433c )
by cam
01:14
created
ecrire/src/Texte/Collecteur/AbstractCollecteur.php 3 patches
Indentation   +149 added lines, -149 removed lines patch added patch discarded remove patch
@@ -14,154 +14,154 @@
 block discarded – undo
14 14
 
15 15
 abstract class AbstractCollecteur {
16 16
 
17
-	protected static string $markPrefix = 'COLLECT';
18
-	protected string $markId;
19
-
20
-	/**
21
-	 * Collecteur générique des occurences d'une preg dans un texte avec leurs positions et longueur
22
-	 * @param string $texte
23
-	 *   texte à analyser pour la collecte
24
-	 * @param string $if_chars
25
-	 *   caractere(s) à tester avant de tenter la preg
26
-	 * @param string $start_with
27
-	 *   caractere(s) par lesquels commencent l'expression recherchée (permet de démarrer la preg à la prochaine occurence de cette chaine)
28
-	 * @param string $preg
29
-	 *   preg utilisée pour la collecte
30
-	 * @param int $max_items
31
-	 *   pour limiter le nombre de preg collectée (pour la detection simple de présence par exemple)
32
-	 * @return array
33
-	 */
34
-	protected static function collecteur(string $texte, string $if_chars, string $start_with, string $preg, int $max_items = 0): array {
35
-
36
-		$collection = [];
37
-		$pos = 0;
38
-		while (
39
-			(!$if_chars || strpos($texte, $if_chars, $pos) !== false)
40
-			and ($next = ($start_with ? strpos($texte, $start_with, $pos) : $pos)) !== false
41
-			and preg_match($preg, $texte, $r, PREG_OFFSET_CAPTURE, $next)) {
42
-
43
-			$found_pos = $r[0][1];
44
-			$found_length = strlen($r[0][0]);
45
-			$match = [
46
-				'raw' => $r[0][0],
47
-				'match' => array_column($r, 0),
48
-				'pos' => $found_pos,
49
-				'length' => $found_length
50
-			];
51
-
52
-			$collection[] = $match;
53
-
54
-			if ($max_items and count($collection) === $max_items) {
55
-				break;
56
-			}
57
-
58
-			$pos = $match['pos'] + $match['length'];
59
-		}
60
-
61
-		return $collection;
62
-	}
63
-
64
-	/**
65
-	 * Sanitizer une collection d'occurences
66
-	 *
67
-	 * @param array $collection
68
-	 * @param string $sanitize_callback
69
-	 * @return array
70
-	 */
71
-	protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
72
-		foreach ($collection as &$c) {
73
-			$c['raw'] = $sanitize_callback($c['raw']);
74
-		}
75
-
76
-		return $collection;
77
-	}
78
-
79
-	/**
80
-	 * @param string $texte
81
-	 * @param array $options
82
-	 * @return array
83
-	 */
84
-	public function collecter(string $texte, array $options = []): array {
85
-		$collection = [];
86
-		return $collection;
87
-	}
88
-
89
-	public function detecter($texte): bool {
90
-		if (!empty($this->markId) and strpos($texte, $this->markId) !== false) {
91
-			return true;
92
-		}
93
-		return !empty($this->collecter($texte, ['detecter_presence' => true]));
94
-	}
95
-
96
-	/**
97
-	 * Echapper les occurences de la collecte par un texte neutre du point de vue HTML
98
-	 *
99
-	 * @see retablir()
100
-	 * @param string $texte
101
-	 * @param array $options
102
-	 *   string $sanitize_callback
103
-	 * @return array
104
-	 *   texte, marqueur utilise pour echapper les modeles
105
-	 */
106
-	public function echapper(string $texte, array $options = []): string {
107
-		if (!function_exists('creer_uniqid')) {
108
-			include_spip('inc/acces');
109
-		}
110
-
111
-		$collection = $this->collecter($texte, $options);
112
-		if (!empty($options['sanitize_callback']) and is_callable($options['sanitize_callback'])) {
113
-			$collection = $this->sanitizer_collection($collection, $options['sanitize_callback']);
114
-		}
115
-
116
-		if (!empty($collection)) {
117
-			if (empty($this->markId)) {
118
-				// generer un marqueur qui n'existe pas dans le texte
119
-				do {
120
-					$this->markId = substr(md5(uniqid(static::class, 1)), 0, 7);
121
-					$this->markId = "@|".static::$markPrefix . $this->markId . "|";
122
-				} while (strpos($texte, $this->markId) !== false);
123
-			}
124
-
125
-			$offset_pos = 0;
126
-			foreach ($collection as $c) {
127
-				$rempl = $this->markId . base64_encode($c['raw']) . '|@';
128
-				$texte = substr_replace($texte, $rempl, $c['pos'] + $offset_pos, $c['length']);
129
-				$offset_pos += strlen($rempl) - $c['length'];
130
-			}
131
-		}
132
-
133
-		return $texte;
134
-	}
135
-
136
-
137
-	/**
138
-	 * Retablir les occurences échappées précédemment
139
-	 *
140
-	 * @see echapper()
141
-	 * @param string $texte
142
-	 * @return string
143
-	 */
144
-	function retablir(string $texte): string {
145
-
146
-		if (!empty($this->markId)) {
147
-			$lm = strlen($this->markId);
148
-			$pos = 0;
149
-			while (
150
-				($p = strpos($texte, $this->markId, $pos)) !== false
151
-				and $end = strpos($texte, '|@', $p + $lm)
152
-			) {
153
-				$base64 = substr($texte, $p + $lm, $end - ($p + $lm));
154
-				if ($c = base64_decode($base64, true)) {
155
-					$texte = substr_replace($texte, $c, $p, $end + 2 - $p);
156
-					$pos = $p + strlen($c);
157
-				}
158
-				else {
159
-					$pos = $end;
160
-				}
161
-			}
162
-		}
163
-
164
-		return $texte;
165
-	}
17
+    protected static string $markPrefix = 'COLLECT';
18
+    protected string $markId;
19
+
20
+    /**
21
+     * Collecteur générique des occurences d'une preg dans un texte avec leurs positions et longueur
22
+     * @param string $texte
23
+     *   texte à analyser pour la collecte
24
+     * @param string $if_chars
25
+     *   caractere(s) à tester avant de tenter la preg
26
+     * @param string $start_with
27
+     *   caractere(s) par lesquels commencent l'expression recherchée (permet de démarrer la preg à la prochaine occurence de cette chaine)
28
+     * @param string $preg
29
+     *   preg utilisée pour la collecte
30
+     * @param int $max_items
31
+     *   pour limiter le nombre de preg collectée (pour la detection simple de présence par exemple)
32
+     * @return array
33
+     */
34
+    protected static function collecteur(string $texte, string $if_chars, string $start_with, string $preg, int $max_items = 0): array {
35
+
36
+        $collection = [];
37
+        $pos = 0;
38
+        while (
39
+            (!$if_chars || strpos($texte, $if_chars, $pos) !== false)
40
+            and ($next = ($start_with ? strpos($texte, $start_with, $pos) : $pos)) !== false
41
+            and preg_match($preg, $texte, $r, PREG_OFFSET_CAPTURE, $next)) {
42
+
43
+            $found_pos = $r[0][1];
44
+            $found_length = strlen($r[0][0]);
45
+            $match = [
46
+                'raw' => $r[0][0],
47
+                'match' => array_column($r, 0),
48
+                'pos' => $found_pos,
49
+                'length' => $found_length
50
+            ];
51
+
52
+            $collection[] = $match;
53
+
54
+            if ($max_items and count($collection) === $max_items) {
55
+                break;
56
+            }
57
+
58
+            $pos = $match['pos'] + $match['length'];
59
+        }
60
+
61
+        return $collection;
62
+    }
63
+
64
+    /**
65
+     * Sanitizer une collection d'occurences
66
+     *
67
+     * @param array $collection
68
+     * @param string $sanitize_callback
69
+     * @return array
70
+     */
71
+    protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
72
+        foreach ($collection as &$c) {
73
+            $c['raw'] = $sanitize_callback($c['raw']);
74
+        }
75
+
76
+        return $collection;
77
+    }
78
+
79
+    /**
80
+     * @param string $texte
81
+     * @param array $options
82
+     * @return array
83
+     */
84
+    public function collecter(string $texte, array $options = []): array {
85
+        $collection = [];
86
+        return $collection;
87
+    }
88
+
89
+    public function detecter($texte): bool {
90
+        if (!empty($this->markId) and strpos($texte, $this->markId) !== false) {
91
+            return true;
92
+        }
93
+        return !empty($this->collecter($texte, ['detecter_presence' => true]));
94
+    }
95
+
96
+    /**
97
+     * Echapper les occurences de la collecte par un texte neutre du point de vue HTML
98
+     *
99
+     * @see retablir()
100
+     * @param string $texte
101
+     * @param array $options
102
+     *   string $sanitize_callback
103
+     * @return array
104
+     *   texte, marqueur utilise pour echapper les modeles
105
+     */
106
+    public function echapper(string $texte, array $options = []): string {
107
+        if (!function_exists('creer_uniqid')) {
108
+            include_spip('inc/acces');
109
+        }
110
+
111
+        $collection = $this->collecter($texte, $options);
112
+        if (!empty($options['sanitize_callback']) and is_callable($options['sanitize_callback'])) {
113
+            $collection = $this->sanitizer_collection($collection, $options['sanitize_callback']);
114
+        }
115
+
116
+        if (!empty($collection)) {
117
+            if (empty($this->markId)) {
118
+                // generer un marqueur qui n'existe pas dans le texte
119
+                do {
120
+                    $this->markId = substr(md5(uniqid(static::class, 1)), 0, 7);
121
+                    $this->markId = "@|".static::$markPrefix . $this->markId . "|";
122
+                } while (strpos($texte, $this->markId) !== false);
123
+            }
124
+
125
+            $offset_pos = 0;
126
+            foreach ($collection as $c) {
127
+                $rempl = $this->markId . base64_encode($c['raw']) . '|@';
128
+                $texte = substr_replace($texte, $rempl, $c['pos'] + $offset_pos, $c['length']);
129
+                $offset_pos += strlen($rempl) - $c['length'];
130
+            }
131
+        }
132
+
133
+        return $texte;
134
+    }
135
+
136
+
137
+    /**
138
+     * Retablir les occurences échappées précédemment
139
+     *
140
+     * @see echapper()
141
+     * @param string $texte
142
+     * @return string
143
+     */
144
+    function retablir(string $texte): string {
145
+
146
+        if (!empty($this->markId)) {
147
+            $lm = strlen($this->markId);
148
+            $pos = 0;
149
+            while (
150
+                ($p = strpos($texte, $this->markId, $pos)) !== false
151
+                and $end = strpos($texte, '|@', $p + $lm)
152
+            ) {
153
+                $base64 = substr($texte, $p + $lm, $end - ($p + $lm));
154
+                if ($c = base64_decode($base64, true)) {
155
+                    $texte = substr_replace($texte, $c, $p, $end + 2 - $p);
156
+                    $pos = $p + strlen($c);
157
+                }
158
+                else {
159
+                    $pos = $end;
160
+                }
161
+            }
162
+        }
163
+
164
+        return $texte;
165
+    }
166 166
 
167 167
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -118,13 +118,13 @@
 block discarded – undo
118 118
 				// generer un marqueur qui n'existe pas dans le texte
119 119
 				do {
120 120
 					$this->markId = substr(md5(uniqid(static::class, 1)), 0, 7);
121
-					$this->markId = "@|".static::$markPrefix . $this->markId . "|";
121
+					$this->markId = "@|".static::$markPrefix.$this->markId."|";
122 122
 				} while (strpos($texte, $this->markId) !== false);
123 123
 			}
124 124
 
125 125
 			$offset_pos = 0;
126 126
 			foreach ($collection as $c) {
127
-				$rempl = $this->markId . base64_encode($c['raw']) . '|@';
127
+				$rempl = $this->markId.base64_encode($c['raw']).'|@';
128 128
 				$texte = substr_replace($texte, $rempl, $c['pos'] + $offset_pos, $c['length']);
129 129
 				$offset_pos += strlen($rempl) - $c['length'];
130 130
 			}
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -154,8 +154,7 @@
 block discarded – undo
154 154
 				if ($c = base64_decode($base64, true)) {
155 155
 					$texte = substr_replace($texte, $c, $p, $end + 2 - $p);
156 156
 					$pos = $p + strlen($c);
157
-				}
158
-				else {
157
+				} else {
159 158
 					$pos = $end;
160 159
 				}
161 160
 			}
Please login to merge, or discard this patch.
ecrire/src/Texte/Collecteur/Idiomes.php 2 patches
Indentation   +110 added lines, -110 removed lines patch added patch discarded remove patch
@@ -23,115 +23,115 @@
 block discarded – undo
23 23
  */
24 24
 class Idiomes extends AbstractCollecteur {
25 25
 
26
-	protected static string $markPrefix = 'IDIOME';
27
-
28
-	/**
29
-	 * La preg pour découper et collecter les modèles
30
-	 * @var string
31
-	 */
32
-	protected string $preg_idiome;
33
-
34
-	public function __construct(?string $preg = null) {
35
-
36
-		$this->preg_idiome = ($preg ?: '@<:(?:([a-z0-9_]+):)?([a-z0-9_]+):>@isS');
37
-	}
38
-
39
-	/**
40
-	 * Sanitizer une collection d'occurences d'idiomes : on ne fait rien
41
-	 *
42
-	 * @param array $collection
43
-	 * @param string $sanitize_callback
44
-	 * @return array
45
-	 */
46
-	protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
47
-
48
-		return $collection;
49
-	}
50
-
51
-
52
-	/**
53
-	 * @param string $texte
54
-	 * @param array $options
55
-	 *   bool $collecter_liens
56
-	 * @return array
57
-	 */
58
-	public function collecter(string $texte, array $options = []): array {
59
-		if (!$texte) {
60
-			return [];
61
-		}
62
-
63
-		// collecter les matchs de la preg
64
-		$idiomes = $this->collecteur($texte, '', '<:', $this->preg_idiome, empty($options['detecter_presence']) ? 0 : 1);
65
-
66
-		// si on veut seulement detecter la présence, on peut retourner tel quel
67
-		if (empty($options['detecter_presence'])) {
68
-
69
-			$pos_prev = 0;
70
-			foreach ($idiomes as $k => &$idiome) {
71
-
72
-				$idiome['module'] = $idiome['match'][1];
73
-				$idiome['chaine'] = $idiome['match'][2];
74
-			}
75
-		}
76
-
77
-		return $idiomes;
78
-	}
79
-
80
-	/**
81
-	 * Traiter les idiomes d'un texte
82
-	 *
83
-	 * @uses inc_traduire_dist()
84
-	 * @uses code_echappement()
85
-	 * @uses echappe_retour()
86
-	 *
87
-	 * @param string $texte
88
-	 * @param array $options
89
-	 *   ?string $lang
90
-	 *   ?bool echappe_span
91
-	 * @return string
92
-	 */
93
-	public function traiter(string $texte, array $options) {
94
-		static $traduire;
95
-		if ($texte) {
96
-
97
-			$idiomes = $this->collecter($texte);
98
-			if (!empty($idiomes)) {
99
-				$lang = $options['lang'] ?? $GLOBALS['spip_lang'];
100
-				$echappe_span = $options['echappe_span'] ?? false;
101
-
102
-				if (is_null($traduire)) {
103
-					$traduire = charger_fonction('traduire', 'inc');
104
-					include_spip('inc/lang');
105
-				}
106
-
107
-				$offset_pos = 0;
108
-				foreach ($idiomes as $idiome) {
109
-
110
-					$cle = ($idiome['module'] ? $idiome['module'] . ':' : '') . $idiome['chaine'];
111
-					$desc = $traduire($cle, $lang, true);
112
-					$l = $desc->langue;
113
-
114
-					// si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
115
-					if (strlen($desc->texte ?? '')) {
116
-						$trad = code_echappement($desc->texte, 'idiome', false);
117
-						if ($l !== $lang) {
118
-							$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
119
-						}
120
-						if (lang_dir($l) !== lang_dir($lang)) {
121
-							$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
122
-						}
123
-						if (!$echappe_span) {
124
-							$trad = echappe_retour($trad, 'idiome');
125
-						}
126
-						$texte = substr_replace($texte, $trad, $idiome['pos'] + $offset_pos, $idiome['length']);
127
-						$offset_pos += strlen($trad) - $idiome['length'];
128
-					}
129
-
130
-				}
131
-			}
132
-		}
133
-
134
-		return $texte;
135
-	}
26
+    protected static string $markPrefix = 'IDIOME';
27
+
28
+    /**
29
+     * La preg pour découper et collecter les modèles
30
+     * @var string
31
+     */
32
+    protected string $preg_idiome;
33
+
34
+    public function __construct(?string $preg = null) {
35
+
36
+        $this->preg_idiome = ($preg ?: '@<:(?:([a-z0-9_]+):)?([a-z0-9_]+):>@isS');
37
+    }
38
+
39
+    /**
40
+     * Sanitizer une collection d'occurences d'idiomes : on ne fait rien
41
+     *
42
+     * @param array $collection
43
+     * @param string $sanitize_callback
44
+     * @return array
45
+     */
46
+    protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
47
+
48
+        return $collection;
49
+    }
50
+
51
+
52
+    /**
53
+     * @param string $texte
54
+     * @param array $options
55
+     *   bool $collecter_liens
56
+     * @return array
57
+     */
58
+    public function collecter(string $texte, array $options = []): array {
59
+        if (!$texte) {
60
+            return [];
61
+        }
62
+
63
+        // collecter les matchs de la preg
64
+        $idiomes = $this->collecteur($texte, '', '<:', $this->preg_idiome, empty($options['detecter_presence']) ? 0 : 1);
65
+
66
+        // si on veut seulement detecter la présence, on peut retourner tel quel
67
+        if (empty($options['detecter_presence'])) {
68
+
69
+            $pos_prev = 0;
70
+            foreach ($idiomes as $k => &$idiome) {
71
+
72
+                $idiome['module'] = $idiome['match'][1];
73
+                $idiome['chaine'] = $idiome['match'][2];
74
+            }
75
+        }
76
+
77
+        return $idiomes;
78
+    }
79
+
80
+    /**
81
+     * Traiter les idiomes d'un texte
82
+     *
83
+     * @uses inc_traduire_dist()
84
+     * @uses code_echappement()
85
+     * @uses echappe_retour()
86
+     *
87
+     * @param string $texte
88
+     * @param array $options
89
+     *   ?string $lang
90
+     *   ?bool echappe_span
91
+     * @return string
92
+     */
93
+    public function traiter(string $texte, array $options) {
94
+        static $traduire;
95
+        if ($texte) {
96
+
97
+            $idiomes = $this->collecter($texte);
98
+            if (!empty($idiomes)) {
99
+                $lang = $options['lang'] ?? $GLOBALS['spip_lang'];
100
+                $echappe_span = $options['echappe_span'] ?? false;
101
+
102
+                if (is_null($traduire)) {
103
+                    $traduire = charger_fonction('traduire', 'inc');
104
+                    include_spip('inc/lang');
105
+                }
106
+
107
+                $offset_pos = 0;
108
+                foreach ($idiomes as $idiome) {
109
+
110
+                    $cle = ($idiome['module'] ? $idiome['module'] . ':' : '') . $idiome['chaine'];
111
+                    $desc = $traduire($cle, $lang, true);
112
+                    $l = $desc->langue;
113
+
114
+                    // si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
115
+                    if (strlen($desc->texte ?? '')) {
116
+                        $trad = code_echappement($desc->texte, 'idiome', false);
117
+                        if ($l !== $lang) {
118
+                            $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
119
+                        }
120
+                        if (lang_dir($l) !== lang_dir($lang)) {
121
+                            $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
122
+                        }
123
+                        if (!$echappe_span) {
124
+                            $trad = echappe_retour($trad, 'idiome');
125
+                        }
126
+                        $texte = substr_replace($texte, $trad, $idiome['pos'] + $offset_pos, $idiome['length']);
127
+                        $offset_pos += strlen($trad) - $idiome['length'];
128
+                    }
129
+
130
+                }
131
+            }
132
+        }
133
+
134
+        return $texte;
135
+    }
136 136
 
137 137
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -107,7 +107,7 @@
 block discarded – undo
107 107
 				$offset_pos = 0;
108 108
 				foreach ($idiomes as $idiome) {
109 109
 
110
-					$cle = ($idiome['module'] ? $idiome['module'] . ':' : '') . $idiome['chaine'];
110
+					$cle = ($idiome['module'] ? $idiome['module'].':' : '').$idiome['chaine'];
111 111
 					$desc = $traduire($cle, $lang, true);
112 112
 					$l = $desc->langue;
113 113
 
Please login to merge, or discard this patch.
ecrire/src/Texte/Collecteur/Modeles.php 2 patches
Indentation   +197 added lines, -197 removed lines patch added patch discarded remove patch
@@ -22,202 +22,202 @@
 block discarded – undo
22 22
  */
23 23
 class Modeles extends AbstractCollecteur {
24 24
 
25
-	protected static string $markPrefix = 'MODELE';
26
-
27
-	/**
28
-	 * La preg pour découper et collecter les modèles
29
-	 * @var string
30
-	 */
31
-	protected string $preg_modele;
32
-
33
-	public function __construct(?string $preg = null) {
34
-
35
-		$this->preg_modele = ($preg ?:
36
-			'@<([a-z_-]{3,})' # <modele
37
-			. '\s*([0-9]*)\s*' # id
38
-			. '([|](?:<[^<>]*>|[^>])*?)?' # |arguments (y compris des tags <...>)
39
-			. '\s*/?' . '>@isS' # fin du modele >
40
-		);
41
-	}
42
-
43
-	/**
44
-	 * Sanitizer une collection d'occurences de modèle : on ne fait rien
45
-	 *
46
-	 * @param array $collection
47
-	 * @param string $sanitize_callback
48
-	 * @return array
49
-	 */
50
-	protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
51
-
52
-		return $collection;
53
-	}
54
-
55
-	/**
56
-	 * @param string $texte
57
-	 * @param array $options
58
-	 *   bool $collecter_liens
59
-	 * @return array
60
-	 */
61
-	public function collecter(string $texte, array $options = []): array {
62
-		if (!$texte) {
63
-			return [];
64
-		}
65
-
66
-		// collecter les matchs de la preg
67
-		$modeles = $this->collecteur($texte, '', '<', $this->preg_modele);
68
-
69
-		$pos_prev = 0;
70
-		foreach ($modeles as $k => &$modele) {
71
-			$pos = $modele['pos'];
72
-			$modele['type'] = $modele['match'][1];
73
-			$modele['id'] = $modele['match'][2] ?? '';
74
-			$modele['params'] = $modele['match'][3] ?? '';
75
-
76
-			$longueur = $modele['length'];
77
-			$end = $pos + $longueur;
78
-
79
-			// il faut avoir un id ou des params commençant par un | sinon c'est une simple balise html
80
-			if (empty($modele['id']) and empty($modele['params'])) {
81
-				unset($modeles[$k]);
82
-				continue;
83
-			}
84
-
85
-			// si on veut seulement detecter la présence, on peut retourner tel quel
86
-			if (!empty($options['detecter_presence'])) {
87
-				break;
88
-			}
89
-
90
-			$modele['lien'] = false;
91
-			if (!empty($options['collecter_liens'])
92
-				and $pos_fermeture_lien = stripos($texte, '</a>', $end)
93
-				and !strlen(trim(substr($texte, $end, $pos_fermeture_lien - $end)))) {
94
-
95
-				$pos_lien_ouvrant = stripos($texte, '<a', $pos_prev);
96
-				if ($pos_lien_ouvrant !== false
97
-					and $pos_lien_ouvrant < $pos
98
-					and preg_match('/<a\s[^<>]*>\s*$/i', substr($texte, $pos_prev, $pos - $pos_prev), $r)
99
-				) {
100
-					$modele['lien'] = [
101
-						'href' => extraire_attribut($r[0], 'href'),
102
-						'class' => extraire_attribut($r[0], 'class'),
103
-						'mime' => extraire_attribut($r[0], 'type'),
104
-						'title' => extraire_attribut($r[0], 'title'),
105
-						'hreflang' => extraire_attribut($r[0], 'hreflang')
106
-					];
107
-					$n = strlen($r[0]);
108
-					$pos -= $n;
109
-					$longueur = $pos_fermeture_lien - $pos + 4;
110
-					$end = $pos + $longueur;
111
-				}
112
-			}
113
-
114
-
115
-			$modele['pos'] = $pos;
116
-			$modele['length'] = $longueur;
117
-			$pos_prev = $end;
118
-		}
119
-
120
-		return $modeles;
121
-	}
122
-
123
-	/**
124
-	 * Traiter les modeles d'un texte
125
-	 * @param string $texte
126
-	 * @param array $options
127
-	 *   bool|array $doublons
128
-	 *   string $echap
129
-	 *   ?Spip\Texte\CollecteurLiens $collecteurLiens
130
-	 *   ?array $env
131
-	 *   ?string $connect
132
-	 * @return string
133
-	 */
134
-	public function traiter(string $texte, array $options) {
135
-		if ($texte) {
136
-			$doublons = $options['doublons'] ?? false;
137
-			$echap = $options['echap'] ?? '';
138
-			$collecteurLiens = $options['collecteurLiens'] ?? null;
139
-			$env = $options['env'] ?? [];
140
-			$connect = $options['connect'] ?? '';
141
-
142
-			// preserver la compatibilite : true = recherche des documents
143
-			if ($doublons === true) {
144
-				$doublons = ['documents' => ['doc', 'emb', 'img']];
145
-			}
146
-
147
-			$modeles = $this->collecter($texte, ['collecter_liens' => true]);
148
-			if (!empty($modeles)) {
149
-				include_spip('public/assembler');
150
-				$wrap_embed_html = charger_fonction('wrap_embed_html', 'inc', true);
151
-
152
-				$offset_pos = 0;
153
-				foreach ($modeles as $m) {
154
-					// calculer le modele
155
-					# hack indexation
156
-					if ($doublons) {
157
-						$texte .= preg_replace(',[|][^|=]*,s', ' ', $m['params']);
158
-					} # version normale
159
-					else {
160
-						// si un tableau de liens a ete passe, reinjecter le contenu d'origine
161
-						// dans les parametres, plutot que les liens echappes
162
-						$params = $m['params'];
163
-						if (!is_null($collecteurLiens)) {
164
-							$params = $collecteurLiens->retablir($params);
165
-						}
166
-
167
-						$modele = inclure_modele($m['type'], $m['id'], $params, $m['lien'], $connect ?? '', $env);
168
-
169
-						// en cas d'echec,
170
-						// si l'objet demande a une url,
171
-						// creer un petit encadre vers elle
172
-						if ($modele === false) {
173
-							$modele = $m['raw'];
174
-
175
-							if (!is_null($collecteurLiens)) {
176
-								$modele = $collecteurLiens->retablir($modele);
177
-							}
178
-
179
-							$contexte = array_merge($env, ['id' => $m['id'], 'type' => $m['type'], 'modele' => $modele]);
180
-
181
-							if (!empty($m['lien'])) {
182
-								# un eventuel guillemet (") sera reechappe par #ENV
183
-								$contexte['lien'] = str_replace('&quot;', '"', $m['lien']['href']);
184
-								$contexte['lien_class'] = $m['lien']['class'];
185
-								$contexte['lien_mime'] = $m['lien']['mime'];
186
-								$contexte['lien_title'] = $m['lien']['title'];
187
-								$contexte['lien_hreflang'] = $m['lien']['hreflang'];
188
-							}
189
-
190
-							$modele = recuperer_fond('modeles/dist', $contexte, [], $connect ?? '');
191
-						}
192
-
193
-						// le remplacer dans le texte
194
-						if ($modele !== false) {
195
-							$modele = protege_js_modeles($modele);
196
-
197
-							if ($wrap_embed_html) {
198
-								$modele = $wrap_embed_html($m['raw'], $modele);
199
-							}
200
-
201
-							$rempl = code_echappement($modele, $echap);
202
-							$texte = substr_replace($texte, $rempl, $m['pos'] + $offset_pos, $m['length']);
203
-							$offset_pos += strlen($rempl) - $m['length'];
204
-						}
205
-					}
206
-
207
-					// hack pour tout l'espace prive
208
-					if ((test_espace_prive() or ($doublons)) and !empty($m['id'])) {
209
-						$type = strtolower($m['type']);
210
-						foreach ($doublons ?: ['documents' => ['doc', 'emb', 'img']] as $quoi => $type_modeles) {
211
-							if (in_array($type, $type_modeles)) {
212
-								$GLOBALS["doublons_{$quoi}_inclus"][] = $m['id'];
213
-							}
214
-						}
215
-					}
216
-				}
217
-			}
218
-		}
219
-
220
-		return $texte;
221
-	}
25
+    protected static string $markPrefix = 'MODELE';
26
+
27
+    /**
28
+     * La preg pour découper et collecter les modèles
29
+     * @var string
30
+     */
31
+    protected string $preg_modele;
32
+
33
+    public function __construct(?string $preg = null) {
34
+
35
+        $this->preg_modele = ($preg ?:
36
+            '@<([a-z_-]{3,})' # <modele
37
+            . '\s*([0-9]*)\s*' # id
38
+            . '([|](?:<[^<>]*>|[^>])*?)?' # |arguments (y compris des tags <...>)
39
+            . '\s*/?' . '>@isS' # fin du modele >
40
+        );
41
+    }
42
+
43
+    /**
44
+     * Sanitizer une collection d'occurences de modèle : on ne fait rien
45
+     *
46
+     * @param array $collection
47
+     * @param string $sanitize_callback
48
+     * @return array
49
+     */
50
+    protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
51
+
52
+        return $collection;
53
+    }
54
+
55
+    /**
56
+     * @param string $texte
57
+     * @param array $options
58
+     *   bool $collecter_liens
59
+     * @return array
60
+     */
61
+    public function collecter(string $texte, array $options = []): array {
62
+        if (!$texte) {
63
+            return [];
64
+        }
65
+
66
+        // collecter les matchs de la preg
67
+        $modeles = $this->collecteur($texte, '', '<', $this->preg_modele);
68
+
69
+        $pos_prev = 0;
70
+        foreach ($modeles as $k => &$modele) {
71
+            $pos = $modele['pos'];
72
+            $modele['type'] = $modele['match'][1];
73
+            $modele['id'] = $modele['match'][2] ?? '';
74
+            $modele['params'] = $modele['match'][3] ?? '';
75
+
76
+            $longueur = $modele['length'];
77
+            $end = $pos + $longueur;
78
+
79
+            // il faut avoir un id ou des params commençant par un | sinon c'est une simple balise html
80
+            if (empty($modele['id']) and empty($modele['params'])) {
81
+                unset($modeles[$k]);
82
+                continue;
83
+            }
84
+
85
+            // si on veut seulement detecter la présence, on peut retourner tel quel
86
+            if (!empty($options['detecter_presence'])) {
87
+                break;
88
+            }
89
+
90
+            $modele['lien'] = false;
91
+            if (!empty($options['collecter_liens'])
92
+                and $pos_fermeture_lien = stripos($texte, '</a>', $end)
93
+                and !strlen(trim(substr($texte, $end, $pos_fermeture_lien - $end)))) {
94
+
95
+                $pos_lien_ouvrant = stripos($texte, '<a', $pos_prev);
96
+                if ($pos_lien_ouvrant !== false
97
+                    and $pos_lien_ouvrant < $pos
98
+                    and preg_match('/<a\s[^<>]*>\s*$/i', substr($texte, $pos_prev, $pos - $pos_prev), $r)
99
+                ) {
100
+                    $modele['lien'] = [
101
+                        'href' => extraire_attribut($r[0], 'href'),
102
+                        'class' => extraire_attribut($r[0], 'class'),
103
+                        'mime' => extraire_attribut($r[0], 'type'),
104
+                        'title' => extraire_attribut($r[0], 'title'),
105
+                        'hreflang' => extraire_attribut($r[0], 'hreflang')
106
+                    ];
107
+                    $n = strlen($r[0]);
108
+                    $pos -= $n;
109
+                    $longueur = $pos_fermeture_lien - $pos + 4;
110
+                    $end = $pos + $longueur;
111
+                }
112
+            }
113
+
114
+
115
+            $modele['pos'] = $pos;
116
+            $modele['length'] = $longueur;
117
+            $pos_prev = $end;
118
+        }
119
+
120
+        return $modeles;
121
+    }
122
+
123
+    /**
124
+     * Traiter les modeles d'un texte
125
+     * @param string $texte
126
+     * @param array $options
127
+     *   bool|array $doublons
128
+     *   string $echap
129
+     *   ?Spip\Texte\CollecteurLiens $collecteurLiens
130
+     *   ?array $env
131
+     *   ?string $connect
132
+     * @return string
133
+     */
134
+    public function traiter(string $texte, array $options) {
135
+        if ($texte) {
136
+            $doublons = $options['doublons'] ?? false;
137
+            $echap = $options['echap'] ?? '';
138
+            $collecteurLiens = $options['collecteurLiens'] ?? null;
139
+            $env = $options['env'] ?? [];
140
+            $connect = $options['connect'] ?? '';
141
+
142
+            // preserver la compatibilite : true = recherche des documents
143
+            if ($doublons === true) {
144
+                $doublons = ['documents' => ['doc', 'emb', 'img']];
145
+            }
146
+
147
+            $modeles = $this->collecter($texte, ['collecter_liens' => true]);
148
+            if (!empty($modeles)) {
149
+                include_spip('public/assembler');
150
+                $wrap_embed_html = charger_fonction('wrap_embed_html', 'inc', true);
151
+
152
+                $offset_pos = 0;
153
+                foreach ($modeles as $m) {
154
+                    // calculer le modele
155
+                    # hack indexation
156
+                    if ($doublons) {
157
+                        $texte .= preg_replace(',[|][^|=]*,s', ' ', $m['params']);
158
+                    } # version normale
159
+                    else {
160
+                        // si un tableau de liens a ete passe, reinjecter le contenu d'origine
161
+                        // dans les parametres, plutot que les liens echappes
162
+                        $params = $m['params'];
163
+                        if (!is_null($collecteurLiens)) {
164
+                            $params = $collecteurLiens->retablir($params);
165
+                        }
166
+
167
+                        $modele = inclure_modele($m['type'], $m['id'], $params, $m['lien'], $connect ?? '', $env);
168
+
169
+                        // en cas d'echec,
170
+                        // si l'objet demande a une url,
171
+                        // creer un petit encadre vers elle
172
+                        if ($modele === false) {
173
+                            $modele = $m['raw'];
174
+
175
+                            if (!is_null($collecteurLiens)) {
176
+                                $modele = $collecteurLiens->retablir($modele);
177
+                            }
178
+
179
+                            $contexte = array_merge($env, ['id' => $m['id'], 'type' => $m['type'], 'modele' => $modele]);
180
+
181
+                            if (!empty($m['lien'])) {
182
+                                # un eventuel guillemet (") sera reechappe par #ENV
183
+                                $contexte['lien'] = str_replace('&quot;', '"', $m['lien']['href']);
184
+                                $contexte['lien_class'] = $m['lien']['class'];
185
+                                $contexte['lien_mime'] = $m['lien']['mime'];
186
+                                $contexte['lien_title'] = $m['lien']['title'];
187
+                                $contexte['lien_hreflang'] = $m['lien']['hreflang'];
188
+                            }
189
+
190
+                            $modele = recuperer_fond('modeles/dist', $contexte, [], $connect ?? '');
191
+                        }
192
+
193
+                        // le remplacer dans le texte
194
+                        if ($modele !== false) {
195
+                            $modele = protege_js_modeles($modele);
196
+
197
+                            if ($wrap_embed_html) {
198
+                                $modele = $wrap_embed_html($m['raw'], $modele);
199
+                            }
200
+
201
+                            $rempl = code_echappement($modele, $echap);
202
+                            $texte = substr_replace($texte, $rempl, $m['pos'] + $offset_pos, $m['length']);
203
+                            $offset_pos += strlen($rempl) - $m['length'];
204
+                        }
205
+                    }
206
+
207
+                    // hack pour tout l'espace prive
208
+                    if ((test_espace_prive() or ($doublons)) and !empty($m['id'])) {
209
+                        $type = strtolower($m['type']);
210
+                        foreach ($doublons ?: ['documents' => ['doc', 'emb', 'img']] as $quoi => $type_modeles) {
211
+                            if (in_array($type, $type_modeles)) {
212
+                                $GLOBALS["doublons_{$quoi}_inclus"][] = $m['id'];
213
+                            }
214
+                        }
215
+                    }
216
+                }
217
+            }
218
+        }
219
+
220
+        return $texte;
221
+    }
222 222
 
223 223
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -3 removed lines patch added patch discarded remove patch
@@ -32,11 +32,10 @@
 block discarded – undo
32 32
 
33 33
 	public function __construct(?string $preg = null) {
34 34
 
35
-		$this->preg_modele = ($preg ?:
36
-			'@<([a-z_-]{3,})' # <modele
35
+		$this->preg_modele = ($preg ?: '@<([a-z_-]{3,})' # <modele
37 36
 			. '\s*([0-9]*)\s*' # id
38 37
 			. '([|](?:<[^<>]*>|[^>])*?)?' # |arguments (y compris des tags <...>)
39
-			. '\s*/?' . '>@isS' # fin du modele >
38
+			. '\s*/?'.'>@isS' # fin du modele >
40 39
 		);
41 40
 	}
42 41
 
Please login to merge, or discard this patch.
ecrire/src/Texte/Collecteur/Liens.php 1 patch
Indentation   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -17,103 +17,103 @@
 block discarded – undo
17 17
  */
18 18
 class Liens extends AbstractCollecteur {
19 19
 
20
-	protected static string $markPrefix = 'LIEN';
21
-
22
-	/**
23
-	 * La preg pour découper et collecter les modèles
24
-	 * @var string
25
-	 */
26
-	protected string $preg_lien;
27
-
28
-	public function __construct(?string $preg = null) {
29
-
30
-		// Regexp des raccourcis, aussi utilisee pour la fusion de sauvegarde Spip
31
-		// Laisser passer des paires de crochets pour la balise multi
32
-		// mais refuser plus d'imbrications ou de mauvaises imbrications
33
-		// sinon les crochets ne peuvent plus servir qu'a ce type de raccourci
34
-		$this->preg_lien = ($preg ?: '/\[([^][]*?([[][^]>-]*[]][^][]*)*)->(>?)([^]]*)\]/msS');
35
-	}
36
-
37
-
38
-	/**
39
-	 * Sanitizer une collection d'occurences de liens : il faut sanitizer le href et le texte uniquement
40
-	 *
41
-	 * @param array $collection
42
-	 * @param string $sanitize_callback
43
-	 * @return array
44
-	 */
45
-	protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
46
-		foreach ($collection as &$lien) {
47
-			$t = $sanitize_callback($lien['texte']);
48
-			if ($t !== $lien['texte']) {
49
-				$lien['raw'] = str_replace($lien['texte'], $t, $lien['raw']);
50
-				$lien['texte'] = $t;
51
-			}
52
-			$href = $sanitize_callback($lien['href']);
53
-			if ($href !== $lien['href']) {
54
-				$lien['raw'] = str_replace($lien['href'], $href, $lien['raw']);
55
-				$lien['href'] = $href;
56
-			}
57
-		}
58
-
59
-		return $collection;
60
-	}
61
-
62
-	/**
63
-	 * @param string $texte
64
-	 * @param array $options
65
-	 *   bool $collecter_liens
66
-	 * @return array
67
-	 */
68
-	public function collecter(string $texte, array $options = []): array {
69
-		if (!$texte) {
70
-			return [];
71
-		}
72
-
73
-		$liens = [];
74
-		if (strpos($texte, '->') !== false) {
75
-
76
-			$desechappe_crochets = false;
77
-			// si il y a un crochet ouvrant échappé ou un crochet fermant échappé, les substituer pour les ignorer
78
-			if (strpos($texte, '\[') !== false or strpos($texte, '\]') !== false) {
79
-				$texte = str_replace(['\[', '\]'], ["\x1\x5", "\x1\x6"], $texte);
80
-				$desechappe_crochets = true;
81
-			}
82
-
83
-			// collecter les matchs de la preg
84
-			$liens = $this->collecteur($texte, '->', '[', $this->preg_lien, empty($options['detecter_presence']) ? 0 : 1);
85
-
86
-			// si on veut seulement detecter la présence, on peut retourner tel quel
87
-			if (empty($options['detecter_presence'])) {
88
-
89
-				foreach ($liens as $k => &$lien) {
90
-
91
-					$lien['href'] = end($lien['match']);
92
-					$lien['texte'] = $lien['match'][1];
93
-					$lien['ouvrant'] = $lien['match'][3] ?? '';
94
-
95
-					// la mise en lien automatique est passee par la a tort !
96
-					// corrigeons pour eviter d'avoir un <a...> dans un href...
97
-					if (strncmp($lien['href'], '<a', 2) == 0) {
98
-						$href = extraire_attribut($lien['href'], 'href');
99
-						// remplacons dans la source qui peut etre reinjectee dans les arguments
100
-						// d'un modele
101
-						$lien['raw'] = str_replace($lien['href'], $href, $lien['raw']);
102
-						// et prenons le href comme la vraie url a linker
103
-						$lien['href'] = $href;
104
-					}
105
-
106
-					if ($desechappe_crochets and strpos($lien['raw'], "\x1") !== false) {
107
-						$lien['raw'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $lien['raw']);
108
-						$lien['texte'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $lien['texte']);
109
-						$lien['href'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $lien['href']);
110
-					}
111
-
112
-				}
113
-			}
114
-		}
115
-
116
-		return $liens;
117
-	}
20
+    protected static string $markPrefix = 'LIEN';
21
+
22
+    /**
23
+     * La preg pour découper et collecter les modèles
24
+     * @var string
25
+     */
26
+    protected string $preg_lien;
27
+
28
+    public function __construct(?string $preg = null) {
29
+
30
+        // Regexp des raccourcis, aussi utilisee pour la fusion de sauvegarde Spip
31
+        // Laisser passer des paires de crochets pour la balise multi
32
+        // mais refuser plus d'imbrications ou de mauvaises imbrications
33
+        // sinon les crochets ne peuvent plus servir qu'a ce type de raccourci
34
+        $this->preg_lien = ($preg ?: '/\[([^][]*?([[][^]>-]*[]][^][]*)*)->(>?)([^]]*)\]/msS');
35
+    }
36
+
37
+
38
+    /**
39
+     * Sanitizer une collection d'occurences de liens : il faut sanitizer le href et le texte uniquement
40
+     *
41
+     * @param array $collection
42
+     * @param string $sanitize_callback
43
+     * @return array
44
+     */
45
+    protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
46
+        foreach ($collection as &$lien) {
47
+            $t = $sanitize_callback($lien['texte']);
48
+            if ($t !== $lien['texte']) {
49
+                $lien['raw'] = str_replace($lien['texte'], $t, $lien['raw']);
50
+                $lien['texte'] = $t;
51
+            }
52
+            $href = $sanitize_callback($lien['href']);
53
+            if ($href !== $lien['href']) {
54
+                $lien['raw'] = str_replace($lien['href'], $href, $lien['raw']);
55
+                $lien['href'] = $href;
56
+            }
57
+        }
58
+
59
+        return $collection;
60
+    }
61
+
62
+    /**
63
+     * @param string $texte
64
+     * @param array $options
65
+     *   bool $collecter_liens
66
+     * @return array
67
+     */
68
+    public function collecter(string $texte, array $options = []): array {
69
+        if (!$texte) {
70
+            return [];
71
+        }
72
+
73
+        $liens = [];
74
+        if (strpos($texte, '->') !== false) {
75
+
76
+            $desechappe_crochets = false;
77
+            // si il y a un crochet ouvrant échappé ou un crochet fermant échappé, les substituer pour les ignorer
78
+            if (strpos($texte, '\[') !== false or strpos($texte, '\]') !== false) {
79
+                $texte = str_replace(['\[', '\]'], ["\x1\x5", "\x1\x6"], $texte);
80
+                $desechappe_crochets = true;
81
+            }
82
+
83
+            // collecter les matchs de la preg
84
+            $liens = $this->collecteur($texte, '->', '[', $this->preg_lien, empty($options['detecter_presence']) ? 0 : 1);
85
+
86
+            // si on veut seulement detecter la présence, on peut retourner tel quel
87
+            if (empty($options['detecter_presence'])) {
88
+
89
+                foreach ($liens as $k => &$lien) {
90
+
91
+                    $lien['href'] = end($lien['match']);
92
+                    $lien['texte'] = $lien['match'][1];
93
+                    $lien['ouvrant'] = $lien['match'][3] ?? '';
94
+
95
+                    // la mise en lien automatique est passee par la a tort !
96
+                    // corrigeons pour eviter d'avoir un <a...> dans un href...
97
+                    if (strncmp($lien['href'], '<a', 2) == 0) {
98
+                        $href = extraire_attribut($lien['href'], 'href');
99
+                        // remplacons dans la source qui peut etre reinjectee dans les arguments
100
+                        // d'un modele
101
+                        $lien['raw'] = str_replace($lien['href'], $href, $lien['raw']);
102
+                        // et prenons le href comme la vraie url a linker
103
+                        $lien['href'] = $href;
104
+                    }
105
+
106
+                    if ($desechappe_crochets and strpos($lien['raw'], "\x1") !== false) {
107
+                        $lien['raw'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $lien['raw']);
108
+                        $lien['texte'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $lien['texte']);
109
+                        $lien['href'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $lien['href']);
110
+                    }
111
+
112
+                }
113
+            }
114
+        }
115
+
116
+        return $liens;
117
+    }
118 118
 
119 119
 }
Please login to merge, or discard this patch.
ecrire/src/Texte/Collecteur/Multis.php 3 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -209,9 +209,9 @@
 block discarded – undo
209 209
 								// il ne faut pas echapper en div si propre produit un seul paragraphe
210 210
 								include_spip('inc/texte');
211 211
 								$trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad));
212
-								$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
212
+								$mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
213 213
 								if ($mode === 'div') {
214
-									$trad = rtrim($trad) . "\n\n";
214
+									$trad = rtrim($trad)."\n\n";
215 215
 								}
216 216
 								$trad = code_echappement($trad, 'multi', false, $mode);
217 217
 								$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -185,8 +185,7 @@
 block discarded – undo
185 185
 					$trads = $m['trads'];
186 186
 					if (empty($trads)) {
187 187
 						$trad = '';
188
-					}
189
-					elseif ($l = approcher_langue($trads, $lang)) {
188
+					} elseif ($l = approcher_langue($trads, $lang)) {
190 189
 						$trad = $trads[$l];
191 190
 					} else {
192 191
 						if ($lang_defaut == 'aucune') {
Please login to merge, or discard this patch.
Indentation   +204 added lines, -204 removed lines patch added patch discarded remove patch
@@ -29,209 +29,209 @@
 block discarded – undo
29 29
  */
30 30
 class Multis extends AbstractCollecteur {
31 31
 
32
-	protected static string $markPrefix = 'MULTI';
33
-
34
-	/**
35
-	 * La preg pour découper et collecter les modèles
36
-	 * @var string
37
-	 */
38
-	protected string $preg_multi;
39
-
40
-	public function __construct(?string $preg = null) {
41
-
42
-		$this->preg_multi = ($preg ?: '@<multi>(.*?)</multi>@sS');
43
-	}
44
-
45
-	/**
46
-	 * Sanitizer une collection d'occurences de multi : on sanitize chaque texte de langue séparemment
47
-	 *
48
-	 * @param array $collection
49
-	 * @param string $sanitize_callback
50
-	 * @return array
51
-	 */
52
-	protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
53
-
54
-		foreach ($collection as &$multi) {
55
-			$changed = false;
56
-			foreach ($multi['trads'] as $lang => $trad) {
57
-				$t = $sanitize_callback($trad);
58
-				if ($t !== $trad) {
59
-					$changed = true;
60
-					$multi['trads'][$lang] = $t;
61
-				}
62
-			}
63
-			if ($changed) {
64
-				$texte = $this->agglomerer_trads($multi['trads']);
65
-				$multi['raw'] = str_replace($multi['texte'], $texte, $multi['raw']);
66
-				$multi['texte'] = $texte;
67
-			}
68
-		}
69
-		return $collection;
70
-	}
71
-
72
-
73
-	/**
74
-	 * Convertit le contenu d'une balise `<multi>` en un tableau
75
-	 *
76
-	 * Exemple de blocs.
77
-	 * - `texte par défaut [fr] en français [en] en anglais`
78
-	 * - `[fr] en français [en] en anglais`
79
-	 *
80
-	 * @param string $bloc
81
-	 *     Le contenu intérieur d'un bloc multi
82
-	 * @return array [code de langue => texte]
83
-	 *     Peut retourner un code de langue vide, lorsqu'un texte par défaut est indiqué.
84
-	 **/
85
-	protected function extraire_trads($bloc) {
86
-		$trads = [];
87
-
88
-		if (strlen($bloc)) {
89
-			$langs = $this->collecteur($bloc, ']', '[', '@[\[]([a-z]{2,3}(_[a-z]{2,3})?(_[a-z]{2,3})?)[\]]@siS');
90
-			$lang = '';
91
-			$pos_prev = 0;
92
-			foreach ($langs as $l) {
93
-				$pos = $l['pos'];
94
-				if ($lang or $pos > $pos_prev) {
95
-					$trads[$lang] = substr($bloc, $pos_prev, $pos - $pos_prev);
96
-				}
97
-				$lang = $l['match'][1];
98
-				$pos_prev = $pos + $l['length'];
99
-			}
100
-			$trads[$lang] = substr($bloc, $pos_prev);
101
-		}
102
-
103
-		return $trads;
104
-	}
105
-
106
-	/**
107
-	 * Recoller ensemble les trads pour reconstituer le texte dans la balise <multi>...</multi>
108
-	 * @param $trads
109
-	 * @return string
110
-	 */
111
-	protected function agglomerer_trads($trads) {
112
-		$texte = '';
113
-		foreach ($trads as $lang => $trad) {
114
-			if ($texte or $lang) {
115
-				$texte .= "[$lang]";
116
-			}
117
-			$texte .= $trad;
118
-		}
119
-		return $texte;
120
-	}
121
-
122
-	/**
123
-	 * @param string $texte
124
-	 * @param array $options
125
-	 *   bool $collecter_liens
126
-	 * @return array
127
-	 */
128
-	public function collecter(string $texte, array $options = []): array {
129
-		if (!$texte) {
130
-			return [];
131
-		}
132
-
133
-		// collecter les matchs de la preg
134
-		$multis = $this->collecteur($texte, '', '<multi', $this->preg_multi, empty($options['detecter_presence']) ? 0 : 1);
135
-		// si on veut seulement detecter la présence, on peut retourner tel quel
136
-		if (empty($options['detecter_presence'])) {
137
-			foreach ($multis as $k => &$multi) {
138
-				$multi['texte'] = $multi['match'][1];
139
-				// extraire les trads du texte
140
-				$multi['trads'] = $this->extraire_trads($multi['texte']);
141
-			}
142
-		}
143
-
144
-		return $multis;
145
-	}
146
-
147
-	/**
148
-	 * Traiter les multis d'un texte
149
-	 *
150
-	 * @uses approcher_langue()
151
-	 * @uses lang_typo()
152
-	 * @uses code_echappement()
153
-	 * @uses echappe_retour()
154
-	 *
155
-	 * @param string $texte
156
-	 * @param array $options
157
-	 *   ?string $lang
158
-	 *   ?string $lang_defaut
159
-	 *   ?bool echappe_span
160
-	 *   ?bool appliquer_typo
161
-	 * @return string
162
-	 */
163
-	public function traiter(string $texte, array $options) {
164
-		if ($texte) {
165
-
166
-			$multis = $this->collecter($texte);
167
-			if (!empty($multis)) {
168
-				$lang = $options['lang'] ?? $GLOBALS['spip_lang'];
169
-				$lang_defaut = $options['lang_defaut'] ?? _LANGUE_PAR_DEFAUT;
170
-				$echappe_span = $options['echappe_span'] ?? false;
171
-				$appliquer_typo = $options['appliquer_typo'] ?? true;
172
-
173
-				if (!function_exists('approcher_langue')) {
174
-					include_spip('inc/lang');
175
-				}
176
-				if (!function_exists('code_echappement')) {
177
-					include_spip('inc/texte_mini');
178
-				}
179
-
180
-				$offset_pos = 0;
181
-				foreach ($multis as $m) {
182
-
183
-					// chercher la version de la langue courante
184
-					$trads = $m['trads'];
185
-					if (empty($trads)) {
186
-						$trad = '';
187
-					}
188
-					elseif ($l = approcher_langue($trads, $lang)) {
189
-						$trad = $trads[$l];
190
-					} else {
191
-						if ($lang_defaut == 'aucune') {
192
-							$trad = '';
193
-						} else {
194
-							// langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php)
195
-							// ou la premiere dispo
196
-							if (!$l = approcher_langue($trads, $lang_defaut)) {
197
-								$l = array_keys($trads);
198
-								$l = reset($l);
199
-							}
200
-							$trad = $trads[$l];
201
-
202
-							// mais typographier le texte selon les regles de celle-ci
203
-							// Attention aux blocs multi sur plusieurs lignes
204
-							if ($appliquer_typo) {
205
-								$typographie = charger_fonction(lang_typo($l), 'typographie');
206
-								$trad = $typographie($trad);
207
-
208
-								// Tester si on echappe en span ou en div
209
-								// il ne faut pas echapper en div si propre produit un seul paragraphe
210
-								include_spip('inc/texte');
211
-								$trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad));
212
-								$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
213
-								if ($mode === 'div') {
214
-									$trad = rtrim($trad) . "\n\n";
215
-								}
216
-								$trad = code_echappement($trad, 'multi', false, $mode);
217
-								$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
218
-								if (lang_dir($l) !== lang_dir($lang)) {
219
-									$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
220
-								}
221
-								if (!$echappe_span) {
222
-									$trad = echappe_retour($trad, 'multi');
223
-								}
224
-							}
225
-						}
226
-					}
227
-
228
-					$texte = substr_replace($texte, $trad, $m['pos'] + $offset_pos, $m['length']);
229
-					$offset_pos += strlen($trad) - $m['length'];
230
-				}
231
-			}
232
-		}
233
-
234
-		return $texte;
235
-	}
32
+    protected static string $markPrefix = 'MULTI';
33
+
34
+    /**
35
+     * La preg pour découper et collecter les modèles
36
+     * @var string
37
+     */
38
+    protected string $preg_multi;
39
+
40
+    public function __construct(?string $preg = null) {
41
+
42
+        $this->preg_multi = ($preg ?: '@<multi>(.*?)</multi>@sS');
43
+    }
44
+
45
+    /**
46
+     * Sanitizer une collection d'occurences de multi : on sanitize chaque texte de langue séparemment
47
+     *
48
+     * @param array $collection
49
+     * @param string $sanitize_callback
50
+     * @return array
51
+     */
52
+    protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
53
+
54
+        foreach ($collection as &$multi) {
55
+            $changed = false;
56
+            foreach ($multi['trads'] as $lang => $trad) {
57
+                $t = $sanitize_callback($trad);
58
+                if ($t !== $trad) {
59
+                    $changed = true;
60
+                    $multi['trads'][$lang] = $t;
61
+                }
62
+            }
63
+            if ($changed) {
64
+                $texte = $this->agglomerer_trads($multi['trads']);
65
+                $multi['raw'] = str_replace($multi['texte'], $texte, $multi['raw']);
66
+                $multi['texte'] = $texte;
67
+            }
68
+        }
69
+        return $collection;
70
+    }
71
+
72
+
73
+    /**
74
+     * Convertit le contenu d'une balise `<multi>` en un tableau
75
+     *
76
+     * Exemple de blocs.
77
+     * - `texte par défaut [fr] en français [en] en anglais`
78
+     * - `[fr] en français [en] en anglais`
79
+     *
80
+     * @param string $bloc
81
+     *     Le contenu intérieur d'un bloc multi
82
+     * @return array [code de langue => texte]
83
+     *     Peut retourner un code de langue vide, lorsqu'un texte par défaut est indiqué.
84
+     **/
85
+    protected function extraire_trads($bloc) {
86
+        $trads = [];
87
+
88
+        if (strlen($bloc)) {
89
+            $langs = $this->collecteur($bloc, ']', '[', '@[\[]([a-z]{2,3}(_[a-z]{2,3})?(_[a-z]{2,3})?)[\]]@siS');
90
+            $lang = '';
91
+            $pos_prev = 0;
92
+            foreach ($langs as $l) {
93
+                $pos = $l['pos'];
94
+                if ($lang or $pos > $pos_prev) {
95
+                    $trads[$lang] = substr($bloc, $pos_prev, $pos - $pos_prev);
96
+                }
97
+                $lang = $l['match'][1];
98
+                $pos_prev = $pos + $l['length'];
99
+            }
100
+            $trads[$lang] = substr($bloc, $pos_prev);
101
+        }
102
+
103
+        return $trads;
104
+    }
105
+
106
+    /**
107
+     * Recoller ensemble les trads pour reconstituer le texte dans la balise <multi>...</multi>
108
+     * @param $trads
109
+     * @return string
110
+     */
111
+    protected function agglomerer_trads($trads) {
112
+        $texte = '';
113
+        foreach ($trads as $lang => $trad) {
114
+            if ($texte or $lang) {
115
+                $texte .= "[$lang]";
116
+            }
117
+            $texte .= $trad;
118
+        }
119
+        return $texte;
120
+    }
121
+
122
+    /**
123
+     * @param string $texte
124
+     * @param array $options
125
+     *   bool $collecter_liens
126
+     * @return array
127
+     */
128
+    public function collecter(string $texte, array $options = []): array {
129
+        if (!$texte) {
130
+            return [];
131
+        }
132
+
133
+        // collecter les matchs de la preg
134
+        $multis = $this->collecteur($texte, '', '<multi', $this->preg_multi, empty($options['detecter_presence']) ? 0 : 1);
135
+        // si on veut seulement detecter la présence, on peut retourner tel quel
136
+        if (empty($options['detecter_presence'])) {
137
+            foreach ($multis as $k => &$multi) {
138
+                $multi['texte'] = $multi['match'][1];
139
+                // extraire les trads du texte
140
+                $multi['trads'] = $this->extraire_trads($multi['texte']);
141
+            }
142
+        }
143
+
144
+        return $multis;
145
+    }
146
+
147
+    /**
148
+     * Traiter les multis d'un texte
149
+     *
150
+     * @uses approcher_langue()
151
+     * @uses lang_typo()
152
+     * @uses code_echappement()
153
+     * @uses echappe_retour()
154
+     *
155
+     * @param string $texte
156
+     * @param array $options
157
+     *   ?string $lang
158
+     *   ?string $lang_defaut
159
+     *   ?bool echappe_span
160
+     *   ?bool appliquer_typo
161
+     * @return string
162
+     */
163
+    public function traiter(string $texte, array $options) {
164
+        if ($texte) {
165
+
166
+            $multis = $this->collecter($texte);
167
+            if (!empty($multis)) {
168
+                $lang = $options['lang'] ?? $GLOBALS['spip_lang'];
169
+                $lang_defaut = $options['lang_defaut'] ?? _LANGUE_PAR_DEFAUT;
170
+                $echappe_span = $options['echappe_span'] ?? false;
171
+                $appliquer_typo = $options['appliquer_typo'] ?? true;
172
+
173
+                if (!function_exists('approcher_langue')) {
174
+                    include_spip('inc/lang');
175
+                }
176
+                if (!function_exists('code_echappement')) {
177
+                    include_spip('inc/texte_mini');
178
+                }
179
+
180
+                $offset_pos = 0;
181
+                foreach ($multis as $m) {
182
+
183
+                    // chercher la version de la langue courante
184
+                    $trads = $m['trads'];
185
+                    if (empty($trads)) {
186
+                        $trad = '';
187
+                    }
188
+                    elseif ($l = approcher_langue($trads, $lang)) {
189
+                        $trad = $trads[$l];
190
+                    } else {
191
+                        if ($lang_defaut == 'aucune') {
192
+                            $trad = '';
193
+                        } else {
194
+                            // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php)
195
+                            // ou la premiere dispo
196
+                            if (!$l = approcher_langue($trads, $lang_defaut)) {
197
+                                $l = array_keys($trads);
198
+                                $l = reset($l);
199
+                            }
200
+                            $trad = $trads[$l];
201
+
202
+                            // mais typographier le texte selon les regles de celle-ci
203
+                            // Attention aux blocs multi sur plusieurs lignes
204
+                            if ($appliquer_typo) {
205
+                                $typographie = charger_fonction(lang_typo($l), 'typographie');
206
+                                $trad = $typographie($trad);
207
+
208
+                                // Tester si on echappe en span ou en div
209
+                                // il ne faut pas echapper en div si propre produit un seul paragraphe
210
+                                include_spip('inc/texte');
211
+                                $trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad));
212
+                                $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
213
+                                if ($mode === 'div') {
214
+                                    $trad = rtrim($trad) . "\n\n";
215
+                                }
216
+                                $trad = code_echappement($trad, 'multi', false, $mode);
217
+                                $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
218
+                                if (lang_dir($l) !== lang_dir($lang)) {
219
+                                    $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
220
+                                }
221
+                                if (!$echappe_span) {
222
+                                    $trad = echappe_retour($trad, 'multi');
223
+                                }
224
+                            }
225
+                        }
226
+                    }
227
+
228
+                    $texte = substr_replace($texte, $trad, $m['pos'] + $offset_pos, $m['length']);
229
+                    $offset_pos += strlen($trad) - $m['length'];
230
+                }
231
+            }
232
+        }
233
+
234
+        return $texte;
235
+    }
236 236
 
237 237
 }
Please login to merge, or discard this patch.
ecrire/inc/modeles.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -26,16 +26,16 @@  discard block
 block discarded – undo
26 26
  */
27 27
 function traiter_modeles($texte, $doublons = false, $echap = '', string $connect = '', ?Spip\Texte\Collecteur\Liens $collecteurLiens = null, $env = []) {
28 28
 
29
-	include_spip("src/Texte/Collecteur/AbstractCollecteur");
30
-	include_spip("src/Texte/Collecteur/Modeles");
31
-	$collecteurModeles = new Spip\Texte\Collecteur\Modeles();
29
+    include_spip("src/Texte/Collecteur/AbstractCollecteur");
30
+    include_spip("src/Texte/Collecteur/Modeles");
31
+    $collecteurModeles = new Spip\Texte\Collecteur\Modeles();
32 32
 
33
-	$options = [
34
-		'doublons' => $doublons,
35
-		'echap' => $echap,
36
-		'connect' => $connect,
37
-		'collecteurLiens' => $collecteurLiens,
38
-		'env' => $env
39
-	];
40
-	return $collecteurModeles->traiter($texte ?? '', $options);
33
+    $options = [
34
+        'doublons' => $doublons,
35
+        'echap' => $echap,
36
+        'connect' => $connect,
37
+        'collecteurLiens' => $collecteurLiens,
38
+        'env' => $env
39
+    ];
40
+    return $collecteurModeles->traiter($texte ?? '', $options);
41 41
 }
Please login to merge, or discard this patch.
ecrire/inc/liens.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -11,5 +11,5 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
Please login to merge, or discard this patch.
ecrire/inc/texte_mini.php 3 patches
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -83,8 +83,7 @@  discard block
 block discarded – undo
83 83
 		  . '</code>'
84 84
 		  . '</pre>'
85 85
 		  . '</div>';
86
-	}
87
-	else {
86
+	} else {
88 87
 		$echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
89 88
 		$echap = str_replace("  ", " &nbsp;", $echap);
90 89
 		$html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>';
@@ -611,8 +610,7 @@  discard block
 block discarded – undo
611 610
 		$collecteurLiens = $collecteurModeles = null;
612 611
 		if (!empty($options['expanser_liens'])) {
613 612
 			$texte = expanser_liens($texte, $env['connect'] ?? '', $env['env'] ?? []);
614
-		}
615
-		else {
613
+		} else {
616 614
 			include_spip("src/Texte/Collecteur/AbstractCollecteur");
617 615
 			include_spip("src/Texte/Collecteur/Liens");
618 616
 			include_spip("src/Texte/Collecteur/Modeles");
Please login to merge, or discard this patch.
Indentation   +518 added lines, -518 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 include_spip('inc/filtres');
22 22
 include_spip('inc/lang');
@@ -38,21 +38,21 @@  discard block
 block discarded – undo
38 38
  **/
39 39
 function definir_puce() {
40 40
 
41
-	// Attention au sens, qui n'est pas defini de la meme facon dans
42
-	// l'espace prive (spip_lang est la langue de l'interface, lang_dir
43
-	// celle du texte) et public (spip_lang est la langue du texte)
44
-	$dir = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']);
41
+    // Attention au sens, qui n'est pas defini de la meme facon dans
42
+    // l'espace prive (spip_lang est la langue de l'interface, lang_dir
43
+    // celle du texte) et public (spip_lang est la langue du texte)
44
+    $dir = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']);
45 45
 
46
-	$p = 'puce' . (test_espace_prive() ? '_prive' : '');
47
-	if ($dir == 'rtl') {
48
-		$p .= '_rtl';
49
-	}
46
+    $p = 'puce' . (test_espace_prive() ? '_prive' : '');
47
+    if ($dir == 'rtl') {
48
+        $p .= '_rtl';
49
+    }
50 50
 
51
-	if (!isset($GLOBALS[$p])) {
52
-		$GLOBALS[$p] = '<span class="spip-puce ' . $dir . '"><b>–</b></span>';
53
-	}
51
+    if (!isset($GLOBALS[$p])) {
52
+        $GLOBALS[$p] = '<span class="spip-puce ' . $dir . '"><b>–</b></span>';
53
+    }
54 54
 
55
-	return $GLOBALS[$p];
55
+    return $GLOBALS[$p];
56 56
 }
57 57
 
58 58
 /**
@@ -66,31 +66,31 @@  discard block
 block discarded – undo
66 66
  */
67 67
 function spip_balisage_code(string $corps, bool $bloc = false, string $attributs = '', string $langage = '') {
68 68
 
69
-	$echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
70
-	$class = "spip_code " . ($bloc ? 'spip_code_block' : 'spip_code_inline');
71
-	if ($attributs) {
72
-		$attributs = " " . trim($attributs);
73
-	}
74
-	if ($langage) {
75
-		$class .= " language-$langage";
76
-		$attributs .= ' data-language="'. $langage .'"';
77
-	}
78
-	if ($bloc) {
79
-		$html = "<div class=\"precode\">"
80
-		  . "<pre class=\"$class\" dir=\"ltr\" style=\"text-align: left;\"$attributs>"
81
-		  . "<code>"
82
-		  . $echap
83
-		  . '</code>'
84
-		  . '</pre>'
85
-		  . '</div>';
86
-	}
87
-	else {
88
-		$echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
89
-		$echap = str_replace("  ", " &nbsp;", $echap);
90
-		$html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>';
91
-	}
92
-
93
-	return $html;
69
+    $echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
70
+    $class = "spip_code " . ($bloc ? 'spip_code_block' : 'spip_code_inline');
71
+    if ($attributs) {
72
+        $attributs = " " . trim($attributs);
73
+    }
74
+    if ($langage) {
75
+        $class .= " language-$langage";
76
+        $attributs .= ' data-language="'. $langage .'"';
77
+    }
78
+    if ($bloc) {
79
+        $html = "<div class=\"precode\">"
80
+            . "<pre class=\"$class\" dir=\"ltr\" style=\"text-align: left;\"$attributs>"
81
+            . "<code>"
82
+            . $echap
83
+            . '</code>'
84
+            . '</pre>'
85
+            . '</div>';
86
+    }
87
+    else {
88
+        $echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
89
+        $echap = str_replace("  ", " &nbsp;", $echap);
90
+        $html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>';
91
+    }
92
+
93
+    return $html;
94 94
 }
95 95
 
96 96
 
@@ -98,14 +98,14 @@  discard block
 block discarded – undo
98 98
 // dont on souhaite qu'ils provoquent un saut de paragraphe
99 99
 
100 100
 if (!defined('_BALISES_BLOCS')) {
101
-	define(
102
-		'_BALISES_BLOCS',
103
-		'address|applet|article|aside|blockquote|button|center|d[ltd]|div|fieldset|fig(ure|caption)|footer|form|h[1-6r]|hgroup|head|header|iframe|li|map|marquee|nav|noscript|object|ol|pre|section|t(able|[rdh]|body|foot|extarea)|ul|script|style'
104
-	);
101
+    define(
102
+        '_BALISES_BLOCS',
103
+        'address|applet|article|aside|blockquote|button|center|d[ltd]|div|fieldset|fig(ure|caption)|footer|form|h[1-6r]|hgroup|head|header|iframe|li|map|marquee|nav|noscript|object|ol|pre|section|t(able|[rdh]|body|foot|extarea)|ul|script|style'
104
+    );
105 105
 }
106 106
 
107 107
 if (!defined('_BALISES_BLOCS_REGEXP')) {
108
-	define('_BALISES_BLOCS_REGEXP', ',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS');
108
+    define('_BALISES_BLOCS_REGEXP', ',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS');
109 109
 }
110 110
 
111 111
 //
@@ -116,100 +116,100 @@  discard block
 block discarded – undo
116 116
 // une $source differente ; le script detecte automagiquement si ce qu'on
117 117
 // echappe est un div ou un span
118 118
 function code_echappement($rempl, $source = '', $no_transform = false, $mode = null) {
119
-	if (!strlen($rempl)) {
120
-		return '';
121
-	}
122
-
123
-	// Tester si on echappe en span ou en div
124
-	if (is_null($mode) or !in_array($mode, ['div', 'span'])) {
125
-		$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $rempl) ? 'div' : 'span';
126
-	}
127
-
128
-	// Decouper en morceaux, base64 a des probleme selon la taille de la pile
129
-	$taille = 30000;
130
-	$return = '';
131
-	for ($i = 0; $i < strlen($rempl); $i += $taille) {
132
-		// Convertir en base64 et cacher dans un attribut
133
-		// utiliser les " pour eviter le re-encodage de ' et &#8217
134
-		$base64 = base64_encode(substr($rempl, $i, $taille));
135
-		$return .= "<$mode class=\"base64$source\" title=\"$base64\"></$mode>";
136
-	}
137
-
138
-	return $return;
119
+    if (!strlen($rempl)) {
120
+        return '';
121
+    }
122
+
123
+    // Tester si on echappe en span ou en div
124
+    if (is_null($mode) or !in_array($mode, ['div', 'span'])) {
125
+        $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $rempl) ? 'div' : 'span';
126
+    }
127
+
128
+    // Decouper en morceaux, base64 a des probleme selon la taille de la pile
129
+    $taille = 30000;
130
+    $return = '';
131
+    for ($i = 0; $i < strlen($rempl); $i += $taille) {
132
+        // Convertir en base64 et cacher dans un attribut
133
+        // utiliser les " pour eviter le re-encodage de ' et &#8217
134
+        $base64 = base64_encode(substr($rempl, $i, $taille));
135
+        $return .= "<$mode class=\"base64$source\" title=\"$base64\"></$mode>";
136
+    }
137
+
138
+    return $return;
139 139
 }
140 140
 
141 141
 
142 142
 // Echapper les <html>...</ html>
143 143
 function traiter_echap_html_dist($regs, $options = []) {
144
-	return $regs[3];
144
+    return $regs[3];
145 145
 }
146 146
 
147 147
 // Echapper les <pre>...</ pre>
148 148
 function traiter_echap_pre_dist($regs, $options = []) {
149
-	// echapper les <code> dans <pre>
150
-	$pre = $regs[3];
151
-
152
-	// echapper les < dans <code>
153
-	// on utilise _PROTEGE_BLOCS pour simplifier le code et la maintenance, mais on est interesse que par <code>
154
-	if (
155
-		strpos($pre, '<') !== false
156
-		and preg_match_all(_PROTEGE_BLOCS, $pre, $matches, PREG_SET_ORDER)
157
-	) {
158
-		foreach ($matches as $m) {
159
-			if ($m[1] === 'code') {
160
-				$code = '<code' . $m[2] . '>' . spip_htmlspecialchars($m[3]) . '</code>';
161
-				$pre = str_replace($m[0], $code, $pre);
162
-			}
163
-		}
164
-	}
165
-	return "<pre>$pre</pre>";
149
+    // echapper les <code> dans <pre>
150
+    $pre = $regs[3];
151
+
152
+    // echapper les < dans <code>
153
+    // on utilise _PROTEGE_BLOCS pour simplifier le code et la maintenance, mais on est interesse que par <code>
154
+    if (
155
+        strpos($pre, '<') !== false
156
+        and preg_match_all(_PROTEGE_BLOCS, $pre, $matches, PREG_SET_ORDER)
157
+    ) {
158
+        foreach ($matches as $m) {
159
+            if ($m[1] === 'code') {
160
+                $code = '<code' . $m[2] . '>' . spip_htmlspecialchars($m[3]) . '</code>';
161
+                $pre = str_replace($m[0], $code, $pre);
162
+            }
163
+        }
164
+    }
165
+    return "<pre>$pre</pre>";
166 166
 }
167 167
 
168 168
 // Echapper les <code>...</ code>
169 169
 function traiter_echap_code_dist($regs, $options = []) {
170
-	[, , $att, $corps] = $regs;
170
+    [, , $att, $corps] = $regs;
171 171
 
172
-	// ne pas mettre le <div...> s'il n'y a qu'une ligne
173
-	if (strpos($corps, "\n") !== false) {
174
-		// supprimer les sauts de ligne debut/fin
175
-		// (mais pas les espaces => ascii art).
176
-		$corps = preg_replace("/^[\n\r]+|[\n\r]+$/s", '', $corps);
172
+    // ne pas mettre le <div...> s'il n'y a qu'une ligne
173
+    if (strpos($corps, "\n") !== false) {
174
+        // supprimer les sauts de ligne debut/fin
175
+        // (mais pas les espaces => ascii art).
176
+        $corps = preg_replace("/^[\n\r]+|[\n\r]+$/s", '', $corps);
177 177
 
178
-		$echap = spip_balisage_code($corps, true, $att);
179
-	} else {
180
-		$echap = spip_balisage_code($corps, false, $att);
181
-	}
178
+        $echap = spip_balisage_code($corps, true, $att);
179
+    } else {
180
+        $echap = spip_balisage_code($corps, false, $att);
181
+    }
182 182
 
183
-	return $echap;
183
+    return $echap;
184 184
 }
185 185
 
186 186
 // Echapper les <cadre>...</ cadre> aka <frame>...</ frame>
187 187
 function traiter_echap_cadre_dist($regs, $options = []) {
188
-	$echap = trim(entites_html($regs[3]));
189
-	// compter les lignes un peu plus finement qu'avec les \n
190
-	$lignes = explode("\n", trim($echap));
191
-	$n = 0;
192
-	foreach ($lignes as $l) {
193
-		$n += floor(strlen($l) / 60) + 1;
194
-	}
195
-	$n = max($n, 2);
196
-	$echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre spip_cadre_block' dir='ltr'>$echap</textarea>";
197
-
198
-	return $echap;
188
+    $echap = trim(entites_html($regs[3]));
189
+    // compter les lignes un peu plus finement qu'avec les \n
190
+    $lignes = explode("\n", trim($echap));
191
+    $n = 0;
192
+    foreach ($lignes as $l) {
193
+        $n += floor(strlen($l) / 60) + 1;
194
+    }
195
+    $n = max($n, 2);
196
+    $echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre spip_cadre_block' dir='ltr'>$echap</textarea>";
197
+
198
+    return $echap;
199 199
 }
200 200
 
201 201
 function traiter_echap_frame_dist($regs, $options = []) {
202
-	return traiter_echap_cadre_dist($regs);
202
+    return traiter_echap_cadre_dist($regs);
203 203
 }
204 204
 
205 205
 function traiter_echap_script_dist($regs, $options = []) {
206
-	// rendre joli (et inactif) si c'est un script language=php
207
-	if (preg_match(',<script\b[^>]+php,ims', $regs[0])) {
208
-		return highlight_string($regs[0], true);
209
-	}
206
+    // rendre joli (et inactif) si c'est un script language=php
207
+    if (preg_match(',<script\b[^>]+php,ims', $regs[0])) {
208
+        return highlight_string($regs[0], true);
209
+    }
210 210
 
211
-	// Cas normal : le script passe tel quel
212
-	return $regs[0];
211
+    // Cas normal : le script passe tel quel
212
+    return $regs[0];
213 213
 }
214 214
 
215 215
 define('_PROTEGE_BLOCS', ',<(html|pre|code|cadre|frame|script|style)(\b[^>]*)?>(.*)</\1>,UimsS');
@@ -228,74 +228,74 @@  discard block
 block discarded – undo
228 228
  * @return string|string[]
229 229
  */
230 230
 function echappe_html(
231
-	$letexte,
232
-	$source = '',
233
-	$no_transform = false,
234
-	$preg = '',
235
-	$callback_prefix = '',
236
-	$callback_options = []
231
+    $letexte,
232
+    $source = '',
233
+    $no_transform = false,
234
+    $preg = '',
235
+    $callback_prefix = '',
236
+    $callback_options = []
237 237
 ) {
238
-	if (!is_string($letexte) or !strlen($letexte)) {
239
-		return $letexte;
240
-	}
241
-
242
-	if (
243
-		($preg or str_contains($letexte, '<'))
244
-		and preg_match_all($preg ?: _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)
245
-	) {
246
-		foreach ($matches as $regs) {
247
-			$echap = '';
248
-			// echappements tels quels ?
249
-			if ($no_transform) {
250
-				$echap = $regs[0];
251
-			} else {
252
-				// sinon les traiter selon le cas
253
-				$callback_secure_prefix = ($callback_options['secure_prefix'] ?? '');
254
-				if (
255
-					function_exists($f = $callback_prefix . $callback_secure_prefix . 'traiter_echap_' . strtolower($regs[1]))
256
-					or function_exists($f = $f . '_dist')
257
-					or ($callback_secure_prefix and (
258
-						function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1]))
259
-						or function_exists($f = $f . '_dist')
260
-					))
261
-				) {
262
-					$echap = $f($regs, $callback_options);
263
-				}
264
-			}
265
-
266
-			$p = strpos($letexte, (string) $regs[0]);
267
-			$letexte = substr_replace($letexte, code_echappement($echap, $source, $no_transform), $p, strlen($regs[0]));
268
-		}
269
-	}
270
-
271
-	if ($no_transform) {
272
-		return $letexte;
273
-	}
274
-
275
-	// Echapper le php pour faire joli (ici, c'est pas pour la securite)
276
-	// seulement si on a echappe les <script>
277
-	// (derogatoire car on ne peut pas faire passer < ? ... ? >
278
-	// dans une callback autonommee
279
-	if (strpos($preg ?: _PROTEGE_BLOCS, 'script') !== false) {
280
-		if (
281
-			strpos($letexte, '<' . '?') !== false and preg_match_all(
282
-				',<[?].*($|[?]>),UisS',
283
-				$letexte,
284
-				$matches,
285
-				PREG_SET_ORDER
286
-			)
287
-		) {
288
-			foreach ($matches as $regs) {
289
-				$letexte = str_replace(
290
-					$regs[0],
291
-					code_echappement(highlight_string($regs[0], true), $source),
292
-					$letexte
293
-				);
294
-			}
295
-		}
296
-	}
297
-
298
-	return $letexte;
238
+    if (!is_string($letexte) or !strlen($letexte)) {
239
+        return $letexte;
240
+    }
241
+
242
+    if (
243
+        ($preg or str_contains($letexte, '<'))
244
+        and preg_match_all($preg ?: _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)
245
+    ) {
246
+        foreach ($matches as $regs) {
247
+            $echap = '';
248
+            // echappements tels quels ?
249
+            if ($no_transform) {
250
+                $echap = $regs[0];
251
+            } else {
252
+                // sinon les traiter selon le cas
253
+                $callback_secure_prefix = ($callback_options['secure_prefix'] ?? '');
254
+                if (
255
+                    function_exists($f = $callback_prefix . $callback_secure_prefix . 'traiter_echap_' . strtolower($regs[1]))
256
+                    or function_exists($f = $f . '_dist')
257
+                    or ($callback_secure_prefix and (
258
+                        function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1]))
259
+                        or function_exists($f = $f . '_dist')
260
+                    ))
261
+                ) {
262
+                    $echap = $f($regs, $callback_options);
263
+                }
264
+            }
265
+
266
+            $p = strpos($letexte, (string) $regs[0]);
267
+            $letexte = substr_replace($letexte, code_echappement($echap, $source, $no_transform), $p, strlen($regs[0]));
268
+        }
269
+    }
270
+
271
+    if ($no_transform) {
272
+        return $letexte;
273
+    }
274
+
275
+    // Echapper le php pour faire joli (ici, c'est pas pour la securite)
276
+    // seulement si on a echappe les <script>
277
+    // (derogatoire car on ne peut pas faire passer < ? ... ? >
278
+    // dans une callback autonommee
279
+    if (strpos($preg ?: _PROTEGE_BLOCS, 'script') !== false) {
280
+        if (
281
+            strpos($letexte, '<' . '?') !== false and preg_match_all(
282
+                ',<[?].*($|[?]>),UisS',
283
+                $letexte,
284
+                $matches,
285
+                PREG_SET_ORDER
286
+            )
287
+        ) {
288
+            foreach ($matches as $regs) {
289
+                $letexte = str_replace(
290
+                    $regs[0],
291
+                    code_echappement(highlight_string($regs[0], true), $source),
292
+                    $letexte
293
+                );
294
+            }
295
+        }
296
+    }
297
+
298
+    return $letexte;
299 299
 }
300 300
 
301 301
 //
@@ -303,57 +303,57 @@  discard block
 block discarded – undo
303 303
 // Rq: $source sert a faire des echappements "a soi" qui ne sont pas nettoyes
304 304
 // par propre() : exemple dans multi et dans typo()
305 305
 function echappe_retour($letexte, $source = '', $filtre = '') {
306
-	if (strpos($letexte, (string) "base64$source")) {
307
-		# spip_log(spip_htmlspecialchars($letexte));  ## pour les curieux
308
-		$max_prof = 5;
309
-		while (
310
-			strpos($letexte, '<') !== false
311
-			and
312
-			preg_match_all(
313
-				',<(span|div)\sclass=[\'"]base64' . $source . '[\'"]\s(.*)>\s*</\1>,UmsS',
314
-				$letexte,
315
-				$regs,
316
-				PREG_SET_ORDER
317
-			)
318
-			and $max_prof--
319
-		) {
320
-			foreach ($regs as $reg) {
321
-				$rempl = base64_decode(extraire_attribut($reg[0], 'title'));
322
-				// recherche d'attributs supplementaires
323
-				$at = [];
324
-				foreach (['lang', 'dir'] as $attr) {
325
-					if ($a = extraire_attribut($reg[0], $attr)) {
326
-						$at[$attr] = $a;
327
-					}
328
-				}
329
-				if ($at) {
330
-					$rempl = '<' . $reg[1] . '>' . $rempl . '</' . $reg[1] . '>';
331
-					foreach ($at as $attr => $a) {
332
-						$rempl = inserer_attribut($rempl, $attr, $a);
333
-					}
334
-				}
335
-				if ($filtre) {
336
-					$rempl = $filtre($rempl);
337
-				}
338
-				$letexte = str_replace($reg[0], $rempl, $letexte);
339
-			}
340
-		}
341
-	}
342
-
343
-	return $letexte;
306
+    if (strpos($letexte, (string) "base64$source")) {
307
+        # spip_log(spip_htmlspecialchars($letexte));  ## pour les curieux
308
+        $max_prof = 5;
309
+        while (
310
+            strpos($letexte, '<') !== false
311
+            and
312
+            preg_match_all(
313
+                ',<(span|div)\sclass=[\'"]base64' . $source . '[\'"]\s(.*)>\s*</\1>,UmsS',
314
+                $letexte,
315
+                $regs,
316
+                PREG_SET_ORDER
317
+            )
318
+            and $max_prof--
319
+        ) {
320
+            foreach ($regs as $reg) {
321
+                $rempl = base64_decode(extraire_attribut($reg[0], 'title'));
322
+                // recherche d'attributs supplementaires
323
+                $at = [];
324
+                foreach (['lang', 'dir'] as $attr) {
325
+                    if ($a = extraire_attribut($reg[0], $attr)) {
326
+                        $at[$attr] = $a;
327
+                    }
328
+                }
329
+                if ($at) {
330
+                    $rempl = '<' . $reg[1] . '>' . $rempl . '</' . $reg[1] . '>';
331
+                    foreach ($at as $attr => $a) {
332
+                        $rempl = inserer_attribut($rempl, $attr, $a);
333
+                    }
334
+                }
335
+                if ($filtre) {
336
+                    $rempl = $filtre($rempl);
337
+                }
338
+                $letexte = str_replace($reg[0], $rempl, $letexte);
339
+            }
340
+        }
341
+    }
342
+
343
+    return $letexte;
344 344
 }
345 345
 
346 346
 // Reinserer le javascript de confiance (venant des modeles)
347 347
 
348 348
 function echappe_retour_modeles($letexte, $interdire_scripts = false) {
349
-	$letexte = echappe_retour($letexte);
349
+    $letexte = echappe_retour($letexte);
350 350
 
351
-	// Dans les appels directs hors squelette, securiser aussi ici
352
-	if ($interdire_scripts) {
353
-		$letexte = interdire_scripts($letexte);
354
-	}
351
+    // Dans les appels directs hors squelette, securiser aussi ici
352
+    if ($interdire_scripts) {
353
+        $letexte = interdire_scripts($letexte);
354
+    }
355 355
 
356
-	return trim($letexte);
356
+    return trim($letexte);
357 357
 }
358 358
 
359 359
 
@@ -381,128 +381,128 @@  discard block
 block discarded – undo
381 381
  *     texte coupé
382 382
  **/
383 383
 function couper($texte, $taille = 50, $suite = null) {
384
-	if (!($length = strlen($texte)) or $taille <= 0) {
385
-		return '';
386
-	}
387
-	$offset = 400 + 2 * $taille;
388
-	while (
389
-		$offset < $length
390
-		and strlen(preg_replace(',<(!--|\w|/)[^>]+>,Uims', '', substr($texte, 0, $offset))) < $taille
391
-	) {
392
-		$offset = 2 * $offset;
393
-	}
394
-	if (
395
-		$offset < $length
396
-		&& ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== null
397
-	) {
398
-		$p_tag_fermant = strpos($texte, '>', $offset);
399
-		if ($p_tag_fermant && ($p_tag_fermant < $p_tag_ouvrant)) {
400
-			$offset = $p_tag_fermant + 1;
401
-		} // prolonger la coupe jusqu'au tag fermant suivant eventuel
402
-	}
403
-	$texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */
404
-
405
-	if (!function_exists('nettoyer_raccourcis_typo')) {
406
-		include_spip('inc/lien');
407
-	}
408
-	$texte = nettoyer_raccourcis_typo($texte);
409
-
410
-	// balises de sauts de ligne et paragraphe
411
-	$texte = preg_replace('/<p( [^>]*)?' . '>/', "\r\r", $texte);
412
-	$texte = preg_replace('/<br( [^>]*)?' . '>/', "\n", $texte);
413
-
414
-	// on repasse les doubles \n en \r que nettoyer_raccourcis_typo() a pu modifier
415
-	$texte = str_replace("\n\n", "\r\r", $texte);
416
-
417
-	// supprimer les tags
418
-	$texte = supprimer_tags($texte);
419
-	$texte = trim(str_replace("\n", ' ', $texte));
420
-
421
-	// tester s'il est nécessaire de couper le texte
422
-	if (spip_strlen($texte) <= $taille) {
423
-		$points = '';
424
-	} else {
425
-		// points de suite
426
-		if (is_null($suite)) {
427
-			$suite = (defined('_COUPER_SUITE') ? _COUPER_SUITE : '&nbsp;(...)');
428
-		}
429
-		$taille_suite = spip_strlen(filtrer_entites($suite));
430
-
431
-		// couper au mot precedent (ou au début de la chaîne si c'est le premier mot)
432
-		// on coupe avec un caractère de plus que la taille demandée afin de pouvoir
433
-		// détecter si le dernier mot du texte coupé est complet ou non. ce caractère
434
-		// excédentaire est ensuite supprimé par l'appel à preg_replace()
435
-		$long = spip_substr($texte, 0, max($taille + 1 - $taille_suite, 1));
436
-		$u = $GLOBALS['meta']['pcre_u'];
437
-		$court = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, "\\2", $long);
438
-		$points = $suite;
439
-
440
-		// trop court ? ne pas faire de (...)
441
-		if (spip_strlen($court) < max(0.75 * $taille, 2)) {
442
-			$points = '';
443
-			$long = spip_substr($texte, 0, $taille + 1);
444
-			preg_match('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, $long, $m);
445
-			$texte = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, "\\2", $long);
446
-			// encore trop court ? couper au caractere
447
-			if (spip_strlen($texte) < 0.75 * $taille) {
448
-				$texte = spip_substr($long, 0, $taille);
449
-			}
450
-		} else {
451
-			$texte = $court;
452
-		}
453
-	}
454
-
455
-	// remettre les paragraphes
456
-	$texte = preg_replace("/\r\r+/", "\n\n", $texte);
457
-
458
-	// supprimer l'eventuelle entite finale mal coupee
459
-	$texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
460
-
461
-	return quote_amp(trim($texte)) . $points;
384
+    if (!($length = strlen($texte)) or $taille <= 0) {
385
+        return '';
386
+    }
387
+    $offset = 400 + 2 * $taille;
388
+    while (
389
+        $offset < $length
390
+        and strlen(preg_replace(',<(!--|\w|/)[^>]+>,Uims', '', substr($texte, 0, $offset))) < $taille
391
+    ) {
392
+        $offset = 2 * $offset;
393
+    }
394
+    if (
395
+        $offset < $length
396
+        && ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== null
397
+    ) {
398
+        $p_tag_fermant = strpos($texte, '>', $offset);
399
+        if ($p_tag_fermant && ($p_tag_fermant < $p_tag_ouvrant)) {
400
+            $offset = $p_tag_fermant + 1;
401
+        } // prolonger la coupe jusqu'au tag fermant suivant eventuel
402
+    }
403
+    $texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */
404
+
405
+    if (!function_exists('nettoyer_raccourcis_typo')) {
406
+        include_spip('inc/lien');
407
+    }
408
+    $texte = nettoyer_raccourcis_typo($texte);
409
+
410
+    // balises de sauts de ligne et paragraphe
411
+    $texte = preg_replace('/<p( [^>]*)?' . '>/', "\r\r", $texte);
412
+    $texte = preg_replace('/<br( [^>]*)?' . '>/', "\n", $texte);
413
+
414
+    // on repasse les doubles \n en \r que nettoyer_raccourcis_typo() a pu modifier
415
+    $texte = str_replace("\n\n", "\r\r", $texte);
416
+
417
+    // supprimer les tags
418
+    $texte = supprimer_tags($texte);
419
+    $texte = trim(str_replace("\n", ' ', $texte));
420
+
421
+    // tester s'il est nécessaire de couper le texte
422
+    if (spip_strlen($texte) <= $taille) {
423
+        $points = '';
424
+    } else {
425
+        // points de suite
426
+        if (is_null($suite)) {
427
+            $suite = (defined('_COUPER_SUITE') ? _COUPER_SUITE : '&nbsp;(...)');
428
+        }
429
+        $taille_suite = spip_strlen(filtrer_entites($suite));
430
+
431
+        // couper au mot precedent (ou au début de la chaîne si c'est le premier mot)
432
+        // on coupe avec un caractère de plus que la taille demandée afin de pouvoir
433
+        // détecter si le dernier mot du texte coupé est complet ou non. ce caractère
434
+        // excédentaire est ensuite supprimé par l'appel à preg_replace()
435
+        $long = spip_substr($texte, 0, max($taille + 1 - $taille_suite, 1));
436
+        $u = $GLOBALS['meta']['pcre_u'];
437
+        $court = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, "\\2", $long);
438
+        $points = $suite;
439
+
440
+        // trop court ? ne pas faire de (...)
441
+        if (spip_strlen($court) < max(0.75 * $taille, 2)) {
442
+            $points = '';
443
+            $long = spip_substr($texte, 0, $taille + 1);
444
+            preg_match('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, $long, $m);
445
+            $texte = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, "\\2", $long);
446
+            // encore trop court ? couper au caractere
447
+            if (spip_strlen($texte) < 0.75 * $taille) {
448
+                $texte = spip_substr($long, 0, $taille);
449
+            }
450
+        } else {
451
+            $texte = $court;
452
+        }
453
+    }
454
+
455
+    // remettre les paragraphes
456
+    $texte = preg_replace("/\r\r+/", "\n\n", $texte);
457
+
458
+    // supprimer l'eventuelle entite finale mal coupee
459
+    $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
460
+
461
+    return quote_amp(trim($texte)) . $points;
462 462
 }
463 463
 
464 464
 
465 465
 function protege_js_modeles($t) {
466
-	if (isset($GLOBALS['visiteur_session'])) {
467
-		if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) {
468
-			if (!defined('_PROTEGE_JS_MODELES')) {
469
-				include_spip('inc/acces');
470
-				define('_PROTEGE_JS_MODELES', creer_uniqid());
471
-			}
472
-			foreach ($r as $regs) {
473
-				$t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t);
474
-			}
475
-		}
476
-		if (preg_match_all(',<\?php.*?($|\?' . '>),isS', $t, $r, PREG_SET_ORDER)) {
477
-			if (!defined('_PROTEGE_PHP_MODELES')) {
478
-				include_spip('inc/acces');
479
-				define('_PROTEGE_PHP_MODELES', creer_uniqid());
480
-			}
481
-			foreach ($r as $regs) {
482
-				$t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t);
483
-			}
484
-		}
485
-	}
486
-
487
-	return $t;
466
+    if (isset($GLOBALS['visiteur_session'])) {
467
+        if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) {
468
+            if (!defined('_PROTEGE_JS_MODELES')) {
469
+                include_spip('inc/acces');
470
+                define('_PROTEGE_JS_MODELES', creer_uniqid());
471
+            }
472
+            foreach ($r as $regs) {
473
+                $t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t);
474
+            }
475
+        }
476
+        if (preg_match_all(',<\?php.*?($|\?' . '>),isS', $t, $r, PREG_SET_ORDER)) {
477
+            if (!defined('_PROTEGE_PHP_MODELES')) {
478
+                include_spip('inc/acces');
479
+                define('_PROTEGE_PHP_MODELES', creer_uniqid());
480
+            }
481
+            foreach ($r as $regs) {
482
+                $t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t);
483
+            }
484
+        }
485
+    }
486
+
487
+    return $t;
488 488
 }
489 489
 
490 490
 
491 491
 function echapper_faux_tags($letexte) {
492
-	if (strpos($letexte, '<') === false) {
493
-		return $letexte;
494
-	}
495
-	$textMatches = preg_split(',(</?[a-z!][^<>]*>),', $letexte, -1, PREG_SPLIT_DELIM_CAPTURE);
496
-
497
-	$letexte = '';
498
-	while (is_countable($textMatches) ? count($textMatches) : 0) {
499
-		// un texte a echapper
500
-		$letexte .= str_replace('<', '&lt;', array_shift($textMatches));
501
-		// un tag html qui a servit a faite le split
502
-		$letexte .= array_shift($textMatches);
503
-	}
504
-
505
-	return $letexte;
492
+    if (strpos($letexte, '<') === false) {
493
+        return $letexte;
494
+    }
495
+    $textMatches = preg_split(',(</?[a-z!][^<>]*>),', $letexte, -1, PREG_SPLIT_DELIM_CAPTURE);
496
+
497
+    $letexte = '';
498
+    while (is_countable($textMatches) ? count($textMatches) : 0) {
499
+        // un texte a echapper
500
+        $letexte .= str_replace('<', '&lt;', array_shift($textMatches));
501
+        // un tag html qui a servit a faite le split
502
+        $letexte .= array_shift($textMatches);
503
+    }
504
+
505
+    return $letexte;
506 506
 }
507 507
 
508 508
 /**
@@ -522,115 +522,115 @@  discard block
 block discarded – undo
522 522
  * @return string
523 523
  */
524 524
 function echapper_html_suspect($texte, $options = [], $connect = null, $env = []) {
525
-	static $echapper_html_suspect;
526
-	if (!$texte or !is_string($texte)) {
527
-		return $texte;
528
-	}
529
-
530
-	if (!isset($echapper_html_suspect)) {
531
-		$echapper_html_suspect = charger_fonction('echapper_html_suspect', 'inc', true);
532
-	}
533
-	// si fonction personalisee, on delegue
534
-	if ($echapper_html_suspect) {
535
-		// on collecte le tableau d'arg minimal pour ne pas casser un appel a une fonction inc_echapper_html_suspect() selon l'ancienne signature
536
-		$args = [$texte, $options];
537
-		if ($connect or !empty($env)) {
538
-			$args[] = $connect;
539
-		}
540
-		if (!empty($env)) {
541
-			$args[] = $env;
542
-		}
543
-		return $echapper_html_suspect(...$args);
544
-	}
545
-
546
-	if (is_bool($options)) {
547
-		$options = ['strict' => $options];
548
-	}
549
-	$strict = $options['strict'] ?? true;
550
-
551
-	// pas de balise html ou pas d'attribut sur les balises ? c'est OK
552
-	if (
553
-		strpos($texte, '<') === false
554
-		or !str_contains($texte, '=')
555
-	) {
556
-		return $texte;
557
-	}
558
-
559
-	// dans le prive, on veut afficher tout echappé pour la moderation
560
-	if (!isset($env['espace_prive'])) {
561
-		// conserver le comportement historique en cas d'appel court sans env
562
-		$env['espace_prive'] = test_espace_prive();
563
-	}
564
-	if (!empty($env['espace_prive']) or !empty($env['wysiwyg'])) {
565
-
566
-		// quand c'est du texte qui passe par propre on est plus coulant tant qu'il y a pas d'attribut du type onxxx=
567
-		// car sinon on declenche sur les modeles ou ressources
568
-		if (
569
-			!$strict and
570
-			(strpos($texte, 'on') === false or !preg_match(",<\w+.*\bon\w+\s*=,UimsS", $texte))
571
-		) {
572
-			return $texte;
573
-		}
574
-
575
-		include_spip("src/Texte/Collecteur/AbstractCollecteur");
576
-		include_spip("src/Texte/Collecteur/Modeles");
577
-		$collecteurModeles = new Spip\Texte\Collecteur\Modeles();
578
-		$texte = $collecteurModeles->echapper($texte);
579
-		$texte = echappe_js($texte);
580
-
581
-		$texte_to_check = $texte;
582
-		// si les raccourcis liens vont etre interprétés, il faut les expanser avant de vérifier que le html est safe
583
-		// car un raccourci peut etre utilisé pour faire un lien malin
584
-		// et un raccourci est potentiellement modifié par safehtml, ce qui fait un faux positif dans is_html_safe
585
-		if (!empty($options['expanser_liens'])) {
586
-			$texte_to_check = expanser_liens($texte_to_check, $env['connect'] ?? '', $env['env'] ?? []);
587
-		}
588
-		if (!is_html_safe($texte_to_check)) {
589
-			$texte = $options['texte_source_affiche'] ?? $texte;
590
-			$texte = preg_replace(",<(/?\w+\b[^>]*>),", "<tt>&lt;\\1</tt>", $texte);
591
-			$texte = str_replace('<', '&lt;', $texte);
592
-			$texte = str_replace('&lt;tt>', '<tt>', $texte);
593
-			$texte = str_replace('&lt;/tt>', '</tt>', $texte);
594
-			if (!function_exists('attribut_html')) {
595
-				include_spip('inc/filtres');
596
-			}
597
-			if (!empty($options['wrap_suspect'])) {
598
-				$texte = wrap($texte, $options['wrap_suspect']);
599
-			}
600
-			$texte = "<mark class='danger-js' title='" . attribut_html(_T('erreur_contenu_suspect')) . "'>⚠️</mark> " . $texte;
601
-		}
602
-
603
-		$texte = $collecteurModeles->retablir($texte);
604
-	}
605
-
606
-	// si on est là dans le public c'est le mode parano
607
-	// on veut donc un rendu propre et secure, et virer silencieusement ce qui est dangereux
608
-	else {
609
-		$collecteurLiens = $collecteurModeles = null;
610
-		if (!empty($options['expanser_liens'])) {
611
-			$texte = expanser_liens($texte, $env['connect'] ?? '', $env['env'] ?? []);
612
-		}
613
-		else {
614
-			include_spip("src/Texte/Collecteur/AbstractCollecteur");
615
-			include_spip("src/Texte/Collecteur/Liens");
616
-			include_spip("src/Texte/Collecteur/Modeles");
617
-
618
-			$collecteurLiens = new Spip\Texte\Collecteur\Liens();
619
-			$texte = $collecteurLiens->echapper($texte, ['sanitize_callback' => 'safehtml']);
620
-
621
-			$collecteurModeles = new Spip\Texte\Collecteur\Modeles();
622
-			$texte = $collecteurModeles->echapper($texte);
623
-		}
624
-		$texte = safehtml($texte);
625
-		if ($collecteurModeles) {
626
-			$texte = $collecteurModeles->retablir($texte);
627
-		}
628
-		if ($collecteurLiens) {
629
-			$texte = $collecteurLiens->retablir($texte);
630
-		}
631
-	}
632
-
633
-	return $texte;
525
+    static $echapper_html_suspect;
526
+    if (!$texte or !is_string($texte)) {
527
+        return $texte;
528
+    }
529
+
530
+    if (!isset($echapper_html_suspect)) {
531
+        $echapper_html_suspect = charger_fonction('echapper_html_suspect', 'inc', true);
532
+    }
533
+    // si fonction personalisee, on delegue
534
+    if ($echapper_html_suspect) {
535
+        // on collecte le tableau d'arg minimal pour ne pas casser un appel a une fonction inc_echapper_html_suspect() selon l'ancienne signature
536
+        $args = [$texte, $options];
537
+        if ($connect or !empty($env)) {
538
+            $args[] = $connect;
539
+        }
540
+        if (!empty($env)) {
541
+            $args[] = $env;
542
+        }
543
+        return $echapper_html_suspect(...$args);
544
+    }
545
+
546
+    if (is_bool($options)) {
547
+        $options = ['strict' => $options];
548
+    }
549
+    $strict = $options['strict'] ?? true;
550
+
551
+    // pas de balise html ou pas d'attribut sur les balises ? c'est OK
552
+    if (
553
+        strpos($texte, '<') === false
554
+        or !str_contains($texte, '=')
555
+    ) {
556
+        return $texte;
557
+    }
558
+
559
+    // dans le prive, on veut afficher tout echappé pour la moderation
560
+    if (!isset($env['espace_prive'])) {
561
+        // conserver le comportement historique en cas d'appel court sans env
562
+        $env['espace_prive'] = test_espace_prive();
563
+    }
564
+    if (!empty($env['espace_prive']) or !empty($env['wysiwyg'])) {
565
+
566
+        // quand c'est du texte qui passe par propre on est plus coulant tant qu'il y a pas d'attribut du type onxxx=
567
+        // car sinon on declenche sur les modeles ou ressources
568
+        if (
569
+            !$strict and
570
+            (strpos($texte, 'on') === false or !preg_match(",<\w+.*\bon\w+\s*=,UimsS", $texte))
571
+        ) {
572
+            return $texte;
573
+        }
574
+
575
+        include_spip("src/Texte/Collecteur/AbstractCollecteur");
576
+        include_spip("src/Texte/Collecteur/Modeles");
577
+        $collecteurModeles = new Spip\Texte\Collecteur\Modeles();
578
+        $texte = $collecteurModeles->echapper($texte);
579
+        $texte = echappe_js($texte);
580
+
581
+        $texte_to_check = $texte;
582
+        // si les raccourcis liens vont etre interprétés, il faut les expanser avant de vérifier que le html est safe
583
+        // car un raccourci peut etre utilisé pour faire un lien malin
584
+        // et un raccourci est potentiellement modifié par safehtml, ce qui fait un faux positif dans is_html_safe
585
+        if (!empty($options['expanser_liens'])) {
586
+            $texte_to_check = expanser_liens($texte_to_check, $env['connect'] ?? '', $env['env'] ?? []);
587
+        }
588
+        if (!is_html_safe($texte_to_check)) {
589
+            $texte = $options['texte_source_affiche'] ?? $texte;
590
+            $texte = preg_replace(",<(/?\w+\b[^>]*>),", "<tt>&lt;\\1</tt>", $texte);
591
+            $texte = str_replace('<', '&lt;', $texte);
592
+            $texte = str_replace('&lt;tt>', '<tt>', $texte);
593
+            $texte = str_replace('&lt;/tt>', '</tt>', $texte);
594
+            if (!function_exists('attribut_html')) {
595
+                include_spip('inc/filtres');
596
+            }
597
+            if (!empty($options['wrap_suspect'])) {
598
+                $texte = wrap($texte, $options['wrap_suspect']);
599
+            }
600
+            $texte = "<mark class='danger-js' title='" . attribut_html(_T('erreur_contenu_suspect')) . "'>⚠️</mark> " . $texte;
601
+        }
602
+
603
+        $texte = $collecteurModeles->retablir($texte);
604
+    }
605
+
606
+    // si on est là dans le public c'est le mode parano
607
+    // on veut donc un rendu propre et secure, et virer silencieusement ce qui est dangereux
608
+    else {
609
+        $collecteurLiens = $collecteurModeles = null;
610
+        if (!empty($options['expanser_liens'])) {
611
+            $texte = expanser_liens($texte, $env['connect'] ?? '', $env['env'] ?? []);
612
+        }
613
+        else {
614
+            include_spip("src/Texte/Collecteur/AbstractCollecteur");
615
+            include_spip("src/Texte/Collecteur/Liens");
616
+            include_spip("src/Texte/Collecteur/Modeles");
617
+
618
+            $collecteurLiens = new Spip\Texte\Collecteur\Liens();
619
+            $texte = $collecteurLiens->echapper($texte, ['sanitize_callback' => 'safehtml']);
620
+
621
+            $collecteurModeles = new Spip\Texte\Collecteur\Modeles();
622
+            $texte = $collecteurModeles->echapper($texte);
623
+        }
624
+        $texte = safehtml($texte);
625
+        if ($collecteurModeles) {
626
+            $texte = $collecteurModeles->retablir($texte);
627
+        }
628
+        if ($collecteurLiens) {
629
+            $texte = $collecteurLiens->retablir($texte);
630
+        }
631
+    }
632
+
633
+    return $texte;
634 634
 }
635 635
 
636 636
 
@@ -651,52 +651,52 @@  discard block
 block discarded – undo
651 651
  *      texte sécurisé
652 652
  **/
653 653
 function safehtml($t) {
654
-	static $safehtml;
655
-
656
-	if (!$t or !is_string($t)) {
657
-		return $t;
658
-	}
659
-	# attention safehtml nettoie deux ou trois caracteres de plus. A voir
660
-	if (strpos($t, '<') === false) {
661
-		return str_replace("\x00", '', $t);
662
-	}
663
-
664
-	$collecteurIdiomes = null;
665
-	if (stripos($t, '<:') !== false) {
666
-		include_spip("src/Texte/Collecteur/AbstractCollecteur");
667
-		include_spip("src/Texte/Collecteur/Idiomes");
668
-		$collecteurIdiomes = new Spip\Texte\Collecteur\Idiomes();
669
-		$t = $collecteurIdiomes->echapper($t);
670
-	}
671
-	$collecteurMultis = null;
672
-	if (stripos($t, '<multi') !== false) {
673
-		include_spip("src/Texte/Collecteur/AbstractCollecteur");
674
-		include_spip("src/Texte/Collecteur/Multis");
675
-		$collecteurMultis = new Spip\Texte\Collecteur\Multis();
676
-		$t = $collecteurMultis->echapper($t, ['sanitize_callback' => 'safehtml']);
677
-	}
678
-
679
-	if (!function_exists('interdire_scripts')) {
680
-		include_spip('inc/texte');
681
-	}
682
-	$t = interdire_scripts($t); // jolifier le php
683
-	$t = echappe_js($t);
684
-
685
-	if (!isset($safehtml)) {
686
-		$safehtml = charger_fonction('safehtml', 'inc', true);
687
-	}
688
-	if ($safehtml) {
689
-		$t = $safehtml($t);
690
-	}
691
-
692
-	if ($collecteurMultis) {
693
-		$t = $collecteurMultis->retablir($t);
694
-	}
695
-	if ($collecteurIdiomes) {
696
-		$t = $collecteurIdiomes->retablir($t);
697
-	}
698
-
699
-	return interdire_scripts($t); // interdire le php (2 precautions)
654
+    static $safehtml;
655
+
656
+    if (!$t or !is_string($t)) {
657
+        return $t;
658
+    }
659
+    # attention safehtml nettoie deux ou trois caracteres de plus. A voir
660
+    if (strpos($t, '<') === false) {
661
+        return str_replace("\x00", '', $t);
662
+    }
663
+
664
+    $collecteurIdiomes = null;
665
+    if (stripos($t, '<:') !== false) {
666
+        include_spip("src/Texte/Collecteur/AbstractCollecteur");
667
+        include_spip("src/Texte/Collecteur/Idiomes");
668
+        $collecteurIdiomes = new Spip\Texte\Collecteur\Idiomes();
669
+        $t = $collecteurIdiomes->echapper($t);
670
+    }
671
+    $collecteurMultis = null;
672
+    if (stripos($t, '<multi') !== false) {
673
+        include_spip("src/Texte/Collecteur/AbstractCollecteur");
674
+        include_spip("src/Texte/Collecteur/Multis");
675
+        $collecteurMultis = new Spip\Texte\Collecteur\Multis();
676
+        $t = $collecteurMultis->echapper($t, ['sanitize_callback' => 'safehtml']);
677
+    }
678
+
679
+    if (!function_exists('interdire_scripts')) {
680
+        include_spip('inc/texte');
681
+    }
682
+    $t = interdire_scripts($t); // jolifier le php
683
+    $t = echappe_js($t);
684
+
685
+    if (!isset($safehtml)) {
686
+        $safehtml = charger_fonction('safehtml', 'inc', true);
687
+    }
688
+    if ($safehtml) {
689
+        $t = $safehtml($t);
690
+    }
691
+
692
+    if ($collecteurMultis) {
693
+        $t = $collecteurMultis->retablir($t);
694
+    }
695
+    if ($collecteurIdiomes) {
696
+        $t = $collecteurIdiomes->retablir($t);
697
+    }
698
+
699
+    return interdire_scripts($t); // interdire le php (2 precautions)
700 700
 }
701 701
 
702 702
 
@@ -704,25 +704,25 @@  discard block
 block discarded – undo
704 704
  * Detecter si un texte est "safe" ie non modifie significativement par safehtml()
705 705
  */
706 706
 function is_html_safe(string $texte): bool {
707
-	if ($is_html_safe = charger_fonction('is_html_safe', 'inc', true)) {
708
-		return $is_html_safe($texte);
709
-	}
710
-
711
-	// simplifier les retour ligne pour etre certain de ce que l'on compare
712
-	$texte = str_replace("\r\n", "\n", $texte);
713
-	// safehtml reduit aussi potentiellement les &nbsp;
714
-	$texte = str_replace("&nbsp;", " ", $texte);
715
-	// safehtml remplace les entités numériques
716
-	if (strpos($texte, '&#') !== false) {
717
-		$texte = unicode2charset($texte);
718
-	}
719
-
720
-	$texte_safe = safehtml($texte);
721
-
722
-	// on teste sur strlen car safehtml supprime le contenu dangereux
723
-	// mais il peut aussi changer des ' en " sur les attributs html,
724
-	// donc un test d'egalite est trop strict
725
-	return strlen($texte_safe) === strlen($texte);
707
+    if ($is_html_safe = charger_fonction('is_html_safe', 'inc', true)) {
708
+        return $is_html_safe($texte);
709
+    }
710
+
711
+    // simplifier les retour ligne pour etre certain de ce que l'on compare
712
+    $texte = str_replace("\r\n", "\n", $texte);
713
+    // safehtml reduit aussi potentiellement les &nbsp;
714
+    $texte = str_replace("&nbsp;", " ", $texte);
715
+    // safehtml remplace les entités numériques
716
+    if (strpos($texte, '&#') !== false) {
717
+        $texte = unicode2charset($texte);
718
+    }
719
+
720
+    $texte_safe = safehtml($texte);
721
+
722
+    // on teste sur strlen car safehtml supprime le contenu dangereux
723
+    // mais il peut aussi changer des ' en " sur les attributs html,
724
+    // donc un test d'egalite est trop strict
725
+    return strlen($texte_safe) === strlen($texte);
726 726
 }
727 727
 
728 728
 /**
@@ -743,13 +743,13 @@  discard block
 block discarded – undo
743 743
  *     texte sans les modèles d'image
744 744
  **/
745 745
 function supprime_img($letexte, $message = null) {
746
-	if ($message === null) {
747
-		$message = '(' . _T('img_indisponible') . ')';
748
-	}
749
-
750
-	return preg_replace(
751
-		',<(img|doc|emb)([0-9]+)(\|([^>]*))?' . '\s*/?' . '>,i',
752
-		$message,
753
-		$letexte
754
-	);
746
+    if ($message === null) {
747
+        $message = '(' . _T('img_indisponible') . ')';
748
+    }
749
+
750
+    return preg_replace(
751
+        ',<(img|doc|emb)([0-9]+)(\|([^>]*))?' . '\s*/?' . '>,i',
752
+        $message,
753
+        $letexte
754
+    );
755 755
 }
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -43,13 +43,13 @@  discard block
 block discarded – undo
43 43
 	// celle du texte) et public (spip_lang est la langue du texte)
44 44
 	$dir = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']);
45 45
 
46
-	$p = 'puce' . (test_espace_prive() ? '_prive' : '');
46
+	$p = 'puce'.(test_espace_prive() ? '_prive' : '');
47 47
 	if ($dir == 'rtl') {
48 48
 		$p .= '_rtl';
49 49
 	}
50 50
 
51 51
 	if (!isset($GLOBALS[$p])) {
52
-		$GLOBALS[$p] = '<span class="spip-puce ' . $dir . '"><b>–</b></span>';
52
+		$GLOBALS[$p] = '<span class="spip-puce '.$dir.'"><b>–</b></span>';
53 53
 	}
54 54
 
55 55
 	return $GLOBALS[$p];
@@ -67,13 +67,13 @@  discard block
 block discarded – undo
67 67
 function spip_balisage_code(string $corps, bool $bloc = false, string $attributs = '', string $langage = '') {
68 68
 
69 69
 	$echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
70
-	$class = "spip_code " . ($bloc ? 'spip_code_block' : 'spip_code_inline');
70
+	$class = "spip_code ".($bloc ? 'spip_code_block' : 'spip_code_inline');
71 71
 	if ($attributs) {
72
-		$attributs = " " . trim($attributs);
72
+		$attributs = " ".trim($attributs);
73 73
 	}
74 74
 	if ($langage) {
75 75
 		$class .= " language-$langage";
76
-		$attributs .= ' data-language="'. $langage .'"';
76
+		$attributs .= ' data-language="'.$langage.'"';
77 77
 	}
78 78
 	if ($bloc) {
79 79
 		$html = "<div class=\"precode\">"
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
 	else {
88 88
 		$echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
89 89
 		$echap = str_replace("  ", " &nbsp;", $echap);
90
-		$html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>';
90
+		$html = "<code class=\"$class\" dir=\"ltr\"$attributs>".$echap.'</code>';
91 91
 	}
92 92
 
93 93
 	return $html;
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
 }
106 106
 
107 107
 if (!defined('_BALISES_BLOCS_REGEXP')) {
108
-	define('_BALISES_BLOCS_REGEXP', ',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS');
108
+	define('_BALISES_BLOCS_REGEXP', ',</?('._BALISES_BLOCS.')[>[:space:]],iS');
109 109
 }
110 110
 
111 111
 //
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
 
123 123
 	// Tester si on echappe en span ou en div
124 124
 	if (is_null($mode) or !in_array($mode, ['div', 'span'])) {
125
-		$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $rempl) ? 'div' : 'span';
125
+		$mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $rempl) ? 'div' : 'span';
126 126
 	}
127 127
 
128 128
 	// Decouper en morceaux, base64 a des probleme selon la taille de la pile
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
 	) {
158 158
 		foreach ($matches as $m) {
159 159
 			if ($m[1] === 'code') {
160
-				$code = '<code' . $m[2] . '>' . spip_htmlspecialchars($m[3]) . '</code>';
160
+				$code = '<code'.$m[2].'>'.spip_htmlspecialchars($m[3]).'</code>';
161 161
 				$pre = str_replace($m[0], $code, $pre);
162 162
 			}
163 163
 		}
@@ -167,7 +167,7 @@  discard block
 block discarded – undo
167 167
 
168 168
 // Echapper les <code>...</ code>
169 169
 function traiter_echap_code_dist($regs, $options = []) {
170
-	[, , $att, $corps] = $regs;
170
+	[,, $att, $corps] = $regs;
171 171
 
172 172
 	// ne pas mettre le <div...> s'il n'y a qu'une ligne
173 173
 	if (strpos($corps, "\n") !== false) {
@@ -252,11 +252,11 @@  discard block
 block discarded – undo
252 252
 				// sinon les traiter selon le cas
253 253
 				$callback_secure_prefix = ($callback_options['secure_prefix'] ?? '');
254 254
 				if (
255
-					function_exists($f = $callback_prefix . $callback_secure_prefix . 'traiter_echap_' . strtolower($regs[1]))
256
-					or function_exists($f = $f . '_dist')
255
+					function_exists($f = $callback_prefix.$callback_secure_prefix.'traiter_echap_'.strtolower($regs[1]))
256
+					or function_exists($f = $f.'_dist')
257 257
 					or ($callback_secure_prefix and (
258
-						function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1]))
259
-						or function_exists($f = $f . '_dist')
258
+						function_exists($f = $callback_prefix.'traiter_echap_'.strtolower($regs[1]))
259
+						or function_exists($f = $f.'_dist')
260 260
 					))
261 261
 				) {
262 262
 					$echap = $f($regs, $callback_options);
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
 	// dans une callback autonommee
279 279
 	if (strpos($preg ?: _PROTEGE_BLOCS, 'script') !== false) {
280 280
 		if (
281
-			strpos($letexte, '<' . '?') !== false and preg_match_all(
281
+			strpos($letexte, '<'.'?') !== false and preg_match_all(
282 282
 				',<[?].*($|[?]>),UisS',
283 283
 				$letexte,
284 284
 				$matches,
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
 			strpos($letexte, '<') !== false
311 311
 			and
312 312
 			preg_match_all(
313
-				',<(span|div)\sclass=[\'"]base64' . $source . '[\'"]\s(.*)>\s*</\1>,UmsS',
313
+				',<(span|div)\sclass=[\'"]base64'.$source.'[\'"]\s(.*)>\s*</\1>,UmsS',
314 314
 				$letexte,
315 315
 				$regs,
316 316
 				PREG_SET_ORDER
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 					}
328 328
 				}
329 329
 				if ($at) {
330
-					$rempl = '<' . $reg[1] . '>' . $rempl . '</' . $reg[1] . '>';
330
+					$rempl = '<'.$reg[1].'>'.$rempl.'</'.$reg[1].'>';
331 331
 					foreach ($at as $attr => $a) {
332 332
 						$rempl = inserer_attribut($rempl, $attr, $a);
333 333
 					}
@@ -408,8 +408,8 @@  discard block
 block discarded – undo
408 408
 	$texte = nettoyer_raccourcis_typo($texte);
409 409
 
410 410
 	// balises de sauts de ligne et paragraphe
411
-	$texte = preg_replace('/<p( [^>]*)?' . '>/', "\r\r", $texte);
412
-	$texte = preg_replace('/<br( [^>]*)?' . '>/', "\n", $texte);
411
+	$texte = preg_replace('/<p( [^>]*)?'.'>/', "\r\r", $texte);
412
+	$texte = preg_replace('/<br( [^>]*)?'.'>/', "\n", $texte);
413 413
 
414 414
 	// on repasse les doubles \n en \r que nettoyer_raccourcis_typo() a pu modifier
415 415
 	$texte = str_replace("\n\n", "\r\r", $texte);
@@ -434,15 +434,15 @@  discard block
 block discarded – undo
434 434
 		// excédentaire est ensuite supprimé par l'appel à preg_replace()
435 435
 		$long = spip_substr($texte, 0, max($taille + 1 - $taille_suite, 1));
436 436
 		$u = $GLOBALS['meta']['pcre_u'];
437
-		$court = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, "\\2", $long);
437
+		$court = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D'.$u, "\\2", $long);
438 438
 		$points = $suite;
439 439
 
440 440
 		// trop court ? ne pas faire de (...)
441 441
 		if (spip_strlen($court) < max(0.75 * $taille, 2)) {
442 442
 			$points = '';
443 443
 			$long = spip_substr($texte, 0, $taille + 1);
444
-			preg_match('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, $long, $m);
445
-			$texte = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D' . $u, "\\2", $long);
444
+			preg_match('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D'.$u, $long, $m);
445
+			$texte = preg_replace('/(^|([^\s ])[\s ]+)([\s ]|[^\s ]+)?$/D'.$u, "\\2", $long);
446 446
 			// encore trop court ? couper au caractere
447 447
 			if (spip_strlen($texte) < 0.75 * $taille) {
448 448
 				$texte = spip_substr($long, 0, $taille);
@@ -458,7 +458,7 @@  discard block
 block discarded – undo
458 458
 	// supprimer l'eventuelle entite finale mal coupee
459 459
 	$texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
460 460
 
461
-	return quote_amp(trim($texte)) . $points;
461
+	return quote_amp(trim($texte)).$points;
462 462
 }
463 463
 
464 464
 
@@ -470,16 +470,16 @@  discard block
 block discarded – undo
470 470
 				define('_PROTEGE_JS_MODELES', creer_uniqid());
471 471
 			}
472 472
 			foreach ($r as $regs) {
473
-				$t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t);
473
+				$t = str_replace($regs[0], code_echappement($regs[0], 'javascript'._PROTEGE_JS_MODELES), $t);
474 474
 			}
475 475
 		}
476
-		if (preg_match_all(',<\?php.*?($|\?' . '>),isS', $t, $r, PREG_SET_ORDER)) {
476
+		if (preg_match_all(',<\?php.*?($|\?'.'>),isS', $t, $r, PREG_SET_ORDER)) {
477 477
 			if (!defined('_PROTEGE_PHP_MODELES')) {
478 478
 				include_spip('inc/acces');
479 479
 				define('_PROTEGE_PHP_MODELES', creer_uniqid());
480 480
 			}
481 481
 			foreach ($r as $regs) {
482
-				$t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t);
482
+				$t = str_replace($regs[0], code_echappement($regs[0], 'php'._PROTEGE_PHP_MODELES), $t);
483 483
 			}
484 484
 		}
485 485
 	}
@@ -597,7 +597,7 @@  discard block
 block discarded – undo
597 597
 			if (!empty($options['wrap_suspect'])) {
598 598
 				$texte = wrap($texte, $options['wrap_suspect']);
599 599
 			}
600
-			$texte = "<mark class='danger-js' title='" . attribut_html(_T('erreur_contenu_suspect')) . "'>⚠️</mark> " . $texte;
600
+			$texte = "<mark class='danger-js' title='".attribut_html(_T('erreur_contenu_suspect'))."'>⚠️</mark> ".$texte;
601 601
 		}
602 602
 
603 603
 		$texte = $collecteurModeles->retablir($texte);
@@ -744,11 +744,11 @@  discard block
 block discarded – undo
744 744
  **/
745 745
 function supprime_img($letexte, $message = null) {
746 746
 	if ($message === null) {
747
-		$message = '(' . _T('img_indisponible') . ')';
747
+		$message = '('._T('img_indisponible').')';
748 748
 	}
749 749
 
750 750
 	return preg_replace(
751
-		',<(img|doc|emb)([0-9]+)(\|([^>]*))?' . '\s*/?' . '>,i',
751
+		',<(img|doc|emb)([0-9]+)(\|([^>]*))?'.'\s*/?'.'>,i',
752 752
 		$message,
753 753
 		$letexte
754 754
 	);
Please login to merge, or discard this patch.
ecrire/lang/spip_oc_lnc.php 1 patch
Indentation   +569 added lines, -569 removed lines patch added patch discarded remove patch
@@ -4,507 +4,507 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Tornar a l’interfàcia grafica completa',
14
-	'access_mode_texte' => 'Afichar l’interfàcia textuala simplificada',
15
-	'admin_debug' => 'desbugatge',
16
-	'admin_modifier_article' => 'Modificar aquel article',
17
-	'admin_modifier_auteur' => 'Modificar aquel autor',
18
-	'admin_modifier_breve' => 'Modificar aquela brèva',
19
-	'admin_modifier_mot' => 'Modificar aquel mot clau',
20
-	'admin_modifier_rubrique' => 'Modificar aquela rubrica',
21
-	'admin_recalculer' => 'Tornar calcular la pagina',
22
-	'afficher_trad' => 'mostrar las reviradas',
23
-	'alerte_maj_impossible' => '<b>Alèrta!</b> Es impossible d’actualizar la basa SQL vèrs la version @version@; saique i a un problèma relatiu al drech de modificar la basa de donadas. Volgatz contactar vòstre albergador.',
24
-	'analyse_xml' => 'Analisi XML',
25
-	'annuler' => 'Anullar',
26
-	'antispam_champ_vide' => 'Volgatz daissar aquel camp void :',
27
-	'articles_recents' => 'Los articles mai recents',
28
-	'avis_archive_incorrect' => 'lo fichièr archiu es pas un fichièr SPIP',
29
-	'avis_archive_invalide' => 'lo fichièr archiu es pas valid',
30
-	'avis_attention' => 'ATENCION!',
31
-	'avis_champ_incorrect_type_objet' => 'Nom de camp incorrècte @name@ per objècte de tipe @type@',
32
-	'avis_colonne_inexistante' => 'La colomna @col@ existís pas',
33
-	'avis_erreur' => 'Error: vejatz çai jos',
34
-	'avis_erreur_connexion' => 'Error de connexion',
35
-	'avis_erreur_cookie' => 'problèma de cookie',
36
-	'avis_erreur_fonction_contexte' => 'Error de programacion. Cal pas apelar aquela foncion dins aquel contèxt.',
37
-	'avis_erreur_mysql' => 'Error SQL ',
38
-	'avis_erreur_sauvegarde' => 'Error dins la salvagarda (@type@ @id_objet@)! ',
39
-	'avis_erreur_visiteur' => 'Problèma per accedir a l’espaci privat',
12
+    // A
13
+    'access_interface_graphique' => 'Tornar a l’interfàcia grafica completa',
14
+    'access_mode_texte' => 'Afichar l’interfàcia textuala simplificada',
15
+    'admin_debug' => 'desbugatge',
16
+    'admin_modifier_article' => 'Modificar aquel article',
17
+    'admin_modifier_auteur' => 'Modificar aquel autor',
18
+    'admin_modifier_breve' => 'Modificar aquela brèva',
19
+    'admin_modifier_mot' => 'Modificar aquel mot clau',
20
+    'admin_modifier_rubrique' => 'Modificar aquela rubrica',
21
+    'admin_recalculer' => 'Tornar calcular la pagina',
22
+    'afficher_trad' => 'mostrar las reviradas',
23
+    'alerte_maj_impossible' => '<b>Alèrta!</b> Es impossible d’actualizar la basa SQL vèrs la version @version@; saique i a un problèma relatiu al drech de modificar la basa de donadas. Volgatz contactar vòstre albergador.',
24
+    'analyse_xml' => 'Analisi XML',
25
+    'annuler' => 'Anullar',
26
+    'antispam_champ_vide' => 'Volgatz daissar aquel camp void :',
27
+    'articles_recents' => 'Los articles mai recents',
28
+    'avis_archive_incorrect' => 'lo fichièr archiu es pas un fichièr SPIP',
29
+    'avis_archive_invalide' => 'lo fichièr archiu es pas valid',
30
+    'avis_attention' => 'ATENCION!',
31
+    'avis_champ_incorrect_type_objet' => 'Nom de camp incorrècte @name@ per objècte de tipe @type@',
32
+    'avis_colonne_inexistante' => 'La colomna @col@ existís pas',
33
+    'avis_erreur' => 'Error: vejatz çai jos',
34
+    'avis_erreur_connexion' => 'Error de connexion',
35
+    'avis_erreur_cookie' => 'problèma de cookie',
36
+    'avis_erreur_fonction_contexte' => 'Error de programacion. Cal pas apelar aquela foncion dins aquel contèxt.',
37
+    'avis_erreur_mysql' => 'Error SQL ',
38
+    'avis_erreur_sauvegarde' => 'Error dins la salvagarda (@type@ @id_objet@)! ',
39
+    'avis_erreur_visiteur' => 'Problèma per accedir a l’espaci privat',
40 40
 
41
-	// B
42
-	'barre_a_accent_grave' => 'Inserir una A accent grèu majuscula',
43
-	'barre_aide' => 'Utilizar las acorchas tipograficas per enriquir vòstra compaginacion',
44
-	'barre_e_accent_aigu' => 'Inserir una E accent agut majuscula',
45
-	'barre_eo' => 'Inserir una E dins l’O',
46
-	'barre_eo_maj' => 'Inserir una E dins la O majuscula',
47
-	'barre_euro' => 'Inserir lo simbèl de l’èuro: €',
48
-	'barre_gras' => 'Metre en {{gras}}',
49
-	'barre_guillemets' => 'Enrodar amb de « verguetas »',
50
-	'barre_guillemets_simples' => 'Enrodar amb de „verguetas“',
51
-	'barre_intertitre' => 'Transformar en {{{intertítol}}}',
52
-	'barre_italic' => 'Metre en {italics}',
53
-	'barre_lien' => 'Transformar en [ligam ipertèxt->http://...]',
54
-	'barre_lien_input' => 'Volgatz indicar l’adreiça de vòstre ligam (podètz indicar una adreiça web jos la forma http://www.lomieusit.com o simplament indicar lo numèro d’un article d’aquel sit).',
55
-	'barre_note' => 'Transformar en [[Nòta de pè]]',
56
-	'barre_quote' => '<quote>Citar un messatge</quote>',
57
-	'bouton_changer' => 'Cambiar',
58
-	'bouton_chercher' => 'Cercar',
59
-	'bouton_choisir' => 'Causir',
60
-	'bouton_download' => 'Telecargar', # MODIF
61
-	'bouton_enregistrer' => 'Registrar',
62
-	'bouton_radio_desactiver_messagerie_interne' => 'Desactivar la messatjariá intèrna',
63
-	'bouton_radio_envoi_annonces' => 'Mandar los anoncis editorials',
64
-	'bouton_radio_non_envoi_annonces' => 'Mandar pas d’anoncis',
65
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Mandar pas la tièra de las novetats',
66
-	'bouton_recharger_page' => 'tornar cargar aquela pagina',
67
-	'bouton_telecharger' => 'Telecargar',
68
-	'bouton_upload' => 'Telecargar', # MODIF
69
-	'bouton_valider' => 'Validar',
41
+    // B
42
+    'barre_a_accent_grave' => 'Inserir una A accent grèu majuscula',
43
+    'barre_aide' => 'Utilizar las acorchas tipograficas per enriquir vòstra compaginacion',
44
+    'barre_e_accent_aigu' => 'Inserir una E accent agut majuscula',
45
+    'barre_eo' => 'Inserir una E dins l’O',
46
+    'barre_eo_maj' => 'Inserir una E dins la O majuscula',
47
+    'barre_euro' => 'Inserir lo simbèl de l’èuro: €',
48
+    'barre_gras' => 'Metre en {{gras}}',
49
+    'barre_guillemets' => 'Enrodar amb de « verguetas »',
50
+    'barre_guillemets_simples' => 'Enrodar amb de „verguetas“',
51
+    'barre_intertitre' => 'Transformar en {{{intertítol}}}',
52
+    'barre_italic' => 'Metre en {italics}',
53
+    'barre_lien' => 'Transformar en [ligam ipertèxt->http://...]',
54
+    'barre_lien_input' => 'Volgatz indicar l’adreiça de vòstre ligam (podètz indicar una adreiça web jos la forma http://www.lomieusit.com o simplament indicar lo numèro d’un article d’aquel sit).',
55
+    'barre_note' => 'Transformar en [[Nòta de pè]]',
56
+    'barre_quote' => '<quote>Citar un messatge</quote>',
57
+    'bouton_changer' => 'Cambiar',
58
+    'bouton_chercher' => 'Cercar',
59
+    'bouton_choisir' => 'Causir',
60
+    'bouton_download' => 'Telecargar', # MODIF
61
+    'bouton_enregistrer' => 'Registrar',
62
+    'bouton_radio_desactiver_messagerie_interne' => 'Desactivar la messatjariá intèrna',
63
+    'bouton_radio_envoi_annonces' => 'Mandar los anoncis editorials',
64
+    'bouton_radio_non_envoi_annonces' => 'Mandar pas d’anoncis',
65
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Mandar pas la tièra de las novetats',
66
+    'bouton_recharger_page' => 'tornar cargar aquela pagina',
67
+    'bouton_telecharger' => 'Telecargar',
68
+    'bouton_upload' => 'Telecargar', # MODIF
69
+    'bouton_valider' => 'Validar',
70 70
 
71
-	// C
72
-	'cal_apresmidi' => 'tantòst',
73
-	'cal_jour_entier' => 'jorn entièr',
74
-	'cal_matin' => 'matin',
75
-	'cal_par_jour' => 'calendièr per jorn',
76
-	'cal_par_mois' => 'calendièr per mes',
77
-	'cal_par_semaine' => 'calendièr per setmana',
78
-	'choix_couleur_interface' => 'color ',
79
-	'choix_interface' => 'causir l’interfàcia',
80
-	'colonne' => 'Colomna',
81
-	'confirm_changer_statut' => 'Atencion, avètz demandat de cambiar l’estatut d’aquel element. Desiratz de contunhar? ',
82
-	'correcte' => 'corrècte',
71
+    // C
72
+    'cal_apresmidi' => 'tantòst',
73
+    'cal_jour_entier' => 'jorn entièr',
74
+    'cal_matin' => 'matin',
75
+    'cal_par_jour' => 'calendièr per jorn',
76
+    'cal_par_mois' => 'calendièr per mes',
77
+    'cal_par_semaine' => 'calendièr per setmana',
78
+    'choix_couleur_interface' => 'color ',
79
+    'choix_interface' => 'causir l’interfàcia',
80
+    'colonne' => 'Colomna',
81
+    'confirm_changer_statut' => 'Atencion, avètz demandat de cambiar l’estatut d’aquel element. Desiratz de contunhar? ',
82
+    'correcte' => 'corrècte',
83 83
 
84
-	// D
85
-	'date_aujourdhui' => 'uèi',
86
-	'date_avant_jc' => 'abans lo Crist',
87
-	'date_dans' => 'd’aquí @delai@',
88
-	'date_de_mois_1' => '@j@ de genièr',
89
-	'date_de_mois_10' => '@j@ d’octobre',
90
-	'date_de_mois_11' => '@j@ de novembre',
91
-	'date_de_mois_12' => '@j@ de decembre',
92
-	'date_de_mois_2' => '@j@ de febrièr',
93
-	'date_de_mois_3' => '@j@ de març',
94
-	'date_de_mois_4' => '@j@ d’abril',
95
-	'date_de_mois_5' => '@j@ de mai',
96
-	'date_de_mois_6' => '@j@ de junh',
97
-	'date_de_mois_7' => '@j@ de julh',
98
-	'date_de_mois_8' => '@j@ d’agost',
99
-	'date_de_mois_9' => '@j@ de setembre',
100
-	'date_demain' => 'deman',
101
-	'date_fmt_heures_minutes' => '@h@h@m@min',
102
-	'date_fmt_jour_heure' => '@jour@ a @heure@',
103
-	'date_fmt_jour_mois' => '@jourmois@',
104
-	'date_fmt_jour_mois_annee' => '@jourmois@ de @annee@',
105
-	'date_fmt_mois_annee' => '@nommois@ de @annee@',
106
-	'date_fmt_nomjour_date' => 'lo @nomjour@ @date@',
107
-	'date_heures' => 'oras',
108
-	'date_hier' => 'ièr',
109
-	'date_il_y_a' => 'fa @delai@',
110
-	'date_jnum1' => '1r',
111
-	'date_jnum10' => '10',
112
-	'date_jnum11' => '11',
113
-	'date_jnum12' => '12',
114
-	'date_jnum13' => '13',
115
-	'date_jnum14' => '14',
116
-	'date_jnum15' => '15',
117
-	'date_jnum16' => '16',
118
-	'date_jnum17' => '17',
119
-	'date_jnum18' => '18',
120
-	'date_jnum19' => '19',
121
-	'date_jnum2' => '2',
122
-	'date_jnum20' => '20',
123
-	'date_jnum21' => '21',
124
-	'date_jnum22' => '22',
125
-	'date_jnum23' => '23',
126
-	'date_jnum24' => '24',
127
-	'date_jnum25' => '25',
128
-	'date_jnum26' => '26',
129
-	'date_jnum27' => '27',
130
-	'date_jnum28' => '28',
131
-	'date_jnum29' => '29',
132
-	'date_jnum3' => '3',
133
-	'date_jnum30' => '30',
134
-	'date_jnum31' => '31',
135
-	'date_jnum4' => '4',
136
-	'date_jnum5' => '5',
137
-	'date_jnum6' => '6',
138
-	'date_jnum7' => '7',
139
-	'date_jnum8' => '8',
140
-	'date_jnum9' => '9',
141
-	'date_jour_1' => 'dimenge',
142
-	'date_jour_1_abbr' => 'dmg.',
143
-	'date_jour_1_initiale' => 'dg.',
144
-	'date_jour_2' => 'diluns',
145
-	'date_jour_2_abbr' => 'dil.',
146
-	'date_jour_2_initiale' => 'dl.',
147
-	'date_jour_3' => 'dimars',
148
-	'date_jour_3_abbr' => 'dmr.',
149
-	'date_jour_3_initiale' => 'dm.',
150
-	'date_jour_4' => 'dimècres',
151
-	'date_jour_4_abbr' => 'dmc.',
152
-	'date_jour_4_initiale' => 'dc.',
153
-	'date_jour_5' => 'dijòus',
154
-	'date_jour_5_abbr' => 'dij.',
155
-	'date_jour_5_initiale' => 'dj.',
156
-	'date_jour_6' => 'divendres',
157
-	'date_jour_6_abbr' => 'div.',
158
-	'date_jour_6_initiale' => 'dv.',
159
-	'date_jour_7' => 'dissabte',
160
-	'date_jour_7_abbr' => 'dis.',
161
-	'date_jour_7_initiale' => 'ds.',
162
-	'date_jours' => 'jorns',
163
-	'date_minutes' => 'minutas',
164
-	'date_mois' => 'mes(es)',
165
-	'date_mois_1' => 'genièr',
166
-	'date_mois_10' => 'octobre',
167
-	'date_mois_11' => 'novembre',
168
-	'date_mois_12' => 'decembre',
169
-	'date_mois_2' => 'febrièr',
170
-	'date_mois_3' => 'març',
171
-	'date_mois_4' => 'abril',
172
-	'date_mois_5' => 'mai',
173
-	'date_mois_6' => 'junh',
174
-	'date_mois_7' => 'julh',
175
-	'date_mois_8' => 'agost',
176
-	'date_mois_9' => 'setembre',
177
-	'date_saison_1' => 'ivèrn',
178
-	'date_saison_2' => 'prima',
179
-	'date_saison_3' => 'estiu',
180
-	'date_saison_4' => 'davalada',
181
-	'date_semaines' => 'setmana(s)',
182
-	'dirs_commencer' => 'per començar vertadièrament l’installacion',
183
-	'dirs_preliminaire' => 'Preliminar: <b>Reglar los dreches d’accès</b>',
184
-	'dirs_probleme_droits' => 'Problèma de dreches d’accès',
185
-	'dirs_repertoires_absents' => '<p><b>S’es pas trobat los repertòris seguents: </b></p> <ul>@bad_dirs@.</ul> 
84
+    // D
85
+    'date_aujourdhui' => 'uèi',
86
+    'date_avant_jc' => 'abans lo Crist',
87
+    'date_dans' => 'd’aquí @delai@',
88
+    'date_de_mois_1' => '@j@ de genièr',
89
+    'date_de_mois_10' => '@j@ d’octobre',
90
+    'date_de_mois_11' => '@j@ de novembre',
91
+    'date_de_mois_12' => '@j@ de decembre',
92
+    'date_de_mois_2' => '@j@ de febrièr',
93
+    'date_de_mois_3' => '@j@ de març',
94
+    'date_de_mois_4' => '@j@ d’abril',
95
+    'date_de_mois_5' => '@j@ de mai',
96
+    'date_de_mois_6' => '@j@ de junh',
97
+    'date_de_mois_7' => '@j@ de julh',
98
+    'date_de_mois_8' => '@j@ d’agost',
99
+    'date_de_mois_9' => '@j@ de setembre',
100
+    'date_demain' => 'deman',
101
+    'date_fmt_heures_minutes' => '@h@h@m@min',
102
+    'date_fmt_jour_heure' => '@jour@ a @heure@',
103
+    'date_fmt_jour_mois' => '@jourmois@',
104
+    'date_fmt_jour_mois_annee' => '@jourmois@ de @annee@',
105
+    'date_fmt_mois_annee' => '@nommois@ de @annee@',
106
+    'date_fmt_nomjour_date' => 'lo @nomjour@ @date@',
107
+    'date_heures' => 'oras',
108
+    'date_hier' => 'ièr',
109
+    'date_il_y_a' => 'fa @delai@',
110
+    'date_jnum1' => '1r',
111
+    'date_jnum10' => '10',
112
+    'date_jnum11' => '11',
113
+    'date_jnum12' => '12',
114
+    'date_jnum13' => '13',
115
+    'date_jnum14' => '14',
116
+    'date_jnum15' => '15',
117
+    'date_jnum16' => '16',
118
+    'date_jnum17' => '17',
119
+    'date_jnum18' => '18',
120
+    'date_jnum19' => '19',
121
+    'date_jnum2' => '2',
122
+    'date_jnum20' => '20',
123
+    'date_jnum21' => '21',
124
+    'date_jnum22' => '22',
125
+    'date_jnum23' => '23',
126
+    'date_jnum24' => '24',
127
+    'date_jnum25' => '25',
128
+    'date_jnum26' => '26',
129
+    'date_jnum27' => '27',
130
+    'date_jnum28' => '28',
131
+    'date_jnum29' => '29',
132
+    'date_jnum3' => '3',
133
+    'date_jnum30' => '30',
134
+    'date_jnum31' => '31',
135
+    'date_jnum4' => '4',
136
+    'date_jnum5' => '5',
137
+    'date_jnum6' => '6',
138
+    'date_jnum7' => '7',
139
+    'date_jnum8' => '8',
140
+    'date_jnum9' => '9',
141
+    'date_jour_1' => 'dimenge',
142
+    'date_jour_1_abbr' => 'dmg.',
143
+    'date_jour_1_initiale' => 'dg.',
144
+    'date_jour_2' => 'diluns',
145
+    'date_jour_2_abbr' => 'dil.',
146
+    'date_jour_2_initiale' => 'dl.',
147
+    'date_jour_3' => 'dimars',
148
+    'date_jour_3_abbr' => 'dmr.',
149
+    'date_jour_3_initiale' => 'dm.',
150
+    'date_jour_4' => 'dimècres',
151
+    'date_jour_4_abbr' => 'dmc.',
152
+    'date_jour_4_initiale' => 'dc.',
153
+    'date_jour_5' => 'dijòus',
154
+    'date_jour_5_abbr' => 'dij.',
155
+    'date_jour_5_initiale' => 'dj.',
156
+    'date_jour_6' => 'divendres',
157
+    'date_jour_6_abbr' => 'div.',
158
+    'date_jour_6_initiale' => 'dv.',
159
+    'date_jour_7' => 'dissabte',
160
+    'date_jour_7_abbr' => 'dis.',
161
+    'date_jour_7_initiale' => 'ds.',
162
+    'date_jours' => 'jorns',
163
+    'date_minutes' => 'minutas',
164
+    'date_mois' => 'mes(es)',
165
+    'date_mois_1' => 'genièr',
166
+    'date_mois_10' => 'octobre',
167
+    'date_mois_11' => 'novembre',
168
+    'date_mois_12' => 'decembre',
169
+    'date_mois_2' => 'febrièr',
170
+    'date_mois_3' => 'març',
171
+    'date_mois_4' => 'abril',
172
+    'date_mois_5' => 'mai',
173
+    'date_mois_6' => 'junh',
174
+    'date_mois_7' => 'julh',
175
+    'date_mois_8' => 'agost',
176
+    'date_mois_9' => 'setembre',
177
+    'date_saison_1' => 'ivèrn',
178
+    'date_saison_2' => 'prima',
179
+    'date_saison_3' => 'estiu',
180
+    'date_saison_4' => 'davalada',
181
+    'date_semaines' => 'setmana(s)',
182
+    'dirs_commencer' => 'per començar vertadièrament l’installacion',
183
+    'dirs_preliminaire' => 'Preliminar: <b>Reglar los dreches d’accès</b>',
184
+    'dirs_probleme_droits' => 'Problèma de dreches d’accès',
185
+    'dirs_repertoires_absents' => '<p><b>S’es pas trobat los repertòris seguents: </b></p> <ul>@bad_dirs@.</ul> 
186 186
   <p>Se pòt que venga d’un problèma de majusculas o minusculas mal mesas.
187 187
   Verificatz que las minusculas e majusculas d’aqueles repertòris correspondan ben amb çò afichat
188 188
   çai subre; s’es pas lo cas, tornatz nommar los repertòris amb vòstre logicial FTP en corregir l’error.</p>
189 189
   <p>Un còp qu’auretz fach aquò, poiretz ',
190
-	'dirs_repertoires_suivants' => '<p><b>Los repertòris seguents son pas accessibles en escritura: </b></p><ul>@bad_dirs@.</ul> </b>
190
+    'dirs_repertoires_suivants' => '<p><b>Los repertòris seguents son pas accessibles en escritura: </b></p><ul>@bad_dirs@.</ul> </b>
191 191
   <p>Per adobar aquò, utilizatz vòstre client FTP per tal de reglar los dreches d’accès de cadun
192 192
   d’aqueles repertòris. La guida d’installacion explica en detalh cossí cal procedir.</p>
193 193
   <p>Tre qu’auretz facha aquela manipulacion, poiretz ',
194
-	'double_occurrence' => 'Dobla ocurréncia', # MODIF
194
+    'double_occurrence' => 'Dobla ocurréncia', # MODIF
195 195
 
196
-	// E
197
-	'envoi_via_le_site' => 'Mandadís amb lo biais del sit web',
198
-	'erreur' => 'Error',
199
-	'erreur_balise_non_fermee' => 'darrièra balisa non tampada :',
200
-	'erreur_texte' => 'error(s)',
196
+    // E
197
+    'envoi_via_le_site' => 'Mandadís amb lo biais del sit web',
198
+    'erreur' => 'Error',
199
+    'erreur_balise_non_fermee' => 'darrièra balisa non tampada :',
200
+    'erreur_texte' => 'error(s)',
201 201
 
202
-	// F
203
-	'fichier_introuvable' => 'S’es pas pogut trobar lo fichièr @fichier@.', # MODIF
204
-	'form_deja_inscrit' => 'Sètz ja inscrich(a).',
205
-	'form_email_non_valide' => 'Vòstra adreiça e-mail es pas valida.',
206
-	'form_forum_access_refuse' => 'Podètz pas mai accedir a aquel sit.',
207
-	'form_forum_bonjour' => 'Bonjorn @nom@,,',
208
-	'form_forum_email_deja_enregistre' => 'Aquela adreiça e-mail ja es registrada, adoncas podètz utilizar vòstre mot de santa Clara costumièr.',
209
-	'form_forum_identifiant_mail' => 'Vos avèm mandat vòstre identificant novèl per e-mail.',
210
-	'form_forum_identifiants' => 'Identificants personals',
211
-	'form_forum_indiquer_nom_email' => 'Indicatz aquí vòstre nom e vòstra adreiça e-mail. Vòstre identificant personal arribarà lèu-lèu, per e-mail.',
212
-	'form_forum_login' => 'login :',
213
-	'form_forum_message_auto' => '(aquò’s un messatge automatic)',
214
-	'form_forum_pass' => 'mot de santa Clara :',
215
-	'form_forum_probleme_mail' => 'Problèma d’e-mail: se pòt pas mandar l’identificant.',
216
-	'form_forum_voici1' => 'Vaicí vòstres identificants per poder participar a la vida
202
+    // F
203
+    'fichier_introuvable' => 'S’es pas pogut trobar lo fichièr @fichier@.', # MODIF
204
+    'form_deja_inscrit' => 'Sètz ja inscrich(a).',
205
+    'form_email_non_valide' => 'Vòstra adreiça e-mail es pas valida.',
206
+    'form_forum_access_refuse' => 'Podètz pas mai accedir a aquel sit.',
207
+    'form_forum_bonjour' => 'Bonjorn @nom@,,',
208
+    'form_forum_email_deja_enregistre' => 'Aquela adreiça e-mail ja es registrada, adoncas podètz utilizar vòstre mot de santa Clara costumièr.',
209
+    'form_forum_identifiant_mail' => 'Vos avèm mandat vòstre identificant novèl per e-mail.',
210
+    'form_forum_identifiants' => 'Identificants personals',
211
+    'form_forum_indiquer_nom_email' => 'Indicatz aquí vòstre nom e vòstra adreiça e-mail. Vòstre identificant personal arribarà lèu-lèu, per e-mail.',
212
+    'form_forum_login' => 'login :',
213
+    'form_forum_message_auto' => '(aquò’s un messatge automatic)',
214
+    'form_forum_pass' => 'mot de santa Clara :',
215
+    'form_forum_probleme_mail' => 'Problèma d’e-mail: se pòt pas mandar l’identificant.',
216
+    'form_forum_voici1' => 'Vaicí vòstres identificants per poder participar a la vida
217 217
 del sit "@nom_site_spip@" (@adresse_site@) :',
218
-	'form_forum_voici2' => 'Vaquí vòstres identificants per prepausar d’articles 
218
+    'form_forum_voici2' => 'Vaquí vòstres identificants per prepausar d’articles 
219 219
  sul sit "@nom_site_spip@" (@adresse_login@) :',
220
-	'form_indiquer_email' => 'Volgatz indicar vòstra adreiça e-mail.',
221
-	'form_indiquer_nom' => 'Volgatz indicar vòstre nom.',
222
-	'form_indiquer_nom_site' => 'Volgatz indicar lo nom de vòstre sit.',
223
-	'form_pet_deja_enregistre' => 'Ja aquel sit es registrat',
224
-	'form_pet_signature_pasprise' => 'Vòstra signatura es pas presa en compte.',
225
-	'form_prop_confirmer_envoi' => 'Confirmar lo mandadís',
226
-	'form_prop_description' => 'Descripcion/comentari',
227
-	'form_prop_enregistre' => 'Vòstra proposicion es plan registrada, apareisserà en linha tre que los responsables del sit l’auràn validada .',
228
-	'form_prop_envoyer' => 'Mandar un messatge',
229
-	'form_prop_indiquer_email' => 'Volgatz indicar una adreiça e-mail valida',
230
-	'form_prop_indiquer_nom_site' => 'Volgatz indicar lo nom del sit.',
231
-	'form_prop_indiquer_sujet' => 'Volgatz indicar un subjècte',
232
-	'form_prop_message_envoye' => 'Messatge mandat',
233
-	'form_prop_non_enregistre' => 'Vòstra proposicion es pas estada registrada.',
234
-	'form_prop_sujet' => 'Subjècte',
235
-	'form_prop_url_site' => 'Adreiça (URL) del sit', # MODIF
236
-	'forum_non_inscrit' => 'Siá sètz pas inscrich(a), siá avètz fach una error d’adreiça o de mot de santa Clara. ',
237
-	'forum_par_auteur' => 'per @auteur@',
238
-	'forum_titre_erreur' => 'Error...',
220
+    'form_indiquer_email' => 'Volgatz indicar vòstra adreiça e-mail.',
221
+    'form_indiquer_nom' => 'Volgatz indicar vòstre nom.',
222
+    'form_indiquer_nom_site' => 'Volgatz indicar lo nom de vòstre sit.',
223
+    'form_pet_deja_enregistre' => 'Ja aquel sit es registrat',
224
+    'form_pet_signature_pasprise' => 'Vòstra signatura es pas presa en compte.',
225
+    'form_prop_confirmer_envoi' => 'Confirmar lo mandadís',
226
+    'form_prop_description' => 'Descripcion/comentari',
227
+    'form_prop_enregistre' => 'Vòstra proposicion es plan registrada, apareisserà en linha tre que los responsables del sit l’auràn validada .',
228
+    'form_prop_envoyer' => 'Mandar un messatge',
229
+    'form_prop_indiquer_email' => 'Volgatz indicar una adreiça e-mail valida',
230
+    'form_prop_indiquer_nom_site' => 'Volgatz indicar lo nom del sit.',
231
+    'form_prop_indiquer_sujet' => 'Volgatz indicar un subjècte',
232
+    'form_prop_message_envoye' => 'Messatge mandat',
233
+    'form_prop_non_enregistre' => 'Vòstra proposicion es pas estada registrada.',
234
+    'form_prop_sujet' => 'Subjècte',
235
+    'form_prop_url_site' => 'Adreiça (URL) del sit', # MODIF
236
+    'forum_non_inscrit' => 'Siá sètz pas inscrich(a), siá avètz fach una error d’adreiça o de mot de santa Clara. ',
237
+    'forum_par_auteur' => 'per @auteur@',
238
+    'forum_titre_erreur' => 'Error...',
239 239
 
240
-	// I
241
-	'ical_texte_rss_articles' => 'Lo fichièr "backend" dels articles d’aqueste sit se tròba a l’adreiça:',
242
-	'ical_texte_rss_articles2' => 'Atanben podètz obténer de fichièrs "backend" pels articles de cada rubrica del sit:',
243
-	'ical_texte_rss_breves' => 'Existisson mai d’un fichièr contenent las brèvas del sit. En precisar un numèro de rubrica,  obtendretz sonque las brèvas de la rubrica aquela.',
244
-	'icone_a_suivre' => 'De seguir',
245
-	'icone_admin_site' => 'Administracion del sit',
246
-	'icone_agenda' => 'Agenda',
247
-	'icone_aide_ligne' => 'Ajuda',
248
-	'icone_articles' => 'Articles',
249
-	'icone_auteurs' => 'Autors',
250
-	'icone_brouteur' => 'Navigacion rapida',
251
-	'icone_configuration_site' => 'Configuracion',
252
-	'icone_configurer_site' => 'Configurar vòstre sit',
253
-	'icone_creer_nouvel_auteur' => 'Crear un autor nòu',
254
-	'icone_creer_rubrique' => 'Crear una rubrica',
255
-	'icone_creer_sous_rubrique' => 'Crear una sosrubrica',
256
-	'icone_deconnecter' => 'Se desconnectar',
257
-	'icone_discussions' => 'Discussions',
258
-	'icone_doc_rubrique' => 'Documents de las rubricas',
259
-	'icone_ecrire_article' => 'Escriure un article nòu',
260
-	'icone_edition_site' => 'Edicion',
261
-	'icone_gestion_langues' => 'Gestion de las lengas',
262
-	'icone_informations_personnelles' => 'Informacions personalas',
263
-	'icone_interface_complet' => 'Interfàcia completa',
264
-	'icone_interface_simple' => 'Interfàcia simplificada',
265
-	'icone_maintenance_site' => 'Mantenença del sit',
266
-	'icone_messagerie_personnelle' => 'Messatjariá personala',
267
-	'icone_repartition_debut' => 'Afichar la reparticion dempuèi la començança',
268
-	'icone_rubriques' => 'Rubricas',
269
-	'icone_sauver_site' => 'Salvagarda del sit',
270
-	'icone_site_entier' => 'Tot lo sit ',
271
-	'icone_sites_references' => 'Sits referenciats',
272
-	'icone_statistiques' => 'Estadisticas del sit',
273
-	'icone_suivi_activite' => 'Seguir la vida del sit',
274
-	'icone_suivi_actualite' => 'Evolucion del sit',
275
-	'icone_suivi_pettions' => 'Seguir/gerir las peticions',
276
-	'icone_suivi_revisions' => 'Modificacions dels articles',
277
-	'icone_supprimer_document' => 'Suprimir aquel document',
278
-	'icone_supprimer_image' => 'Suprimir aquel imatge',
279
-	'icone_tous_articles' => 'Totes vòstres articles ',
280
-	'icone_tous_auteur' => 'Totes los autors ',
281
-	'icone_visiter_site' => 'Vesitar', # MODIF
282
-	'icone_voir_en_ligne' => 'Veire en linha',
283
-	'img_indisponible' => 'imatge indisponible',
284
-	'impossible' => 'impossible',
285
-	'info_a_suivre' => 'DE SEGUIR>>',
286
-	'info_acces_interdit' => 'Accès proïbit',
287
-	'info_acces_refuse' => 'Accès refusat',
288
-	'info_action' => 'Accion : @action@',
289
-	'info_administrer_rubriques' => 'Podètz administrar aquela rubrica e sas sosrubricas',
290
-	'info_adresse_non_indiquee' => 'Avètz pas indicat l’adreiça de testar !',
291
-	'info_aide' => 'AJUDA :',
292
-	'info_ajouter_mot' => 'Apondre aquel mot',
293
-	'info_annonce' => 'ANONCI',
294
-	'info_annonces_generales' => 'Anoncis generals:',
295
-	'info_article_propose' => 'Article prepausat',
296
-	'info_article_publie' => 'Article publicat',
297
-	'info_article_redaction' => 'Article en cors de redaccion',
298
-	'info_article_refuse' => 'Article refusat',
299
-	'info_article_supprime' => 'Article suprimit',
300
-	'info_articles' => 'Articles',
301
-	'info_articles_a_valider' => 'Los articles de validar',
302
-	'info_articles_proposes' => 'Articles prepausats',
303
-	'info_auteurs_nombre' => 'autor(s)',
304
-	'info_authentification_ftp' => 'autentificacion (per FTP).',
305
-	'info_breves_2' => 'brèvas',
306
-	'info_connexion_refusee' => 'Connexion refusada',
307
-	'info_contact_developpeur' => 'Volgatz contactar un desvolopaire.',
308
-	'info_contenance' => 'Aquel sit conten:',
309
-	'info_contribution' => 'Contribucions de forum', # MODIF
310
-	'info_copyright' => '@spip@ es un logicial liure distribuit @lien_gpl@.',
311
-	'info_copyright_doc' => ' Per mai d’informacions, veire lo sit <a href="@spipnet@">http://www.spip.net/oc</a>.', # MODIF
312
-	'info_copyright_gpl' => 'jos licéncia GPL',
313
-	'info_cours_edition' => 'Vòstres articles en cors de redaccion', # MODIF
314
-	'info_creer_repertoire' => 'Volgatz crear un fichièr o un repertòri nommat',
315
-	'info_creer_repertoire_2' => 'dintre lo sosrepertòri   <b>@repertoire@</b>, puèi:',
316
-	'info_creer_vignette' => 'creacion automatica de la vinheta',
317
-	'info_deplier' => 'Desplegar',
318
-	'info_descriptif_nombre' => 'descriptiu(s) :',
319
-	'info_description' => 'Descripcion :',
320
-	'info_description_2' => 'Descripcion :',
321
-	'info_dimension' => 'Dimensions :',
322
-	'info_ecire_message_prive' => 'Escriure un messatge privat',
323
-	'info_email_invalide' => 'Adreiça e-mail invalida',
324
-	'info_en_cours_validation' => 'Vòstres articles en cors de redaccion',
325
-	'info_en_ligne' => 'Ara en linha:',
326
-	'info_envoyer_message_prive' => 'Mandar un messatge privat a aquel autor',
327
-	'info_erreur_requete' => 'Error dins la requista',
328
-	'info_erreur_squelette2' => 'Ges d’esqueleta <b>@fichier@</b> es pas disponibla...',
329
-	'info_erreur_systeme' => 'Error sistèma (errno @errsys@)',
330
-	'info_erreur_systeme2' => 'Lo disc dur es benlèu plen, o la basa de donadas degalhada.<br />
240
+    // I
241
+    'ical_texte_rss_articles' => 'Lo fichièr "backend" dels articles d’aqueste sit se tròba a l’adreiça:',
242
+    'ical_texte_rss_articles2' => 'Atanben podètz obténer de fichièrs "backend" pels articles de cada rubrica del sit:',
243
+    'ical_texte_rss_breves' => 'Existisson mai d’un fichièr contenent las brèvas del sit. En precisar un numèro de rubrica,  obtendretz sonque las brèvas de la rubrica aquela.',
244
+    'icone_a_suivre' => 'De seguir',
245
+    'icone_admin_site' => 'Administracion del sit',
246
+    'icone_agenda' => 'Agenda',
247
+    'icone_aide_ligne' => 'Ajuda',
248
+    'icone_articles' => 'Articles',
249
+    'icone_auteurs' => 'Autors',
250
+    'icone_brouteur' => 'Navigacion rapida',
251
+    'icone_configuration_site' => 'Configuracion',
252
+    'icone_configurer_site' => 'Configurar vòstre sit',
253
+    'icone_creer_nouvel_auteur' => 'Crear un autor nòu',
254
+    'icone_creer_rubrique' => 'Crear una rubrica',
255
+    'icone_creer_sous_rubrique' => 'Crear una sosrubrica',
256
+    'icone_deconnecter' => 'Se desconnectar',
257
+    'icone_discussions' => 'Discussions',
258
+    'icone_doc_rubrique' => 'Documents de las rubricas',
259
+    'icone_ecrire_article' => 'Escriure un article nòu',
260
+    'icone_edition_site' => 'Edicion',
261
+    'icone_gestion_langues' => 'Gestion de las lengas',
262
+    'icone_informations_personnelles' => 'Informacions personalas',
263
+    'icone_interface_complet' => 'Interfàcia completa',
264
+    'icone_interface_simple' => 'Interfàcia simplificada',
265
+    'icone_maintenance_site' => 'Mantenença del sit',
266
+    'icone_messagerie_personnelle' => 'Messatjariá personala',
267
+    'icone_repartition_debut' => 'Afichar la reparticion dempuèi la començança',
268
+    'icone_rubriques' => 'Rubricas',
269
+    'icone_sauver_site' => 'Salvagarda del sit',
270
+    'icone_site_entier' => 'Tot lo sit ',
271
+    'icone_sites_references' => 'Sits referenciats',
272
+    'icone_statistiques' => 'Estadisticas del sit',
273
+    'icone_suivi_activite' => 'Seguir la vida del sit',
274
+    'icone_suivi_actualite' => 'Evolucion del sit',
275
+    'icone_suivi_pettions' => 'Seguir/gerir las peticions',
276
+    'icone_suivi_revisions' => 'Modificacions dels articles',
277
+    'icone_supprimer_document' => 'Suprimir aquel document',
278
+    'icone_supprimer_image' => 'Suprimir aquel imatge',
279
+    'icone_tous_articles' => 'Totes vòstres articles ',
280
+    'icone_tous_auteur' => 'Totes los autors ',
281
+    'icone_visiter_site' => 'Vesitar', # MODIF
282
+    'icone_voir_en_ligne' => 'Veire en linha',
283
+    'img_indisponible' => 'imatge indisponible',
284
+    'impossible' => 'impossible',
285
+    'info_a_suivre' => 'DE SEGUIR>>',
286
+    'info_acces_interdit' => 'Accès proïbit',
287
+    'info_acces_refuse' => 'Accès refusat',
288
+    'info_action' => 'Accion : @action@',
289
+    'info_administrer_rubriques' => 'Podètz administrar aquela rubrica e sas sosrubricas',
290
+    'info_adresse_non_indiquee' => 'Avètz pas indicat l’adreiça de testar !',
291
+    'info_aide' => 'AJUDA :',
292
+    'info_ajouter_mot' => 'Apondre aquel mot',
293
+    'info_annonce' => 'ANONCI',
294
+    'info_annonces_generales' => 'Anoncis generals:',
295
+    'info_article_propose' => 'Article prepausat',
296
+    'info_article_publie' => 'Article publicat',
297
+    'info_article_redaction' => 'Article en cors de redaccion',
298
+    'info_article_refuse' => 'Article refusat',
299
+    'info_article_supprime' => 'Article suprimit',
300
+    'info_articles' => 'Articles',
301
+    'info_articles_a_valider' => 'Los articles de validar',
302
+    'info_articles_proposes' => 'Articles prepausats',
303
+    'info_auteurs_nombre' => 'autor(s)',
304
+    'info_authentification_ftp' => 'autentificacion (per FTP).',
305
+    'info_breves_2' => 'brèvas',
306
+    'info_connexion_refusee' => 'Connexion refusada',
307
+    'info_contact_developpeur' => 'Volgatz contactar un desvolopaire.',
308
+    'info_contenance' => 'Aquel sit conten:',
309
+    'info_contribution' => 'Contribucions de forum', # MODIF
310
+    'info_copyright' => '@spip@ es un logicial liure distribuit @lien_gpl@.',
311
+    'info_copyright_doc' => ' Per mai d’informacions, veire lo sit <a href="@spipnet@">http://www.spip.net/oc</a>.', # MODIF
312
+    'info_copyright_gpl' => 'jos licéncia GPL',
313
+    'info_cours_edition' => 'Vòstres articles en cors de redaccion', # MODIF
314
+    'info_creer_repertoire' => 'Volgatz crear un fichièr o un repertòri nommat',
315
+    'info_creer_repertoire_2' => 'dintre lo sosrepertòri   <b>@repertoire@</b>, puèi:',
316
+    'info_creer_vignette' => 'creacion automatica de la vinheta',
317
+    'info_deplier' => 'Desplegar',
318
+    'info_descriptif_nombre' => 'descriptiu(s) :',
319
+    'info_description' => 'Descripcion :',
320
+    'info_description_2' => 'Descripcion :',
321
+    'info_dimension' => 'Dimensions :',
322
+    'info_ecire_message_prive' => 'Escriure un messatge privat',
323
+    'info_email_invalide' => 'Adreiça e-mail invalida',
324
+    'info_en_cours_validation' => 'Vòstres articles en cors de redaccion',
325
+    'info_en_ligne' => 'Ara en linha:',
326
+    'info_envoyer_message_prive' => 'Mandar un messatge privat a aquel autor',
327
+    'info_erreur_requete' => 'Error dins la requista',
328
+    'info_erreur_squelette2' => 'Ges d’esqueleta <b>@fichier@</b> es pas disponibla...',
329
+    'info_erreur_systeme' => 'Error sistèma (errno @errsys@)',
330
+    'info_erreur_systeme2' => 'Lo disc dur es benlèu plen, o la basa de donadas degalhada.<br />
331 331
 <span style="color:red;">Assajatz de <a href=\'@script@\'>reparar la basa</a>, o contactatz vòstre albergador.</span>',
332
-	'info_fini' => 'Es acabat !',
333
-	'info_format_image' => 'Formats d’imatges que se pòdon utilizar per crear de vinhetas: @gd_formats@.',
334
-	'info_format_non_defini' => 'format non definit',
335
-	'info_grand_ecran' => 'Ecran grand',
336
-	'info_image_aide' => 'AJUDA',
337
-	'info_image_process_titre' => 'Metòde de fabricacion de las vinhetas',
338
-	'info_impossible_lire_page' => '<b>Error!</b> Impossible de legir la pagina <tt><html>@test_proxy@</html></tt> a travèrs del proxy <tt>',
339
-	'info_installation_systeme_publication' => 'Installacion del sistèma de publicacion...',
340
-	'info_installer_documents' => 'Podètz installar automaticament totes los documents contenguts dins lo repertòri @upload@.',
341
-	'info_installer_ftp' => 'Coma administrator, podètz installar (per FTP) de fichièrs dins lo repertòri @upload@,  puèi los  seleccionar dirèctament aicí.',
342
-	'info_installer_images' => 'Podètz installar d’imatges als formats JPEG, GIF e PNG.',
343
-	'info_installer_images_dossier' => 'Installar d’imatges dins lo reprtòri @upload@ per los poder seleccionar aicí.',
344
-	'info_interface_complete' => 'Interfàcia completa',
345
-	'info_interface_simple' => 'Interfàcia simplificada',
346
-	'info_joindre_document_article' => 'Podètz jónher a aquel article de documents de la mena de',
347
-	'info_joindre_document_rubrique' => 'Podètz apondre a aquela rubrica de documents de la mena de',
348
-	'info_joindre_documents_article' => 'Podètz jónher a aquel article de documents de la mena de:',
349
-	'info_l_article' => 'l’article',
350
-	'info_la_breve' => 'la brèva',
351
-	'info_la_rubrique' => 'la rubrica',
352
-	'info_langue_principale' => 'Lenga majorala del sit',
353
-	'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixèls',
354
-	'info_les_auteurs_1' => 'per @les_auteurs@ ',
355
-	'info_logo_format_interdit' => 'Los lògos de formats @formats@ son sols autorizats.',
356
-	'info_logo_max_poids' => 'Los lògos an de far mens de @maxi@ (aqueste fichièr fa @actuel@).',
357
-	'info_mail_fournisseur' => '[email protected]',
358
-	'info_message_2' => 'MESSATGE',
359
-	'info_message_supprime' => 'MESSATGE SUPRIMIT',
360
-	'info_mise_en_ligne' => 'Data de mesa en linha:',
361
-	'info_modification_parametres_securite' => 'modificacions dels paramètres de seguretat',
362
-	'info_mois_courant' => 'Dins lo corrent del mes:',
363
-	'info_mot_cle_ajoute' => 'S’es apondut lo mot clau seguent a ',
364
-	'info_multi_herit' => 'Lenga predefinida',
365
-	'info_multi_langues_soulignees' => 'Las <u>lengas solinhadas</u> benefícian d’una revirada de totes los tèxtes de l’interfàcia. Se seleccionatz aquelas lengas, fòrça elements del sit public (datas, formularis) se reviraràn automaticament. Per las lengas non solinhadas, aqueles elements apareisseràn dins la lenga principala del sit.', # MODIF
366
-	'info_multilinguisme' => 'Multilingüisme',
367
-	'info_nom_non_utilisateurs_connectes' => 'Vòstre nom apareis pas dins la tièra dels utilizaires connectats.',
368
-	'info_nom_utilisateurs_connectes' => 'Lo vòstre nom apareis dins la tièra dels utilizaires connectats.',
369
-	'info_nombre_en_ligne' => 'Ara en linha:',
370
-	'info_non_resultat' => 'Pas cap de resultat per "@cherche_mot@"',
371
-	'info_non_utilisation_messagerie' => 'Utilizatz pas la messatjariá intèrna d’aquel sit.',
372
-	'info_nouveau_message' => 'AVÈTZ UN MESSATGE NÒU',
373
-	'info_nouveaux_messages' => 'AVÈTZ @total_messages@ MESSATGES NÒUS',
374
-	'info_numero_abbreviation' => 'N° ',
375
-	'info_pense_bete' => 'MEMENTO',
376
-	'info_petit_ecran' => 'Ecran pichòt ',
377
-	'info_pixels' => 'pixèls',
378
-	'info_plusieurs_mots_trouves' => 'Mai d’un mot clau trobat per "@cherche_mot@" :',
379
-	'info_portfolio_automatique' => 'Pòrtfòlio automatic:',
380
-	'info_premier_resultat' => '[@debut_limit@ primièrs resultats de @total@]',
381
-	'info_premier_resultat_sur' => ' [@debut_limit@ primièrs resultats de @total@]',
382
-	'info_propose_1' => '[@nom_site_spip@] Prepausa: @titre@',
383
-	'info_propose_2' => 'Article prepausat
332
+    'info_fini' => 'Es acabat !',
333
+    'info_format_image' => 'Formats d’imatges que se pòdon utilizar per crear de vinhetas: @gd_formats@.',
334
+    'info_format_non_defini' => 'format non definit',
335
+    'info_grand_ecran' => 'Ecran grand',
336
+    'info_image_aide' => 'AJUDA',
337
+    'info_image_process_titre' => 'Metòde de fabricacion de las vinhetas',
338
+    'info_impossible_lire_page' => '<b>Error!</b> Impossible de legir la pagina <tt><html>@test_proxy@</html></tt> a travèrs del proxy <tt>',
339
+    'info_installation_systeme_publication' => 'Installacion del sistèma de publicacion...',
340
+    'info_installer_documents' => 'Podètz installar automaticament totes los documents contenguts dins lo repertòri @upload@.',
341
+    'info_installer_ftp' => 'Coma administrator, podètz installar (per FTP) de fichièrs dins lo repertòri @upload@,  puèi los  seleccionar dirèctament aicí.',
342
+    'info_installer_images' => 'Podètz installar d’imatges als formats JPEG, GIF e PNG.',
343
+    'info_installer_images_dossier' => 'Installar d’imatges dins lo reprtòri @upload@ per los poder seleccionar aicí.',
344
+    'info_interface_complete' => 'Interfàcia completa',
345
+    'info_interface_simple' => 'Interfàcia simplificada',
346
+    'info_joindre_document_article' => 'Podètz jónher a aquel article de documents de la mena de',
347
+    'info_joindre_document_rubrique' => 'Podètz apondre a aquela rubrica de documents de la mena de',
348
+    'info_joindre_documents_article' => 'Podètz jónher a aquel article de documents de la mena de:',
349
+    'info_l_article' => 'l’article',
350
+    'info_la_breve' => 'la brèva',
351
+    'info_la_rubrique' => 'la rubrica',
352
+    'info_langue_principale' => 'Lenga majorala del sit',
353
+    'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixèls',
354
+    'info_les_auteurs_1' => 'per @les_auteurs@ ',
355
+    'info_logo_format_interdit' => 'Los lògos de formats @formats@ son sols autorizats.',
356
+    'info_logo_max_poids' => 'Los lògos an de far mens de @maxi@ (aqueste fichièr fa @actuel@).',
357
+    'info_mail_fournisseur' => '[email protected]',
358
+    'info_message_2' => 'MESSATGE',
359
+    'info_message_supprime' => 'MESSATGE SUPRIMIT',
360
+    'info_mise_en_ligne' => 'Data de mesa en linha:',
361
+    'info_modification_parametres_securite' => 'modificacions dels paramètres de seguretat',
362
+    'info_mois_courant' => 'Dins lo corrent del mes:',
363
+    'info_mot_cle_ajoute' => 'S’es apondut lo mot clau seguent a ',
364
+    'info_multi_herit' => 'Lenga predefinida',
365
+    'info_multi_langues_soulignees' => 'Las <u>lengas solinhadas</u> benefícian d’una revirada de totes los tèxtes de l’interfàcia. Se seleccionatz aquelas lengas, fòrça elements del sit public (datas, formularis) se reviraràn automaticament. Per las lengas non solinhadas, aqueles elements apareisseràn dins la lenga principala del sit.', # MODIF
366
+    'info_multilinguisme' => 'Multilingüisme',
367
+    'info_nom_non_utilisateurs_connectes' => 'Vòstre nom apareis pas dins la tièra dels utilizaires connectats.',
368
+    'info_nom_utilisateurs_connectes' => 'Lo vòstre nom apareis dins la tièra dels utilizaires connectats.',
369
+    'info_nombre_en_ligne' => 'Ara en linha:',
370
+    'info_non_resultat' => 'Pas cap de resultat per "@cherche_mot@"',
371
+    'info_non_utilisation_messagerie' => 'Utilizatz pas la messatjariá intèrna d’aquel sit.',
372
+    'info_nouveau_message' => 'AVÈTZ UN MESSATGE NÒU',
373
+    'info_nouveaux_messages' => 'AVÈTZ @total_messages@ MESSATGES NÒUS',
374
+    'info_numero_abbreviation' => 'N° ',
375
+    'info_pense_bete' => 'MEMENTO',
376
+    'info_petit_ecran' => 'Ecran pichòt ',
377
+    'info_pixels' => 'pixèls',
378
+    'info_plusieurs_mots_trouves' => 'Mai d’un mot clau trobat per "@cherche_mot@" :',
379
+    'info_portfolio_automatique' => 'Pòrtfòlio automatic:',
380
+    'info_premier_resultat' => '[@debut_limit@ primièrs resultats de @total@]',
381
+    'info_premier_resultat_sur' => ' [@debut_limit@ primièrs resultats de @total@]',
382
+    'info_propose_1' => '[@nom_site_spip@] Prepausa: @titre@',
383
+    'info_propose_2' => 'Article prepausat
384 384
 ---------------',
385
-	'info_propose_3' => 'L’article "@titre@" es prepausat a la publicacion.',
386
-	'info_propose_4' => 'Vos convidam a lo venir consultar e a donar vòstre vejaire',
387
-	'info_propose_5' => 'dins lo forum que li es estacat. Es disponible a l’adreiça:',
388
-	'info_publie_01' => 'L’article "@titre@" es estat validat per @connect_nom@.',
389
-	'info_publie_1' => '[@nom_site_spip@] PUBLICA: @titre@',
390
-	'info_publie_2' => 'Article publicat
385
+    'info_propose_3' => 'L’article "@titre@" es prepausat a la publicacion.',
386
+    'info_propose_4' => 'Vos convidam a lo venir consultar e a donar vòstre vejaire',
387
+    'info_propose_5' => 'dins lo forum que li es estacat. Es disponible a l’adreiça:',
388
+    'info_publie_01' => 'L’article "@titre@" es estat validat per @connect_nom@.',
389
+    'info_publie_1' => '[@nom_site_spip@] PUBLICA: @titre@',
390
+    'info_publie_2' => 'Article publicat
391 391
 --------------',
392
-	'info_rechercher' => 'Cercar',
393
-	'info_rechercher_02' => 'Cercar:',
394
-	'info_remplacer_vignette' => 'Remplaçar la vinheta predefinida per un lògo personalizat:',
395
-	'info_sans_titre_2' => 'sens títol',
396
-	'info_selectionner_fichier' => 'Podètz seleccionar un fichièr del dorsièr @upload@',
397
-	'info_selectionner_fichier_2' => 'Seleccionar un fichièr:',
398
-	'info_supprimer_vignette' => 'suprimir la vinheta',
399
-	'info_symbole_bleu' => 'Lo simbèl <b>blau</b> marca un <b>memento</b>: valent a dire un messatge per vòstre usatge personal.',
400
-	'info_symbole_jaune' => 'Lo simbèl <b>jaune</b> marca un <b>anonci per totes los redactors </b>: los administrators lo pòdon modificar, cada redactor lo pòt veire.',
401
-	'info_symbole_vert' => 'Lo simbèl <b>verd</b> marca los <b>messatges escambiats amb d’autres utilizaires</b> del sit.',
402
-	'info_telecharger_nouveau_logo' => 'Telecargar un lògo nòu:',
403
-	'info_telecharger_ordinateur' => 'Telecargar a partir de vòstre ordenador:',
404
-	'info_tous_resultats_enregistres' => '[totes los resultats son registrats]',
405
-	'info_tout_afficher' => 'O afichar tot',
406
-	'info_travaux_texte' => 'Aquel sit es pas encara configurat. Tornatz mai tard...',
407
-	'info_travaux_titre' => 'Sit en òbras',
408
-	'info_trop_resultat' => 'Tròp de resultats per "@cherche_mot@"; volgatz afinar la recèrca.',
409
-	'info_utilisation_messagerie_interne' => 'Utilizatz la messatjariá intèrna d’aquel sit.',
410
-	'info_valider_lien' => 'validar aquel ligam',
411
-	'info_verifier_image' => ', volgatz verificar que los imatges se sián plan transferits.',
412
-	'info_vignette_defaut' => 'Vinheta predefinida',
413
-	'info_vignette_personnalisee' => 'Vinheta personalizada',
414
-	'info_visite' => 'vesita:',
415
-	'info_vos_rendez_vous' => 'Los vòstres rendètz-vos venents',
416
-	'infos_vos_pense_bete' => 'Vòstres mementos', # MODIF
392
+    'info_rechercher' => 'Cercar',
393
+    'info_rechercher_02' => 'Cercar:',
394
+    'info_remplacer_vignette' => 'Remplaçar la vinheta predefinida per un lògo personalizat:',
395
+    'info_sans_titre_2' => 'sens títol',
396
+    'info_selectionner_fichier' => 'Podètz seleccionar un fichièr del dorsièr @upload@',
397
+    'info_selectionner_fichier_2' => 'Seleccionar un fichièr:',
398
+    'info_supprimer_vignette' => 'suprimir la vinheta',
399
+    'info_symbole_bleu' => 'Lo simbèl <b>blau</b> marca un <b>memento</b>: valent a dire un messatge per vòstre usatge personal.',
400
+    'info_symbole_jaune' => 'Lo simbèl <b>jaune</b> marca un <b>anonci per totes los redactors </b>: los administrators lo pòdon modificar, cada redactor lo pòt veire.',
401
+    'info_symbole_vert' => 'Lo simbèl <b>verd</b> marca los <b>messatges escambiats amb d’autres utilizaires</b> del sit.',
402
+    'info_telecharger_nouveau_logo' => 'Telecargar un lògo nòu:',
403
+    'info_telecharger_ordinateur' => 'Telecargar a partir de vòstre ordenador:',
404
+    'info_tous_resultats_enregistres' => '[totes los resultats son registrats]',
405
+    'info_tout_afficher' => 'O afichar tot',
406
+    'info_travaux_texte' => 'Aquel sit es pas encara configurat. Tornatz mai tard...',
407
+    'info_travaux_titre' => 'Sit en òbras',
408
+    'info_trop_resultat' => 'Tròp de resultats per "@cherche_mot@"; volgatz afinar la recèrca.',
409
+    'info_utilisation_messagerie_interne' => 'Utilizatz la messatjariá intèrna d’aquel sit.',
410
+    'info_valider_lien' => 'validar aquel ligam',
411
+    'info_verifier_image' => ', volgatz verificar que los imatges se sián plan transferits.',
412
+    'info_vignette_defaut' => 'Vinheta predefinida',
413
+    'info_vignette_personnalisee' => 'Vinheta personalizada',
414
+    'info_visite' => 'vesita:',
415
+    'info_vos_rendez_vous' => 'Los vòstres rendètz-vos venents',
416
+    'infos_vos_pense_bete' => 'Vòstres mementos', # MODIF
417 417
 
418
-	// L
419
-	'lien_afficher_icones_seuls' => 'Afichar sonque las icònas',
420
-	'lien_afficher_texte_icones' => 'Afichar las icònas e lo tèxt',
421
-	'lien_afficher_texte_seul' => 'Afichar sonque lo tèxt',
422
-	'lien_liberer' => 'liberar',
423
-	'lien_liberer_tous' => 'liberar aqueles articles', # MODIF
424
-	'lien_nouvea_pense_bete' => 'MEMENTO NÒU',
425
-	'lien_nouveau_message' => 'MESSATGE NÒU',
426
-	'lien_nouvelle_annonce' => 'ANONCI NOVÈL',
427
-	'lien_petitions' => 'PETICION',
428
-	'lien_popularite' => 'popularitat: @popularite@%',
429
-	'lien_racine_site' => 'RAIÇ DEL SIT',
430
-	'lien_reessayer' => 'tornar ensajar',
431
-	'lien_repondre_message' => 'Respondre a aquel messatge',
432
-	'lien_supprimer' => 'suprimir',
433
-	'lien_tout_afficher' => 'O afichar tot',
434
-	'lien_visite_site' => 'vesitar aquel sit',
435
-	'lien_visites' => '@visites@ vesitas',
436
-	'lien_voir_auteur' => 'Veire aquel autor',
437
-	'ligne' => 'Linha',
438
-	'login_acces_prive' => 'accès a l’espaci privat',
439
-	'login_autre_identifiant' => 'se connectar amb un autre identificant',
440
-	'login_cookie_accepte' => 'Volgatz configurar vòstre navigador per que los accèpte (almens per aquel sit).',
441
-	'login_cookie_oblige' => 'Per vos identificar d’un biais segur sus aqueste sit, vos cal acceptar los cookies.',
442
-	'login_deconnexion_ok' => 'Sètz desconnectat/ada.',
443
-	'login_erreur_pass' => 'Error de mot de santa Clara.',
444
-	'login_espace_prive' => 'espaci privat',
445
-	'login_identifiant_inconnu' => 'L’identificant «@login@» es inconegut.',
446
-	'login_login' => 'Login :',
447
-	'login_login2' => 'Login (identificant de connexion al sit) :', # MODIF
448
-	'login_login_pass_incorrect' => '(Login o mot de santa Clara incorrècte.)',
449
-	'login_motpasseoublie' => 'mot de santa Clara oblidat ?',
450
-	'login_non_securise' => 'Atencion, aquel formulari es pas securizat.
418
+    // L
419
+    'lien_afficher_icones_seuls' => 'Afichar sonque las icònas',
420
+    'lien_afficher_texte_icones' => 'Afichar las icònas e lo tèxt',
421
+    'lien_afficher_texte_seul' => 'Afichar sonque lo tèxt',
422
+    'lien_liberer' => 'liberar',
423
+    'lien_liberer_tous' => 'liberar aqueles articles', # MODIF
424
+    'lien_nouvea_pense_bete' => 'MEMENTO NÒU',
425
+    'lien_nouveau_message' => 'MESSATGE NÒU',
426
+    'lien_nouvelle_annonce' => 'ANONCI NOVÈL',
427
+    'lien_petitions' => 'PETICION',
428
+    'lien_popularite' => 'popularitat: @popularite@%',
429
+    'lien_racine_site' => 'RAIÇ DEL SIT',
430
+    'lien_reessayer' => 'tornar ensajar',
431
+    'lien_repondre_message' => 'Respondre a aquel messatge',
432
+    'lien_supprimer' => 'suprimir',
433
+    'lien_tout_afficher' => 'O afichar tot',
434
+    'lien_visite_site' => 'vesitar aquel sit',
435
+    'lien_visites' => '@visites@ vesitas',
436
+    'lien_voir_auteur' => 'Veire aquel autor',
437
+    'ligne' => 'Linha',
438
+    'login_acces_prive' => 'accès a l’espaci privat',
439
+    'login_autre_identifiant' => 'se connectar amb un autre identificant',
440
+    'login_cookie_accepte' => 'Volgatz configurar vòstre navigador per que los accèpte (almens per aquel sit).',
441
+    'login_cookie_oblige' => 'Per vos identificar d’un biais segur sus aqueste sit, vos cal acceptar los cookies.',
442
+    'login_deconnexion_ok' => 'Sètz desconnectat/ada.',
443
+    'login_erreur_pass' => 'Error de mot de santa Clara.',
444
+    'login_espace_prive' => 'espaci privat',
445
+    'login_identifiant_inconnu' => 'L’identificant «@login@» es inconegut.',
446
+    'login_login' => 'Login :',
447
+    'login_login2' => 'Login (identificant de connexion al sit) :', # MODIF
448
+    'login_login_pass_incorrect' => '(Login o mot de santa Clara incorrècte.)',
449
+    'login_motpasseoublie' => 'mot de santa Clara oblidat ?',
450
+    'login_non_securise' => 'Atencion, aquel formulari es pas securizat.
451 451
     Se volètz pas que vòstre mot de santa Clara siá
452 452
    interceptat sul ret, volgatz activar Javascript 
453 453
    dins vòstre navigador e',
454
-	'login_nouvelle_tentative' => 'novèl ensag',
455
-	'login_par_ici' => 'Sètz registrat/ada... per aquí...',
456
-	'login_pass2' => 'Mot de santa Clara :',
457
-	'login_preferez_refuser' => '<b>Se vos agrada mai de refusar los cookies</b>, un autre metòde de connexion (mens securizat) es a vòstra disposicion:',
458
-	'login_recharger' => 'tornar cargar aquela pagina',
459
-	'login_rester_identifie' => 'Demorar identificat qualques jorns', # MODIF
460
-	'login_retour_public' => 'Tornar al sit public',
461
-	'login_retour_site' => 'Tornar al sit public',
462
-	'login_retoursitepublic' => 'tornar al sit public',
463
-	'login_sinscrire' => 's’inscriure', # MODIF
464
-	'login_test_navigateur' => 'Ensag navigador/tornar connectar',
465
-	'login_verifiez_navigateur' => '(ça que la verificatz que vòstre navigador aja pas servat vòstre mot de santa Clara en memòria...)',
454
+    'login_nouvelle_tentative' => 'novèl ensag',
455
+    'login_par_ici' => 'Sètz registrat/ada... per aquí...',
456
+    'login_pass2' => 'Mot de santa Clara :',
457
+    'login_preferez_refuser' => '<b>Se vos agrada mai de refusar los cookies</b>, un autre metòde de connexion (mens securizat) es a vòstra disposicion:',
458
+    'login_recharger' => 'tornar cargar aquela pagina',
459
+    'login_rester_identifie' => 'Demorar identificat qualques jorns', # MODIF
460
+    'login_retour_public' => 'Tornar al sit public',
461
+    'login_retour_site' => 'Tornar al sit public',
462
+    'login_retoursitepublic' => 'tornar al sit public',
463
+    'login_sinscrire' => 's’inscriure', # MODIF
464
+    'login_test_navigateur' => 'Ensag navigador/tornar connectar',
465
+    'login_verifiez_navigateur' => '(ça que la verificatz que vòstre navigador aja pas servat vòstre mot de santa Clara en memòria...)',
466 466
 
467
-	// M
468
-	'masquer_trad' => 'escondre las reviradas',
469
-	'module_fichiers_langues' => 'Fichièrs de lenga',
467
+    // M
468
+    'masquer_trad' => 'escondre las reviradas',
469
+    'module_fichiers_langues' => 'Fichièrs de lenga',
470 470
 
471
-	// N
472
-	'navigateur_pas_redirige' => 'Se vòstre navigador es pas redirigit, clicatz aicí per contunhar.',
473
-	'numero' => 'Numèro',
471
+    // N
472
+    'navigateur_pas_redirige' => 'Se vòstre navigador es pas redirigit, clicatz aicí per contunhar.',
473
+    'numero' => 'Numèro',
474 474
 
475
-	// O
476
-	'occurence' => 'Ocurréncia',
477
-	'onglet_affacer_base' => 'Escafar la basa',
478
-	'onglet_auteur' => 'L’autor',
479
-	'onglet_contenu_site' => 'Contengut del sit',
480
-	'onglet_evolution_visite_mod' => 'Evolucion',
481
-	'onglet_fonctions_avances' => 'Foncions avançadas',
482
-	'onglet_informations_personnelles' => 'Informacions personalas',
483
-	'onglet_interactivite' => 'Interactivitat',
484
-	'onglet_messagerie' => 'Messatjariá',
485
-	'onglet_repartition_rubrique' => 'Reparticion per rubricas',
486
-	'onglet_save_restaur_base' => 'Salvagardar/restaurar la basa',
487
-	'onglet_vider_cache' => 'Vojar l’escondedor',
475
+    // O
476
+    'occurence' => 'Ocurréncia',
477
+    'onglet_affacer_base' => 'Escafar la basa',
478
+    'onglet_auteur' => 'L’autor',
479
+    'onglet_contenu_site' => 'Contengut del sit',
480
+    'onglet_evolution_visite_mod' => 'Evolucion',
481
+    'onglet_fonctions_avances' => 'Foncions avançadas',
482
+    'onglet_informations_personnelles' => 'Informacions personalas',
483
+    'onglet_interactivite' => 'Interactivitat',
484
+    'onglet_messagerie' => 'Messatjariá',
485
+    'onglet_repartition_rubrique' => 'Reparticion per rubricas',
486
+    'onglet_save_restaur_base' => 'Salvagardar/restaurar la basa',
487
+    'onglet_vider_cache' => 'Vojar l’escondedor',
488 488
 
489
-	// P
490
-	'pass_choix_pass' => 'Volgatz causir vòstre mot de santa Clara novèl:',
491
-	'pass_erreur' => 'Error',
492
-	'pass_erreur_acces_refuse' => '<b>Error :</b> podètz pas pus accedir a aquel sit.',
493
-	'pass_erreur_code_inconnu' => '<b>Error :</b> aquel còde correspond pas a cap de vesitaire que pòsca accedir a aquel sit.',
494
-	'pass_erreur_non_enregistre' => '<b>Error:</b> l’adreiça <tt>@email_oubli@</tt> es pas registrada sus aquel sit.',
495
-	'pass_erreur_non_valide' => '<b>Error:</b> aquel e-mail <tt>@email_oubli@</tt> es pas valid!',
496
-	'pass_erreur_probleme_technique' => '<b>Error:</b> pr’amor d’un problèma tecnic, l’e-mail se pòt pas mandar. ',
497
-	'pass_espace_prive_bla' => 'L’espaci privat d’aqueste sit es dobèrt als
489
+    // P
490
+    'pass_choix_pass' => 'Volgatz causir vòstre mot de santa Clara novèl:',
491
+    'pass_erreur' => 'Error',
492
+    'pass_erreur_acces_refuse' => '<b>Error :</b> podètz pas pus accedir a aquel sit.',
493
+    'pass_erreur_code_inconnu' => '<b>Error :</b> aquel còde correspond pas a cap de vesitaire que pòsca accedir a aquel sit.',
494
+    'pass_erreur_non_enregistre' => '<b>Error:</b> l’adreiça <tt>@email_oubli@</tt> es pas registrada sus aquel sit.',
495
+    'pass_erreur_non_valide' => '<b>Error:</b> aquel e-mail <tt>@email_oubli@</tt> es pas valid!',
496
+    'pass_erreur_probleme_technique' => '<b>Error:</b> pr’amor d’un problèma tecnic, l’e-mail se pòt pas mandar. ',
497
+    'pass_espace_prive_bla' => 'L’espaci privat d’aqueste sit es dobèrt als
498 498
   vesitaires que se son inscriches. Un còp registrat/ada,
499 499
   poiretz consultar los articles en cors de redaccion,
500 500
   prepausar d’articles novèls e participar a totes los forums.',
501
-	'pass_forum_bla' => 'Avètz demandat d’intervenir dins un forum
501
+    'pass_forum_bla' => 'Avètz demandat d’intervenir dins un forum
502 502
   reservat als vesitaires registrats.',
503
-	'pass_indiquez_cidessous' => 'Marcatz çai sota l’adreiça e-mail ont
503
+    'pass_indiquez_cidessous' => 'Marcatz çai sota l’adreiça e-mail ont
504 504
  vos registrèretz lo còp passat. 
505 505
    Recebretz un e-mail que vos bailarà lo biais de 
506 506
     tornar trobar vòstre accès.',
507
-	'pass_mail_passcookie' => '(aquò’s un messatge automatic)
507
+    'pass_mail_passcookie' => '(aquò’s un messatge automatic)
508 508
 Per tornar trobar vòstre accès al sit
509 509
 @nom_site_spip@ (@adresse_site@)
510 510
 
@@ -516,126 +516,126 @@  discard block
 block discarded – undo
516 516
 e vos tornar connectar al sit.
517 517
 
518 518
 ',
519
-	'pass_mot_oublie' => 'Mot de santa Clara desmembrat',
520
-	'pass_nouveau_enregistre' => 'Vòstre mot de santa Clara novèl es estat registrat.',
521
-	'pass_nouveau_pass' => 'Mot de santa Clara novèl',
522
-	'pass_ok' => 'D’acòrdi',
523
-	'pass_oubli_mot' => 'Mot de santa Clara desmembrat',
524
-	'pass_quitter_fenetre' => 'Quitar aquesta fenèstra ',
525
-	'pass_rappel_login' => 'Remembrança: vòstre identificant (login) es « @login@ ».',
526
-	'pass_recevoir_mail' => 'Recebretz un e-mail que vos explicarà cossí tornar trobar vòstre accès al sit.', # MODIF
527
-	'pass_retour_public' => 'Tornar al sit public',
528
-	'pass_rien_a_faire_ici' => 'Pas res a faire aicí.',
529
-	'pass_vousinscrire' => 'S’inscriure sus aqueste sit',
530
-	'precedent' => 'precedent',
531
-	'previsualisation' => 'Previsualizacion',
532
-	'previsualiser' => 'Previsualizar',
519
+    'pass_mot_oublie' => 'Mot de santa Clara desmembrat',
520
+    'pass_nouveau_enregistre' => 'Vòstre mot de santa Clara novèl es estat registrat.',
521
+    'pass_nouveau_pass' => 'Mot de santa Clara novèl',
522
+    'pass_ok' => 'D’acòrdi',
523
+    'pass_oubli_mot' => 'Mot de santa Clara desmembrat',
524
+    'pass_quitter_fenetre' => 'Quitar aquesta fenèstra ',
525
+    'pass_rappel_login' => 'Remembrança: vòstre identificant (login) es « @login@ ».',
526
+    'pass_recevoir_mail' => 'Recebretz un e-mail que vos explicarà cossí tornar trobar vòstre accès al sit.', # MODIF
527
+    'pass_retour_public' => 'Tornar al sit public',
528
+    'pass_rien_a_faire_ici' => 'Pas res a faire aicí.',
529
+    'pass_vousinscrire' => 'S’inscriure sus aqueste sit',
530
+    'precedent' => 'precedent',
531
+    'previsualisation' => 'Previsualizacion',
532
+    'previsualiser' => 'Previsualizar',
533 533
 
534
-	// R
535
-	'retour' => 'Tornar',
534
+    // R
535
+    'retour' => 'Tornar',
536 536
 
537
-	// S
538
-	'spip_conforme_dtd' => 'SPIP considèra aquel document coma confòrm a son DOCTYPE :',
539
-	'squelette' => 'esqueleta',
540
-	'squelette_inclus_ligne' => 'esqueleta inclusa, linha',
541
-	'squelette_ligne' => 'esqueleta, linha',
542
-	'stats_visites_et_popularite' => '@visites@ vesitas; popularitat: @popularite@',
543
-	'suivant' => 'seguent',
537
+    // S
538
+    'spip_conforme_dtd' => 'SPIP considèra aquel document coma confòrm a son DOCTYPE :',
539
+    'squelette' => 'esqueleta',
540
+    'squelette_inclus_ligne' => 'esqueleta inclusa, linha',
541
+    'squelette_ligne' => 'esqueleta, linha',
542
+    'stats_visites_et_popularite' => '@visites@ vesitas; popularitat: @popularite@',
543
+    'suivant' => 'seguent',
544 544
 
545
-	// T
546
-	'taille_ko' => '@taille@ Ko',
547
-	'taille_mo' => '@taille@ Mo',
548
-	'taille_octets' => '@taille@ octets',
549
-	'texte_actualite_site_1' => 'Quand vos seretz familharizat/ada amb l’interfàcia, poiretz clicar sus «',
550
-	'texte_actualite_site_2' => 'Interfàcia completa',
551
-	'texte_actualite_site_3' => '" per dobrir mai de possibilitats.',
552
-	'texte_creation_automatique_vignette' => 'La creacion automatica de vinhetas de previsualizacion es activada sus aquel sit. S’installatz a partir d’aquel formulari d’imatges al(s) format(s) @gd_formats@, s’acompanharàn d’una vinheta d’una talha maximala de @taille_preview@ pixèls.',
553
-	'texte_documents_associes' => 'Los documents seguents s’assòcian a l’article,
545
+    // T
546
+    'taille_ko' => '@taille@ Ko',
547
+    'taille_mo' => '@taille@ Mo',
548
+    'taille_octets' => '@taille@ octets',
549
+    'texte_actualite_site_1' => 'Quand vos seretz familharizat/ada amb l’interfàcia, poiretz clicar sus «',
550
+    'texte_actualite_site_2' => 'Interfàcia completa',
551
+    'texte_actualite_site_3' => '" per dobrir mai de possibilitats.',
552
+    'texte_creation_automatique_vignette' => 'La creacion automatica de vinhetas de previsualizacion es activada sus aquel sit. S’installatz a partir d’aquel formulari d’imatges al(s) format(s) @gd_formats@, s’acompanharàn d’una vinheta d’una talha maximala de @taille_preview@ pixèls.',
553
+    'texte_documents_associes' => 'Los documents seguents s’assòcian a l’article,
554 554
  mas s’inserisson pas
555 555
  dirèctament. Segon la compaginacion del sit public,
556 556
  poiràn aparéisser jos forma de documents jonches.',
557
-	'texte_erreur_mise_niveau_base' => 'Error de basa de donadas pendent la mesa a nivèl. L’imatge <b>@fichier@</b> es pas passat (article @id_article@).
557
+    'texte_erreur_mise_niveau_base' => 'Error de basa de donadas pendent la mesa a nivèl. L’imatge <b>@fichier@</b> es pas passat (article @id_article@).
558 558
   Notatz plan aquela referéncia, tornatz ensajar la mesa a
559 559
  nivèl, e verificatz puèi que los imatges aparescan
560 560
  encara dins los articles.',
561
-	'texte_erreur_visiteur' => 'Avètz assajat d’accedir a l’espaci privat amb un identificant qu’o permet pas.',
562
-	'texte_inc_auth_1' => 'Sètz identificat/ada coma
561
+    'texte_erreur_visiteur' => 'Avètz assajat d’accedir a l’espaci privat amb un identificant qu’o permet pas.',
562
+    'texte_inc_auth_1' => 'Sètz identificat/ada coma
563 563
    <b>@auth_login@</b>, mas aquel login existís pas o pas mai dins la basa.
564 564
   Ensajatz de vos', # MODIF
565
-	'texte_inc_auth_2' => 'tornar connectar',
566
-	'texte_inc_auth_3' => ', aprèp qu’auretz quitat eventualament, puèi
565
+    'texte_inc_auth_2' => 'tornar connectar',
566
+    'texte_inc_auth_3' => ', aprèp qu’auretz quitat eventualament, puèi
567 567
   tornat lançar vòstre navigador.',
568
-	'texte_inc_config' => 'Las modificacions fachas dins aquestas paginas influéncian bravament lo
568
+    'texte_inc_config' => 'Las modificacions fachas dins aquestas paginas influéncian bravament lo
569 569
  foncionament de vòstre sit. Vos aconselham d’i intervenir pas tant que siatz pas
570 570
  acostumat/ada al foncionament del sistèma SPIP. <br /><br /><b>
571 571
  En general, se conselha fòrt
572 572
  de daissar la carga d’aquestas paginas al webmèstre principal de vòstre sit.</b>',
573
-	'texte_inc_meta_1' => 'Lo sistèma a rescontrat una error dins l’escritura del fichièr <code>@fichier@</code>.Volgatz, coma administrator/tritz del sit,',
574
-	'texte_inc_meta_2' => 'verificar los dreches d’escritura',
575
-	'texte_inc_meta_3' => 'dins lo repertòri <code>@repertoire@</code>.',
576
-	'texte_statut_en_cours_redaction' => 'en cors de redaccion',
577
-	'texte_statut_poubelle' => 'al bordilhièr',
578
-	'texte_statut_propose_evaluation' => 'prepausat per avaloracion',
579
-	'texte_statut_publie' => 'publicat en linha',
580
-	'texte_statut_refuse' => 'refusat',
581
-	'titre_ajouter_mot_cle' => 'APONDRE UN MOT CLAU:',
582
-	'titre_cadre_raccourcis' => 'ACORCHAS:',
583
-	'titre_changer_couleur_interface' => 'Cambiar la color de l’interfàcia',
584
-	'titre_image_admin_article' => 'Podètz administrar aqueste article',
585
-	'titre_image_administrateur' => 'Administrator',
586
-	'titre_image_aide' => 'D’ajuda subre aquel element',
587
-	'titre_image_auteur_supprime' => 'Autor suprimit',
588
-	'titre_image_redacteur' => 'Redactor sens accès',
589
-	'titre_image_redacteur_02' => 'Redactor',
590
-	'titre_image_visiteur' => 'Vesitaire',
591
-	'titre_joindre_document' => 'JÓNHER UN DOCUMENT',
592
-	'titre_mots_cles' => 'MOTS CLAU',
593
-	'titre_probleme_technique' => 'Atencion: un problèma tecnic (servidor SQL) empacha d’accedir a aquela part del sit. Mercés de vòstra indulgéncia.',
594
-	'titre_publier_document' => 'PUBLICAR UN DOCUMENT DINS AQUELA RUBRICA',
595
-	'titre_statistiques' => 'Estadisticas del sit',
596
-	'titre_titre_document' => 'Títol del document:',
597
-	'trad_reference' => '(article de referéncia)', # MODIF
573
+    'texte_inc_meta_1' => 'Lo sistèma a rescontrat una error dins l’escritura del fichièr <code>@fichier@</code>.Volgatz, coma administrator/tritz del sit,',
574
+    'texte_inc_meta_2' => 'verificar los dreches d’escritura',
575
+    'texte_inc_meta_3' => 'dins lo repertòri <code>@repertoire@</code>.',
576
+    'texte_statut_en_cours_redaction' => 'en cors de redaccion',
577
+    'texte_statut_poubelle' => 'al bordilhièr',
578
+    'texte_statut_propose_evaluation' => 'prepausat per avaloracion',
579
+    'texte_statut_publie' => 'publicat en linha',
580
+    'texte_statut_refuse' => 'refusat',
581
+    'titre_ajouter_mot_cle' => 'APONDRE UN MOT CLAU:',
582
+    'titre_cadre_raccourcis' => 'ACORCHAS:',
583
+    'titre_changer_couleur_interface' => 'Cambiar la color de l’interfàcia',
584
+    'titre_image_admin_article' => 'Podètz administrar aqueste article',
585
+    'titre_image_administrateur' => 'Administrator',
586
+    'titre_image_aide' => 'D’ajuda subre aquel element',
587
+    'titre_image_auteur_supprime' => 'Autor suprimit',
588
+    'titre_image_redacteur' => 'Redactor sens accès',
589
+    'titre_image_redacteur_02' => 'Redactor',
590
+    'titre_image_visiteur' => 'Vesitaire',
591
+    'titre_joindre_document' => 'JÓNHER UN DOCUMENT',
592
+    'titre_mots_cles' => 'MOTS CLAU',
593
+    'titre_probleme_technique' => 'Atencion: un problèma tecnic (servidor SQL) empacha d’accedir a aquela part del sit. Mercés de vòstra indulgéncia.',
594
+    'titre_publier_document' => 'PUBLICAR UN DOCUMENT DINS AQUELA RUBRICA',
595
+    'titre_statistiques' => 'Estadisticas del sit',
596
+    'titre_titre_document' => 'Títol del document:',
597
+    'trad_reference' => '(article de referéncia)', # MODIF
598 598
 
599
-	// Z
600
-	'zbug_balise_b_aval' => ' : balisa B en aval',
601
-	'zbug_boucle' => 'bloca',
602
-	'zbug_boucle_recursive_undef' => 'bloca recursiva non definida', # MODIF
603
-	'zbug_champ_hors_boucle' => 'Camp @champ@ fòra bloca',
604
-	'zbug_champ_hors_motif' => 'Camp @champ@ en defòra d’una bloca de motiu @motif@', # MODIF
605
-	'zbug_code' => 'còde',
606
-	'zbug_critere_inconnu' => 'critèri inconegut @critere@', # MODIF
607
-	'zbug_distant_interdit' => 'extèrne enebit', # MODIF
608
-	'zbug_doublon_table_sans_index' => 'doblons sus una taula sens indèx', # MODIF
609
-	'zbug_erreur_boucle_double' => 'BLOCA@id@: definicion dobla', # MODIF
610
-	'zbug_erreur_boucle_fermant' => 'BLOCA@id@: lo tag barrador manca', # MODIF
611
-	'zbug_erreur_boucle_syntaxe' => 'Sintaxi bloca incorrècta', # MODIF
612
-	'zbug_erreur_compilation' => 'Error de compilacion',
613
-	'zbug_erreur_execution_page' => 'error d’execucion de la pagina', # MODIF
614
-	'zbug_erreur_filtre' => 'Error: filtre <b>« @filtre@ »</b> non definit', # MODIF
615
-	'zbug_erreur_meme_parent' => '{meme_parent} s’aplica sonque a las blocas (FORUMS) o (RUBRIQUES)', # MODIF
616
-	'zbug_erreur_squelette' => 'Error(s) dins l’esqueleta',
617
-	'zbug_info_erreur_squelette' => 'Error subre lo sit',
618
-	'zbug_inversion_ordre_inexistant' => 'inversion d’un òrdre inexistent', # MODIF
619
-	'zbug_pagination_sans_critere' => '#PAGINATION sens critèri {pagination} o emplegat dins una bocla recursiva', # MODIF
620
-	'zbug_parametres_inclus_incorrects' => 'Paramètres d’inclusion incorrèctes', # MODIF
621
-	'zbug_profile' => 'Temps de calcul: @time@',
622
-	'zbug_resultat' => 'resultat',
623
-	'zbug_serveur_indefini' => 'servidor SQL indefinit', # MODIF
624
-	'zbug_table_inconnue' => 'Taula SQL « @table@ » inconeguda',
625
-	'zxml_connus_attributs' => 'atributs coneguts',
626
-	'zxml_de' => 'de',
627
-	'zxml_inconnu_attribut' => 'atribut inconegut',
628
-	'zxml_inconnu_balise' => 'balisa inconeguda',
629
-	'zxml_inconnu_entite' => 'entitat inconeguda',
630
-	'zxml_inconnu_id' => 'ID inconegut',
631
-	'zxml_mais_de' => 'mas de',
632
-	'zxml_non_conforme' => 'es pas confòrm al motiu',
633
-	'zxml_non_fils' => 'es pas un filh de',
634
-	'zxml_nonvide_balise' => 'balisa non voida',
635
-	'zxml_obligatoire_attribut' => 'atribut obligatòri mas absent dins',
636
-	'zxml_succession_fils_incorrecte' => 'succession dels filhs incorrècte',
637
-	'zxml_survoler' => 'susvolar per veire los corrèctes',
638
-	'zxml_valeur_attribut' => 'valor de l’atribut',
639
-	'zxml_vide_balise' => 'balise voida',
640
-	'zxml_vu' => 'vist aperavant'
599
+    // Z
600
+    'zbug_balise_b_aval' => ' : balisa B en aval',
601
+    'zbug_boucle' => 'bloca',
602
+    'zbug_boucle_recursive_undef' => 'bloca recursiva non definida', # MODIF
603
+    'zbug_champ_hors_boucle' => 'Camp @champ@ fòra bloca',
604
+    'zbug_champ_hors_motif' => 'Camp @champ@ en defòra d’una bloca de motiu @motif@', # MODIF
605
+    'zbug_code' => 'còde',
606
+    'zbug_critere_inconnu' => 'critèri inconegut @critere@', # MODIF
607
+    'zbug_distant_interdit' => 'extèrne enebit', # MODIF
608
+    'zbug_doublon_table_sans_index' => 'doblons sus una taula sens indèx', # MODIF
609
+    'zbug_erreur_boucle_double' => 'BLOCA@id@: definicion dobla', # MODIF
610
+    'zbug_erreur_boucle_fermant' => 'BLOCA@id@: lo tag barrador manca', # MODIF
611
+    'zbug_erreur_boucle_syntaxe' => 'Sintaxi bloca incorrècta', # MODIF
612
+    'zbug_erreur_compilation' => 'Error de compilacion',
613
+    'zbug_erreur_execution_page' => 'error d’execucion de la pagina', # MODIF
614
+    'zbug_erreur_filtre' => 'Error: filtre <b>« @filtre@ »</b> non definit', # MODIF
615
+    'zbug_erreur_meme_parent' => '{meme_parent} s’aplica sonque a las blocas (FORUMS) o (RUBRIQUES)', # MODIF
616
+    'zbug_erreur_squelette' => 'Error(s) dins l’esqueleta',
617
+    'zbug_info_erreur_squelette' => 'Error subre lo sit',
618
+    'zbug_inversion_ordre_inexistant' => 'inversion d’un òrdre inexistent', # MODIF
619
+    'zbug_pagination_sans_critere' => '#PAGINATION sens critèri {pagination} o emplegat dins una bocla recursiva', # MODIF
620
+    'zbug_parametres_inclus_incorrects' => 'Paramètres d’inclusion incorrèctes', # MODIF
621
+    'zbug_profile' => 'Temps de calcul: @time@',
622
+    'zbug_resultat' => 'resultat',
623
+    'zbug_serveur_indefini' => 'servidor SQL indefinit', # MODIF
624
+    'zbug_table_inconnue' => 'Taula SQL « @table@ » inconeguda',
625
+    'zxml_connus_attributs' => 'atributs coneguts',
626
+    'zxml_de' => 'de',
627
+    'zxml_inconnu_attribut' => 'atribut inconegut',
628
+    'zxml_inconnu_balise' => 'balisa inconeguda',
629
+    'zxml_inconnu_entite' => 'entitat inconeguda',
630
+    'zxml_inconnu_id' => 'ID inconegut',
631
+    'zxml_mais_de' => 'mas de',
632
+    'zxml_non_conforme' => 'es pas confòrm al motiu',
633
+    'zxml_non_fils' => 'es pas un filh de',
634
+    'zxml_nonvide_balise' => 'balisa non voida',
635
+    'zxml_obligatoire_attribut' => 'atribut obligatòri mas absent dins',
636
+    'zxml_succession_fils_incorrecte' => 'succession dels filhs incorrècte',
637
+    'zxml_survoler' => 'susvolar per veire los corrèctes',
638
+    'zxml_valeur_attribut' => 'valor de l’atribut',
639
+    'zxml_vide_balise' => 'balise voida',
640
+    'zxml_vu' => 'vist aperavant'
641 641
 );
Please login to merge, or discard this patch.