From f6ec7dccd5c589bbbed98921f6c6af8d4cac4e41 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 22 Mar 2023 17:50:45 +0100 Subject: [PATCH 01/16] Init 12304 --- CHANGES.md | 3 +++ LISEZMOI.md | 2 +- README.md | 2 +- core/core.php | 2 +- core/module/user/user.php | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ce000e36..02c45a11 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,8 @@ # Changelog +## Version 12.3.04 +- Bug de notification de compte bloqué, la traduction n'est pas effectuée. + ## Version 12.3.03 - Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée. - Corrige des problèmes d'interprétation des scripts intégrés dans une page. diff --git a/LISEZMOI.md b/LISEZMOI.md index fdfcb7b2..8168338a 100644 --- a/LISEZMOI.md +++ b/LISEZMOI.md @@ -1,4 +1,4 @@ -# ZwiiCMS 12.3.03 +# ZwiiCMS 12.3.04 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. diff --git a/README.md b/README.md index b7374707..07186ec7 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ZwiiCMS 12.3.03 +# ZwiiCMS 12.3.04 Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge. diff --git a/core/core.php b/core/core.php index 1d9ae9c0..62d3926e 100644 --- a/core/core.php +++ b/core/core.php @@ -53,7 +53,7 @@ class common const ACCESS_TIMER = 1800; // Numéro de version et branche pour l'auto-update - const ZWII_VERSION = '12.3.03'; + const ZWII_VERSION = '12.3.04'; const ZWII_DATAVERSION = 12301; diff --git a/core/module/user/user.php b/core/module/user/user.php index 9b8b4071..8b4fc202 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -511,7 +511,7 @@ class user extends common } // Cas 3 le délai de bloquage court if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) { - $notification = sprintf(helper::translate('Accès bloqué %d minutes', ($this->getData(['config', 'connect', 'timeout']) / 60))); + $notification = sprintf(helper::translate('Accès bloqué %d minutes'), ($this->getData(['config', 'connect', 'timeout']) / 60)); } // Valeurs en sortie From 169a30f4496f201b2f3529fa5ddf28258be87f00 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 23 Mar 2023 07:43:23 +0100 Subject: [PATCH 02/16] Blog position RSS --- module/blog/view/index/index.php | 114 ++++++++++++++++--------------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php index 091e1d5a..4deebb03 100755 --- a/module/blog/view/index/index.php +++ b/module/blog/view/index/index.php @@ -1,17 +1,17 @@ - - getData(['module', $this->getUrl(0), 'config', 'feeds'])) : ?> - - +getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?> + + +
- $article) : ?> - getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) === 0) : ?> + $article): ?> + getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) === 0): ?>

@@ -25,9 +25,9 @@
- signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> + signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> - getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> + getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?>

@@ -35,8 +35,8 @@ getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) && file_exists(self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])) - ) : ?> - getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']); ?> + ): ?> + getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']); ?> getData(['module', $this->getUrl(0), 'posts', $articleId, 'hidePicture']) == false) { echo 'getUrl(0) . '/edit/' . $articleId . '/' . $_SESSION['csrf']; ?>"> + ): ?> + Éditer
- getData(['module', $this->getUrl(0), 'posts', $articleId, 'commentClose'])) : ?> + getData(['module', $this->getUrl(0), 'posts', $articleId, 'commentClose'])): ?>

Cet article ne reçoit pas de commentaire.

- +

'right']); ?> 1 ? 's' : ''); echo ''; } else { - echo 'Pas encore de commentaire'; + echo 'Pas encore de commentaire'; } ?>

- +
+ ): ?>
getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])); - $thumb = 'mini_' . $parts['basename']; - // Créer la miniature si manquante - if (!file_exists(self::FILE_DIR . 'thumb/' . $thumb)) { - $this->makeThumb( - self::FILE_DIR . 'source/' . $article['picture'], - self::FILE_DIR . 'thumb/' . $thumb, - self::THUMBS_WIDTH - ); - } - ?> + $parts = pathinfo($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])); + $thumb = 'mini_' . $parts['basename']; + // Créer la miniature si manquante + if (!file_exists(self::FILE_DIR . 'thumb/' . $thumb)) { + $this->makeThumb( + self::FILE_DIR . 'source/' . $article['picture'], + self::FILE_DIR . 'thumb/' . $thumb, + self::THUMBS_WIDTH + ); + } + ?> - <?php echo $article['picture']; ?> + <?php echo $article['picture']; ?>
- +

@@ -129,30 +131,30 @@

- + 'left']); ?>
- - - signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']));?> - - getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> + + + signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> + + getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?>

- getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?> + getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>

'), 0, $lenght); ?>... Lire la suite

-
- - +
+ +
- + \ No newline at end of file From 65a12d0e25b0d1bce8691c0cf23fcbfc0935ded5 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 23 Mar 2023 07:49:52 +0100 Subject: [PATCH 03/16] Blog 6.6 position RSS CSS --- module/blog/blog.php | 2 +- module/blog/changes.md | 2 ++ module/blog/view/index/index.css | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/blog/blog.php b/module/blog/blog.php index 7845d6e9..2288a184 100755 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -16,7 +16,7 @@ class blog extends common { - const VERSION = '6.5'; + const VERSION = '6.6'; const REALNAME = 'Blog'; const DELETE = true; const UPDATE = '0.0'; diff --git a/module/blog/changes.md b/module/blog/changes.md index f07709e3..c79ad906 100755 --- a/module/blog/changes.md +++ b/module/blog/changes.md @@ -1,4 +1,6 @@ +# version 6.6 +- Position de l'icône RSS # version 6.5 - Intl dates formats - Modifications liées à la suppression de flatpickr diff --git a/module/blog/view/index/index.css b/module/blog/view/index/index.css index ead594b7..395cfb01 100755 --- a/module/blog/view/index/index.css +++ b/module/blog/view/index/index.css @@ -96,7 +96,6 @@ */ #rssFeed { text-align: right; - float: right; } #rssFeed p { display: inline; From c85f208837092a3410c1d17302d276f7518d974b Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 23 Mar 2023 07:56:45 +0100 Subject: [PATCH 04/16] Lire la suite WIP --- module/blog/view/index/index.css | 16 +++++++++++++++- module/blog/view/index/index.php | 3 ++- module/news/view/index/index.php | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/module/blog/view/index/index.css b/module/blog/view/index/index.css index 395cfb01..b7e317e7 100755 --- a/module/blog/view/index/index.css +++ b/module/blog/view/index/index.css @@ -100,4 +100,18 @@ #rssFeed p { display: inline; vertical-align: top; -} \ No newline at end of file +} + +article { + position: relative; + /* Autres styles pour les articles coupés */ + } + +article +.read-more-btn { + position: absolute; + bottom: 10px; + right: 10px; + z-index: 1; + /* Autres styles pour le bouton */ + } \ No newline at end of file diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php index 4deebb03..6dbcf360 100755 --- a/module/blog/view/index/index.php +++ b/module/blog/view/index/index.php @@ -147,7 +147,8 @@

getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>

'), 0, $lenght); ?>... - Lire la suite + +

diff --git a/module/news/view/index/index.php b/module/news/view/index/index.php index 10ebf140..14da4d51 100644 --- a/module/news/view/index/index.php +++ b/module/news/view/index/index.php @@ -46,6 +46,7 @@ && strlen($this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'content'])) >= $this->getData(['module', $this->getUrl(0), 'config', 'height']) ): ?> getUrl(0) . '/' . $newsId . '">lire la suite'; ?> + From d4d88cfdeb4a48021c1685c38e882cb24d282388 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Fri, 24 Mar 2023 08:48:30 +0100 Subject: [PATCH 05/16] Blog Read More --- module/blog/view/index/index.css | 29 +++++++++++++++++++++-------- module/blog/view/index/index.php | 14 ++++++++++---- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/module/blog/view/index/index.css b/module/blog/view/index/index.css index b7e317e7..cd1f14d7 100755 --- a/module/blog/view/index/index.css +++ b/module/blog/view/index/index.css @@ -50,6 +50,7 @@ margin-bottom: 5px; } .blogContent { + position: relative; float: left; margin-top: 5px; } @@ -102,16 +103,28 @@ vertical-align: top; } -article { +.rowArticle { position: relative; /* Autres styles pour les articles coupés */ } - -article -.read-more-btn { + +.readMoreContainer { position: absolute; - bottom: 10px; - right: 10px; - z-index: 1; + bottom: 0px; + width: 100%; + height: 45%; + background: linear-gradient(180deg,hsla(0,0%,100%,0) 0,#f6f6f6 100%,#f6f6f6); +} + +.readMoreButton { + position: absolute; + width: 20%; + bottom: 0px; + left: 0; + right: 0; + margin-left: auto; + margin-right: auto; + z-index: 99; + background: linear-gradient(180deg,hsla(0,0%,100%,0) 0,#f6f6f6 100%,#f6f6f6); /* Autres styles pour le bouton */ - } \ No newline at end of file + } diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php index 6dbcf360..913bfb7a 100755 --- a/module/blog/view/index/index.php +++ b/module/blog/view/index/index.php @@ -144,14 +144,20 @@ getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> -

+

getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>

'), 0, $lenght); ?>... - - -

+
+ From ae494b8d66d26504c8d1ff9605718e318fa22271 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Fri, 24 Mar 2023 09:08:15 +0100 Subject: [PATCH 06/16] Blog 6.6 traduction + changes --- CHANGES.md | 1 + module/blog/changes.md | 1 + module/blog/i18n/de.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/en_EN.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/es.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/fr_FR.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/gr_GR.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/it.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/pt_PT.json | 81 +++++++++++++++++++++++++++++++- module/blog/i18n/tr_TR.json | 81 +++++++++++++++++++++++++++++++- module/blog/view/index/index.php | 2 +- 11 files changed, 643 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 02c45a11..e61657d2 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ ## Version 12.3.04 - Bug de notification de compte bloqué, la traduction n'est pas effectuée. +- Amélioration du module, aspect de la liste des articles présenté en tableau et du bouton Lire la suite ## Version 12.3.03 - Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée. diff --git a/module/blog/changes.md b/module/blog/changes.md index c79ad906..000bb906 100755 --- a/module/blog/changes.md +++ b/module/blog/changes.md @@ -1,6 +1,7 @@ # version 6.6 - Position de l'icône RSS +- Présentation en tableau amélioration du visuel # version 6.5 - Intl dates formats - Modifications liées à la suppression de flatpickr diff --git a/module/blog/i18n/de.json b/module/blog/i18n/de.json index ab22df78..ef9d99fd 100644 --- a/module/blog/i18n/de.json +++ b/module/blog/i18n/de.json @@ -1 +1,80 @@ -{"1 article":"1 Artikel","10 articles":"10 Artikel","100 signes":"100 Zeichen","12 articles":"12 Artikel","2 articles":"2 Artikel","250 signes":"250 Zeichen","4 articles":"4 Artikel","500 signes":"500 Zeichen","6 articles":"6 Artikel","750 signes":"750 Zeichen","8 articles":"8 Artikel","Administrateur":"Administrator","Approbation par un modérateur":"Genehmigung durch einen Moderator","Approuver le commentaire ?":"Den Kommentar genehmigen?","Approuvé":"Genehmigt","Article complet en pleine page":"Voller Artikel auf der vollständigen Seite","Article supprimé":"Artikel gelöscht","Articles par page":"Artikel pro Seite","Aucun article":"Kein Artikel","Aucun commentaire":"Kein Kommentar","Auteur":"Auteur","Brouillon":"Unorganisiert","Caractères par commentaire":"Charaktere nach Kommentar","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Auswahl der maximalen Anzahl von Zeichen für jeden Artikel Kommentar, enthalten HTML -Formatierung.","Commentaire approuvé":"Genehmigter Kommentar","Commentaire rejeté":"Abgelehnter Kommentar","Commentaire supprimé":"Kommentar gelöscht","Commentaires":"Kommentare","Commentaires supprimés":"Gelöschte Kommentare","Edition - Suppression":"Ausgabe - Unterdrückung","Effacer l'article":"Löschen Sie den Artikel","Fermer les commentaires":"Schalten Sie die Kommentare aus","Gestion des commentaires":"Kommentarmanagement","Grande":"Grande","Groupe du propriétaire":"Besitzergruppe","Image de couverture":"Berichterstattung","Informations générales":"Allgemeine Informationen","L'article n'est visible qu'après la date de publication prévue.":"Der Artikel ist erst nach dem Datum der bereitgestellten Veröffentlichung sichtbar.","Largeur":"Bild breite","Le texte de l'article est adapté autour de l'image":"Der Text des Artikels ist um das Bild angepasst","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Benutzer höherer Gruppen zugreifen ohne Einschränkung auf den Artikel","Lien du flux RSS":"Lien du flux RSS","Masquer l'image dans l'article":"Verstecken Sie das Bild im Artikel","Masquer l'image de couverture dans l'article":"Verstecken Sie das Titelbild im Artikel","Membre":"Mitglied","Notification par email":"Benachrichtigung PAR -E -Mail","Nouvel article créé":"Neuer Artikel erstellt","Options de configuration":"Optionen de Konfiguration","Options de publication":"Publikationsoptionen","Permalink":"Permalink","Petite":"Zierlich","Pleine largeur":"Gesamtbreite","Propriétaire":"Eigentümer","Publication":"Veröffentlichung","Publier":"Veröffentlichen","Rejeter le commentaire ?":"Den Kommentar ablehnen?","Rejeté":"Abgelehnt","Rédiger un article":"Artikel","Supprimer cet article ?":"Diesen Artikel löschen?","Supprimer le commentaire ?":"Den Kommentar löschen?","Supprimer tous les commentaires ?":"Alle Kommentare löschen?","Tableau:couverture + 200 signes":"Tabelle:Cover + 200 Zeichen","Tableau:couverture + 400 signes":"Tabelle:Abdeckung + 400 Zeichen","Tableau:couverture + 600 signes":"Tabelle:Abdeckung + 600 Zeichen","Tableau:couverture + 800 signes":"Tabelle:Abdeckung + 800 Zeichen","Taille optimale de l'image de couverture:920 x 350 pixels.":"Optimale Größe des Titelbildes:920 x 350 Pixel.","Texte de l'étiquette":"Beschriftungstext","Tous les groupes":"Alle Gruppen","Tout effacer":"Alles löschen","Très Grande":"Sehr groß","Très petite":"Sehr klein","À droite":"Nach rechts","À gauche":"Nach links","Éditer l'article":"Bearbeiten Sie den Artikel","Éditer/ Approuver les commentaires":"Kommentare bearbeiten / genehmigen","Éditeur":"Editor","État":"État"} \ No newline at end of file +{ + "1 article": "1 Artikel", + "10 articles": "10 Artikel", + "100 signes": "100 Zeichen", + "12 articles": "12 Artikel", + "2 articles": "2 Artikel", + "250 signes": "250 Zeichen", + "4 articles": "4 Artikel", + "500 signes": "500 Zeichen", + "6 articles": "6 Artikel", + "750 signes": "750 Zeichen", + "8 articles": "8 Artikel", + "Administrateur": "Administrator", + "Approbation par un modérateur": "Genehmigung durch einen Moderator", + "Approuver le commentaire ?": "Den Kommentar genehmigen?", + "Approuvé": "Genehmigt", + "Article complet en pleine page": "Voller Artikel auf der vollständigen Seite", + "Article supprimé": "Artikel gelöscht", + "Articles par page": "Artikel pro Seite", + "Aucun article": "Kein Artikel", + "Aucun commentaire": "Kein Kommentar", + "Auteur": "Auteur", + "Brouillon": "Unorganisiert", + "Caractères par commentaire": "Charaktere nach Kommentar", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Auswahl der maximalen Anzahl von Zeichen für jeden Artikel Kommentar, enthalten HTML -Formatierung.", + "Commentaire approuvé": "Genehmigter Kommentar", + "Commentaire rejeté": "Abgelehnter Kommentar", + "Commentaire supprimé": "Kommentar gelöscht", + "Commentaires": "Kommentare", + "Commentaires supprimés": "Gelöschte Kommentare", + "Edition - Suppression": "Ausgabe - Unterdrückung", + "Effacer l'article": "Löschen Sie den Artikel", + "Fermer les commentaires": "Schalten Sie die Kommentare aus", + "Gestion des commentaires": "Kommentarmanagement", + "Grande": "Grande", + "Groupe du propriétaire": "Besitzergruppe", + "Image de couverture": "Berichterstattung", + "Informations générales": "Allgemeine Informationen", + "L'article n'est visible qu'après la date de publication prévue.": "Der Artikel ist erst nach dem Datum der bereitgestellten Veröffentlichung sichtbar.", + "Largeur": "Bild breite", + "Le texte de l'article est adapté autour de l'image": "Der Text des Artikels ist um das Bild angepasst", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Benutzer höherer Gruppen zugreifen ohne Einschränkung auf den Artikel", + "Lien du flux RSS": "Lien du flux RSS", + "Masquer l'image dans l'article": "Verstecken Sie das Bild im Artikel", + "Masquer l'image de couverture dans l'article": "Verstecken Sie das Titelbild im Artikel", + "Membre": "Mitglied", + "Notification par email": "Benachrichtigung PAR -E -Mail", + "Nouvel article créé": "Neuer Artikel erstellt", + "Options de configuration": "Optionen de Konfiguration", + "Options de publication": "Publikationsoptionen", + "Permalink": "Permalink", + "Petite": "Zierlich", + "Pleine largeur": "Gesamtbreite", + "Propriétaire": "Eigentümer", + "Publication": "Veröffentlichung", + "Publier": "Veröffentlichen", + "Rejeter le commentaire ?": "Den Kommentar ablehnen?", + "Rejeté": "Abgelehnt", + "Rédiger un article": "Artikel", + "Supprimer cet article ?": "Diesen Artikel löschen?", + "Supprimer le commentaire ?": "Den Kommentar löschen?", + "Supprimer tous les commentaires ?": "Alle Kommentare löschen?", + "Tableau:couverture + 200 signes": "Tabelle:Cover + 200 Zeichen", + "Tableau:couverture + 400 signes": "Tabelle:Abdeckung + 400 Zeichen", + "Tableau:couverture + 600 signes": "Tabelle:Abdeckung + 600 Zeichen", + "Tableau:couverture + 800 signes": "Tabelle:Abdeckung + 800 Zeichen", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "Optimale Größe des Titelbildes:920 x 350 Pixel.", + "Texte de l'étiquette": "Beschriftungstext", + "Tous les groupes": "Alle Gruppen", + "Tout effacer": "Alles löschen", + "Très Grande": "Sehr groß", + "Très petite": "Sehr klein", + "À droite": "Nach rechts", + "À gauche": "Nach links", + "Éditer l'article": "Bearbeiten Sie den Artikel", + "Éditer/ Approuver les commentaires": "Kommentare bearbeiten / genehmigen", + "Éditeur": "Editor", + "État": "État", + "Lire la suite": "Mehr lesen" +} \ No newline at end of file diff --git a/module/blog/i18n/en_EN.json b/module/blog/i18n/en_EN.json index 3aad20c8..be409c19 100644 --- a/module/blog/i18n/en_EN.json +++ b/module/blog/i18n/en_EN.json @@ -1 +1,80 @@ -{"1 article":"1 article","10 articles":"10 articles","100 signes":"100 signs","12 articles":"12 articles","2 articles":"2 articles","250 signes":"250 signs","4 articles":"4 articles","500 signes":"500 signs","6 articles":"6 articles","750 signes":"750 signs","8 articles":"8 articles","Administrateur":"Administrator","Approbation par un modérateur":"Approval by a moderator","Approuver le commentaire ?":"Approve the comment?","Approuvé":"Approved","Article complet en pleine page":"Full article in full page","Article supprimé":"Deleted article","Articles par page":"Articles per page","Aucun article":"No article","Aucun commentaire":"No comment","Auteur":"Auteur","Brouillon":"Draft copy","Caractères par commentaire":"Characters by comment","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Choosing the maximum number of characters for each article comment, HTML formatting included.","Commentaire approuvé":"Approved comment","Commentaire rejeté":"Rejected commentary","Commentaire supprimé":"Deleted comment","Commentaires":"Comments","Commentaires supprimés":"Deleted comments","Edition - Suppression":"Edition - Suppression","Effacer l'article":"Erase the article","Fermer les commentaires":"Turn off the comments","Gestion des commentaires":"Comment management","Grande":"Large","Groupe du propriétaire":"Owner's group","Image de couverture":"Coverage","Informations générales":"General informations","L'article n'est visible qu'après la date de publication prévue.":"The article is only visible after the date of publication provided.","Largeur":"Image width","Le texte de l'article est adapté autour de l'image":"The text of the article is adapted around the image","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Users of higher groups access the article without restriction","Lien du flux RSS":"Lien du Flux RSS","Masquer l'image dans l'article":"Hide the image in the article","Masquer l'image de couverture dans l'article":"Hide the cover image in the article","Membre":"Member","Notification par email":"Notification par email","Nouvel article créé":"New article created","Options de configuration":"Configuration options","Options de publication":"Publication options","Permalink":"Permalink","Petite":"Petite","Pleine largeur":"Full width","Propriétaire":"Owner","Publication":"Publication","Publier":"Publish","Rejeter le commentaire ?":"Reject the comment?","Rejeté":"Rejected","Rédiger un article":"Write an article","Supprimer cet article ?":"Delete this article?","Supprimer le commentaire ?":"Delete the comment?","Supprimer tous les commentaires ?":"Delete all comments?","Tableau:couverture + 200 signes":"Table:cover + 200 signs","Tableau:couverture + 400 signes":"Table:cover + 400 signs","Tableau:couverture + 600 signes":"Table:cover + 600 signs","Tableau:couverture + 800 signes":"Table:cover + 800 signs","Taille optimale de l'image de couverture:920 x 350 pixels.":"Optimal size of the cover image:920 x 350 pixels.","Texte de l'étiquette":"Label text","Tous les groupes":"All groups","Tout effacer":"Erase everything","Très Grande":"Very tall","Très petite":"Very small","À droite":"To the right","À gauche":"To the left","Éditer l'article":"Edit the article","Éditer/ Approuver les commentaires":"Edit / approve comments","Éditeur":"Editor","État":"Status"} \ No newline at end of file +{ + "1 article": "1 article", + "10 articles": "10 articles", + "100 signes": "100 signs", + "12 articles": "12 articles", + "2 articles": "2 articles", + "250 signes": "250 signs", + "4 articles": "4 articles", + "500 signes": "500 signs", + "6 articles": "6 articles", + "750 signes": "750 signs", + "8 articles": "8 articles", + "Administrateur": "Administrator", + "Approbation par un modérateur": "Approval by a moderator", + "Approuver le commentaire ?": "Approve the comment?", + "Approuvé": "Approved", + "Article complet en pleine page": "Full article in full page", + "Article supprimé": "Deleted article", + "Articles par page": "Articles per page", + "Aucun article": "No article", + "Aucun commentaire": "No comment", + "Auteur": "Auteur", + "Brouillon": "Draft copy", + "Caractères par commentaire": "Characters by comment", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Choosing the maximum number of characters for each article comment, HTML formatting included.", + "Commentaire approuvé": "Approved comment", + "Commentaire rejeté": "Rejected commentary", + "Commentaire supprimé": "Deleted comment", + "Commentaires": "Comments", + "Commentaires supprimés": "Deleted comments", + "Edition - Suppression": "Edition - Suppression", + "Effacer l'article": "Erase the article", + "Fermer les commentaires": "Turn off the comments", + "Gestion des commentaires": "Comment management", + "Grande": "Large", + "Groupe du propriétaire": "Owner's group", + "Image de couverture": "Coverage", + "Informations générales": "General informations", + "L'article n'est visible qu'après la date de publication prévue.": "The article is only visible after the date of publication provided.", + "Largeur": "Image width", + "Le texte de l'article est adapté autour de l'image": "The text of the article is adapted around the image", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Users of higher groups access the article without restriction", + "Lien du flux RSS": "Lien du Flux RSS", + "Masquer l'image dans l'article": "Hide the image in the article", + "Masquer l'image de couverture dans l'article": "Hide the cover image in the article", + "Membre": "Member", + "Notification par email": "Notification par email", + "Nouvel article créé": "New article created", + "Options de configuration": "Configuration options", + "Options de publication": "Publication options", + "Permalink": "Permalink", + "Petite": "Petite", + "Pleine largeur": "Full width", + "Propriétaire": "Owner", + "Publication": "Publication", + "Publier": "Publish", + "Rejeter le commentaire ?": "Reject the comment?", + "Rejeté": "Rejected", + "Rédiger un article": "Write an article", + "Supprimer cet article ?": "Delete this article?", + "Supprimer le commentaire ?": "Delete the comment?", + "Supprimer tous les commentaires ?": "Delete all comments?", + "Tableau:couverture + 200 signes": "Table:cover + 200 signs", + "Tableau:couverture + 400 signes": "Table:cover + 400 signs", + "Tableau:couverture + 600 signes": "Table:cover + 600 signs", + "Tableau:couverture + 800 signes": "Table:cover + 800 signs", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "Optimal size of the cover image:920 x 350 pixels.", + "Texte de l'étiquette": "Label text", + "Tous les groupes": "All groups", + "Tout effacer": "Erase everything", + "Très Grande": "Very tall", + "Très petite": "Very small", + "À droite": "To the right", + "À gauche": "To the left", + "Éditer l'article": "Edit the article", + "Éditer/ Approuver les commentaires": "Edit / approve comments", + "Éditeur": "Editor", + "État": "Status", + "Lire la suite": "Read more" +} \ No newline at end of file diff --git a/module/blog/i18n/es.json b/module/blog/i18n/es.json index a6be205e..319731b7 100644 --- a/module/blog/i18n/es.json +++ b/module/blog/i18n/es.json @@ -1 +1,80 @@ -{"1 article":"1 Artículo","10 articles":"10 Artículos","100 signes":"100 caracteres","12 articles":"12 Artículos","2 articles":"2 Artículos","250 signes":"250 caracteres","4 articles":"4 Artículos","500 signes":"500 caracteres","6 articles":"6 Artículos","750 signes":"750 caracteres","8 articles":"8 Artículos","Administrateur":"Administrador","Approbation par un modérateur":"Aprobación del moderador","Approuver le commentaire ?":"¿Aprobar el comentario?","Approuvé":"Aprobado","Article complet en pleine page":"Artículo completo a plena página","Article supprimé":"Artículo suprimido","Articles par page":"Artículos por página","Aucun article":"Ningún artículo","Aucun commentaire":"Sin comentarios","Auteur":"Autor","Brouillon":"Borrador","Caractères par commentaire":"Caracteres por comentario","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Elección del número máximo de caracteres para cada comentario del artículo, incluido el formato html","Commentaire approuvé":"Comentario aprobado","Commentaire rejeté":"Comentario rechazado","Commentaire supprimé":"Comentario eliminado","Commentaires":"Comentarios","Commentaires supprimés":"Comentarios eliminados","Edition - Suppression":"Editar Borrar","Effacer l'article":"Eliminar artículo","Fermer les commentaires":"Cerrar los comentarios","Gestion des commentaires":"Gestión de comentarios","Grande":"Grande","Groupe du propriétaire":"Grupo de propietarios","Image de couverture":"Imagen de portada","Informations générales":"Información general","L'article n'est visible qu'après la date de publication prévue.":"El artículo solo es visible después de la fecha de publicación programada.","Largeur":"Ancho de la imagen","Le texte de l'article est adapté autour de l'image":"El texto del artículo se envuelve alrededor de la imagen","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Los usuarios de grupos superiores pueden acceder al artículo sin restricción.","Lien du flux RSS":"Enlace de fuente RSS","Masquer l'image dans l'article":"Ocultar imagen en la publicación","Masquer l'image de couverture dans l'article":"Ocultar imagen de portada en el artículo","Membre":"Miembro","Notification par email":"Notificación por correo electrónico","Nouvel article créé":"Nuevo artículo creado","Options de configuration":"Opciones de configuración","Options de publication":"Opciones de publicación","Permalink":"Enlace permanente","Petite":"Pequeña","Pleine largeur":"Anchura completa","Propriétaire":"Propietario","Publication":"Publicación","Publier":"Publicar","Rejeter le commentaire ?":"¿Rechazar el comentario?","Rejeté":"Rechazado","Rédiger un article":"Escribir un artículo","Supprimer cet article ?":"¿Borrar este artículo?","Supprimer le commentaire ?":"¿Borrar el comentario?","Supprimer tous les commentaires ?":"¿Borrar todos los comentarios?","Tableau:couverture + 200 signes":"Tabla:portada + 200 caracteres","Tableau:couverture + 400 signes":"Tabla:portada + 400 caracteres","Tableau:couverture + 600 signes":"Tabla:portada + 600 caracteres","Tableau:couverture + 800 signes":"Tabla:portada + 800 caracteres","Taille optimale de l'image de couverture:920 x 350 pixels.":"Tamaño de imagen de portada óptimo:920 x 350 píxeles.","Texte de l'étiquette":"Texto de la etiqueta","Tous les groupes":"Todos los grupos","Tout effacer":"Borrar todo","Très Grande":"Muy grande","Très petite":"Muy pequeña","À droite":"A la derecha","À gauche":"A la izquierda","Éditer l'article":"Editar artículo","Éditer/ Approuver les commentaires":"Editar / Aprobar comentarios","Éditeur":"Editor","État":"Estado"} \ No newline at end of file +{ + "1 article": "1 Artículo", + "10 articles": "10 Artículos", + "100 signes": "100 caracteres", + "12 articles": "12 Artículos", + "2 articles": "2 Artículos", + "250 signes": "250 caracteres", + "4 articles": "4 Artículos", + "500 signes": "500 caracteres", + "6 articles": "6 Artículos", + "750 signes": "750 caracteres", + "8 articles": "8 Artículos", + "Administrateur": "Administrador", + "Approbation par un modérateur": "Aprobación del moderador", + "Approuver le commentaire ?": "¿Aprobar el comentario?", + "Approuvé": "Aprobado", + "Article complet en pleine page": "Artículo completo a plena página", + "Article supprimé": "Artículo suprimido", + "Articles par page": "Artículos por página", + "Aucun article": "Ningún artículo", + "Aucun commentaire": "Sin comentarios", + "Auteur": "Autor", + "Brouillon": "Borrador", + "Caractères par commentaire": "Caracteres por comentario", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Elección del número máximo de caracteres para cada comentario del artículo, incluido el formato html", + "Commentaire approuvé": "Comentario aprobado", + "Commentaire rejeté": "Comentario rechazado", + "Commentaire supprimé": "Comentario eliminado", + "Commentaires": "Comentarios", + "Commentaires supprimés": "Comentarios eliminados", + "Edition - Suppression": "Editar Borrar", + "Effacer l'article": "Eliminar artículo", + "Fermer les commentaires": "Cerrar los comentarios", + "Gestion des commentaires": "Gestión de comentarios", + "Grande": "Grande", + "Groupe du propriétaire": "Grupo de propietarios", + "Image de couverture": "Imagen de portada", + "Informations générales": "Información general", + "L'article n'est visible qu'après la date de publication prévue.": "El artículo solo es visible después de la fecha de publicación programada.", + "Largeur": "Ancho de la imagen", + "Le texte de l'article est adapté autour de l'image": "El texto del artículo se envuelve alrededor de la imagen", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Los usuarios de grupos superiores pueden acceder al artículo sin restricción.", + "Lien du flux RSS": "Enlace de fuente RSS", + "Masquer l'image dans l'article": "Ocultar imagen en la publicación", + "Masquer l'image de couverture dans l'article": "Ocultar imagen de portada en el artículo", + "Membre": "Miembro", + "Notification par email": "Notificación por correo electrónico", + "Nouvel article créé": "Nuevo artículo creado", + "Options de configuration": "Opciones de configuración", + "Options de publication": "Opciones de publicación", + "Permalink": "Enlace permanente", + "Petite": "Pequeña", + "Pleine largeur": "Anchura completa", + "Propriétaire": "Propietario", + "Publication": "Publicación", + "Publier": "Publicar", + "Rejeter le commentaire ?": "¿Rechazar el comentario?", + "Rejeté": "Rechazado", + "Rédiger un article": "Escribir un artículo", + "Supprimer cet article ?": "¿Borrar este artículo?", + "Supprimer le commentaire ?": "¿Borrar el comentario?", + "Supprimer tous les commentaires ?": "¿Borrar todos los comentarios?", + "Tableau:couverture + 200 signes": "Tabla:portada + 200 caracteres", + "Tableau:couverture + 400 signes": "Tabla:portada + 400 caracteres", + "Tableau:couverture + 600 signes": "Tabla:portada + 600 caracteres", + "Tableau:couverture + 800 signes": "Tabla:portada + 800 caracteres", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "Tamaño de imagen de portada óptimo:920 x 350 píxeles.", + "Texte de l'étiquette": "Texto de la etiqueta", + "Tous les groupes": "Todos los grupos", + "Tout effacer": "Borrar todo", + "Très Grande": "Muy grande", + "Très petite": "Muy pequeña", + "À droite": "A la derecha", + "À gauche": "A la izquierda", + "Éditer l'article": "Editar artículo", + "Éditer/ Approuver les commentaires": "Editar / Aprobar comentarios", + "Éditeur": "Editor", + "État": "Estado", + "Lire la suite": "Leer más" +} \ No newline at end of file diff --git a/module/blog/i18n/fr_FR.json b/module/blog/i18n/fr_FR.json index 9e26dfee..fa974929 100644 --- a/module/blog/i18n/fr_FR.json +++ b/module/blog/i18n/fr_FR.json @@ -1 +1,80 @@ -{} \ No newline at end of file +{ + "1 article": "", + "10 articles": "", + "100 signes": "", + "12 articles": "", + "2 articles": "", + "250 signes": "", + "4 articles": "", + "500 signes": "", + "6 articles": "", + "750 signes": "", + "8 articles": "", + "Administrateur": "", + "Approbation par un modérateur": "", + "Approuver le commentaire ?": "", + "Approuvé": "", + "Article complet en pleine page": "", + "Article supprimé": "", + "Articles par page": "", + "Aucun article": "", + "Aucun commentaire": "", + "Auteur": "", + "Brouillon": "", + "Caractères par commentaire": "", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "", + "Commentaire approuvé": "", + "Commentaire rejeté": "", + "Commentaire supprimé": "", + "Commentaires": "", + "Commentaires supprimés": "", + "Edition - Suppression": "", + "Effacer l'article": "", + "Fermer les commentaires": "", + "Gestion des commentaires": "", + "Grande": "", + "Groupe du propriétaire": "", + "Image de couverture": "", + "Informations générales": "", + "L'article n'est visible qu'après la date de publication prévue.": "", + "Largeur": "", + "Le texte de l'article est adapté autour de l'image": "", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "", + "Lien du flux RSS": "", + "Masquer l'image dans l'article": "", + "Masquer l'image de couverture dans l'article": "", + "Membre": "", + "Notification par email": "", + "Nouvel article créé": "", + "Options de configuration": "", + "Options de publication": "", + "Permalink": "", + "Petite": "", + "Pleine largeur": "", + "Propriétaire": "", + "Publication": "", + "Publier": "", + "Rejeter le commentaire ?": "", + "Rejeté": "", + "Rédiger un article": "", + "Supprimer cet article ?": "", + "Supprimer le commentaire ?": "", + "Supprimer tous les commentaires ?": "", + "Tableau:couverture + 200 signes": "", + "Tableau:couverture + 400 signes": "", + "Tableau:couverture + 600 signes": "", + "Tableau:couverture + 800 signes": "", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "", + "Texte de l'étiquette": "", + "Tous les groupes": "", + "Tout effacer": "", + "Très Grande": "", + "Très petite": "", + "À droite": "", + "À gauche": "", + "Éditer l'article": "", + "Éditer/ Approuver les commentaires": "", + "Éditeur": "", + "État": "", + "Lire la suite": "" +} \ No newline at end of file diff --git a/module/blog/i18n/gr_GR.json b/module/blog/i18n/gr_GR.json index 0f1dee98..4a69df4f 100644 --- a/module/blog/i18n/gr_GR.json +++ b/module/blog/i18n/gr_GR.json @@ -1 +1,80 @@ -{"1 article":"1 Άρθρο","10 articles":"10 Άρθρα","100 signes":"100 χαρακτήρες","12 articles":"12 Άρθρα","2 articles":"2 Άρθρα","250 signes":"250 χαρακτήρες","4 articles":"4 Άρθρα","500 signes":"500 χαρακτήρες","6 articles":"6 Άρθρα","750 signes":"750 χαρακτήρες","8 articles":"8 Άρθρα","Administrateur":"Διαχειριστής","Approbation par un modérateur":"Έγκριση επόπτη","Approuver le commentaire ?":"Εγκρίνετε το σχόλιο;","Approuvé":"Εγκεκριμένο","Article complet en pleine page":"Άρθρο πλήρους σελίδας","Article supprimé":"Άρθρο που διαγράφηκε","Articles par page":"Άρθρα ανά σελίδα","Aucun article":"κανένα άρθρο","Aucun commentaire":"Κανένα σχόλιο","Auteur":"Συγγραφέας","Brouillon":"Σχέδιο","Caractères par commentaire":"Χαρακτήρες ανά σχόλιο","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Επιλογή του μέγιστου αριθμού χαρακτήρων για κάθε σχόλιο του άρθρου, συμπεριλαμβανομένης της μορφοποίησης html.","Commentaire approuvé":"Σχόλιο εγκεκριμένο","Commentaire rejeté":"Σχόλιο απορρίφθηκε","Commentaire supprimé":"Σχόλιο διαγράφηκε","Commentaires":"Σχόλια","Commentaires supprimés":"Σχόλια διαγράφονται","Edition - Suppression":"Επεξεργασία - Διαγραφή","Effacer l'article":"Διαγραφή αντικειμένου","Fermer les commentaires":"Κλείσιμο σχολίων","Gestion des commentaires":"Διαχείριση σχολίων","Grande":"Μεγάλη","Groupe du propriétaire":"Ομάδα ιδιοκτήτη","Image de couverture":"εικόνα εξωφύλλου","Informations générales":"Γενικές πληροφορίες","L'article n'est visible qu'après la date de publication prévue.":"Το άρθρο είναι ορατό μόνο μετά την προγραμματισμένη ημερομηνία δημοσίευσης","Largeur":"Πλάτος εικόνας","Le texte de l'article est adapté autour de l'image":"Το κείμενο του άρθρου τοποθετείται γύρω από την εικόνα","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Οι χρήστες σε ανώτερες ομάδες έχουν απεριόριστη πρόσβαση στο άρθρο","Lien du flux RSS":"Σύνδεσμος τροφοδοσίας RSS","Masquer l'image dans l'article":"Απόκρυψη εικόνας στο άρθρο","Masquer l'image de couverture dans l'article":"Απόκρυψη της εικόνας εξωφύλλου στο άρθρο","Membre":"Μέλος","Notification par email":"Ειδοποίηση ηλεκτρονικού ταχυδρομείου","Nouvel article créé":"Δημιουργήθηκε νέο άρθρο","Options de configuration":"Opções de configuração","Options de publication":"Επιλογές δημοσίευσης","Permalink":"Μόνιμος σύνδεσμος","Petite":"μικρη","Pleine largeur":"Πλήρες πλάτος","Propriétaire":"Ιδιοκτήτης","Publication":"ημερομηνία δημοσίευσης","Publier":"δημοσιεύστε το άρθρο","Rejeter le commentaire ?":"Απορρίπτετε το σχόλιο;","Rejeté":"Απορρίφθηκε","Rédiger un article":"Γράψτε ένα άρθρο","Supprimer cet article ?":"Να διαγράψετε αυτό το άρθρο;","Supprimer le commentaire ?":"Διαγράψτε το σχόλιο;","Supprimer tous les commentaires ?":"Να διαγράψετε όλα τα σχόλια;","Tableau:couverture + 200 signes":"Πίνακας:εξώφυλλο + 200 χαρακτήρες","Tableau:couverture + 400 signes":"Πίνακας:εξώφυλλο + 400 χαρακτήρες","Tableau:couverture + 600 signes":"Πίνακας:εξώφυλλο + 600 χαρακτήρες","Tableau:couverture + 800 signes":"Πίνακας:εξώφυλλο + 800 χαρακτήρες","Taille optimale de l'image de couverture:920 x 350 pixels.":"Βέλτιστο μέγεθος εικόνας εξωφύλλου:920 x 350 pixels","Texte de l'étiquette":"Κείμενο ετικέτας","Tous les groupes":"Όλες οι ομάδες","Tout effacer":"Διαγραφή όλων","Très Grande":"Πολύ μεγάλη","Très petite":"Πολύ μικρη","À droite":"Δεξιά","À gauche":"Αριστερά","Éditer l'article":"Επεξεργασία άρθρου","Éditer/ Approuver les commentaires":"Επεξεργασία / Έγκριση σχολίων","Éditeur":"Συντάκτης","État":"κατάσταση"} \ No newline at end of file +{ + "1 article": "1 Άρθρο", + "10 articles": "10 Άρθρα", + "100 signes": "100 χαρακτήρες", + "12 articles": "12 Άρθρα", + "2 articles": "2 Άρθρα", + "250 signes": "250 χαρακτήρες", + "4 articles": "4 Άρθρα", + "500 signes": "500 χαρακτήρες", + "6 articles": "6 Άρθρα", + "750 signes": "750 χαρακτήρες", + "8 articles": "8 Άρθρα", + "Administrateur": "Διαχειριστής", + "Approbation par un modérateur": "Έγκριση επόπτη", + "Approuver le commentaire ?": "Εγκρίνετε το σχόλιο;", + "Approuvé": "Εγκεκριμένο", + "Article complet en pleine page": "Άρθρο πλήρους σελίδας", + "Article supprimé": "Άρθρο που διαγράφηκε", + "Articles par page": "Άρθρα ανά σελίδα", + "Aucun article": "κανένα άρθρο", + "Aucun commentaire": "Κανένα σχόλιο", + "Auteur": "Συγγραφέας", + "Brouillon": "Σχέδιο", + "Caractères par commentaire": "Χαρακτήρες ανά σχόλιο", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Επιλογή του μέγιστου αριθμού χαρακτήρων για κάθε σχόλιο του άρθρου, συμπεριλαμβανομένης της μορφοποίησης html.", + "Commentaire approuvé": "Σχόλιο εγκεκριμένο", + "Commentaire rejeté": "Σχόλιο απορρίφθηκε", + "Commentaire supprimé": "Σχόλιο διαγράφηκε", + "Commentaires": "Σχόλια", + "Commentaires supprimés": "Σχόλια διαγράφονται", + "Edition - Suppression": "Επεξεργασία - Διαγραφή", + "Effacer l'article": "Διαγραφή αντικειμένου", + "Fermer les commentaires": "Κλείσιμο σχολίων", + "Gestion des commentaires": "Διαχείριση σχολίων", + "Grande": "Μεγάλη", + "Groupe du propriétaire": "Ομάδα ιδιοκτήτη", + "Image de couverture": "εικόνα εξωφύλλου", + "Informations générales": "Γενικές πληροφορίες", + "L'article n'est visible qu'après la date de publication prévue.": "Το άρθρο είναι ορατό μόνο μετά την προγραμματισμένη ημερομηνία δημοσίευσης", + "Largeur": "Πλάτος εικόνας", + "Le texte de l'article est adapté autour de l'image": "Το κείμενο του άρθρου τοποθετείται γύρω από την εικόνα", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Οι χρήστες σε ανώτερες ομάδες έχουν απεριόριστη πρόσβαση στο άρθρο", + "Lien du flux RSS": "Σύνδεσμος τροφοδοσίας RSS", + "Masquer l'image dans l'article": "Απόκρυψη εικόνας στο άρθρο", + "Masquer l'image de couverture dans l'article": "Απόκρυψη της εικόνας εξωφύλλου στο άρθρο", + "Membre": "Μέλος", + "Notification par email": "Ειδοποίηση ηλεκτρονικού ταχυδρομείου", + "Nouvel article créé": "Δημιουργήθηκε νέο άρθρο", + "Options de configuration": "Opções de configuração", + "Options de publication": "Επιλογές δημοσίευσης", + "Permalink": "Μόνιμος σύνδεσμος", + "Petite": "μικρη", + "Pleine largeur": "Πλήρες πλάτος", + "Propriétaire": "Ιδιοκτήτης", + "Publication": "ημερομηνία δημοσίευσης", + "Publier": "δημοσιεύστε το άρθρο", + "Rejeter le commentaire ?": "Απορρίπτετε το σχόλιο;", + "Rejeté": "Απορρίφθηκε", + "Rédiger un article": "Γράψτε ένα άρθρο", + "Supprimer cet article ?": "Να διαγράψετε αυτό το άρθρο;", + "Supprimer le commentaire ?": "Διαγράψτε το σχόλιο;", + "Supprimer tous les commentaires ?": "Να διαγράψετε όλα τα σχόλια;", + "Tableau:couverture + 200 signes": "Πίνακας:εξώφυλλο + 200 χαρακτήρες", + "Tableau:couverture + 400 signes": "Πίνακας:εξώφυλλο + 400 χαρακτήρες", + "Tableau:couverture + 600 signes": "Πίνακας:εξώφυλλο + 600 χαρακτήρες", + "Tableau:couverture + 800 signes": "Πίνακας:εξώφυλλο + 800 χαρακτήρες", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "Βέλτιστο μέγεθος εικόνας εξωφύλλου:920 x 350 pixels", + "Texte de l'étiquette": "Κείμενο ετικέτας", + "Tous les groupes": "Όλες οι ομάδες", + "Tout effacer": "Διαγραφή όλων", + "Très Grande": "Πολύ μεγάλη", + "Très petite": "Πολύ μικρη", + "À droite": "Δεξιά", + "À gauche": "Αριστερά", + "Éditer l'article": "Επεξεργασία άρθρου", + "Éditer/ Approuver les commentaires": "Επεξεργασία / Έγκριση σχολίων", + "Éditeur": "Συντάκτης", + "État": "κατάσταση", + "Lire la suite": "Διαβάστε περισσότερα" +} \ No newline at end of file diff --git a/module/blog/i18n/it.json b/module/blog/i18n/it.json index 4371f451..ff15cec0 100644 --- a/module/blog/i18n/it.json +++ b/module/blog/i18n/it.json @@ -1 +1,80 @@ -{"1 article":"1 articolo","10 articles":"10 articoli","100 signes":"100 segni","12 articles":"12 articoli","2 articles":"2 articoli","250 signes":"250 segni","4 articles":"4 articoli","500 signes":"500 segni","6 articles":"6 articoli","750 signes":"750 segni","8 articles":"8 articoli","Administrateur":"Amministratore","Approbation par un modérateur":"Approvazione da parte di un moderatore","Approuver le commentaire ?":"Approvare il commento?","Approuvé":"Approvato","Article complet en pleine page":"Articolo completo in tutta la pagina","Article supprimé":"Articolo cancellato","Articles par page":"Articoli per pagina","Aucun article":"Nessun articolo","Aucun commentaire":"Nessun commento","Auteur":"Auteur","Brouillon":"Progetto di copia","Caractères par commentaire":"Personaggi per commento","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Scegliere il numero massimo di caratteri per ciascun commento dell'articolo, la formattazione HTML inclusa.","Commentaire approuvé":"Commento approvato","Commentaire rejeté":"Commento respinto","Commentaire supprimé":"Commento cancellato","Commentaires":"Commenti","Commentaires supprimés":"Commenti cancellati","Edition - Suppression":"Edizione - soppressione","Effacer l'article":"Cancella l'articolo","Fermer les commentaires":"Disattiva i commenti","Gestion des commentaires":"Gestione dei commenti","Grande":"Grande","Groupe du propriétaire":"Gruppo del proprietario","Image de couverture":"Copertura","Informations générales":"Informazioni generali","L'article n'est visible qu'après la date de publication prévue.":"L'articolo è visibile solo dopo la data di pubblicazione fornita.","Largeur":"Larghezza dell'immagine","Le texte de l'article est adapté autour de l'image":"Il testo dell'articolo è adattato all'immagine","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Gli utenti di gruppi più alti accedono all'articolo senza restrizioni","Lien du flux RSS":"Lien Du Flux RSS","Masquer l'image dans l'article":"Nascondi l'immagine nell'articolo","Masquer l'image de couverture dans l'article":"Nascondi l'immagine di copertina nell'articolo","Membre":"Membro","Notification par email":"Email di notifica par","Nouvel article créé":"Nuovo articolo creato","Options de configuration":"Opzioni di configurazione","Options de publication":"Opzioni di pubblicazione","Permalink":"Permalink","Petite":"Petite","Pleine largeur":"Intera larghezza","Propriétaire":"Proprietario","Publication":"Pbblicazione","Publier":"Pubblicare","Rejeter le commentaire ?":"Rifiutare il commento?","Rejeté":"Respinto","Rédiger un article":"Scrivi un articolo","Supprimer cet article ?":"Elimina questo articolo?","Supprimer le commentaire ?":"Elimina il commento?","Supprimer tous les commentaires ?":"Elimina tutti i commenti?","Tableau:couverture + 200 signes":"","Tableau:couverture + 400 signes":"","Tableau:couverture + 600 signes":"","Tableau:couverture + 800 signes":"","Taille optimale de l'image de couverture:920 x 350 pixels.":"","Texte de l'étiquette":"Testo dell'etichetta","Tous les groupes":"Tutti i gruppi","Tout effacer":"Cancellare tutto","Très Grande":"Molto alto","Très petite":"Molto piccolo","À droite":"","À gauche":"A sinistra","Éditer l'article":"Modifica l'articolo","Éditer/ Approuver les commentaires":"","Éditeur":"Editore","État":"Stato"} \ No newline at end of file +{ + "1 article": "1 articolo", + "10 articles": "10 articoli", + "100 signes": "100 segni", + "12 articles": "12 articoli", + "2 articles": "2 articoli", + "250 signes": "250 segni", + "4 articles": "4 articoli", + "500 signes": "500 segni", + "6 articles": "6 articoli", + "750 signes": "750 segni", + "8 articles": "8 articoli", + "Administrateur": "Amministratore", + "Approbation par un modérateur": "Approvazione da parte di un moderatore", + "Approuver le commentaire ?": "Approvare il commento?", + "Approuvé": "Approvato", + "Article complet en pleine page": "Articolo completo in tutta la pagina", + "Article supprimé": "Articolo cancellato", + "Articles par page": "Articoli per pagina", + "Aucun article": "Nessun articolo", + "Aucun commentaire": "Nessun commento", + "Auteur": "Auteur", + "Brouillon": "Progetto di copia", + "Caractères par commentaire": "Personaggi per commento", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Scegliere il numero massimo di caratteri per ciascun commento dell'articolo, la formattazione HTML inclusa.", + "Commentaire approuvé": "Commento approvato", + "Commentaire rejeté": "Commento respinto", + "Commentaire supprimé": "Commento cancellato", + "Commentaires": "Commenti", + "Commentaires supprimés": "Commenti cancellati", + "Edition - Suppression": "Edizione - soppressione", + "Effacer l'article": "Cancella l'articolo", + "Fermer les commentaires": "Disattiva i commenti", + "Gestion des commentaires": "Gestione dei commenti", + "Grande": "Grande", + "Groupe du propriétaire": "Gruppo del proprietario", + "Image de couverture": "Copertura", + "Informations générales": "Informazioni generali", + "L'article n'est visible qu'après la date de publication prévue.": "L'articolo è visibile solo dopo la data di pubblicazione fornita.", + "Largeur": "Larghezza dell'immagine", + "Le texte de l'article est adapté autour de l'image": "Il testo dell'articolo è adattato all'immagine", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Gli utenti di gruppi più alti accedono all'articolo senza restrizioni", + "Lien du flux RSS": "Lien Du Flux RSS", + "Masquer l'image dans l'article": "Nascondi l'immagine nell'articolo", + "Masquer l'image de couverture dans l'article": "Nascondi l'immagine di copertina nell'articolo", + "Membre": "Membro", + "Notification par email": "Email di notifica par", + "Nouvel article créé": "Nuovo articolo creato", + "Options de configuration": "Opzioni di configurazione", + "Options de publication": "Opzioni di pubblicazione", + "Permalink": "Permalink", + "Petite": "Petite", + "Pleine largeur": "Intera larghezza", + "Propriétaire": "Proprietario", + "Publication": "Pbblicazione", + "Publier": "Pubblicare", + "Rejeter le commentaire ?": "Rifiutare il commento?", + "Rejeté": "Respinto", + "Rédiger un article": "Scrivi un articolo", + "Supprimer cet article ?": "Elimina questo articolo?", + "Supprimer le commentaire ?": "Elimina il commento?", + "Supprimer tous les commentaires ?": "Elimina tutti i commenti?", + "Tableau:couverture + 200 signes": "", + "Tableau:couverture + 400 signes": "", + "Tableau:couverture + 600 signes": "", + "Tableau:couverture + 800 signes": "", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "", + "Texte de l'étiquette": "Testo dell'etichetta", + "Tous les groupes": "Tutti i gruppi", + "Tout effacer": "Cancellare tutto", + "Très Grande": "Molto alto", + "Très petite": "Molto piccolo", + "À droite": "", + "À gauche": "A sinistra", + "Éditer l'article": "Modifica l'articolo", + "Éditer/ Approuver les commentaires": "", + "Éditeur": "Editore", + "État": "Stato", + "Lire la suite": "Continua a leggere" +} \ No newline at end of file diff --git a/module/blog/i18n/pt_PT.json b/module/blog/i18n/pt_PT.json index dfca7ab1..0f3b31a7 100644 --- a/module/blog/i18n/pt_PT.json +++ b/module/blog/i18n/pt_PT.json @@ -1 +1,80 @@ -{"1 article":"1 artigo","10 articles":"10 artigos","100 signes":"100 sinais","12 articles":"12 artigos","2 articles":"2 artigos","250 signes":"250 sinais","4 articles":"4 artigos","500 signes":"500 sinais","6 articles":"6 artigos","750 signes":"750 sinais","8 articles":"8 artigos","Administrateur":"Administrador","Approbation par un modérateur":"Aprovação por um moderador","Approuver le commentaire ?":"Aprovar o comentário?","Approuvé":"Aprovado","Article complet en pleine page":"Artigo completo na página completa","Article supprimé":"Artigo excluído","Articles par page":"Artigos por página","Aucun article":"Nenhum artigo","Aucun commentaire":"Sem comentários","Auteur":"Autora","Brouillon":"Cópia rascunho","Caractères par commentaire":"Personagens por comentários","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"Escolhendo o número máximo de caracteres para cada comentário do artigo, a formatação HTML incluída.","Commentaire approuvé":"Comentário aprovado","Commentaire rejeté":"Comentário rejeitado","Commentaire supprimé":"Comentário excluído","Commentaires":"Comentários","Commentaires supprimés":"Comentários excluídos","Edition - Suppression":"Edição - Supressão","Effacer l'article":"Apague o artigo","Fermer les commentaires":"Desligue os comentários","Gestion des commentaires":"Gerenciamento de comentários","Grande":"Grande","Groupe du propriétaire":"Grupo do proprietário","Image de couverture":"Cobertura","Informations générales":"Informações gerais","L'article n'est visible qu'après la date de publication prévue.":"O artigo é visível apenas após a data da publicação fornecida.","Largeur":"Largura da imagem","Le texte de l'article est adapté autour de l'image":"O texto do artigo é adaptado em torno da imagem","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Usuários de grupos superiores acessam o artigo sem restrição","Lien du flux RSS":"Lien du Flux RSS","Masquer l'image dans l'article":"Esconder a imagem no artigo","Masquer l'image de couverture dans l'article":"Ocultar a imagem da capa no artigo","Membre":"Membro","Notification par email":"Notificação por e -mail","Nouvel article créé":"Novo artigo criado","Options de configuration":"Opções de configuração","Options de publication":"Opções de publicação","Permalink":"Permalink","Petite":"Petite","Pleine largeur":"Largura completa","Propriétaire":"Proprietário","Publication":"Publicação","Publier":"Publicar","Rejeter le commentaire ?":"Rejeitar o comentário?","Rejeté":"Rejeitado","Rédiger un article":"Escrever um artigo","Supprimer cet article ?":"Excluir este artigo?","Supprimer le commentaire ?":"Excluir o comentário?","Supprimer tous les commentaires ?":"Excluir todos os comentários?","Tableau:couverture + 200 signes":"","Tableau:couverture + 400 signes":"","Tableau:couverture + 600 signes":"","Tableau:couverture + 800 signes":"","Taille optimale de l'image de couverture:920 x 350 pixels.":"","Texte de l'étiquette":"Texto da etiqueta","Tous les groupes":"Todos os grupos","Tout effacer":"Apague tudo","Très Grande":"Muito alto","Très petite":"Muito pequeno","À droite":"","À gauche":"Para a esquerda","Éditer l'article":"Edite o artigo","Éditer/ Approuver les commentaires":"","Éditeur":"Editor","État":"Estado"} \ No newline at end of file +{ + "1 article": "1 artigo", + "10 articles": "10 artigos", + "100 signes": "100 sinais", + "12 articles": "12 artigos", + "2 articles": "2 artigos", + "250 signes": "250 sinais", + "4 articles": "4 artigos", + "500 signes": "500 sinais", + "6 articles": "6 artigos", + "750 signes": "750 sinais", + "8 articles": "8 artigos", + "Administrateur": "Administrador", + "Approbation par un modérateur": "Aprovação por um moderador", + "Approuver le commentaire ?": "Aprovar o comentário?", + "Approuvé": "Aprovado", + "Article complet en pleine page": "Artigo completo na página completa", + "Article supprimé": "Artigo excluído", + "Articles par page": "Artigos por página", + "Aucun article": "Nenhum artigo", + "Aucun commentaire": "Sem comentários", + "Auteur": "Autora", + "Brouillon": "Cópia rascunho", + "Caractères par commentaire": "Personagens por comentários", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "Escolhendo o número máximo de caracteres para cada comentário do artigo, a formatação HTML incluída.", + "Commentaire approuvé": "Comentário aprovado", + "Commentaire rejeté": "Comentário rejeitado", + "Commentaire supprimé": "Comentário excluído", + "Commentaires": "Comentários", + "Commentaires supprimés": "Comentários excluídos", + "Edition - Suppression": "Edição - Supressão", + "Effacer l'article": "Apague o artigo", + "Fermer les commentaires": "Desligue os comentários", + "Gestion des commentaires": "Gerenciamento de comentários", + "Grande": "Grande", + "Groupe du propriétaire": "Grupo do proprietário", + "Image de couverture": "Cobertura", + "Informations générales": "Informações gerais", + "L'article n'est visible qu'après la date de publication prévue.": "O artigo é visível apenas após a data da publicação fornecida.", + "Largeur": "Largura da imagem", + "Le texte de l'article est adapté autour de l'image": "O texto do artigo é adaptado em torno da imagem", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Usuários de grupos superiores acessam o artigo sem restrição", + "Lien du flux RSS": "Lien du Flux RSS", + "Masquer l'image dans l'article": "Esconder a imagem no artigo", + "Masquer l'image de couverture dans l'article": "Ocultar a imagem da capa no artigo", + "Membre": "Membro", + "Notification par email": "Notificação por e -mail", + "Nouvel article créé": "Novo artigo criado", + "Options de configuration": "Opções de configuração", + "Options de publication": "Opções de publicação", + "Permalink": "Permalink", + "Petite": "Petite", + "Pleine largeur": "Largura completa", + "Propriétaire": "Proprietário", + "Publication": "Publicação", + "Publier": "Publicar", + "Rejeter le commentaire ?": "Rejeitar o comentário?", + "Rejeté": "Rejeitado", + "Rédiger un article": "Escrever um artigo", + "Supprimer cet article ?": "Excluir este artigo?", + "Supprimer le commentaire ?": "Excluir o comentário?", + "Supprimer tous les commentaires ?": "Excluir todos os comentários?", + "Tableau:couverture + 200 signes": "", + "Tableau:couverture + 400 signes": "", + "Tableau:couverture + 600 signes": "", + "Tableau:couverture + 800 signes": "", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "", + "Texte de l'étiquette": "Texto da etiqueta", + "Tous les groupes": "Todos os grupos", + "Tout effacer": "Apague tudo", + "Très Grande": "Muito alto", + "Très petite": "Muito pequeno", + "À droite": "", + "À gauche": "Para a esquerda", + "Éditer l'article": "Edite o artigo", + "Éditer/ Approuver les commentaires": "", + "Éditeur": "Editor", + "État": "Estado", + "Lire la suite": "Leia mais" +} \ No newline at end of file diff --git a/module/blog/i18n/tr_TR.json b/module/blog/i18n/tr_TR.json index 03cfbe93..361e173d 100644 --- a/module/blog/i18n/tr_TR.json +++ b/module/blog/i18n/tr_TR.json @@ -1 +1,80 @@ -{"1 article":"1 makale","10 articles":"10 makale","100 signes":"100 karakter","12 articles":"12 makale","2 articles":"2 makale","250 signes":"250 karakter","4 articles":"4 makale","500 signes":"500 karakter","6 articles":"6 makale","750 signes":"750 karakter","8 articles":"8 makale","Administrateur":"Yönetici","Approbation par un modérateur":"Moderatör onayı","Approuver le commentaire ?":"Yorum onaylansın mı?","Approuvé":"Onaylandı","Article complet en pleine page":"Tam sayfa tam makale","Article supprimé":"Silinen makale","Articles par page":"Sayfa başına makale","Aucun article":"Makale yok","Aucun commentaire":"Yorum yok","Auteur":"Yazar","Brouillon":"Karalama","Caractères par commentaire":"Yorum başına karakter","Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.":"HTML biçimlendirmesi dahil olmak üzere, makalenin her yorumu için maksimum karakter sayısı seçimi.","Commentaire approuvé":"Onaylanan yorum","Commentaire rejeté":"Reddedilen yorum","Commentaire supprimé":"Silinen yorum","Commentaires":"Yorumlar","Commentaires supprimés":"Silinen yorumlar","Edition - Suppression":"Düzenle - Sil","Effacer l'article":"Makaleyi sil","Fermer les commentaires":"Yorumları kapat","Gestion des commentaires":"Yorum yönetimi","Grande":"Büyük","Groupe du propriétaire":"Sahip grubu","Image de couverture":"Kapak resmi","Informations générales":"Genel bilgiler","L'article n'est visible qu'après la date de publication prévue.":"Makale yalnızca planlanan yayın tarihinden sonra görülebilir.","Largeur":"Resim genişliği","Le texte de l'article est adapté autour de l'image":"Makalenin metni resmin etrafıni çevreler","Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction":"Üst gruplardaki kullanıcılar makaleye kısıtlama olmadan erişebilir","Lien du flux RSS":"RSS dağıtım bağlantısı","Masquer l'image dans l'article":"Makalede resmi gizle","Masquer l'image de couverture dans l'article":"Makalede kapak resmini gizle","Membre":"Üye","Notification par email":"Eposta bildirimi","Nouvel article créé":"Yeni makale oluşturuldu","Options de configuration":"Yapılandırma seçenekleri","Options de publication":"Yayınlama seçenekleri","Permalink":"Kalıcı bağlantı","Petite":"Küçük","Pleine largeur":"Tam genişlik","Propriétaire":"Mal sahibi","Publication":"Yayın","Publier":"Yayınla","Rejeter le commentaire ?":"Yorum reddedilsin mi?","Rejeté":"Reddedildi","Rédiger un article":"Bir makale yaz","Supprimer cet article ?":"Bu makale silinsin mi?","Supprimer le commentaire ?":"Yorum silinsin mi?","Supprimer tous les commentaires ?":"","Tableau:couverture + 200 signes":"","Tableau:couverture + 400 signes":"","Tableau:couverture + 600 signes":"","Tableau:couverture + 800 signes":"","Taille optimale de l'image de couverture:920 x 350 pixels.":"","Texte de l'étiquette":"Etiket metni","Tous les groupes":"Tüm gruplar","Tout effacer":"Her şeyi sil","Très Grande":"Çok büyük","Très petite":"Çok küçük","À droite":"","À gauche":"Sola","Éditer l'article":"Makaleyi düzenle","Éditer/ Approuver les commentaires":"","Éditeur":"Düzenleyici","État":"Durum"} \ No newline at end of file +{ + "1 article": "1 makale", + "10 articles": "10 makale", + "100 signes": "100 karakter", + "12 articles": "12 makale", + "2 articles": "2 makale", + "250 signes": "250 karakter", + "4 articles": "4 makale", + "500 signes": "500 karakter", + "6 articles": "6 makale", + "750 signes": "750 karakter", + "8 articles": "8 makale", + "Administrateur": "Yönetici", + "Approbation par un modérateur": "Moderatör onayı", + "Approuver le commentaire ?": "Yorum onaylansın mı?", + "Approuvé": "Onaylandı", + "Article complet en pleine page": "Tam sayfa tam makale", + "Article supprimé": "Silinen makale", + "Articles par page": "Sayfa başına makale", + "Aucun article": "Makale yok", + "Aucun commentaire": "Yorum yok", + "Auteur": "Yazar", + "Brouillon": "Karalama", + "Caractères par commentaire": "Yorum başına karakter", + "Choix du nombre maximum de caractères pour chaque commentaire de l'article, mise en forme html comprise.": "HTML biçimlendirmesi dahil olmak üzere, makalenin her yorumu için maksimum karakter sayısı seçimi.", + "Commentaire approuvé": "Onaylanan yorum", + "Commentaire rejeté": "Reddedilen yorum", + "Commentaire supprimé": "Silinen yorum", + "Commentaires": "Yorumlar", + "Commentaires supprimés": "Silinen yorumlar", + "Edition - Suppression": "Düzenle - Sil", + "Effacer l'article": "Makaleyi sil", + "Fermer les commentaires": "Yorumları kapat", + "Gestion des commentaires": "Yorum yönetimi", + "Grande": "Büyük", + "Groupe du propriétaire": "Sahip grubu", + "Image de couverture": "Kapak resmi", + "Informations générales": "Genel bilgiler", + "L'article n'est visible qu'après la date de publication prévue.": "Makale yalnızca planlanan yayın tarihinden sonra görülebilir.", + "Largeur": "Resim genişliği", + "Le texte de l'article est adapté autour de l'image": "Makalenin metni resmin etrafıni çevreler", + "Les utilisateurs des groupes supérieurs accèdent à l'article sans restriction": "Üst gruplardaki kullanıcılar makaleye kısıtlama olmadan erişebilir", + "Lien du flux RSS": "RSS dağıtım bağlantısı", + "Masquer l'image dans l'article": "Makalede resmi gizle", + "Masquer l'image de couverture dans l'article": "Makalede kapak resmini gizle", + "Membre": "Üye", + "Notification par email": "Eposta bildirimi", + "Nouvel article créé": "Yeni makale oluşturuldu", + "Options de configuration": "Yapılandırma seçenekleri", + "Options de publication": "Yayınlama seçenekleri", + "Permalink": "Kalıcı bağlantı", + "Petite": "Küçük", + "Pleine largeur": "Tam genişlik", + "Propriétaire": "Mal sahibi", + "Publication": "Yayın", + "Publier": "Yayınla", + "Rejeter le commentaire ?": "Yorum reddedilsin mi?", + "Rejeté": "Reddedildi", + "Rédiger un article": "Bir makale yaz", + "Supprimer cet article ?": "Bu makale silinsin mi?", + "Supprimer le commentaire ?": "Yorum silinsin mi?", + "Supprimer tous les commentaires ?": "", + "Tableau:couverture + 200 signes": "", + "Tableau:couverture + 400 signes": "", + "Tableau:couverture + 600 signes": "", + "Tableau:couverture + 800 signes": "", + "Taille optimale de l'image de couverture:920 x 350 pixels.": "", + "Texte de l'étiquette": "Etiket metni", + "Tous les groupes": "Tüm gruplar", + "Tout effacer": "Her şeyi sil", + "Très Grande": "Çok büyük", + "Très petite": "Çok küçük", + "À droite": "", + "À gauche": "Sola", + "Éditer l'article": "Makaleyi düzenle", + "Éditer/ Approuver les commentaires": "", + "Éditeur": "Düzenleyici", + "État": "Durum", + "Lire la suite": "Devamını oku" +} \ No newline at end of file diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php index 913bfb7a..0b8b7ad1 100755 --- a/module/blog/view/index/index.php +++ b/module/blog/view/index/index.php @@ -151,7 +151,7 @@ From 85de8080441c82bc8c4ec8d98fda3e01baceb188 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Fri, 24 Mar 2023 16:56:04 +0100 Subject: [PATCH 07/16] Blog 6.6 layout --- module/blog/blog.php | 25 +++-- module/blog/i18n/de.json | 15 ++- module/blog/i18n/en_EN.json | 15 ++- module/blog/i18n/es.json | 15 ++- module/blog/i18n/fr_FR.json | 16 ++- module/blog/i18n/gr_GR.json | 15 ++- module/blog/i18n/it.json | 15 ++- module/blog/i18n/pt_PT.json | 15 ++- module/blog/i18n/tr_TR.json | 15 ++- module/blog/view/add/add.php | 2 +- module/blog/view/edit/edit.php | 2 +- module/blog/view/index/index.css | 79 +++++++++----- module/blog/view/index/index.php | 169 +++++++++++++++-------------- module/blog/view/option/option.php | 115 +++++++++++--------- 14 files changed, 307 insertions(+), 206 deletions(-) diff --git a/module/blog/blog.php b/module/blog/blog.php index 2288a184..c7f90116 100755 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -89,7 +89,7 @@ class blog extends common ]; //Paramètre longueur maximale des commentaires en nb de caractères - public static $commentLength = [ + public static $commentsLength = [ 100 => '100 signes', 250 => '250 signes', 500 => '500 signes', @@ -97,11 +97,19 @@ class blog extends common ]; public static $articlesLenght = [ - 0 => 'Article complet en pleine page', - 200 => 'Tableau : couverture + 200 signes', - 400 => 'Tableau : couverture + 400 signes', - 600 => 'Tableau : couverture + 600 signes', - 800 => 'Tableau : couverture + 800 signes' + 0 => 'Articles complets', + 600 => '600 signes', + 800 => '800 signes', + 1000 => '1000 signes', + 1200 => '1200 signes', + 1400 => '1400 signes', + 1600 => '1600 signes', + 1800 => '1800 signes', + ]; + + public static $articlesLayout = [ + false => 'Classique', + true => 'Moderne', ]; // Permissions d'un article @@ -556,11 +564,12 @@ class blog extends common [ 'feeds' => $this->getInput('blogOptionShowFeeds', helper::FILTER_BOOLEAN), 'feedsLabel' => $this->getInput('blogOptionFeedslabel', helper::FILTER_STRING_SHORT), + 'layout' => $this->getInput('blogOptionArticlesLayout', helper::FILTER_BOOLEAN), + 'articlesLenght' => $this->getInput('blogOptionArticlesLayout', helper::FILTER_BOOLEAN) === false ? $this->getInput('blogOptionArticlesLenght', helper::FILTER_INT): 0, 'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT, true), - 'articlesLenght' => $this->getInput('blogOptionArticlesLenght', helper::FILTER_INT), - 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']), 'dateFormat' => $this->getInput('blogOptionDateFormat'), 'timeFormat' => $this->getInput('blogOptionTimeFormat'), + 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']), ] ]); // Valeurs en sortie diff --git a/module/blog/i18n/de.json b/module/blog/i18n/de.json index ef9d99fd..49e5e453 100644 --- a/module/blog/i18n/de.json +++ b/module/blog/i18n/de.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "Diesen Artikel löschen?", "Supprimer le commentaire ?": "Den Kommentar löschen?", "Supprimer tous les commentaires ?": "Alle Kommentare löschen?", - "Tableau:couverture + 200 signes": "Tabelle:Cover + 200 Zeichen", - "Tableau:couverture + 400 signes": "Tabelle:Abdeckung + 400 Zeichen", - "Tableau:couverture + 600 signes": "Tabelle:Abdeckung + 600 Zeichen", - "Tableau:couverture + 800 signes": "Tabelle:Abdeckung + 800 Zeichen", + "200 signes": "200 Zeichen", + "400 signes": "400 Zeichen", + "600 signes": "600 Zeichen", + "1000 signes": "1000 Zeichen", + "1200 signes": "1200 Zeichen", + "1400 signes": "1400 Zeichen", + "1600 signes": "1600 Zeichen", + "1800 signes": "1800 Zeichen", + "Classique": "Klassisch", + "Moderne": "Modern", + "Disposition": "Anordnung", "Taille optimale de l'image de couverture:920 x 350 pixels.": "Optimale Größe des Titelbildes:920 x 350 Pixel.", "Texte de l'étiquette": "Beschriftungstext", "Tous les groupes": "Alle Gruppen", diff --git a/module/blog/i18n/en_EN.json b/module/blog/i18n/en_EN.json index be409c19..189358a2 100644 --- a/module/blog/i18n/en_EN.json +++ b/module/blog/i18n/en_EN.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "Delete this article?", "Supprimer le commentaire ?": "Delete the comment?", "Supprimer tous les commentaires ?": "Delete all comments?", - "Tableau:couverture + 200 signes": "Table:cover + 200 signs", - "Tableau:couverture + 400 signes": "Table:cover + 400 signs", - "Tableau:couverture + 600 signes": "Table:cover + 600 signs", - "Tableau:couverture + 800 signes": "Table:cover + 800 signs", + "200 signes": "200 characters", + "400 signes": "400 characters", + "600 signes": "600 characters", + "1000 signes": "1000 characters", + "1200 signes": "1200 characters", + "1400 signes": "1400 characters", + "1600 signes": "1600 characters", + "1800 signes": "1800 characters", + "Classique": "Classic", + "Moderne": "Modern", + "Disposition": "Layout", "Taille optimale de l'image de couverture:920 x 350 pixels.": "Optimal size of the cover image:920 x 350 pixels.", "Texte de l'étiquette": "Label text", "Tous les groupes": "All groups", diff --git a/module/blog/i18n/es.json b/module/blog/i18n/es.json index 319731b7..35444cf5 100644 --- a/module/blog/i18n/es.json +++ b/module/blog/i18n/es.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "¿Borrar este artículo?", "Supprimer le commentaire ?": "¿Borrar el comentario?", "Supprimer tous les commentaires ?": "¿Borrar todos los comentarios?", - "Tableau:couverture + 200 signes": "Tabla:portada + 200 caracteres", - "Tableau:couverture + 400 signes": "Tabla:portada + 400 caracteres", - "Tableau:couverture + 600 signes": "Tabla:portada + 600 caracteres", - "Tableau:couverture + 800 signes": "Tabla:portada + 800 caracteres", + "200 signes": "200 caracteres", + "400 signes": "400 caracteres", + "600 signes": "600 caracteres", + "1000 signes": "1000 caracteres", + "1200 signes": "1200 caracteres", + "1400 signes": "1400 caracteres", + "1600 signes": "1600 caracteres", + "1800 signes": "1800 caracteres", + "Classique": "Clásico", + "Moderne": "Moderno", + "Disposition": "Distribución", "Taille optimale de l'image de couverture:920 x 350 pixels.": "Tamaño de imagen de portada óptimo:920 x 350 píxeles.", "Texte de l'étiquette": "Texto de la etiqueta", "Tous les groupes": "Todos los grupos", diff --git a/module/blog/i18n/fr_FR.json b/module/blog/i18n/fr_FR.json index fa974929..5f2d4125 100644 --- a/module/blog/i18n/fr_FR.json +++ b/module/blog/i18n/fr_FR.json @@ -60,10 +60,18 @@ "Supprimer cet article ?": "", "Supprimer le commentaire ?": "", "Supprimer tous les commentaires ?": "", - "Tableau:couverture + 200 signes": "", - "Tableau:couverture + 400 signes": "", - "Tableau:couverture + 600 signes": "", - "Tableau:couverture + 800 signes": "", + "200 signes": "", + "400 signes": "", + "600 signes": "", + "1000 signes": "", + "1200 signes": "", + "1400 signes": "", + "1600 signes": "", + "1800 signes": "", + "Classique": "", + "Moderne": "", + "Disposition": "", + "Aperçus": "", "Taille optimale de l'image de couverture:920 x 350 pixels.": "", "Texte de l'étiquette": "", "Tous les groupes": "", diff --git a/module/blog/i18n/gr_GR.json b/module/blog/i18n/gr_GR.json index 4a69df4f..f8d77bb5 100644 --- a/module/blog/i18n/gr_GR.json +++ b/module/blog/i18n/gr_GR.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "Να διαγράψετε αυτό το άρθρο;", "Supprimer le commentaire ?": "Διαγράψτε το σχόλιο;", "Supprimer tous les commentaires ?": "Να διαγράψετε όλα τα σχόλια;", - "Tableau:couverture + 200 signes": "Πίνακας:εξώφυλλο + 200 χαρακτήρες", - "Tableau:couverture + 400 signes": "Πίνακας:εξώφυλλο + 400 χαρακτήρες", - "Tableau:couverture + 600 signes": "Πίνακας:εξώφυλλο + 600 χαρακτήρες", - "Tableau:couverture + 800 signes": "Πίνακας:εξώφυλλο + 800 χαρακτήρες", + "200 signes": "200 χαρακτήρες", + "400 signes": "400 χαρακτήρες", + "600 signes": "600 χαρακτήρες", + "1000 signes": "1000 χαρακτήρες", + "1200 signes": "1200 χαρακτήρες", + "1400 signes": "1400 χαρακτήρες", + "1600 signes": "1600 χαρακτήρες", + "1800 signes": "1800 χαρακτήρες", + "Classique": "Κλασικό", + "Moderne": "Μοντέρνο", + "Disposition": "Διάταξη", "Taille optimale de l'image de couverture:920 x 350 pixels.": "Βέλτιστο μέγεθος εικόνας εξωφύλλου:920 x 350 pixels", "Texte de l'étiquette": "Κείμενο ετικέτας", "Tous les groupes": "Όλες οι ομάδες", diff --git a/module/blog/i18n/it.json b/module/blog/i18n/it.json index ff15cec0..1389d0a6 100644 --- a/module/blog/i18n/it.json +++ b/module/blog/i18n/it.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "Elimina questo articolo?", "Supprimer le commentaire ?": "Elimina il commento?", "Supprimer tous les commentaires ?": "Elimina tutti i commenti?", - "Tableau:couverture + 200 signes": "", - "Tableau:couverture + 400 signes": "", - "Tableau:couverture + 600 signes": "", - "Tableau:couverture + 800 signes": "", + "200 signes": "200 caratteri", + "400 signes": "400 caratteri", + "600 signes": "600 caratteri", + "1000 signes": "1000 caratteri", + "1200 signes": "1200 caratteri", + "1400 signes": "1400 caratteri", + "1600 signes": "1600 caratteri", + "1800 signes": "1800 caratteri", + "Classique": "Classico", + "Moderne": "Moderno", + "Disposition": "Layout", "Taille optimale de l'image de couverture:920 x 350 pixels.": "", "Texte de l'étiquette": "Testo dell'etichetta", "Tous les groupes": "Tutti i gruppi", diff --git a/module/blog/i18n/pt_PT.json b/module/blog/i18n/pt_PT.json index 0f3b31a7..5a2641af 100644 --- a/module/blog/i18n/pt_PT.json +++ b/module/blog/i18n/pt_PT.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "Excluir este artigo?", "Supprimer le commentaire ?": "Excluir o comentário?", "Supprimer tous les commentaires ?": "Excluir todos os comentários?", - "Tableau:couverture + 200 signes": "", - "Tableau:couverture + 400 signes": "", - "Tableau:couverture + 600 signes": "", - "Tableau:couverture + 800 signes": "", + "200 signes": "200 caracteres", + "400 signes": "400 caracteres", + "600 signes": "600 caracteres", + "1000 signes": "1000 caracteres", + "1200 signes": "1200 caracteres", + "1400 signes": "1400 caracteres", + "1600 signes": "1600 caracteres", + "1800 signes": "1800 caracteres", + "Classique": "Clássico", + "Moderne": "Moderno", + "Disposition": "Disposição", "Taille optimale de l'image de couverture:920 x 350 pixels.": "", "Texte de l'étiquette": "Texto da etiqueta", "Tous les groupes": "Todos os grupos", diff --git a/module/blog/i18n/tr_TR.json b/module/blog/i18n/tr_TR.json index 361e173d..8f5dd6cc 100644 --- a/module/blog/i18n/tr_TR.json +++ b/module/blog/i18n/tr_TR.json @@ -60,10 +60,17 @@ "Supprimer cet article ?": "Bu makale silinsin mi?", "Supprimer le commentaire ?": "Yorum silinsin mi?", "Supprimer tous les commentaires ?": "", - "Tableau:couverture + 200 signes": "", - "Tableau:couverture + 400 signes": "", - "Tableau:couverture + 600 signes": "", - "Tableau:couverture + 800 signes": "", + "200 signes": "200 karakter", + "400 signes": "400 karakter", + "600 signes": "600 karakter", + "1000 signes": "1000 karakter", + "1200 signes": "1200 karakter", + "1400 signes": "1400 karakter", + "1600 signes": "1600 karakter", + "1800 signes": "1800 karakter", + "Classique": "Klasik", + "Moderne": "Modern", + "Disposition": "Düzenleme", "Taille optimale de l'image de couverture:920 x 350 pixels.": "", "Texte de l'étiquette": "Etiket metni", "Tous les groupes": "Tüm gruplar", diff --git a/module/blog/view/add/add.php b/module/blog/view/add/add.php index e099ee20..d2de652f 100755 --- a/module/blog/view/add/add.php +++ b/module/blog/view/add/add.php @@ -117,7 +117,7 @@
- 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.', 'label' => 'Caractères par commentaire' ]); ?> diff --git a/module/blog/view/edit/edit.php b/module/blog/view/edit/edit.php index 4c6be948..41f3c7a7 100755 --- a/module/blog/view/edit/edit.php +++ b/module/blog/view/edit/edit.php @@ -127,7 +127,7 @@ ]); ?>
- 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.', 'label' => 'Caractères par commentaire', 'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentMaxlength']) diff --git a/module/blog/view/index/index.css b/module/blog/view/index/index.css index cd1f14d7..b0a94504 100755 --- a/module/blog/view/index/index.css +++ b/module/blog/view/index/index.css @@ -1,10 +1,12 @@ .rowArticle { margin-bottom: 10px !important; } + .blogPicture { float: none; border: 1px; } + .blogPicture img { width: 100%; height: auto; @@ -18,77 +20,91 @@ margin-top: 0; margin-bottom: 5px; } + .blogArticlePicture { height: auto; - border:1px solid lightgray; + border: 1px solid lightgray; box-shadow: 1px 1px 5px; } + .blogArticlePictureleft { float: left; - margin: 15px 10px 5px 0 ; + margin: 15px 10px 5px 0; } + .blogArticlePictureright { float: right; - margin: 15px 0 5px 10px ; + margin: 15px 0 5px 10px; } .blogPicture:hover { opacity: .7; } + .row:after { content: " "; display: table; clear: both; } + .blogComment { padding-right: 10px; float: right; } + .blogTitle { /*background-color: #ECEFF1;*/ padding: 0px; margin-bottom: 5px; } + .blogContent { position: relative; float: left; margin-top: 5px; } -.blogDate, .blogEdit { - font-size:0.8em; + +.blogDate, +.blogEdit { + font-size: 0.8em; font-style: italic; /* color: grey; */ } + @media (max-width: 768px) { .blogContent { display: none; } - + .blogPicture img { - width: 50% ; + width: 50%; display: block; margin-left: auto; margin-right: auto; } } -.pict20{ +.pict20 { width: 20%; } -.pict30{ + +.pict30 { width: 30%; } -.pict40{ + +.pict40 { width: 40%; } -.pict50{ + +.pict50 { width: 50%; } -.pict100{ + +.pict100 { width: 100%; - margin: 15px 0 20px 0 ; + margin: 15px 0 20px 0; } @@ -96,35 +112,42 @@ * Flux RSS */ #rssFeed { - text-align: right; -} -#rssFeed p { - display: inline; - vertical-align: top; + text-align: right; } -.rowArticle { +#rssFeed p { + display: inline; + vertical-align: top; +} + +.rowArticle, +article { position: relative; /* Autres styles pour les articles coupés */ - } +} -.readMoreContainer { +.readMoreContainer { position: absolute; +} + +.readMoreContainer, +.readMoreModernContainer { bottom: 0px; width: 100%; height: 45%; - background: linear-gradient(180deg,hsla(0,0%,100%,0) 0,#f6f6f6 100%,#f6f6f6); + background: linear-gradient(180deg, hsla(0, 0%, 100%, 0) 0, #f6f6f6 100%, #f6f6f6); } - + + .readMoreButton { position: absolute; width: 20%; bottom: 0px; - left: 0; - right: 0; - margin-left: auto; + left: 0; + right: 0; + margin-left: auto; margin-right: auto; z-index: 99; - background: linear-gradient(180deg,hsla(0,0%,100%,0) 0,#f6f6f6 100%,#f6f6f6); + background: linear-gradient(180deg, hsla(0, 0%, 100%, 0) 0, #f6f6f6 100%, #f6f6f6); /* Autres styles pour le bouton */ - } +} \ No newline at end of file diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php index 0b8b7ad1..3c5f8177 100755 --- a/module/blog/view/index/index.php +++ b/module/blog/view/index/index.php @@ -11,93 +11,95 @@
$article): ?> - getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) === 0): ?> -
-
-

- - - -

+ getData(['module', $this->getUrl(0), 'config', 'layout']) === true): ?> +
+
+
+

+ + + +

+
-
-
-
- - - signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> - - getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> +
+
+ + + signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> + + getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])) . ' - ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn'])); ?> +
-
-
-
- getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) && - file_exists(self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])) - ): ?> - getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']); ?> - getData(['module', $this->getUrl(0), 'posts', $articleId, 'hidePicture']) == false) { - echo '' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) . ''; - } ?> - - getData(['module', $this->getUrl(0), 'posts', $articleId, 'content']); ?> +
+
+ getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) && + file_exists(self::FILE_DIR . 'source/' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])) + ): ?> + getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'pictureSize']); ?> + getData(['module', $this->getUrl(0), 'posts', $articleId, 'hidePicture']) == false) { + echo '' . $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']) . ''; + } ?> + + getData(['module', $this->getUrl(0), 'posts', $articleId, 'content']); ?> +
-
-
-
- - +
+ + getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - and - ( // Propriétaire - ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_OWNER - and ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']) === $this->getUser('id') - or $this->getUser('group') === self::GROUP_ADMIN) + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + and + ( // Propriétaire + ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_OWNER + and ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']) === $this->getUser('id') + or $this->getUser('group') === self::GROUP_ADMIN) + ) + or ( + // Groupe + ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_ADMIN + or $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_MODERATOR) + and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) + ) + or ( + // Tout le monde + $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_ALL + and $this->getUser('group') >= $module::$actions['config'] + ) ) - or ( - // Groupe - ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_ADMIN - or $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_MODERATOR) - and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) - ) - or ( - // Tout le monde - $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_ALL - and $this->getUser('group') >= $module::$actions['config'] - ) - ) - ): ?> - - Éditer - - -
-
- getData(['module', $this->getUrl(0), 'posts', $articleId, 'commentClose'])): ?> -

Cet article ne reçoit pas de commentaire.

- -

- 'right']); ?> - 0) { - echo ''; - echo $module::$comments[$articleId] . ' commentaire' . ($module::$comments[$articleId] > 1 ? 's' : ''); - echo ''; - } else { - echo 'Pas encore de commentaire'; - } - ?> -

- + ): ?> + + Éditer + + +
+
+ getData(['module', $this->getUrl(0), 'posts', $articleId, 'commentClose'])): ?> +

Cet article ne reçoit pas de commentaire.

+ +

+ 'right']); ?> + 0) { + echo ''; + echo $module::$comments[$articleId] . ' commentaire' . ($module::$comments[$articleId] > 1 ? 's' : ''); + echo ''; + } else { + echo 'Pas encore de commentaire'; + } + ?> +

+ +
-
+
getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>

'), 0, $lenght); ?>...

-
diff --git a/module/blog/view/option/option.php b/module/blog/view/option/option.php index 5aa1c6d4..a761e381 100755 --- a/module/blog/view/option/option.php +++ b/module/blog/view/option/option.php @@ -1,64 +1,71 @@ -
-
- 'buttonGrey', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'value' => template::ico('left') - ]); ?> -
-
- -
+
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'value' => template::ico('left') + ]); ?>
-
-
-
-

-
-
- 'Disposition', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) - ]); ?> -
-
- 'Articles par page', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) - ]); ?> -
-
- 'Format des dates', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat']) - ]); ?> -
-
- 'Format des heures', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat']) - ]); ?> -
+
+ +
+
+
+
+
+

+ +

+
+
+ 'Disposition', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'layout']) + ]); ?>
-
-
- $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), - ]); ?> -
-
- 'Texte de l\'étiquette', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) - ]); ?> -
+
+ 'Aperçus', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) + ]); ?> +
+
+ 'Articles par page', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) + ]); ?> +
+
+ 'Format des dates', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat']) + ]); ?> +
+
+ 'Format des heures', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat']) + ]); ?> +
+
+
+
+ $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), + ]); ?> +
+
+ 'Texte de l\'étiquette', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) + ]); ?>
+
Version n° -
- +
\ No newline at end of file From 471d28e4fe90e7dee255200b033f156daac81a04 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 25 Mar 2023 09:57:45 +0100 Subject: [PATCH 08/16] Mail UTF-8 en majuscules --- core/layout/mail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/layout/mail.php b/core/layout/mail.php index b4b31b43..4b6bc10c 100644 --- a/core/layout/mail.php +++ b/core/layout/mail.php @@ -1,7 +1,7 @@ - + From 74684864f03746aa0bc73b9154752f7842df92f9 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 25 Mar 2023 18:24:16 +0100 Subject: [PATCH 09/16] =?UTF-8?q?form=203.8=20entit=C3=A9=20HTMl=20non=20d?= =?UTF-8?q?=C3=A9cod=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 9 +- module/form/changes.md | 16 ++-- module/form/form.php | 199 +++++++++++++++++++++-------------------- 3 files changed, 117 insertions(+), 107 deletions(-) diff --git a/core/core.php b/core/core.php index 62d3926e..cb3553a9 100644 --- a/core/core.php +++ b/core/core.php @@ -853,7 +853,7 @@ class common // Boucler sur les enfants et récupérer le tableau children avec la liste des enfants foreach ($childIds as $childId) { $children[] = [ - 'title' => ' » ' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES), + 'title' => ' » ' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES), 'value' => $rewrite . $childId ]; } @@ -897,7 +897,7 @@ class common // Enregistrement : 3 tentatives for ($i = 0; $i < 3; $i++) { - if (file_put_contents('core/vendor/tinymce/link_list.json', json_encode($parents), LOCK_EX) !== false) { + if (file_put_contents('core/vendor/tinymce/link_list.json', json_encode($parents, JSON_UNESCAPED_UNICODE), LOCK_EX) !== false) { break; } // Pause de 10 millisecondes @@ -1108,8 +1108,9 @@ class common include 'core/layout/mail.php'; $layout = ob_get_clean(); $mail = new PHPMailer\PHPMailer\PHPMailer; - $mail->CharSet = 'UTF-8'; $mail->setLanguage(substr(self::$i18nUI, 0, 2), 'core/class/phpmailer/i18n/'); + $mail->CharSet = 'UTF-8'; + $mail->Encoding = 'base64'; // Mail try { // Paramètres SMTP perso @@ -1152,7 +1153,7 @@ class common $mail->addAddress($to); } $mail->isHTML(true); - $mail->Subject = $subject; + $mail->Subject = html_entity_decode($subject); $mail->Body = $layout; $mail->AltBody = strip_tags($content); if ($mail->send()) { diff --git a/module/form/changes.md b/module/form/changes.md index 1ca82afc..84e094cc 100644 --- a/module/form/changes.md +++ b/module/form/changes.md @@ -1,17 +1,19 @@ +# Version 3.8 +- Encode UTF-8 de l'objet du message, et des noms des champs. # Version 3.7 -- Modification liées à la suppression de flatpickr +- Modification liées à la suppression de flatpickr. # Version 3.6 -- Appel de fonction incorrect +- Appel de fonction incorrect. # Version 3.5 - Multilingue # Version 3.4 - Bug de présentation, une div en trop. # Version 3.3 -- Multilinguisme +- Multilinguisme. # Version 3.2 -- Bug variable non initialisée +- Bug variable non initialisée. # Version 3.1 -- Initialisation des paramètres personnalisés +- Initialisation des paramètres personnalisés. # Version 3 -- Déplacement des options de formulaires -- Gabarit du formulaire sur la page +- Déplacement des options de formulaires. +- Gabarit du formulaire sur la page. diff --git a/module/form/form.php b/module/form/form.php index 0a061c8a..a5e019ff 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -14,23 +14,24 @@ * @link http://zwiicms.fr/ */ -class form extends common { +class form extends common +{ - const VERSION = '3.7'; + const VERSION = '3.8'; const REALNAME = 'Formulaire'; const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json) public static $actions = [ 'config' => self::GROUP_MODERATOR, - 'option' => self::GROUP_MODERATOR, + 'option' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'deleteall' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, 'export2csv' => self::GROUP_MODERATOR, 'output2csv' => self::GROUP_MODERATOR, - 'init' => self::GROUP_MODERATOR, - 'update' => self::GROUP_MODERATOR, + 'init' => self::GROUP_MODERATOR, + 'update' => self::GROUP_MODERATOR, ]; public static $data = []; @@ -80,32 +81,33 @@ class form extends common { ]; public static $optionOffset = [ - 0 => 'Aucune', - 1 => 'Une colonne', - 2 => 'Deux colonnes' + 0 => 'Aucune', + 1 => 'Une colonne', + 2 => 'Deux colonnes' ]; public static $optionWidth = [ - 6 => 'Six colonnes', - 7 => 'Sept colonnes', - 8 => 'Huit colonnes', - 9 => 'Neuf colonnes', - 10 => 'Dix colonnes', - 11 => 'Onze colonnes', - 12 => 'Douze colonnes', + 6 => 'Six colonnes', + 7 => 'Sept colonnes', + 8 => 'Huit colonnes', + 9 => 'Neuf colonnes', + 10 => 'Dix colonnes', + 11 => 'Onze colonnes', + 12 => 'Douze colonnes', ]; public static $optionAlign = [ - '' => 'A gauche', - 'textAlignCenter' => 'Au centre', - 'textAlignRight' => 'A droite' + '' => 'A gauche', + 'textAlignCenter' => 'Au centre', + 'textAlignRight' => 'A droite' ]; /** * Configuration */ - public function config() { + public function config() + { // Mise à jour des données de module $this->update(); @@ -113,21 +115,21 @@ class form extends common { // Liste des utilisateurs $userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname'); ksort($userIdsFirstnames); - self::$listUsers [] = ''; - foreach($userIdsFirstnames as $userId => $userFirstname) { - self::$listUsers [] = $userId; + self::$listUsers[] = ''; + foreach ($userIdsFirstnames as $userId => $userFirstname) { + self::$listUsers[] = $userId; } // Soumission du formulaire - if($this->isPost()) { + if ($this->isPost()) { // Génération des données vides if ($this->getData(['module', $this->getUrl(0), 'data']) === null) { $this->setData(['module', $this->getUrl(0), 'data', []]); } // Génération des champs $inputs = []; - foreach($this->getInput('formConfigPosition', null) as $index => $position) { + foreach ($this->getInput('formConfigPosition', null) as $index => $position) { $inputs[] = [ - 'name' => htmlspecialchars_decode($this->getInput('formConfigName[' . $index . ']'),ENT_QUOTES), + 'name' => html_entity_decode($this->getInput('formConfigName[' . $index . ']')), 'position' => helper::filter($position, helper::FILTER_INT), 'required' => $this->getInput('formConfigRequired[' . $index . ']', helper::FILTER_BOOLEAN), 'type' => $this->getInput('formConfigType[' . $index . ']'), @@ -142,13 +144,6 @@ class form extends common { 'state' => true ]); } - // Liste des pages - foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) { - self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); - foreach($childrenPageIds as $childKey) { - self::$pages[$childKey] = '    ' . $this->getData(['page', $childKey, 'title']); - } - } // Valeurs en sortie $this->addOutput([ 'title' => helper::translate('Configuration du module'), @@ -161,20 +156,21 @@ class form extends common { } - public function option() { + public function option() + { // Liste des utilisateurs $userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname'); ksort($userIdsFirstnames); - self::$listUsers [] = ''; + self::$listUsers[] = ''; foreach ($userIdsFirstnames as $userId => $userFirstname) { - self::$listUsers [] = $userId; + self::$listUsers[] = $userId; } // Soumission du formulaire if ($this->isPost()) { // Débordement $width = $this->getInput('formOptionWidth'); - if ($this->getInput('formOptionWidth',helper::FILTER_INT) + $this->getInput('formOptionOffset',helper::FILTER_INT) > 12 ) { - $width = (string) $this->getInput('formOptionWidth',helper::FILTER_INT) - $this->getInput('formOptionOffset',helper::FILTER_INT); + if ($this->getInput('formOptionWidth', helper::FILTER_INT) + $this->getInput('formOptionOffset', helper::FILTER_INT) > 12) { + $width = (string) $this->getInput('formOptionWidth', helper::FILTER_INT) - $this->getInput('formOptionOffset', helper::FILTER_INT); } // Configuration @@ -186,17 +182,17 @@ class form extends common { 'button' => $this->getInput('formOptionButton'), 'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN), 'group' => $this->getInput('formOptionGroup', helper::FILTER_INT), - 'user' => self::$listUsers [$this->getInput('formOptionUser', helper::FILTER_INT)], - 'mail' => $this->getInput('formOptionMail') , + 'user' => self::$listUsers[$this->getInput('formOptionUser', helper::FILTER_INT)], + 'mail' => $this->getInput('formOptionMail'), 'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '', - 'subject' => $this->getInput('formOptionSubject'), + 'subject' => html_entity_decode($this->getInput('formOptionSubject')), 'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN), 'signature' => $this->getInput('formOptionSignature'), 'logoUrl' => $this->getInput('formOptionLogo'), 'logoWidth' => $this->getInput('formOptionLogoWidth'), - 'offset' =>$this->getInput('formOptionOffset'), - 'width' =>$width, - 'align' =>$this->getInput('formOptionAlign'), + 'offset' => $this->getInput('formOptionOffset'), + 'width' => $width, + 'align' => $this->getInput('formOptionAlign'), ] ]); // Génération des données vides @@ -209,12 +205,12 @@ class form extends common { 'redirect' => helper::baseUrl() . $this->getUrl(), 'state' => true ]); - } else { + } else { // Liste des pages - foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) { + foreach ($this->getHierarchy(null, true, false) as $parentPageId => $childrenPageIds) { self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); - foreach($childrenPageIds as $childKey) { - self::$pages[$childKey] = '    ' . $this->getData(['page', $childKey, 'title']); + foreach ($childrenPageIds as $childKey) { + self::$pages[$childKey] = ' » ' . $this->getData(['page', $childKey, 'title']); } } // Valeurs en sortie @@ -232,9 +228,10 @@ class form extends common { /** * Données enregistrées */ - public function data() { + public function data() + { $data = $this->getData(['module', $this->getUrl(0), 'data']); - if($data) { + if ($data) { // Pagination $pagination = helper::pagination($data, $this->getUrl(), self::$itemsperPage); // Liste des pages @@ -243,16 +240,16 @@ class form extends common { $dataIds = array_reverse(array_keys($data)); $data = array_reverse($data); // Données en fonction de la pagination - for($i = $pagination['first']; $i < $pagination['last']; $i++) { + for ($i = $pagination['first']; $i < $pagination['last']; $i++) { $content = ''; - foreach($data[$i] as $input => $value) { + foreach ($data[$i] as $input => $value) { $content .= $input . ' : ' . $value . '
'; } self::$data[] = [ $content, template::button('formDataDelete' . $dataIds[$i], [ 'class' => 'formDataDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'], + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'], 'value' => template::ico('trash') ]) ]; @@ -268,39 +265,40 @@ class form extends common { /** * Export CSV * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2023, Frédéric Tempez + * @copyright Copyright (C) 2018-2023, Frédéric Tempez */ - public function export2csv() { + public function export2csv() + { // Jeton incorrect if ($this->getUrl(2) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'notification' => helper::translate('Action interdite') ]); } else { $data = $this->getData(['module', $this->getUrl(0), 'data']); if ($data !== []) { - $csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv'; - if (!file_exists(self::FILE_DIR.'source/data')) { - mkdir(self::FILE_DIR.'source/data', 0755); + $csvfilename = 'data-' . date('dmY') . '-' . date('hm') . '-' . rand(10, 99) . '.csv'; + if (!file_exists(self::FILE_DIR . 'source/data')) { + mkdir(self::FILE_DIR . 'source/data', 0755); } - $fp = fopen(self::FILE_DIR.'source/data/'.$csvfilename, 'w'); - fputcsv($fp, array_keys($data[1]), ';','"'); + $fp = fopen(self::FILE_DIR . 'source/data/' . $csvfilename, 'w'); + fputcsv($fp, array_keys($data[1]), ';', '"'); foreach ($data as $fields) { - fputcsv($fp, $fields, ';','"'); + fputcsv($fp, $fields, ';', '"'); } fclose($fp); // Valeurs en sortie $this->addOutput([ 'notification' => sprintf(helper::translate('Export CSV effectué dans %1 '), $csvfilename), - 'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'state' => true ]); } else { $this->addOutput([ 'notification' => helper::translate('Aucune donnée à exporter'), - 'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data' + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data' ]); } } @@ -310,19 +308,20 @@ class form extends common { /** * Suppression */ - public function deleteall() { + public function deleteall() + { // Jeton incorrect if ($this->getUrl(2) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'notification' => helper::translate('Action interdite') ]); } else { $data = ($this->getData(['module', $this->getUrl(0), 'data'])); - if (count($data) > 0 ) { + if (count($data) > 0) { // Suppression multiple - for ($i = 1; $i <= count($data) ; $i++) { + for ($i = 1; $i <= count($data); $i++) { echo $this->deleteData(['module', $this->getUrl(0), 'data', $i]); } // Valeurs en sortie @@ -345,17 +344,18 @@ class form extends common { /** * Suppression */ - public function delete() { + public function delete() + { // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data', 'notification' => helper::translate('Action interdite') ]); } else { // La donnée n'existe pas - if($this->getData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]) === null) { + if ($this->getData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]) === null) { // Valeurs en sortie $this->addOutput([ 'access' => false @@ -380,19 +380,20 @@ class form extends common { /** * Accueil */ - public function index() { + public function index() + { // Mise à jour des données de module $this->update(); // Soumission du formulaire - if($this->isPost()) { + if ($this->isPost()) { // Check la captcha - if( + if ( $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) // AND $this->getInput('formcaptcha', helper::FILTER_INT) !== $this->getInput('formcaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('formcaptchaSecondNumber', helper::FILTER_INT)) - AND password_verify($this->getInput('formCaptcha', helper::FILTER_INT), $this->getInput('formCaptchaResult') ) === false ) - { + and password_verify($this->getInput('formCaptcha', helper::FILTER_INT), $this->getInput('formCaptchaResult')) === false + ) { self::$inputNotices['formCaptcha'] = helper::translate('Captcha incorrect'); } @@ -400,9 +401,9 @@ class form extends common { $data = []; $replyTo = null; $content = ''; - foreach($this->getData(['module', $this->getUrl(0), 'input']) as $index => $input) { + foreach ($this->getData(['module', $this->getUrl(0), 'input']) as $index => $input) { // Filtre la valeur - switch($input['type']) { + switch ($input['type']) { case self::TYPE_MAIL: $filter = helper::FILTER_MAIL; break; @@ -420,10 +421,12 @@ class form extends common { } $value = $this->getInput('formInput[' . $index . ']', $filter, $input['required']) === true ? 'X' : $this->getInput('formInput[' . $index . ']', $filter, $input['required']); // premier champ email ajouté au mail en reply si option active - if ($this->getData(['module', $this->getUrl(0), 'config', 'replyto']) === true && - $input['type'] === 'mail') { + if ( + $this->getData(['module', $this->getUrl(0), 'config', 'replyto']) === true && + $input['type'] === 'mail' + ) { $replyTo = $value; - } + } // Préparation des données pour la création dans la base $data[$this->getData(['module', $this->getUrl(0), 'input', $index, 'name'])] = $value; // Préparation des données pour le mail @@ -434,23 +437,25 @@ class form extends common { // Envoi du mail // Rechercher l'adresse en fonction du mail $sent = true; - $singleuser = $this->getData(['user', - $this->getData(['module', $this->getUrl(0), 'config', 'user']), - 'mail']); + $singleuser = $this->getData([ + 'user', + $this->getData(['module', $this->getUrl(0), 'config', 'user']), + 'mail' + ]); $singlemail = $this->getData(['module', $this->getUrl(0), 'config', 'mail']); $group = $this->getData(['module', $this->getUrl(0), 'config', 'group']); // Verification si le mail peut être envoyé - if( + if ( self::$inputNotices === [] && ( $group > 0 || $singleuser !== '' || - $singlemail !== '' ) + $singlemail !== '') ) { // Utilisateurs dans le groupe $to = []; - if ($group > 0){ - foreach($this->getData(['user']) as $userId => $user) { - if($user['group'] >= $group) { + if ($group > 0) { + foreach ($this->getData(['user']) as $userId => $user) { + if ($user['group'] >= $group) { $to[] = $user['mail']; } } @@ -463,10 +468,10 @@ class form extends common { if (!empty($singlemail)) { $to[] = $singlemail; } - if($to) { + if ($to) { // Sujet du mail $subject = $this->getData(['module', $this->getUrl(0), 'config', 'subject']); - if($subject === '') { + if ($subject === '') { $subject = 'Nouveau message en provenance de votre site'; } // Envoi le mail @@ -507,23 +512,25 @@ class form extends common { * Mise à jour du module * Appelée par les fonctions index et config */ - private function update() { + private function update() + { // le module n'est pas initialisé - if ( $this->getData(['module',$this->getUrl(0), 'config']) === NULL ) { + if ($this->getData(['module', $this->getUrl(0), 'config']) === NULL) { $this->init(); } } - /** + /** * Initialisation du thème d'un nouveau module */ - private function init() { + private function init() + { // Données du module absentes require_once('module/form/ressource/defaultdata.php'); - if ($this->getData(['module', $this->getUrl(0), 'config' ]) === null) { + if ($this->getData(['module', $this->getUrl(0), 'config']) === null) { $this->setData(['module', $this->getUrl(0), 'config', init::$defaultData]); } } -} +} \ No newline at end of file From 91112037e95ec09d511e37d978a0ff8db18ab85a Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 26 Mar 2023 09:31:42 +0200 Subject: [PATCH 10/16] Bug d'actualisation du sitemap --- CHANGES.md | 3 +- core/core.php | 264 ++++++++++++++++++---------------- core/module/config/config.php | 2 +- core/module/page/page.php | 28 ++-- 4 files changed, 156 insertions(+), 141 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e61657d2..22b1e42a 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,8 @@ # Changelog ## Version 12.3.04 -- Bug de notification de compte bloqué, la traduction n'est pas effectuée. +- Corrige un défaut d'actualisation de la liste des pages et du site map lorsque la page change d'id. +- Notification de compte bloqué, la traduction n'est pas effectuée. - Amélioration du module, aspect de la liste des articles présenté en tableau et du bouton Lire la suite ## Version 12.3.03 diff --git a/core/core.php b/core/core.php index cb3553a9..e298ee14 100644 --- a/core/core.php +++ b/core/core.php @@ -370,55 +370,10 @@ class common // Construit la liste des pages parents/enfants if ($this->hierarchy['all'] === []) { - $pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC'); - // Parents - foreach ($pages as $pageId => $pagePosition) { - if ( - // Page parent - $this->getData(['page', $pageId, 'parentPageId']) === "" - // Ignore les pages dont l'utilisateur n'a pas accès - and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR - or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - and $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) - ) - ) - ) { - if ($pagePosition !== 0) { - $this->hierarchy['visible'][$pageId] = []; - } - if ($this->getData(['page', $pageId, 'block']) === 'bar') { - $this->hierarchy['bar'][$pageId] = []; - } - $this->hierarchy['all'][$pageId] = []; - } - } - // Enfants - foreach ($pages as $pageId => $pagePosition) { - if ( - // Page parent - $parentId = $this->getData(['page', $pageId, 'parentPageId']) - // Ignore les pages dont l'utilisateur n'a pas accès - and ( - ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR - and $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR - ) - or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - and $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) - and $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) - ) - ) - ) { - if ($pagePosition !== 0) { - $this->hierarchy['visible'][$parentId][] = $pageId; - } - if ($this->getData(['page', $pageId, 'block']) === 'bar') { - $this->hierarchy['bar'][$pageId] = []; - } - $this->hierarchy['all'][$parentId][] = $pageId; - } - } + $this->buildHierarchy(); } + // Construit l'url if ($this->url === '') { if ($url = $_SERVER['QUERY_STRING']) { @@ -706,6 +661,7 @@ class common } } + /** * Accède à la liste des pages parents et de leurs enfants * @param int $parentId Id de la page parent @@ -731,6 +687,133 @@ class common } } + /** + * Fonction pour construire le tableau des pages + * Appelée par le core uniquement + */ + + private function buildHierarchy() + { + + $pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC'); + // Parents + foreach ($pages as $pageId => $pagePosition) { + if ( + // Page parent + $this->getData(['page', $pageId, 'parentPageId']) === "" + // Ignore les pages dont l'utilisateur n'a pas accès + and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR + or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + and $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) + ) + ) + ) { + if ($pagePosition !== 0) { + $this->hierarchy['visible'][$pageId] = []; + } + if ($this->getData(['page', $pageId, 'block']) === 'bar') { + $this->hierarchy['bar'][$pageId] = []; + } + $this->hierarchy['all'][$pageId] = []; + } + } + // Enfants + foreach ($pages as $pageId => $pagePosition) { + if ( + // Page parent + $parentId = $this->getData(['page', $pageId, 'parentPageId']) + // Ignore les pages dont l'utilisateur n'a pas accès + and ( + ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR + and $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR + ) + or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + and $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) + and $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) + ) + ) + ) { + if ($pagePosition !== 0) { + $this->hierarchy['visible'][$parentId][] = $pageId; + } + if ($this->getData(['page', $pageId, 'block']) === 'bar') { + $this->hierarchy['bar'][$pageId] = []; + } + $this->hierarchy['all'][$parentId][] = $pageId; + } + } + } + + /** + * Génère un fichier json avec la liste des pages + * + */ + private function tinyMcePages() + { + // Sauve la liste des pages pour TinyMCE + $parents = []; + $rewrite = (helper::checkRewrite()) ? '' : '?'; + // Boucle de recherche des pages actives + foreach ($this->getHierarchy(null, false, false) as $parentId => $childIds) { + $children = []; + // Exclure les barres + if ($this->getData(['page', $parentId, 'block']) !== 'bar') { + // Boucler sur les enfants et récupérer le tableau children avec la liste des enfants + foreach ($childIds as $childId) { + $children[] = [ + 'title' => ' » ' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES), + 'value' => $rewrite . $childId + ]; + } + // Traitement + if (empty($childIds)) { + // Pas d'enfant, uniquement l'entrée du parent + $parents[] = [ + 'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES), + 'value' => $rewrite . $parentId + ]; + } else { + // Des enfants, on ajoute la page parent en premier + array_unshift($children, [ + 'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES), + 'value' => $rewrite . $parentId + ]); + // puis on ajoute les enfants au parent + $parents[] = [ + 'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES), + 'value' => $rewrite . $parentId, + 'menu' => $children + ]; + } + } + } + // Sitemap et Search + $children = []; + $children[] = [ + 'title' => 'Rechercher dans le site', + 'value' => $rewrite . 'search' + ]; + $children[] = [ + 'title' => 'Plan du site', + 'value' => $rewrite . 'sitemap' + ]; + $parents[] = [ + 'title' => 'Pages spéciales', + 'value' => '#', + 'menu' => $children + ]; + + // Enregistrement : 3 tentatives + for ($i = 0; $i < 3; $i++) { + if (file_put_contents('core/vendor/tinymce/link_list.json', json_encode($parents, JSON_UNESCAPED_UNICODE), LOCK_EX) !== false) { + break; + } + // Pause de 10 millisecondes + usleep(10000); + } + } + + /** * Accède à une valeur des variables http (ordre de recherche en l'absence de type : _COOKIE, _POST) * @param string $key Clé de la valeur @@ -836,74 +919,6 @@ class common return ($this->checkCSRF() and $this->input['_POST'] !== []); } - /** - * Génère un fichier json avec la liste des pages - * - */ - public function listPages() - { - // Sauve la liste des pages pour TinyMCE - $parents = []; - $rewrite = (helper::checkRewrite()) ? '' : '?'; - // Boucle de recherche des pages actives - foreach ($this->getHierarchy(null, false, false) as $parentId => $childIds) { - $children = []; - // Exclure les barres - if ($this->getData(['page', $parentId, 'block']) !== 'bar') { - // Boucler sur les enfants et récupérer le tableau children avec la liste des enfants - foreach ($childIds as $childId) { - $children[] = [ - 'title' => ' » ' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES), - 'value' => $rewrite . $childId - ]; - } - // Traitement - if (empty($childIds)) { - // Pas d'enfant, uniquement l'entrée du parent - $parents[] = [ - 'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES), - 'value' => $rewrite . $parentId - ]; - } else { - // Des enfants, on ajoute la page parent en premier - array_unshift($children, [ - 'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES), - 'value' => $rewrite . $parentId - ]); - // puis on ajoute les enfants au parent - $parents[] = [ - 'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES), - 'value' => $rewrite . $parentId, - 'menu' => $children - ]; - } - } - } - // Sitemap et Search - $children = []; - $children[] = [ - 'title' => 'Rechercher dans le site', - 'value' => $rewrite . 'search' - ]; - $children[] = [ - 'title' => 'Plan du site', - 'value' => $rewrite . 'sitemap' - ]; - $parents[] = [ - 'title' => 'Pages spéciales', - 'value' => '#', - 'menu' => $children - ]; - - // Enregistrement : 3 tentatives - for ($i = 0; $i < 3; $i++) { - if (file_put_contents('core/vendor/tinymce/link_list.json', json_encode($parents, JSON_UNESCAPED_UNICODE), LOCK_EX) !== false) { - break; - } - // Pause de 10 millisecondes - usleep(10000); - } - } /** * Retourne une chemin localisé pour l'enregistrement des données @@ -930,14 +945,20 @@ class common /** * Génère un fichier un fichier sitemap.xml * https://github.com/icamys/php-sitemap-generator - * $command valeurs possible * all : génère un site map complet * Sinon contient id de la page à créer + * @param string Valeurs possibles */ - public function createSitemap($command = "all") + public function updateSitemap() { + // Rafraîchit la liste des pages après une modification de pageId notamment + $this->buildHierarchy(); + + // Actualise la liste des pages pour TinyMCE + $this->tinyMcePages(); + //require_once "core/vendor/sitemap/SitemapGenerator.php"; $timezone = $this->getData(['config', 'timezone']); @@ -1034,6 +1055,8 @@ class common } return (file_exists('sitemap.xml') && file_exists('robots.txt')); + + } /* @@ -1119,7 +1142,7 @@ class common $mail->isSMTP(); $mail->SMTPAutoTLS = false; $mail->SMTPSecure = false; - $mail->SMTPAuth = false; + $mail->SMTPAuth = false; $mail->Host = $this->getdata(['config', 'smtp', 'host']); $mail->Port = (int) $this->getdata(['config', 'smtp', 'port']); if ($this->getData(['config', 'smtp', 'auth'])) { @@ -1258,7 +1281,7 @@ class common new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator( $folder, - RecursiveDirectoryIterator::SKIP_DOTS + RecursiveDirectoryIterator::SKIP_DOTS ), function ($fileInfo, $key, $iterator) use ($filter) { return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter); @@ -1274,5 +1297,4 @@ class common } $zip->close(); } -} - +} \ No newline at end of file diff --git a/core/module/config/config.php b/core/module/config/config.php index 882b3ba0..98e1949d 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -213,7 +213,7 @@ class config extends common { // Mettre à jour le site map - $successSitemap = $this->createSitemap(); + $successSitemap = $this->updateSitemap(); // Valeurs en sortie $this->addOutput([ diff --git a/core/module/page/page.php b/core/module/page/page.php index 9c747c43..94bd3e01 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -168,10 +168,10 @@ class page extends common } //file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $pageId . '.html', '

Contenu de votre nouvelle page.

'); $this->setPage($pageId, '

Contenu de votre nouvelle page.

', self::$i18nContent); - // Met à jour le site map - $this->createSitemap('all'); - // Mise à jour de la liste des pages pour TinyMCE - $this->listPages(); + + // Met à jour le sitemap + $this->updateSitemap(); + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . $pageId, @@ -295,10 +295,10 @@ class page extends common unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html'); } $this->deleteData(['module', $url[0]]); - // Met à jour le site map - $this->createSitemap('all'); - // Mise à jour de la liste des pages pour TinyMCE - $this->listPages(); + + // Met à jour le sitemap + $this->updateSitemap(); + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl(false), @@ -504,10 +504,8 @@ class page extends common $content = empty($this->getInput('pageEditContent', null)) ? '

' : str_replace('

', '

 

', $this->getInput('pageEditContent', null)); $this->setPage($pageId, $content, self::$i18nContent); - // Met à jour le site map - $this->createSitemap('all'); - // Mise à jour de la liste des pages pour TinyMCE - $this->listPages(); + // Met à jour le sitemap + $this->updateSitemap(); // Redirection vers la configuration if ( @@ -554,12 +552,6 @@ class page extends common } } - // Met à jour le site map - $this->createSitemap('all'); - - // Mise à jour de la liste des pages pour TinyMCE - $this->listPages(); - // Valeurs en sortie $this->addOutput([ 'title' => $this->getData(['page', $this->getUrl(2), 'title']), From ca87ee2d3b84b7d945cfb2cbc34599913f3ccb3b Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 26 Mar 2023 14:14:21 +0200 Subject: [PATCH 11/16] Inversion de la minification des script inline --- core/class/layout.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/layout.class.php b/core/class/layout.class.php index e2c10060..665e08fe 100644 --- a/core/class/layout.class.php +++ b/core/class/layout.class.php @@ -1044,7 +1044,7 @@ class layout extends common $inlineScript = implode($this->core->output['inlineScript']); } echo ''; - echo ''; + echo ''; } /** From 53b78bf61da32d561b7b34423d78c42d6eae57c4 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 26 Mar 2023 16:22:02 +0200 Subject: [PATCH 12/16] Mail auth WIP --- core/class/helper.class.php | 24 ------------------------ core/core.php | 4 +--- core/module/config/config.php | 8 ++++---- module/form/form.php | 2 +- 4 files changed, 6 insertions(+), 32 deletions(-) diff --git a/core/class/helper.class.php b/core/class/helper.class.php index f50c8ec8..3b244970 100644 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -682,28 +682,4 @@ class helper return $text; } - /** - * Cryptage - * @param string $key la clé d'encryptage - * @param string $payload la chaine à coder - * @return string - */ - public static function encrypt($key, $payload) - { - $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); - $encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv); - return base64_encode($encrypted . '::' . $iv); - } - - /** - * Décryptage - * @param string $key la clé d'encryptage - * @param string $garble la chaine à décoder - * @return string - */ - public static function decrypt($key, $garble) - { - list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2); - return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv); - } } diff --git a/core/core.php b/core/core.php index e298ee14..a1a8000e 100644 --- a/core/core.php +++ b/core/core.php @@ -1146,12 +1146,10 @@ class common $mail->Host = $this->getdata(['config', 'smtp', 'host']); $mail->Port = (int) $this->getdata(['config', 'smtp', 'port']); if ($this->getData(['config', 'smtp', 'auth'])) { - $mail->SMTPAutoTLS = true; $mail->SMTPSecure = true; $mail->SMTPAuth = $this->getData(['config', 'smtp', 'auth']); $mail->Username = $this->getData(['config', 'smtp', 'username']); - $mail->Password = helper::decrypt($this->getData(['config', 'smtp', 'username']), $this->getData(['config', 'smtp', 'password'])); - $mail->SMTPSecure = $this->getData(['config', 'smtp', 'secure']); + $mail->Password = $this->getData(['config', 'smtp', 'password']); } } diff --git a/core/module/config/config.php b/core/module/config/config.php index 98e1949d..dbba2910 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -455,12 +455,12 @@ class config extends common ], 'smtp' => [ 'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN), - 'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)), - 'port' => $this->getInput('smtpPort', helper::FILTER_INT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)), + 'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT), + 'port' => $this->getInput('smtpPort', helper::FILTER_INT), 'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN), 'secure' => $this->getInput('smtpSecure', helper::FILTER_STRING_SHORT), - 'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN)), - 'password' => helper::encrypt($this->getData(['config', 'smtp', 'username']), $this->getInput('smtpPassword', null, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN))), + 'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT), + 'password' => $this->getInput('smtpPassword', helper::FILTER_STRING_SHORT), 'from' => $this->getInput('smtpFrom', helper::FILTER_MAIL, true), ], 'seo' => [ diff --git a/module/form/form.php b/module/form/form.php index a5e019ff..615692ac 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -491,7 +491,7 @@ class form extends common $this->addOutput([ 'notification' => ($sent === true ? helper::translate('Formulaire soumis') : $sent), 'redirect' => $redirect ? helper::baseUrl() . $redirect : '', - 'state' => ($sent === true ? true : null), + 'state' => ($sent === true ? true : false), 'vendor' => [ 'flatpickr' ], From 0cd7a5490483f4f3831fd43a6ecf792a03f74729 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 27 Mar 2023 11:34:22 +0200 Subject: [PATCH 13/16] Cryptage SMTP --- core/class/helper.class.php | 22 ++++++++++++++++++++++ core/core.php | 4 ++-- core/module/config/config.php | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/class/helper.class.php b/core/class/helper.class.php index 3b244970..cd05e330 100644 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -682,4 +682,26 @@ class helper return $text; } + /** + * Cryptage + * @param string $key la clé d'encryptage + * @param string $string la chaine à coder + * @return string + */ + public static function encrypt($string, $key) { + $encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, substr(md5($key), 0, 16)); + return base64_encode($encrypted); + } + + /** + * Décryptage + * @param string $key la clé d'encryptage + * @param string $string la chaine à décoder + * @return string + */ + public static function decrypt($string, $key) { + $decrypted = openssl_decrypt(base64_decode($string), "AES-256-CBC", $key, 0, substr(md5($key), 0, 16)); + return $decrypted; + } + } diff --git a/core/core.php b/core/core.php index a1a8000e..c44de30e 100644 --- a/core/core.php +++ b/core/core.php @@ -1149,7 +1149,7 @@ class common $mail->SMTPSecure = true; $mail->SMTPAuth = $this->getData(['config', 'smtp', 'auth']); $mail->Username = $this->getData(['config', 'smtp', 'username']); - $mail->Password = $this->getData(['config', 'smtp', 'password']); + $mail->Password = helper::decrypt($this->getData(['config', 'smtp', 'password']),$this->getData(['config', 'smtp', 'host'])); } } @@ -1183,7 +1183,7 @@ class common return $mail->ErrorInfo; } } catch (Exception $e) { - return $e->getMessage(); + return $mail->ErrorInfo; } } diff --git a/core/module/config/config.php b/core/module/config/config.php index dbba2910..4488d8ad 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -460,7 +460,7 @@ class config extends common 'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN), 'secure' => $this->getInput('smtpSecure', helper::FILTER_STRING_SHORT), 'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT), - 'password' => $this->getInput('smtpPassword', helper::FILTER_STRING_SHORT), + 'password' => helper::encrypt($this->getInput('smtpPassword', helper::FILTER_STRING_SHORT),$this->getInput('smtpHost', helper::FILTER_STRING_SHORT)), 'from' => $this->getInput('smtpFrom', helper::FILTER_MAIL, true), ], 'seo' => [ From aef19a9e9c640548c062c25ef609bfe8139086bc Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 27 Mar 2023 11:47:46 +0200 Subject: [PATCH 14/16] Envoi email : encodage titre du site --- CHANGES.md | 5 ++++- core/core.php | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 22b1e42a..e4e0275a 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,8 +2,11 @@ ## Version 12.3.04 - Corrige un défaut d'actualisation de la liste des pages et du site map lorsque la page change d'id. +- Serveur SMTP : + - Corrige le décryptage du mot de passe SMTP. + - Corrige un défaut d'encodage UTF-8 du sujet du mail et du titre du site. - Notification de compte bloqué, la traduction n'est pas effectuée. -- Amélioration du module, aspect de la liste des articles présenté en tableau et du bouton Lire la suite +- Amélioration du module Blog, aspect de la liste des articles présenté en tableau avec un bouton "Lire la suite". ## Version 12.3.03 - Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée. diff --git a/core/core.php b/core/core.php index c44de30e..5c6c3e56 100644 --- a/core/core.php +++ b/core/core.php @@ -1156,11 +1156,11 @@ class common // Expéditeur $host = str_replace('www.', '', $_SERVER['HTTP_HOST']); $from = $from ? $from : 'no-reply@' . $host; - $mail->setFrom($from, $this->getData(['locale', 'title'])); + $mail->setFrom($from, html_entity_decode($this->getData(['locale', 'title']))); // répondre à if (is_null($replyTo)) { - $mail->addReplyTo($from, $this->getData(['locale', 'title'])); + $mail->addReplyTo($from, html_entity_decode($this->getData(['locale', 'title']))); } else { $mail->addReplyTo($replyTo); } From 83ecbdb75b8846a663c49412c62b40668b6e315b Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 27 Mar 2023 13:14:20 +0200 Subject: [PATCH 15/16] 12304 changes --- CHANGES.md | 2 +- core/class/helper.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e4e0275a..cf2053e2 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,7 @@ - Corrige le décryptage du mot de passe SMTP. - Corrige un défaut d'encodage UTF-8 du sujet du mail et du titre du site. - Notification de compte bloqué, la traduction n'est pas effectuée. -- Amélioration du module Blog, aspect de la liste des articles présenté en tableau avec un bouton "Lire la suite". +- Amélioration du module Blog, aspect de la liste des articles présenté en tableau avec un bouton "Lire la suite" agrémenté d'un effet de flou. ## Version 12.3.03 - Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée. diff --git a/core/class/helper.class.php b/core/class/helper.class.php index cd05e330..3a3d3b09 100644 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -682,7 +682,7 @@ class helper return $text; } - /** + /** * Cryptage * @param string $key la clé d'encryptage * @param string $string la chaine à coder From b255d0fddf6fe3cc54c8a2af8f312f78025eb258 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 27 Mar 2023 15:11:07 +0200 Subject: [PATCH 16/16] 12304 nouveaux RS --- CHANGES.md | 12 +++- core/class/layout.class.php | 28 ++++++-- core/layout/common.css | 32 +++++++++ core/module/config/config.php | 6 +- core/module/config/view/social/social.php | 71 +++++++++++++++----- core/vendor/zwiico/css/zwiico-codes.css | 4 ++ core/vendor/zwiico/css/zwiico-embedded.css | 16 +++-- core/vendor/zwiico/css/zwiico-ie7-codes.css | 4 ++ core/vendor/zwiico/css/zwiico-ie7.css | 4 ++ core/vendor/zwiico/css/zwiico.css | 18 +++-- core/vendor/zwiico/font/zwiico.eot | Bin 24880 -> 26124 bytes core/vendor/zwiico/font/zwiico.svg | 10 ++- core/vendor/zwiico/font/zwiico.ttf | Bin 24720 -> 25964 bytes core/vendor/zwiico/font/zwiico.woff | Bin 15512 -> 16428 bytes core/vendor/zwiico/font/zwiico.woff2 | Bin 13152 -> 13956 bytes 15 files changed, 164 insertions(+), 41 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index cf2053e2..ab8f3fbf 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,12 +1,20 @@ # Changelog ## Version 12.3.04 +### Corrections - Corrige un défaut d'actualisation de la liste des pages et du site map lorsque la page change d'id. - Serveur SMTP : - Corrige le décryptage du mot de passe SMTP. - Corrige un défaut d'encodage UTF-8 du sujet du mail et du titre du site. -- Notification de compte bloqué, la traduction n'est pas effectuée. -- Amélioration du module Blog, aspect de la liste des articles présenté en tableau avec un bouton "Lire la suite" agrémenté d'un effet de flou. +- Traduction du message de compte bloqué. +### Améliorations +- Module Blog : + - Aspect de la liste des articles présenté en tableau avec un bouton "Lire la suite" agrémenté d'un effet de flou. + - Des tailles de masquage du texte des articles plus importantes sont proposées. +- Comptes de réseaux sociaux : + - Sont ajoutés Steam, Twitch, Vimeo et Reddit. + - Des icônes accompagnent le noms des réseaux dans la configuration. + ## Version 12.3.03 - Corrige le problème d'affichage lors de l'édition d'une page contenant une feuille style commentée. diff --git a/core/class/layout.class.php b/core/class/layout.class.php index 665e08fe..a60fa1cf 100644 --- a/core/class/layout.class.php +++ b/core/class/layout.class.php @@ -410,6 +410,22 @@ class layout extends common $socialUrl = 'https://www.github.com/'; $title = 'Github'; break; + case 'redditId': + $socialUrl = 'https://www.reddit.com/user/'; + $title = 'Reddit'; + break; + case 'twitchId': + $socialUrl = 'https://www.twitch.tv/'; + $title = 'Twitch'; + break; + case 'vimeoId': + $socialUrl = 'https://vimeo.com/'; + $title = 'Vimeo'; + break; + case 'steamId': + $socialUrl = 'https://steamcommunity.com/id/'; + $title = 'Steam'; + break; default: $socialUrl = ''; } @@ -965,7 +981,7 @@ class layout extends common 'help' => 'Fichiers', 'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']), 'attr' => 'data-lity' - ]) . ''; + ]) . ''; } if ($this->getUser('group') >= self::GROUP_ADMIN) { $rightItems .= '
  • ' . template::ico('brush', [ @@ -1016,10 +1032,10 @@ class layout extends common } } if ($this->getUser('group') >= self::GROUP_MODERATOR) { - $rightItems .= '
  • ' . - template::ico('user', ['margin' => 'right']) . '' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . - '
  • '; + $rightItems .= '
  • ' . + template::ico('user', ['margin' => 'right']) . '' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . + '
  • '; } $rightItems .= '
  • ' . template::ico('logout', [ 'help' => 'Déconnecter', @@ -1043,7 +1059,7 @@ class layout extends common if ($this->core->output['inlineScript']) { $inlineScript = implode($this->core->output['inlineScript']); } - echo ''; + echo ''; echo ''; } diff --git a/core/layout/common.css b/core/layout/common.css index 05420559..54f447cd 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -951,6 +951,38 @@ footer #footerSocials .zwiico-github:hover { background: #000; } +footer #footerSocials .zwiico-reddit { + background: #FF4500; +} + +footer #footerSocials .zwiico-reddit:hover { + background: #D23311; +} + +footer #footerSocials .zwiico-steam { + background: #171A21; +} + +footer #footerSocials .zwiico-steam:hover { + background: #0F1318; +} + +footer #footerSocials .zwiico-vimeo { + background: #162221; +} + +footer #footerSocials .zwiico-vimeo:hover { + background: #121B1E; +} + +footer #footerSocials .zwiico-twitch { + background: #9146FF; +} + +footer #footerSocials .zwiico-twitch:hover { + background: #703CEC; +} + /* Bulle de dialogue */ diff --git a/core/module/config/config.php b/core/module/config/config.php index 4488d8ad..b5b5348c 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -451,7 +451,11 @@ class config extends common 'twitterId' => $this->getInput('socialTwitterId'), 'youtubeId' => $this->getInput('socialYoutubeId'), 'youtubeUserId' => $this->getInput('socialYoutubeUserId'), - 'githubId' => $this->getInput('socialGithubId') + 'githubId' => $this->getInput('socialGithubId'), + 'redditId' => $this->getInput('socialRedditId'), + 'twitchId' => $this->getInput('socialTwitchId'), + 'vimeoId' => $this->getInput('socialVimeoId'), + 'steamId' =>$this->getInput('socialSteamId'), ], 'smtp' => [ 'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN), diff --git a/core/module/config/view/social/social.php b/core/module/config/view/social/social.php index 3f3f27c9..e67063fd 100644 --- a/core/module/config/view/social/social.php +++ b/core/module/config/view/social/social.php @@ -2,7 +2,8 @@
    -

    +

    +