@@ -14,154 +14,154 @@ |
||
| 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 | } |
@@ -118,13 +118,13 @@ |
||
| 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 | } |
@@ -154,8 +154,7 @@ |
||
| 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 | } |
@@ -23,115 +23,115 @@ |
||
| 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 | } |
@@ -107,7 +107,7 @@ |
||
| 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 | |
@@ -22,202 +22,202 @@ |
||
| 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('"', '"', $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('"', '"', $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 | } |
@@ -32,11 +32,10 @@ |
||
| 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 | |
@@ -17,103 +17,103 @@ |
||
| 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 | } |
@@ -209,9 +209,9 @@ |
||
| 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)); |
@@ -185,8 +185,7 @@ |
||
| 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') { |
@@ -29,209 +29,209 @@ |
||
| 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 | } |
@@ -11,7 +11,7 @@ discard block |
||
| 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 |
||
| 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 | } |
@@ -11,5 +11,5 @@ |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
@@ -83,8 +83,7 @@ discard block |
||
| 83 | 83 | . '</code>' |
| 84 | 84 | . '</pre>' |
| 85 | 85 | . '</div>'; |
| 86 | - } |
|
| 87 | - else { |
|
| 86 | + } else { |
|
| 88 | 87 | $echap = str_replace("\t", " ", $echap); |
| 89 | 88 | $echap = str_replace(" ", " ", $echap); |
| 90 | 89 | $html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>'; |
@@ -611,8 +610,7 @@ discard block |
||
| 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"); |
@@ -16,7 +16,7 @@ discard block |
||
| 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 |
||
| 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 |
||
| 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", " ", $echap); |
|
| 89 | - $echap = str_replace(" ", " ", $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", " ", $echap); |
|
| 89 | + $echap = str_replace(" ", " ", $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 |
||
| 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 |
||
| 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 ’ |
|
| 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 ’ |
|
| 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 |
||
| 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 |
||
| 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 |
||
| 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 : ' (...)'); |
|
| 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 : ' (...)'); |
|
| 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('<', '<', 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('<', '<', 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 |
||
| 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><\\1</tt>", $texte); |
|
| 591 | - $texte = str_replace('<', '<', $texte); |
|
| 592 | - $texte = str_replace('<tt>', '<tt>', $texte); |
|
| 593 | - $texte = str_replace('</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><\\1</tt>", $texte); |
|
| 591 | + $texte = str_replace('<', '<', $texte); |
|
| 592 | + $texte = str_replace('<tt>', '<tt>', $texte); |
|
| 593 | + $texte = str_replace('</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 |
||
| 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 |
||
| 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 |
|
| 714 | - $texte = str_replace(" ", " ", $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 |
|
| 714 | + $texte = str_replace(" ", " ", $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 |
||
| 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 | } |
@@ -43,13 +43,13 @@ discard block |
||
| 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 |
||
| 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 |
||
| 87 | 87 | else { |
| 88 | 88 | $echap = str_replace("\t", " ", $echap); |
| 89 | 89 | $echap = str_replace(" ", " ", $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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 | ); |
@@ -4,507 +4,507 @@ discard block |
||
| 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 |
||
| 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 | ); |