Compare commits

..

No commits in common. "master" and "12.2.04" have entirely different histories.

461 changed files with 88724 additions and 16731 deletions

2
.gitignore vendored
View File

@ -9,5 +9,3 @@ site/i18n/*.json
core/vendor/tinymce/link_list.json
robots.txt
sitemap.xml
.gitignore
core/module/config/tool/data.key

1246
CHANGES.md

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
# ZwiiCMS 13.3.02
# ZwiiCMS 12.2.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.
@ -13,15 +13,16 @@ ZwiiCMS a été créé par un développeur de talent, [Rémi Jean](https://remij
## Licence
Cette œuvre est mise à disposition sous licence Attribution - Pas d'utilisation Commerciale - Pas de Modification 4.0 International.
Cette œuvre est mise à disposition sous licence Attribution - Pas d'utilisation Commerciale - Pas de Modification 4.0 International.
Pour voir une copie de cette licence, visitez <http://creativecommons.org/licenses/by-nc-nd/4.0/> ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-nd/4.0/ ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
## Téléchargement de ZwiiCMS
Pour télécharger la dernière version publiée, rendez-vous :
* sur [la page des mises à jour](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
* ou sur [la page de téléchargement du site](https://zwiicms.fr/telechargement)
- sur [la page des mises à jour](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
- ou sur [la page de téléchargement du site](https://zwiicms.fr/telechargement)
## Installation
@ -29,6 +30,7 @@ Décompressez l'archive de Zwii et téléversez son contenu à la racine de votr
Vous trouverez de plus amples explications, en particulier pour une installation chez Free, dans la rubrique "Téléchargements" du forum.
## Procédures de mise à jour
A l'occasion de l'installation d'une verion majeure, il est recommandé de réaliser une copie de sauvegarde.
@ -45,6 +47,7 @@ A l'occasion de l'installation d'une verion majeure, il est recommandé de réal
* Décompressez la nouvelle version sur votre ordinateur.
* Transférez son contenu sur votre serveur en activant le remplacement des fichiers.
## Arborescence générale
*Légende : [R] Répertoire - [F] Fichier*
@ -67,18 +70,16 @@ A l'occasion de l'installation d'une verion majeure, il est recommandé de réal
[R] site Contenu du site
[R] backup Sauvegardes automatiques
[R] i18N Langues de l'interface de Zwii
[R] data Répertoire des données
[R] fr Dossier localisé
[F] page.json Données des pages
[F] module.json Données des modules de pages
[F] local.json Données du site propres à la langue
[F] .default Indicateur de la langue de site par défaut
[R] content Dossier des contenus de page
[F] accueil.html Exemple contenu de la page d'accueil
[R] font Dossier contenant les fontes installées
[F] font.html Fichier contenant les appels des fontes à charger sur cdnFonts
[F] font.css Fichier contenant la feuille de style liée aux polices de caractères locales
[R] fonts Dossier contenant les fontes installées
[F] fonts.html Fichier contenant les appels des fontes à charger sur cdnFonts
[F] fonts.css Fichier contenant la feuille de style liée aux polices de caractères locales
[F] fontes.woff Fichiers locaux des fontes (woff, etc..)
[R] modules Personnalisation des modules ou données propres
[F] admin.css Thème des pages d'administration
@ -87,10 +88,8 @@ A l'occasion de l'installation d'une verion majeure, il est recommandé de réal
[F] config.json Configuration du site
[F] core.json Configuration du noyau
[F] custom.css Feuille de style de la personnalisation avancée
[F] font.json Descripteur des fontes personnalisées
[F] journal.log Journalisation des activités
[F] language.json Langues de l'interface
[F] profil.json Profils des utilisateurs
[F] fonts.json Descripteur des fontes personnalisées
[F] journal.log Journalisation des actions
[F] theme.css Thème du site
[F] theme.json Données du site
[F] user.json Données des utilisateurs

113
README.md
View File

@ -1,4 +1,4 @@
# ZwiiCMS 13.3.02
# ZwiiCMS 12.2.04
Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge.
@ -13,15 +13,16 @@ ZwiiCMS was created by a talented developer, [Rémi Jean](https://remijean.fr/).
## License
This work is licensed under the Attribution-Noncommercial-No Derivative Works 4.0 International License.
This work is licensed under the Attribution-Noncommercial-No Derivative Works 4.0 International License.
To view a copy of this license, visit <http://creativecommons.org/licenses/by-nc-nd/4.0/> or write to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or write to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
## Downloading ZwiiCMS
To download the latest released version, go to :
* [the Updates page](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
* or at [the site download page](https://zwiicms.fr/download)
- [the Updates page](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
- or at [the site download page](https://zwiicms.fr/telechargement)
## Installation
@ -29,6 +30,7 @@ Unzip the Zwii archive and upload its contents to the root of your server or to
You will find more explanations, in particular for an installation at Free, in the "Downloads" section of the forum.
## Update procedures
When installing a major version, it is recommended to make a backup copy.
@ -45,65 +47,62 @@ When installing a major version, it is recommended to make a backup copy.
* Unzip the new version on your computer.
* Transfer its content to your server by activating the file replacement.
## General tree structure
*Legend: [D] Directory - [FILE] File
*Legend: [R] Directory - [F] File
````
text
[DIR] core Core of the system
[DIR] class Classes
[DIR] layout Layout
[DIR] module Core modules
[DIR] vendor External libraries
[FILE] core.js.php Javascript core
[FILE] core.php PHP core
[R] core Core of the system
[R] class Classes
[R] layout Layout
[R] module Core modules
[R] vendor External libraries
[F] core.js.php Javascript core
[F] core.php PHP core
[DIR] module Page modules
[DIR] blog Blog
[DIR] form Form manager
[DIR] gallery Gallery
[DIR] news News
[DIR] redirection Redirection
[R] module Page modules
[R] blog Blog
[R] form Form manager
[R] gallery Gallery
[R] news News
[R] redirection Redirection
[DIR] site Site content
[DIR] backup Automatic backups
[DIR] i18N Zwii Interface languages
[DIR] data Data directory
[DIR] en Localized folder
[FILE] page.json Page data
[FILE] module.json Page module data
[FILE] local.json Language-specific site data
[FILE] .default Unique file of default site language
[DIR] content Folder of page contents
[FILE] home.html Sample home page content
[DIR] fonts Folder containing the installed fonts
[FILE] fonts.html File containing the fonts calls to load on cdnFonts
[FILE] fonts.css File containing the style sheet linked to the local fonts
[FILE] fonts.woff Local font files (woff, etc..)
[DIR] modules Customization of modules or own data
[FILE] admin.css Theme of administration pages
[FILE] admin.json Theme data for administration pages
[FILE] blacklist.json Logging of login attempts with unknown accounts
[FILE] config.json Site configuration
[FILE] core.json Core configuration
[FILE] custom.css Advanced customization stylesheet
[FILE] font.json Custom font descriptor
[FILE] journal.log Activities logging
[FILE] language.json Interface languages database
[FILE] profil.json Users profiles database
[FILE] theme.css Site theme
[FILE] theme.json Site database
[FILE] user.json User database
[FILE] .backup Marker for file backup if present
[DIR] file File manager upload directory
[DIR] source Various resources
[DIR] thumb Image thumbnails
[DIR] tmp Temporary directory
[R] site Site content
[R] backup Automatic backups
[R] data Data directory
[R] en Localized folder
[F] page.json Page data
[F] module.json Page module data
[F] local.json Language-specific site data
[R] content Folder of page contents
[F] home.html Sample home page content
[R] fonts Folder containing the installed fonts
[F] fonts.html File containing the fonts calls to load on cdnFonts
[F] fonts.css File containing the style sheet linked to the local fonts
[F] fonts.woff Local font files (woff, etc..)
[R] modules Customization of modules or own data
[F] admin.css Theme of administration pages
[F] admin.json Theme data for administration pages
[F] blacklist.json Logging of login attempts with unknown accounts
[F] config.json Site configuration
[F] core.json Core configuration
[F] custom.css Advanced customization stylesheet
[F] fonts.json Custom font descriptor
[F] journal.log Action logging
[F] theme.css Site theme
[F] theme.json Site data
[F] user.json User data
[F] .backup Marker for file backup if present
[R] file File manager upload directory
[R] source Various resources
[R] thumb Image thumbnails
[R] tmp Temporary directory
[FILE] index.php ZwiiCMS initialization file
[FILE] robots.txt Filtering of directories accessible to search engine robots
[FILE] sitemap.xml Sitemap
[FILE] sitemap.xml.gz Compressed version
[F] index.php ZwiiCMS initialization file
[F] robots.txt Filtering of directories accessible to search engine robots
[F] sitemap.xml Sitemap
[F] sitemap.xml.gz Compressed version
The .htaccess files contribute to security by filtering access to sensitive directories.

View File

@ -2,11 +2,8 @@
class autoload {
public static function autoloader () {
require_once 'core/core.php';
require_once 'core/class/router.class.php';
require_once 'core/class/helper.class.php';
require_once 'core/class/template.class.php';
require_once 'core/class/layout.class.php';
require_once 'core/class/sitemap/Runtime.class.php';
require_once 'core/class/sitemap/FileSystem.class.php';
require_once 'core/class/sitemap/SitemapGenerator.class.php';

View File

@ -26,15 +26,22 @@ class helper
public static function translate($text)
{
// La traduction existe déjà dans le core
/*
if (array_key_exists($text, core::$dialog) === false && !empty($text)) {
$dialogues = json_decode(file_get_contents('core/module/install/ressource/i18n/fr_FR.json' ), true);
$data = array_merge($dialogues,[$text => '']);
file_put_contents ('core/module/install/ressource/i18n/fr_FR.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
}
*/
*
$target = 'redirection';
$url = $_SERVER['QUERY_STRING'];
$module = explode('/', $url);
if ( $module[0] === $target)
{
// La traduction existe déjà dans le core
if (array_key_exists($text, core::$dialog) === false && !empty($text)) {
$dialogues = json_decode(file_get_contents('module/' . $target . '/i18n/fr_FR.json' ), true);
$data = array_merge($dialogues,[$text => '']);
file_put_contents ('module/' . $target . '/i18n/fr_FR.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
}
}
*/
return (array_key_exists($text, core::$dialog) && !empty(core::$dialog[$text]) ? core::$dialog[$text] : $text);
}
@ -43,41 +50,42 @@ class helper
* Date au format time()
* $format strftime
*/
public static function dateUTF8($format, $date, $locale = 'fr_FR')
public static function dateUTF8($format, $date)
{
require_once 'core/class/strftime/php-8.1-strftime.class.php';
return mb_convert_encoding(\PHP81_BC\strftime($format, $date, $locale), 'UTF-8', mb_list_encodings());
return mb_detect_encoding(\PHP81_BC\strftime($format, $date), 'UTF-8', true)
? \PHP81_BC\strftime($format, $date)
: utf8_encode(\PHP81_BC\strftime($format, $date));
}
/**
* Fonction pour assurer la traduction des messages
*/
public static function googleTranslate($to, $text)
{
public static function googleTranslate($to, $text){
if (!file_exists('site/i18n/' . $to . '.json')) {
file_put_contents('site/i18n/' . $to . '.json', json_encode([]));
file_put_contents ('site/i18n/' . $to . '.json', json_encode([]));
}
if (!empty($text)) {
//Lecture des données en ligne
$data = json_decode(file_get_contents('site/i18n/' . $to . '.json'), true);
// Mode traduction
if ($to !== 'fr_FR') {
$arrayjson = json_decode(file_get_contents('https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=' . $to . '&q=' . rawurlencode($text)), true);
$response = $arrayjson[0][0];
$arrayjson = json_decode(file_get_contents('https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=' . $to . '&q=' . rawurlencode($text)),true);
$response = $arrayjson[0][0];
// Captation
if ($data !== '') {
if (array_key_exists($text, $data)) {
if (array_key_exists($text, $data) ) {
$data[$text] = $response;
} else {
$data = array_merge($data, [$text => $response]);
$data = array_merge($data,[$text => $response]);
}
}
// Mode alimentation des chaines
// Mode alimentation des chaines
} else {
// Créer la variable
$data = array_merge($data, [$text => '']);
$data = array_merge($data,[$text => '']);
}
file_put_contents('site/i18n/' . $to . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
file_put_contents ('site/i18n/' . $to . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
}
}
@ -194,12 +202,12 @@ class helper
// Creation du ZIP
$baseName = str_replace('/', '', helper::baseUrl(false, false));
$baseName = empty($baseName) ? 'ZwiiCMS' : $baseName;
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s', time()) . '.zip';
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s', time()) . '.zip';
$zip = new ZipArchive();
$zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$directory = 'site/';
//$filter = array('backup','tmp','file');
$files = new RecursiveIteratorIterator(
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$directory,
@ -228,7 +236,7 @@ class helper
* du nom réel
* du numéro de version
*/
public static function getModules()
public static function getModules()
{
$modules = array();
$dirs = array_diff(scandir('module'), array('..', '.'));
@ -270,7 +278,7 @@ class helper
$dataDirectory = '';
}
// Affection
$modules[$value] = [
$modules[$value] = [
'name' => $value,
'realName' => $realName,
'version' => $version,
@ -353,9 +361,9 @@ class helper
* Renvoie le numéro de version de Zwii est en ligne
* @return string
*/
public static function getOnlineVersion($channel)
public static function getOnlineVersion()
{
return (helper::getUrlContents(common::ZWII_UPDATE_URL . $channel . '/version'));
return (helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version'));
}
@ -363,14 +371,14 @@ class helper
* Check si une nouvelle version de Zwii est disponible
* @return bool
*/
public static function checkNewVersion($channel)
public static function checkNewVersion()
{
$version = helper::getOnlineVersion($channel);
$update = false;
$version = helper::getOnlineVersion();
if (!empty($version)) {
$update = version_compare(common::ZWII_VERSION, $version) == -1;
return ((version_compare(common::ZWII_VERSION, $version)) === -1);
} else {
return false;
}
return $update;
}
@ -388,12 +396,12 @@ class helper
'darken' => 'rgba(' . max(0, $rgba[0] - 15) . ',' . max(0, $rgba[1] - 15) . ',' . max(0, $rgba[2] - 15) . ',' . $rgba[3] . ')',
'veryDarken' => 'rgba(' . max(0, $rgba[0] - 20) . ',' . max(0, $rgba[1] - 20) . ',' . max(0, $rgba[2] - 20) . ',' . $rgba[3] . ')',
'text' => self::relativeLuminanceW3C($rgba) > .22 ? "#222" : "#DDD",
'rgb' => 'rgb(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ')',
'rgb' => 'rgb(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ')',
'invert' => 'rgba (' .
($rgba[0] < 128 ? 255 : 0) . ',' .
($rgba[1] < 128 ? 255 : 0) . ',' .
($rgba[1] < 128 ? 255 : 0) . ',' .
($rgba[0] < 128 ? 255 : 0) . ')'
($rgba[0] < 128 ? 255 : 0) . ',' .
($rgba[1] < 128 ? 255 : 0) . ',' .
($rgba[1] < 128 ? 255 : 0) . ',' .
($rgba[0] < 128 ? 255 : 0) . ')'
];
}
@ -432,13 +440,11 @@ class helper
break;
case self::FILTER_ID:
$text = mb_strtolower($text, 'UTF-8');
$text = strip_tags(
str_replace(
explode(',', 'á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ,\',", '),
explode(',', 'a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y,-,-,-'),
$text
)
);
$text = strip_tags(str_replace(
explode(',', 'á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ,\',", '),
explode(',', 'a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y,-,-,-'),
$text
));
$text = preg_replace('/([^a-z0-9-])/', '', $text);
// Supprime les emoji
$text = preg_replace('/[[:^print:]]/', '', $text);
@ -526,10 +532,6 @@ class helper
$css = preg_replace(['(( )+{)', '({( )+)'], '{', $css);
$css = preg_replace(['(( )+})', '(}( )+)', '(;( )*})'], '}', $css);
$css = preg_replace(['(;( )+)', '(( )+;)'], ';', $css);
// Convertir les codes entités
$css = htmlspecialchars_decode($css);
// Supprime les balises HTML
$css = strip_tags($css);
// Retourne le css minifié
return $css;
}
@ -558,7 +560,7 @@ class helper
* @param null|int $sufix Suffixe de l'url
* @return array
*/
public static function pagination($array, $url, $item, $suffix = null)
public static function pagination($array, $url, $item, $sufix = null)
{
// Scinde l'url
$url = explode('/', $url);
@ -582,7 +584,7 @@ class helper
if ($nbPage > 1) {
for ($i = 1; $i <= $nbPage; $i++) {
$disabled = ($i === $currentPage) ? ' class="disabled"' : false;
$pages .= '<a href="' . helper::baseUrl() . $urlCurrent . '/' . $i . $suffix . '"' . $disabled . '>' . $i . '</a>';
$pages .= '<a href="' . helper::baseUrl() . $urlCurrent . '/' . $i . $sufix . '"' . $disabled . '>' . $i . '</a>';
}
$pages = '<div class="pagination">' . $pages . '</div>';
}
@ -672,25 +674,25 @@ class helper
/**
* Cryptage
* @param string $key la clé d'encryptage
* @param string $string la chaine à coder
* @param string $payload la chaine à coder
* @return string
*/
public static function encrypt($string, $key)
public static function encrypt($key, $payload)
{
$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
return base64_encode($encrypted);
$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 $string la chaine à décoder
* @param string $garble la chaine à décoder
* @return string
*/
public static function decrypt($string, $key)
public static function decrypt($key, $garble)
{
$decrypted = openssl_decrypt(base64_decode($string), "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
return $decrypted;
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
}
}

View File

@ -141,7 +141,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
} elseif (is_array($key)) {
// Iterate array of paths
foreach ($key as $k) {
self::deleteValue($array, $k);
self::delete($k);
}
}
}

View File

@ -18,12 +18,6 @@ class JsonDb extends \Prowebcraft\Dot
protected $db = '';
protected $data = null;
protected $config = [];
// Tentative d'encodage après échec
const MAX_JSON_ENCODE_ATTEMPTS = 5;
// Tentative d'écriture après échec
const MAX_FILE_WRITE_ATTEMPTS = 5;
// Délais entre deux tentaives
const RETRY_DELAY_SECONDS = 1;
public function __construct($config = [])
{
@ -58,8 +52,7 @@ class JsonDb extends \Prowebcraft\Dot
public function set($key, $value = null, $save = true)
{
parent::set($key, $value);
if ($save)
$this->save();
if ($save) $this->save();
return $this;
}
@ -75,8 +68,7 @@ class JsonDb extends \Prowebcraft\Dot
public function add($key, $value = null, $pop = false, $save = true)
{
parent::add($key, $value, $pop);
if ($save)
$this->save();
if ($save) $this->save();
return $this;
}
@ -90,8 +82,7 @@ class JsonDb extends \Prowebcraft\Dot
public function delete($key, $save = true)
{
parent::delete($key);
if ($save)
$this->save();
if ($save) $this->save();
return $this;
}
@ -107,8 +98,7 @@ class JsonDb extends \Prowebcraft\Dot
public function clear($key = null, $format = false, $save = true)
{
parent::clear($key, $format);
if ($save)
$this->save();
if ($save) $this->save();
return $this;
}
@ -118,20 +108,19 @@ class JsonDb extends \Prowebcraft\Dot
* @param bool $reload Reboot data?
* @return array|mixed|null
*/
protected function loadData($reload = false)
{
protected function loadData($reload = false) {
if ($this->data === null || $reload) {
$this->db = $this->config['dir'] . $this->config['name'];
$this->db = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'];
if (!file_exists($this->db)) {
return null; // Rebuild database manage by CMS
} else {
if ($this->config['backup']) {
try {
copy($this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'], $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup');
} catch (\Exception $e) {
error_log('Erreur de chargement : ' . $e);
exit('Erreur de chargement : ' . $e);
}
try {
//todo make backup of database
copy ($this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'], $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup');
} catch (\Exception $e) {
}
}
}
$this->data = json_decode(file_get_contents($this->db), true);
@ -146,42 +135,22 @@ class JsonDb extends \Prowebcraft\Dot
/**
* Save database
*/
public function save()
{
// Encode les données au format JSON avec les options spécifiées
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
// Vérifie la longueur de la chaîne JSON encodée
$encoded_length = strlen($encoded_data);
// Initialise le compteur de tentatives
$attempt = 0;
// Tente d'encoder les données en JSON et de les sauvegarder jusqu'à 5 fois en cas d'échec
while ($attempt < 5) {
// Essaye d'écrire les données encodées dans le fichier de base de données
$write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou
// Vérifie si l'écriture a réussi
if ($write_result === $encoded_length) {
// Sort de la boucle si l'écriture a réussi
public function save() {
$lenght = strlen(json_encode($this->data));
$try = 0;
while ($try < 5) {
$written = file_put_contents($this->db, json_encode($this->data), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX); // Multi user get a locker
if ($written == $lenght) {
break;
}
// Incrémente le compteur de tentatives
$attempt++;
// Attente
$try++;
sleep(1);
}
// Vérifie si l'écriture a échoué même après plusieurs tentatives
if ($write_result !== $encoded_length) {
// Enregistre un message d'erreur dans le journal des erreurs
error_log('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
// Affiche un message d'erreur et termine le script
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
if ($written !== $lenght) {
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées');
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -350,8 +350,8 @@ class PHPMailer
public $Password = '';
/**
* SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2.
* If not specified, the first one from that list that the server supports will be selected.
* SMTP auth type.
* Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified.
*
* @var string
*/
@ -750,7 +750,7 @@ class PHPMailer
*
* @var string
*/
const VERSION = '6.7.1';
const VERSION = '6.6.0';
/**
* Error severity: message only, continue processing.
@ -858,7 +858,7 @@ class PHPMailer
private function mailPassthru($to, $subject, $body, $header, $params)
{
//Check overloading of mail function to avoid double-encoding
if ((int)ini_get('mbstring.func_overload') & 1) {
if (ini_get('mbstring.func_overload') & 1) {
$subject = $this->secureHeader($subject);
} else {
$subject = $this->encodeHeader($this->secureHeader($subject));
@ -1066,8 +1066,8 @@ class PHPMailer
* Addresses that have been added already return false, but do not throw exceptions.
*
* @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
* @param string $address The email address
* @param string $name An optional username associated with the address
* @param string $address The email address to send, resp. to reply to
* @param string $name
*
* @throws Exception
*
@ -1075,11 +1075,9 @@ class PHPMailer
*/
protected function addOrEnqueueAnAddress($kind, $address, $name)
{
$pos = false;
if ($address !== null) {
$address = trim($address);
$pos = strrpos($address, '@');
}
$address = trim($address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
$pos = strrpos($address, '@');
if (false === $pos) {
//At-sign is missing.
$error_message = sprintf(
@ -1096,14 +1094,8 @@ class PHPMailer
return false;
}
if ($name !== null && is_string($name)) {
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
} else {
$name = '';
}
$params = [$kind, $address, $name];
//Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
//Domain is assumed to be whatever is after the last @ symbol in the address
if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) {
if ('Reply-To' !== $kind) {
if (!array_key_exists($address, $this->RecipientsQueue)) {
@ -1124,22 +1116,6 @@ class PHPMailer
return call_user_func_array([$this, 'addAnAddress'], $params);
}
/**
* Set the boundaries to use for delimiting MIME parts.
* If you override this, ensure you set all 3 boundaries to unique values.
* The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies,
* as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7
*
* @return void
*/
public function setBoundaries()
{
$this->uniqueid = $this->generateId();
$this->boundary[1] = 'b1=_' . $this->uniqueid;
$this->boundary[2] = 'b2=_' . $this->uniqueid;
$this->boundary[3] = 'b3=_' . $this->uniqueid;
}
/**
* Add an address to one of the recipient arrays or to the ReplyTo array.
* Addresses that have been added already return false, but do not throw exceptions.
@ -1304,7 +1280,7 @@ class PHPMailer
*/
public function setFrom($address, $name = '', $auto = true)
{
$address = trim((string)$address);
$address = trim($address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
//Don't validate now addresses with IDN. Will be done in send().
$pos = strrpos($address, '@');
@ -1571,17 +1547,17 @@ class PHPMailer
//Validate From, Sender, and ConfirmReadingTo addresses
foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) {
$this->{$address_kind} = trim($this->{$address_kind});
if (empty($this->{$address_kind})) {
$this->$address_kind = trim($this->$address_kind);
if (empty($this->$address_kind)) {
continue;
}
$this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind});
if (!static::validateAddress($this->{$address_kind})) {
$this->$address_kind = $this->punyencodeAddress($this->$address_kind);
if (!static::validateAddress($this->$address_kind)) {
$error_message = sprintf(
'%s (%s): %s',
$this->lang('invalid_address'),
$address_kind,
$this->{$address_kind}
$this->$address_kind
);
$this->setError($error_message);
$this->edebug($error_message);
@ -1681,17 +1657,17 @@ class PHPMailer
default:
$sendMethod = $this->Mailer . 'Send';
if (method_exists($this, $sendMethod)) {
return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody);
return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
}
return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
}
} catch (Exception $exc) {
$this->setError($exc->getMessage());
$this->edebug($exc->getMessage());
if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) {
if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) {
$this->smtp->reset();
}
$this->setError($exc->getMessage());
$this->edebug($exc->getMessage());
if ($this->exceptions) {
throw $exc;
}
@ -1879,7 +1855,7 @@ class PHPMailer
if (!static::isPermittedPath($path)) {
return false;
}
$readable = is_file($path);
$readable = file_exists($path);
//If not a UNC path (expected to start with \\), check read permission, see #2069
if (strpos($path, '\\\\') !== 0) {
$readable = $readable && is_readable($path);
@ -1907,14 +1883,7 @@ class PHPMailer
foreach ($this->to as $toaddr) {
$toArr[] = $this->addrFormat($toaddr);
}
$to = trim(implode(', ', $toArr));
//If there are no To-addresses (e.g. when sending only to BCC-addresses)
//the following should be added to get a correct DKIM-signature.
//Compare with $this->preSend()
if ($to === '') {
$to = 'undisclosed-recipients:;';
}
$to = implode(', ', $toArr);
$params = null;
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
@ -2117,9 +2086,6 @@ class PHPMailer
$this->smtp->setDebugLevel($this->SMTPDebug);
$this->smtp->setDebugOutput($this->Debugoutput);
$this->smtp->setVerp($this->do_verp);
if ($this->Host === null) {
$this->Host = 'localhost';
}
$hosts = explode(';', $this->Host);
$lastexception = null;
@ -2226,8 +2192,7 @@ class PHPMailer
//As we've caught all exceptions, just report whatever the last one was
if ($this->exceptions && null !== $lastexception) {
throw $lastexception;
}
if ($this->exceptions) {
} elseif ($this->exceptions) {
// no exception was thrown, likely $this->smtp->connect() failed
$message = $this->getSmtpErrorMessage('connect_host');
throw new Exception($message);
@ -2810,7 +2775,10 @@ class PHPMailer
{
$body = '';
//Create unique IDs and preset boundaries
$this->setBoundaries();
$this->uniqueid = $this->generateId();
$this->boundary[1] = 'b1_' . $this->uniqueid;
$this->boundary[2] = 'b2_' . $this->uniqueid;
$this->boundary[3] = 'b3_' . $this->uniqueid;
if ($this->sign_key_file) {
$body .= $this->getMailMIME() . static::$LE;
@ -2846,7 +2814,7 @@ class PHPMailer
$altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
}
//Use this as a preamble in all multipart message types
$mimepre = '';
$mimepre = 'This is a multi-part message in MIME format.' . static::$LE . static::$LE;
switch ($this->message_type) {
case 'inline':
$body .= $mimepre;
@ -3082,18 +3050,6 @@ class PHPMailer
return $body;
}
/**
* Get the boundaries that this message will use
* @return array
*/
public function getBoundaries()
{
if (empty($this->boundary)) {
$this->setBoundaries();
}
return $this->boundary;
}
/**
* Return the start of a message boundary.
*
@ -3749,21 +3705,20 @@ class PHPMailer
* These differ from 'regular' attachments in that they are intended to be
* displayed inline with the message, not just attached for download.
* This is used in HTML messages that embed the images
* the HTML refers to using the `$cid` value in `img` tags, for example `<img src="cid:mylogo">`.
* the HTML refers to using the $cid value.
* Never use a user-supplied path to a file!
*
* @param string $path Path to the attachment
* @param string $cid Content ID of the attachment; Use this to reference
* the content when using an embedded image in HTML
* @param string $name Overrides the attachment filename
* @param string $encoding File encoding (see $Encoding) defaults to `base64`
* @param string $type File MIME type (by default mapped from the `$path` filename's extension)
* @param string $disposition Disposition to use: `inline` (default) or `attachment`
* (unlikely you want this {@see `addAttachment()`} instead)
* @param string $name Overrides the attachment name
* @param string $encoding File encoding (see $Encoding)
* @param string $type File MIME type
* @param string $disposition Disposition to use
*
* @return bool True on successfully adding an attachment
* @throws Exception
*
* @return bool True on successfully adding an attachment
*/
public function addEmbeddedImage(
$path,
@ -4141,8 +4096,12 @@ class PHPMailer
//Is it a valid IPv4 address?
return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
}
//Is it a syntactically valid hostname (when embeded in a URL)?
return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false;
if (filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false) {
//Is it a syntactically valid hostname?
return true;
}
return false;
}
/**
@ -4211,7 +4170,6 @@ class PHPMailer
* @param string $name Custom header name
* @param string|null $value Header value
*
* @return bool True if a header was set successfully
* @throws Exception
*/
public function addCustomHeader($name, $value = null)
@ -4506,7 +4464,6 @@ class PHPMailer
'ics' => 'text/calendar',
'xml' => 'text/xml',
'xsl' => 'text/xml',
'csv' => 'text/csv',
'wmv' => 'video/x-ms-wmv',
'mpeg' => 'video/mpeg',
'mpe' => 'video/mpeg',
@ -4614,7 +4571,7 @@ class PHPMailer
public function set($name, $value = '')
{
if (property_exists($this, $name)) {
$this->{$name} = $value;
$this->$name = $value;
return true;
}
@ -4661,27 +4618,15 @@ class PHPMailer
}
/**
* Remove trailing whitespace from a string.
*
* @param string $text
*
* @return string The text to remove whitespace from
*/
public static function stripTrailingWSP($text)
{
return rtrim($text, " \r\n\t");
}
/**
* Strip trailing line breaks from a string.
* Remove trailing breaks from a string.
*
* @param string $text
*
* @return string The text to remove breaks from
*/
public static function stripTrailingBreaks($text)
public static function stripTrailingWSP($text)
{
return rtrim($text, "\r\n");
return rtrim($text, " \r\n\t");
}
/**
@ -4847,7 +4792,7 @@ class PHPMailer
$body = static::normalizeBreaks($body, self::CRLF);
//Reduce multiple trailing line breaks to a single one
return static::stripTrailingBreaks($body) . self::CRLF;
return static::stripTrailingWSP($body) . self::CRLF;
}
/**

View File

@ -35,7 +35,7 @@ class SMTP
*
* @var string
*/
const VERSION = '6.7.1';
const VERSION = '6.6.0';
/**
* SMTP line break constant.
@ -682,6 +682,7 @@ class SMTP
*/
public function close()
{
$this->setError('');
$this->server_caps = null;
$this->helo_rply = null;
if (is_resource($this->smtp_conn)) {
@ -1036,10 +1037,7 @@ class SMTP
return false;
}
//Don't clear the error store when using keepalive
if ($command !== 'RSET') {
$this->setError('');
}
$this->setError('');
return true;
}

View File

@ -1,28 +0,0 @@
<?php
/**
* German PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
*/
$PHPMAILER_LANG['authenticate'] = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';
$PHPMAILER_LANG['connect_host'] = 'SMTP-Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-Fehler: Daten werden nicht akzeptiert.';
$PHPMAILER_LANG['empty_message'] = 'E-Mail-Inhalt ist leer.';
$PHPMAILER_LANG['encoding'] = 'Unbekannte Kodierung: ';
$PHPMAILER_LANG['execute'] = 'Konnte folgenden Befehl nicht ausführen: ';
$PHPMAILER_LANG['file_access'] = 'Zugriff auf folgende Datei fehlgeschlagen: ';
$PHPMAILER_LANG['file_open'] = 'Dateifehler: Konnte folgende Datei nicht öffnen: ';
$PHPMAILER_LANG['from_failed'] = 'Die folgende Absenderadresse ist nicht korrekt: ';
$PHPMAILER_LANG['instantiate'] = 'Mail-Funktion konnte nicht initialisiert werden.';
$PHPMAILER_LANG['invalid_address'] = 'Die Adresse ist ungültig: ';
$PHPMAILER_LANG['invalid_hostentry'] = 'Ungültiger Hosteintrag: ';
$PHPMAILER_LANG['invalid_host'] = 'Ungültiger Host: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';
$PHPMAILER_LANG['provide_address'] = 'Bitte geben Sie mindestens eine Empfängeradresse an.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: ';
$PHPMAILER_LANG['signing'] = 'Fehler beim Signieren: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Verbindung zum SMTP-Server fehlgeschlagen.';
$PHPMAILER_LANG['smtp_error'] = 'Fehler vom SMTP-Server: ';
$PHPMAILER_LANG['variable_set'] = 'Kann Variable nicht setzen oder zurücksetzen: ';
$PHPMAILER_LANG['extension_missing'] = 'Fehlende Erweiterung: ';

View File

@ -1,33 +0,0 @@
<?php
/**
* Greek PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
*/
$PHPMAILER_LANG['authenticate'] = 'Σφάλμα SMTP: Αδυναμία πιστοποίησης.';
$PHPMAILER_LANG['buggy_php'] = 'Η έκδοση PHP που χρησιμοποιείτε παρουσιάζει σφάλμα που μπορεί να έχει ως αποτέλεσμα κατεστραμένα μηνύματα. Για να το διορθώσετε, αλλάξτε τον τρόπο αποστολής σε SMTP, απενεργοποιήστε την επιλογή mail.add_x_header στο αρχείο php.ini, αλλάξτε λειτουργικό σε MacOS ή Linux ή αναβαθμίστε την PHP σε έκδοση 7.0.17+ ή 7.1.3+.';
$PHPMAILER_LANG['connect_host'] = 'Σφάλμα SMTP: Αδυναμία σύνδεσης με τον φιλοξενητή SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'Σφάλμα SMTP: Μη αποδεκτά δεδομένα.';
$PHPMAILER_LANG['empty_message'] = 'Η ηλεκτρονική επιστολή δεν έχει περιεχόμενο.';
$PHPMAILER_LANG['encoding'] = 'Άγνωστη μορφή κωδικοποίησης: ';
$PHPMAILER_LANG['execute'] = 'Αδυναμία εκτέλεσης: ';
$PHPMAILER_LANG['extension_missing'] = 'Απουσία επέκτασης: ';
$PHPMAILER_LANG['file_access'] = 'Αδυναμία πρόσβασης στο αρχείο: ';
$PHPMAILER_LANG['file_open'] = 'Σφάλμα Αρχείου: Αδυναμία ανοίγματος αρχείου: ';
$PHPMAILER_LANG['from_failed'] = 'Η ακόλουθη διεύθυνση αποστολέα δεν είναι σωστή: ';
$PHPMAILER_LANG['instantiate'] = 'Αδυναμία εκκίνησης συνάρτησης Mail.';
$PHPMAILER_LANG['invalid_address'] = 'Μη έγκυρη διεύθυνση: ';
$PHPMAILER_LANG['invalid_header'] = 'Μη έγκυρο όνομα κεφαλίδας ή τιμή';
$PHPMAILER_LANG['invalid_hostentry'] = 'Μη έγκυρη εισαγωγή φιλοξενητή: ';
$PHPMAILER_LANG['invalid_host'] = 'Μη έγκυρος φιλοξενητής: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.';
$PHPMAILER_LANG['provide_address'] = 'Δώστε τουλάχιστον μια ηλεκτρονική διεύθυνση παραλήπτη.';
$PHPMAILER_LANG['recipients_failed'] = 'Σφάλμα SMTP: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
$PHPMAILER_LANG['signing'] = 'Σφάλμα υπογραφής: ';
$PHPMAILER_LANG['smtp_code'] = 'Κώδικάς SMTP: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'Πρόσθετες πληροφορίες SMTP: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Αποτυχία σύνδεσης SMTP.';
$PHPMAILER_LANG['smtp_detail'] = 'Λεπτομέρεια: ';
$PHPMAILER_LANG['smtp_error'] = 'Σφάλμα με τον διακομιστή SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'Αδυναμία ορισμού ή επαναφοράς μεταβλητής: ';

View File

@ -1,31 +0,0 @@
<?php
/**
* Spanish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
* @author Matt Sturdy <matt.sturdy@gmail.com>
* @author Crystopher Glodzienski Cardoso <crystopher.glodzienski@gmail.com>
*/
$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.';
$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.';
$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.';
$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: ';
$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: ';
$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: ';
$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: ';
$PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.';
$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.';
$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.';
$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: ';
$PHPMAILER_LANG['signing'] = 'Error al firmar: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.';
$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: ';
$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: ';
$PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: ';
$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido';

View File

@ -1,28 +0,0 @@
<?php
/**
* Italian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
* @author Ilias Bartolini <brain79@inwind.it>
* @author Stefano Sabatini <sabas88@gmail.com>
*/
$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.';
$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dati non accettati dal server.';
$PHPMAILER_LANG['empty_message'] = 'Il corpo del messaggio è vuoto';
$PHPMAILER_LANG['encoding'] = 'Codifica dei caratteri sconosciuta: ';
$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: ';
$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: ';
$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: ';
$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: ';
$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail';
$PHPMAILER_LANG['invalid_address'] = 'Impossibile inviare, l\'indirizzo email non è valido: ';
$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente';
$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: ';
$PHPMAILER_LANG['signing'] = 'Errore nella firma: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallita.';
$PHPMAILER_LANG['smtp_error'] = 'Errore del server SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'Impossibile impostare o resettare la variabile: ';
$PHPMAILER_LANG['extension_missing'] = 'Estensione mancante: ';

View File

@ -1,27 +0,0 @@
<?php
/**
* Portuguese (European) PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
* @author Jonadabe <jonadabe@hotmail.com>
*/
$PHPMAILER_LANG['authenticate'] = 'Erro do SMTP: Não foi possível realizar a autenticação.';
$PHPMAILER_LANG['connect_host'] = 'Erro do SMTP: Não foi possível realizar ligação com o servidor SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'Erro do SMTP: Os dados foram rejeitados.';
$PHPMAILER_LANG['empty_message'] = 'A mensagem no e-mail está vazia.';
$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: ';
$PHPMAILER_LANG['execute'] = 'Não foi possível executar: ';
$PHPMAILER_LANG['file_access'] = 'Não foi possível aceder o ficheiro: ';
$PHPMAILER_LANG['file_open'] = 'Abertura do ficheiro: Não foi possível abrir o ficheiro: ';
$PHPMAILER_LANG['from_failed'] = 'Ocorreram falhas nos endereços dos seguintes remententes: ';
$PHPMAILER_LANG['instantiate'] = 'Não foi possível iniciar uma instância da função mail.';
$PHPMAILER_LANG['invalid_address'] = 'Não foi enviado nenhum e-mail para o endereço de e-mail inválido: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';
$PHPMAILER_LANG['provide_address'] = 'Tem de fornecer pelo menos um endereço como destinatário do e-mail.';
$PHPMAILER_LANG['recipients_failed'] = 'Erro do SMTP: O endereço do seguinte destinatário falhou: ';
$PHPMAILER_LANG['signing'] = 'Erro ao assinar: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.';
$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: ';
$PHPMAILER_LANG['extension_missing'] = 'Extensão em falta: ';

View File

@ -1,31 +0,0 @@
<?php
/**
* Turkish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
* @author Elçin Özel
* @author Can Yılmaz
* @author Mehmet Benlioğlu
* @author @yasinaydin
* @author Ogün Karakuş
*/
$PHPMAILER_LANG['authenticate'] = 'SMTP Hatası: Oturum açılamadı.';
$PHPMAILER_LANG['connect_host'] = 'SMTP Hatası: SMTP sunucusuna bağlanılamadı.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Hatası: Veri kabul edilmedi.';
$PHPMAILER_LANG['empty_message'] = 'Mesajın içeriği boş';
$PHPMAILER_LANG['encoding'] = 'Bilinmeyen karakter kodlama: ';
$PHPMAILER_LANG['execute'] = 'Çalıştırılamadı: ';
$PHPMAILER_LANG['file_access'] = 'Dosyaya erişilemedi: ';
$PHPMAILER_LANG['file_open'] = 'Dosya Hatası: Dosya açılamadı: ';
$PHPMAILER_LANG['from_failed'] = 'Belirtilen adreslere gönderme başarısız: ';
$PHPMAILER_LANG['instantiate'] = 'Örnek e-posta fonksiyonu oluşturulamadı.';
$PHPMAILER_LANG['invalid_address'] = 'Geçersiz e-posta adresi: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' e-posta kütüphanesi desteklenmiyor.';
$PHPMAILER_LANG['provide_address'] = 'En az bir alıcı e-posta adresi belirtmelisiniz.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Hatası: Belirtilen alıcılara ulaşılamadı: ';
$PHPMAILER_LANG['signing'] = 'İmzalama hatası: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP connect() fonksiyonu başarısız.';
$PHPMAILER_LANG['smtp_error'] = 'SMTP sunucu hatası: ';
$PHPMAILER_LANG['variable_set'] = 'Değişken ayarlanamadı ya da sıfırlanamadı: ';
$PHPMAILER_LANG['extension_missing'] = 'Eklenti bulunamadı: ';

View File

@ -1,890 +0,0 @@
<?php
class core extends common
{
/**
* Constructeur du coeur
*/
public function __construct()
{
parent::__construct();
// Token CSRF
if (empty($_SESSION['csrf'])) {
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(128));
}
// Fuseau horaire
common::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper
date_default_timezone_set(common::$timezone);
// Supprime les fichiers temporaires
$lastClearTmp = mktime(0, 0, 0);
if ($lastClearTmp > $this->getData(['core', 'lastClearTmp']) + 86400) {
$iterator = new DirectoryIterator(common::TEMP_DIR);
foreach ($iterator as $fileInfos) {
if (
$fileInfos->isFile() &&
$fileInfos->getBasename() !== '.htaccess' &&
$fileInfos->getBasename() !== '.gitkeep'
) {
@unlink($fileInfos->getPathname());
}
}
// Date de la dernière suppression
$this->setData(['core', 'lastClearTmp', $lastClearTmp]);
// Enregistre les données
//$this->SaveData();
}
// Backup automatique des données
$lastBackup = mktime(0, 0, 0);
if (
$this->getData(['config', 'autoBackup'])
and $lastBackup > $this->getData(['core', 'lastBackup']) + 86400
and $this->getData(['user']) // Pas de backup pendant l'installation
) {
// Copie des fichier de données
helper::autoBackup(common::BACKUP_DIR, ['backup', 'tmp', 'file']);
// Date du dernier backup
$this->setData(['core', 'lastBackup', $lastBackup]);
// Supprime les backups de plus de 30 jours
$iterator = new DirectoryIterator(common::BACKUP_DIR);
foreach ($iterator as $fileInfos) {
if (
$fileInfos->isFile()
and $fileInfos->getBasename() !== '.htaccess'
and $fileInfos->getMTime() + (86400 * 30) < time()
) {
@unlink($fileInfos->getPathname());
}
}
}
// Crée le fichier de personnalisation avancée
if (file_exists(common::DATA_DIR . 'custom.css') === false) {
$this->secure_file_put_contents(common::DATA_DIR . 'custom.css', file_get_contents('core/module/theme/resource/custom.css'));
chmod(common::DATA_DIR . 'custom.css', 0755);
}
// Crée le fichier de personnalisation
if (file_exists(common::DATA_DIR . 'theme.css') === false) {
$this->secure_file_put_contents(common::DATA_DIR . 'theme.css', '');
chmod(common::DATA_DIR . 'theme.css', 0755);
}
// Crée le fichier de personnalisation de l'administration
if (file_exists(common::DATA_DIR . 'admin.css') === false) {
$this->secure_file_put_contents(common::DATA_DIR . 'admin.css', '');
chmod(common::DATA_DIR . 'admin.css', 0755);
}
// Check la version rafraichissement du theme
$cssVersion = preg_split('/\*+/', file_get_contents(common::DATA_DIR . 'theme.css'));
if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) {
// Version
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
/**
* Import des polices de caractères
* A partir du CDN
* ou dans le dossier site/file/source/fonts
* ou pas du tout si fonte webSafe
*/
// Fonts disponibles
$fontsAvailable['files'] = $this->getData(['font', 'files']);
$fontsAvailable['imported'] = $this->getData(['font', 'imported']);
$fontsAvailable['websafe'] = common::$fontsWebSafe;
// Fontes installées
$fonts = [
$this->getData(['theme', 'text', 'font']),
$this->getData(['theme', 'title', 'font']),
$this->getData(['theme', 'header', 'font']),
$this->getData(['theme', 'menu', 'font']),
$this->getData(['theme', 'footer', 'font'])
];
// Suppression des polices identiques
$fonts = array_unique($fonts);
/**
* Charge les fontes
*/
foreach ($fonts as $fontId) {
foreach (['websafe', 'imported', 'files'] as $typeFont) {
if (isset($fontsAvailable[$typeFont][$fontId])) {
$fonts[$fontId] = $fontsAvailable[$typeFont][$fontId]['font-family'];
}
}
}
// Fond du body
$colors = helper::colorVariants($this->getData(['theme', 'body', 'backgroundColor']));
// Body
$css .= 'body{font-family:' . $fonts[$this->getData(['theme', 'text', 'font'])] . ';}';
if ($themeBodyImage = $this->getData(['theme', 'body', 'image'])) {
// Image dans html pour éviter les déformations.
$css .= 'html {background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}';
// Couleur du body transparente
$css .= 'body {background-color: rgba(0,0,0,0)}';
} else {
// Pas d'image couleur du body
$css .= 'html {background-color:' . $colors['normal'] . ';}';
}
// Icône BacktoTop
$css .= '#backToTop {background-color:' . $this->getData(['theme', 'body', 'toTopbackgroundColor']) . ';color:' . $this->getData(['theme', 'body', 'toTopColor']) . ';}';
// Site
$colors = helper::colorVariants($this->getData(['theme', 'text', 'linkColor']));
$css .= 'a{color:' . $colors['normal'] . '}';
// Couleurs de site dans TinyMCe
$css .= 'div.mce-edit-area {font-family:' . $fonts[$this->getData(['theme', 'text', 'font'])] . ';}';
// Site dans TinyMCE
$css .= '.editorWysiwyg, .editorWysiwygComment {background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';}';
$css .= 'span.mce-text{background-color: unset !important;}';
$css .= 'body,.row > div{font-size:' . $this->getData(['theme', 'text', 'fontSize']) . '}';
$css .= 'body{color:' . $this->getData(['theme', 'text', 'textColor']) . '}';
$css .= 'select,input[type=password],input[type=email],input[type=text],input[type=date],input[type=time],input[type=week],input[type=month],input[type=datetime-local],.inputFile,select,textarea{color:' . $this->getData(['theme', 'text', 'textColor']) . ';background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';}';
// spécifiques au module de blog
$css .= '.blogDate {color:' . $this->getData(['theme', 'text', 'textColor']) . ';}.blogPicture img{border:1px solid ' . $this->getData(['theme', 'text', 'textColor']) . '; box-shadow: 1px 1px 5px ' . $this->getData(['theme', 'text', 'textColor']) . ';}';
// Couleur fixée dans admin.css
$css .= '.container {max-width:' . $this->getData(['theme', 'site', 'width']) . '}';
$margin = $this->getData(['theme', 'site', 'margin']) ? '0' : '20px';
// Marge supplémentaire lorsque le pied de page est fixe
if (
$this->getData(['theme', 'footer', 'fixed']) === true &&
$this->getData(['theme', 'footer', 'position']) === 'body'
) {
$marginBottomLarge = ((str_replace('px', '', $this->getData(['theme', 'footer', 'height'])) * 2) + 31) . 'px';
$marginBottomSmall = ((str_replace('px', '', $this->getData(['theme', 'footer', 'height'])) * 2) + 93) . 'px';
} else {
$marginBottomSmall = $margin;
$marginBottomLarge = $margin;
}
$css .= $this->getData(['theme', 'site', 'width']) === '100%'
? '@media (min-width: 769px) {#site{margin:0 auto ' . $marginBottomLarge . ' 0 !important;}}@media (max-width: 768px) {#site{margin:0 auto ' . $marginBottomSmall . ' 0 !important;}}#site.light{margin:5% auto !important;} body{margin:0 auto !important;} #bar{margin:0 auto !important;} body > header{margin:0 auto !important;} body > nav {margin: 0 auto !important;} body > footer {margin:0 auto !important;}'
: '@media (min-width: 769px) {#site{margin: ' . $margin . ' auto ' . $marginBottomLarge . ' auto !important;}}@media (max-width: 768px) {#site{margin: ' . $margin . ' auto ' . $marginBottomSmall . ' auto !important;}}#site.light{margin: 5% auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} ';
$css .= $this->getData(['theme', 'site', 'width']) === '750px'
? '.button, button{font-size:0.8em;}'
: '';
$css .= '#site{background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';border-radius:' . $this->getData(['theme', 'site', 'radius']) . ';box-shadow:' . $this->getData(['theme', 'site', 'shadow']) . ' #212223;}';
$colors = helper::colorVariants($this->getData(['theme', 'button', 'backgroundColor']));
$css .= '.speechBubble,.button,.button:hover,button[type=submit],.pagination a,.pagination a:hover,input[type=checkbox]:checked + label:before,input[type=radio]:checked + label:before,.helpContent{background-color:' . $colors['normal'] . ';color:' . $colors['text'] . '}';
$css .= '.helpButton span{color:' . $colors['normal'] . '}';
$css .= 'input[type=text]:hover,input[type=date]:hover,input[type=time]:hover,input[type=week]:hover,input[type=month]:hover,input[type=datetime-local]:hover,input[type=password]:hover,.inputFile:hover,select:hover,textarea:hover{border-color:' . $colors['normal'] . '}';
$css .= '.speechBubble:before{border-color:' . $colors['normal'] . ' transparent transparent transparent}';
$css .= '.button:hover,button[type=submit]:hover,.pagination a:hover,input[type=checkbox]:not(:active):checked:hover + label:before,input[type=checkbox]:active + label:before,input[type=radio]:checked:hover + label:before,input[type=radio]:not(:checked):active + label:before{background-color:' . $colors['darken'] . '}';
$css .= '.helpButton span:hover{color:' . $colors['darken'] . '}';
$css .= '.button:active,button[type=submit]:active,.pagination a:active{background-color:' . $colors['veryDarken'] . '}';
$colors = helper::colorVariants($this->getData(['theme', 'title', 'textColor']));
$css .= 'h1,h2,h3,h4,h5,h6,h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:' . $colors['normal'] . ';font-family:' . $fonts[$this->getData(['theme', 'title', 'font'])] . ';font-weight:' . $this->getData(['theme', 'title', 'fontWeight']) . ';text-transform:' . $this->getData(['theme', 'title', 'textTransform']) . '}';
$css .= 'h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:' . $colors['darken'] . '}';
// Les blocs
$colors = helper::colorVariants($this->getData(['theme', 'block', 'backgroundColor']));
$css .= '.block {border: 1px solid ' . $this->getdata(['theme', 'block', 'borderColor']) . ';}.block h4 {background-color:' . $colors['normal'] . ';color:' . $colors['text'] . ';}';
// Bannière
// Eléments communs
if ($this->getData(['theme', 'header', 'margin'])) {
if ($this->getData(['theme', 'menu', 'position']) === 'site-first') {
$css .= 'header{margin:0 20px}';
} else {
$css .= 'header{margin:20px 20px 0 20px}';
}
}
$colors = helper::colorVariants($this->getData(['theme', 'header', 'backgroundColor']));
$css .= 'header{background-color:' . $colors['normal'] . ';}';
// Bannière de type papier peint
if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper') {
$css .= 'header{background-size:' . $this->getData(['theme', 'header', 'imageContainer']) . '}';
$css .= 'header{background-color:' . $colors['normal'];
// Valeur de hauteur traditionnelle
$css .= ';height:' . $this->getData(['theme', 'header', 'height']) . ';line-height:' . $this->getData(['theme', 'header', 'height']);
$css .= ';text-align:' . $this->getData(['theme', 'header', 'textAlign']) . '}';
if ($themeHeaderImage = $this->getData(['theme', 'header', 'image'])) {
$css .= 'header{background-image:url("../file/source/' . $themeHeaderImage . '");background-position:' . $this->getData(['theme', 'header', 'imagePosition']) . ';background-repeat:' . $this->getData(['theme', 'header', 'imageRepeat']) . '}';
}
$colors = helper::colorVariants($this->getData(['theme', 'header', 'textColor']));
$css .= 'header span{color:' . $colors['normal'] . ';font-family:' . $fonts[$this->getData(['theme', 'header', 'font'])] . ';font-weight:' . $this->getData(['theme', 'header', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'header', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'header', 'textTransform']) . '}';
}
// Bannière au Contenu HTML
if ($this->getData(['theme', 'header', 'feature']) === 'feature') {
// Hauteur de la taille du contenu perso
$css .= 'header {height:' . $this->getData(['theme', 'header', 'height']) . '; min-height:' . $this->getData(['theme', 'header', 'height']) . ';overflow: hidden;}';
}
// Menu
$colors = helper::colorVariants($this->getData(['theme', 'menu', 'backgroundColor']));
$css .= 'nav,nav.navMain a{background-color:' . $colors['normal'] . '}';
$css .= 'nav a,#toggle span,nav a:hover{color:' . $this->getData(['theme', 'menu', 'textColor']) . '}';
$css .= 'nav a:hover{background-color:' . $colors['darken'] . '}';
$css .= 'nav a.active{color:' . $this->getData(['theme', 'menu', 'activeTextColor']) . ';}';
if ($this->getData(['theme', 'menu', 'activeColorAuto']) === true) {
$css .= 'nav a.active{background-color:' . $colors['veryDarken'] . '}';
} else {
$css .= 'nav a.active{background-color:' . $this->getData(['theme', 'menu', 'activeColor']) . '}';
}
$css .= 'nav #burgerText{color:' . $colors['text'] . '}';
// Sous menu
$colors = helper::colorVariants($this->getData(['theme', 'menu', 'backgroundColorSub']));
$css .= 'nav .navSub a{background-color:' . $colors['normal'] . '}';
$css .= 'nav .navMain a.active {border-radius:' . $this->getData(['theme', 'menu', 'radius']) . '}';
$css .= '#menu{text-align:' . $this->getData(['theme', 'menu', 'textAlign']) . '}';
if ($this->getData(['theme', 'menu', 'margin'])) {
if (
$this->getData(['theme', 'menu', 'position']) === 'site-first'
or $this->getData(['theme', 'menu', 'position']) === 'site-second'
) {
$css .= 'nav{padding:10px 10px 0 10px;}';
} else {
$css .= 'nav{padding:0 10px}';
}
} else {
$css .= 'nav{margin:0}';
}
if (
$this->getData(['theme', 'menu', 'position']) === 'top'
) {
$css .= 'nav{padding:0 10px;}';
}
$css .= '#toggle span,#menu a{padding:' . $this->getData(['theme', 'menu', 'height']) . ';font-family:' . $fonts[$this->getData(['theme', 'menu', 'font'])] . ';font-weight:' . $this->getData(['theme', 'menu', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'menu', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'menu', 'textTransform']) . '}';
// Pied de page
$colors = helper::colorVariants($this->getData(['theme', 'footer', 'backgroundColor']));
if ($this->getData(['theme', 'footer', 'margin'])) {
$css .= 'footer{padding:0 20px;}';
} else {
$css .= 'footer{padding:0}';
}
$css .= 'footer span, #footerText > p {color:' . $this->getData(['theme', 'footer', 'textColor']) . ';font-family:' . $fonts[$this->getData(['theme', 'footer', 'font'])] . ';font-weight:' . $this->getData(['theme', 'footer', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'footer', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'footer', 'textTransform']) . '}';
$css .= 'footer {background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
//$css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
$css .= 'footer #footersite > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
$css .= 'footer #footerbody > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
$css .= '@media (max-width: 768px) {footer #footerbody > div { padding: 2px }}';
$css .= '#footerSocials{text-align:' . $this->getData(['theme', 'footer', 'socialsAlign']) . '}';
$css .= '#footerText > p {text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}';
$css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}';
// Enregistre la personnalisation
$this->secure_file_put_contents(common::DATA_DIR . 'theme.css', $css);
// Effacer le cache pour tenir compte de la couleur de fond TinyMCE
header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
}
// Check la version rafraichissement du theme admin
$cssVersion = preg_split('/\*+/', file_get_contents(common::DATA_DIR . 'admin.css'));
if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['admin'])))) {
// Version
$css = '/*' . md5(json_encode($this->getData(['admin']))) . '*/';
// Fonts disponibles
$fontsAvailable['files'] = $this->getData(['font', 'files']);
$fontsAvailable['imported'] = $this->getData(['font', 'imported']);
$fontsAvailable['websafe'] = common::$fontsWebSafe;
/**
* Import des polices de caractères
* A partir du CDN ou dans le dossier site/file/source/fonts
*/
$fonts = [
$this->getData(['admin', 'fontText']),
$this->getData(['admin', 'fontTitle']),
];
// Suppression des polices identiques
$fonts = array_unique($fonts);
/**
* Charge les fontes
*/
foreach ($fonts as $fontId) {
foreach (['websafe', 'imported', 'files'] as $typeFont) {
if (isset($fontsAvailable[$typeFont][$fontId])) {
$fonts[$fontId] = $fontsAvailable[$typeFont][$fontId]['font-family'];
}
}
}
// Thème Administration
$colors = helper::colorVariants($this->getData(['admin', 'backgroundColor']));
$css .= '#site{background-color:' . $colors['normal'] . ';}';
$css .= 'p, div, label, select, input, table, span {font-family:' . $fonts[$this->getData(['admin', 'fontText'])] . '}';
$css .= 'body,.row > div {font-size:' . $this->getData(['admin', 'fontSize']) . '}';
$css .= 'body h1, h2, h3, h4 a, h5, h6 {font-family:' . $fonts[$this->getData(['admin', 'fontTitle'])] . ';color:' . $this->getData(['admin', 'colorTitle']) . ';}';
$css .= '.container {max-width:' . $this->getData(['admin', 'width']) . '}';
$margin = $this->getData(['theme', 'site', 'margin']) ? '0' : '20px';
// Marge supplémentaire lorsque le pied de page est fixe
if (
$this->getData(['theme', 'footer', 'fixed']) === true &&
$this->getData(['theme', 'footer', 'position']) === 'body'
) {
$marginBottomLarge = ((str_replace('px', '', $this->getData(['theme', 'footer', 'height'])) * 2) + 31) . 'px';
$marginBottomSmall = ((str_replace('px', '', $this->getData(['theme', 'footer', 'height'])) * 2) + 93) . 'px';
} else {
$marginBottomSmall = $margin;
$marginBottomLarge = $margin;
}
$css .= $this->getData(['admin', 'width']) === '100%'
? '@media (min-width: 769px) {#site{margin:0 auto ' . $marginBottomLarge . ' 0 !important;}}@media (max-width: 768px) {#site{margin:0 auto ' . $marginBottomSmall . ' 0 !important;}}#site.light{margin:5% auto !important;} body{margin:0 auto !important;} #bar{margin:0 auto !important;} body > header{margin:0 auto !important;} body > nav {margin: 0 auto !important;} body > footer {margin:0 auto !important;}'
: '@media (min-width: 769px) {#site{margin: ' . $margin . ' auto ' . $marginBottomLarge . ' auto !important;}}@media (max-width: 768px) {#site{margin: ' . $margin . ' auto ' . $marginBottomSmall . ' auto !important;}}#site.light{margin: 5% auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} ';
$css .= $this->getData(['admin', 'width']) === '750px'
? '.button, button{font-size:0.8em;}'
: '';
// TinyMCE
$colors = helper::colorVariants($this->getData(['admin', 'colorText']));
$css .= 'body:not(.editorWysiwyg), body:not(editorWysiwygComment),span .zwiico-help {color:' . $colors['normal'] . ';}';
$css .= 'table thead tr, table thead tr .zwiico-help{ background-color:' . $colors['normal'] . '; color:' . $colors['text'] . ';}';
$css .= 'table thead th { color:' . $colors['text'] . ';}';
$colors = helper::colorVariants($this->getData(['admin', 'backgroundColorButton']));
$css .= 'input[type=checkbox]:checked + label::before,.speechBubble{background-color:' . $colors['normal'] . ';color:' . $colors['text'] . ';}';
$css .= '.speechBubble::before {border-color:' . $colors['normal'] . ' transparent transparent transparent;}';
$css .= '.button {background-color:' . $colors['normal'] . ';color:' . $colors['text'] . ';}.button:hover {background-color:' . $colors['darken'] . ';color:' . $colors['text'] . ';}.button:active {background-color:' . $colors['veryDarken'] . ';color:' . $colors['text'] . ';}';
$colors = helper::colorVariants($this->getData(['admin', 'backgroundColorButtonGrey']));
$css .= '.button.buttonGrey {background-color: ' . $colors['normal'] . ';color: ' . $colors['text'] . ';}.button.buttonGrey:hover {background-color:' . $colors['darken'] . ';color:' . $colors['text'] . ';}.button.buttonGrey:active {background-color:' . $colors['veryDarken'] . ';color:' . $colors['text'] . ';}';
$colors = helper::colorVariants($this->getData(['admin', 'backgroundColorButtonRed']));
$css .= '.button.buttonRed {background-color: ' . $colors['normal'] . ';color: ' . $colors['text'] . ';}.button.buttonRed:hover {background-color:' . $colors['darken'] . ';color:' . $colors['text'] . ';}.button.buttonRed:active {background-color:' . $colors['veryDarken'] . ';color:' . $colors['text'] . ';}';
$colors = helper::colorVariants($this->getData(['admin', 'backgroundColorButtonHelp']));
$css .= '.button.buttonHelp {background-color: ' . $colors['normal'] . ';color: ' . $colors['text'] . ';}.button.buttonHelp:hover {background-color:' . $colors['darken'] . ';color:' . $colors['text'] . ';}.button.buttonHelp:active {background-color:' . $colors['veryDarken'] . ';color:' . $colors['text'] . ';}';
$colors = helper::colorVariants($this->getData(['admin', 'backgroundColorButtonGreen']));
$css .= '.button.buttonGreen, button[type=submit] {background-color: ' . $colors['normal'] . ';color: ' . $colors['text'] . ';}.button.buttonGreen:hover, button[type=submit]:hover {background-color: ' . $colors['darken'] . ';color: ' . $colors['text'] . ';}.button.buttonGreen:active, button[type=submit]:active {background-color: ' . $colors['darken'] . ';color: ' . $colors['text'] . ';}';
$colors = helper::colorVariants($this->getData(['admin', 'backgroundBlockColor']));
$css .= '.buttonTab, .block {border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . ';}.buttonTab, .block h4 {background-color: ' . $colors['normal'] . ';color:' . $colors['text'] . ';}';
$css .= 'table tr,input[type=email],input[type=date],input[type=time],input[type=month],input[type=week],input[type=datetime-local],input[type=text],input[type=password],select:not(#barSelectLanguage),select:not(#barSelectPage),textarea:not(.editorWysiwyg), textarea:not(.editorWysiwygComment),.inputFile{background-color: ' . $colors['normal'] . ';color:' . $colors['text'] . ';border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . ';}';
// Bordure du contour TinyMCE
$css .= '.mce-tinymce{border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . '!important;}';
// Enregistre la personnalisation
$this->secure_file_put_contents(common::DATA_DIR . 'admin.css', $css);
}
}
/**
* Auto-chargement des classes
* @param string $className Nom de la classe à charger
*/
public static function autoload($className)
{
$classPath = strtolower($className) . '/' . strtolower($className) . '.php';
// Module du coeur
if (is_readable('core/module/' . $classPath)) {
require 'core/module/' . $classPath;
}
// Module
elseif (is_readable(common::MODULE_DIR . $classPath)) {
require common::MODULE_DIR . $classPath;
}
// Librairie
elseif (is_readable('core/vendor/' . $classPath)) {
require 'core/vendor/' . $classPath;
}
}
/**
* Routage des modules
*/
public function router()
{
$layout = new layout($this);
// Installation
if (
$this->getData(['user']) === []
and $this->getUrl(0) !== 'install'
) {
http_response_code(302);
header('Location:' . helper::baseUrl() . 'install');
exit();
}
// Journalisation
$this->saveLog();
// Force la déconnexion des membres bannis ou d'une seconde session
if (
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and ($this->getUser('group') === common::GROUP_BANNED
or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf'])
and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
)
) {
$user = new user;
$user->logout();
}
// Mode maintenance
if (
$this->getData(['config', 'maintenance'])
and in_array($this->getUrl(0), ['maintenance', 'user']) === false
and $this->getUrl(1) !== 'login'
and ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < common::GROUP_ADMIN
)
)
) {
// Déconnexion
$user = new user;
$user->logout();
// Redirection
http_response_code(302);
header('Location:' . helper::baseUrl() . 'maintenance');
exit();
}
// Check l'accès à la page
$access = null;
if ($this->getData(['page', $this->getUrl(0)]) !== null) {
if (
$this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
// and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group'])
// Modification qui tient compte du profil de la page
and ($this->getUser('group') * 10 + $this->getUser('profil')) >= ($this->getData(['page', $this->getUrl(0), 'group']) * 10 + $this->getData(['page', $this->getUrl(0), 'profil']))
)
) {
$access = true;
} else {
if ($this->getUrl(0) === $this->getData(['locale', 'homePageId'])) {
$access = 'login';
} else {
$access = false;
}
}
// Empêcher l'accès aux pages désactivées par URL directe
if (
($this->getData(['page', $this->getUrl(0), 'disable']) === true
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < common::GROUP_EDITOR
)
) {
$access = false;
}
}
/**
* Contrôle si la page demandée est en édition ou accès à la gestion du site
* conditions de blocage :
* - Les deux utilisateurs qui accèdent à la même page sont différents
* - les URLS sont identiques
* - Une partie de l'URL fait partie de la liste de filtrage (édition d'un module etc..)
* - L'édition est ouverte depuis un temps dépassé, on considère que la page est restée ouverte et qu'elle ne sera pas validée
*/
$accessInfo['userName'] = '';
$accessInfo['pageId'] = '';
if ($this->getData(['user'])) {
foreach ($this->getData(['user']) as $userId => $userIds) {
if (!is_null($this->getData(['user', $userId, 'accessUrl']))) {
$t = explode('/', $this->getData(['user', $userId, 'accessUrl']));
}
if (
$this->getUser('id') &&
$userId !== $this->getUser('id') &&
$this->getData(['user', $userId, 'accessUrl']) === $this->getUrl() &&
array_intersect($t, common::$concurrentAccess) &&
//array_intersect($t, common::$accessExclude) !== false &&
time() < $this->getData(['user', $userId, 'accessTimer']) + common::ACCESS_TIMER
) {
$access = false;
$accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
$accessInfo['pageId'] = end($t);
}
}
}
// Accès concurrent stocke la page visitée
if (
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
&& $this->getUser('id')
) {
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]);
$this->setData(['user', $this->getUser('id'), 'accessTimer', time()]);
}
// Breadcrumb
$title = $this->getData(['page', $this->getUrl(0), 'title']);
if (
!empty($this->getData(['page', $this->getUrl(0), 'parentPageId'])) &&
$this->getData(['page', $this->getUrl(0), 'breadCrumb'])
) {
$title = '<a href="' . helper::baseUrl() .
$this->getData(['page', $this->getUrl(0), 'parentPageId']) .
'">' .
ucfirst($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'parentPageId']), 'title'])) .
'</a> &#8250; ' .
$this->getData(['page', $this->getUrl(0), 'title']);
}
// Importe le style de la page principale
$inlineStyle[] = $this->getData(['page', $this->getUrl(0), 'css']) === null ? '' : $this->getData(['page', $this->getUrl(0), 'css']);
// Importe le script de la page principale
$inlineScript[] = $this->getData(['page', $this->getUrl(0), 'js']) === null ? '' : $this->getData(['page', $this->getUrl(0), 'js']);
// Importe le contenu, le CSS et le script des barres
$contentRight = $this->getData(['page', $this->getUrl(0), 'barRight']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barRight']), common::$siteContent) : '';
$inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']);
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']);
$contentLeft = $this->getData(['page', $this->getUrl(0), 'barLeft']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barLeft']), common::$siteContent) : '';
$inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']);
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']);
// Importe la page simple sans module ou avec un module inexistant
if (
$this->getData(['page', $this->getUrl(0)]) !== null
and ($this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
or !class_exists($this->getData(['page', $this->getUrl(0), 'moduleId']))
)
and $access
) {
// Importe le CSS de la page principale
$this->addOutput([
'title' => $title,
'content' => $this->getPage($this->getUrl(0), common::$siteContent),
'metaDescription' => $this->getData(['page', $this->getUrl(0), 'metaDescription']),
'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']),
'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']),
'iconUrl' => $this->getData(['page', $this->getUrl(0), 'iconUrl']),
'disable' => $this->getData(['page', $this->getUrl(0), 'disable']),
'contentRight' => $contentRight,
'contentLeft' => $contentLeft,
'inlineStyle' => $inlineStyle,
'inlineScript' => $inlineScript,
]);
}
// Importe le module
else {
// Id du module, et valeurs en sortie de la page s'il s'agit d'un module de page
if ($access and $this->getData(['page', $this->getUrl(0), 'moduleId'])) {
$moduleId = $this->getData(['page', $this->getUrl(0), 'moduleId']);
// Construit un meta absent
$metaDescription = $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog' && !empty($this->getUrl(1)) && in_array($this->getUrl(1), $this->getData(['module']))
? strip_tags(substr($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'content']), 0, 159))
: $this->getData(['page', $this->getUrl(0), 'metaDescription']);
// Importe le CSS de la page principale
$pageContent = $this->getPage($this->getUrl(0), common::$siteContent);
$this->addOutput([
'title' => $title,
// Meta description = 160 premiers caractères de l'article
'content' => $pageContent,
'metaDescription' => $metaDescription,
'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']),
'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']),
'iconUrl' => $this->getData(['page', $this->getUrl(0), 'iconUrl']),
'disable' => $this->getData(['page', $this->getUrl(0), 'disable']),
'contentRight' => $contentRight,
'contentLeft' => $contentLeft,
'inlineStyle' => $inlineStyle,
'inlineScript' => $inlineScript,
]);
} else {
$moduleId = $this->getUrl(0);
$pageContent = '';
}
// Check l'existence du module
if (class_exists($moduleId)) {
/** @var common $module */
$module = new $moduleId;
// Check l'existence de l'action
$action = '';
$ignore = true;
if (!is_null($this->getUrl(1))) {
foreach (explode('-', $this->getUrl(1)) as $actionPart) {
if ($ignore) {
$action .= $actionPart;
$ignore = false;
} else {
$action .= ucfirst($actionPart);
}
}
}
$action = array_key_exists($action, $module::$actions) ? $action : 'index';
if (array_key_exists($action, $module::$actions)) {
$module->$action();
$output = $module->output;
// Check le groupe de l'utilisateur
if (
($module::$actions[$action] === common::GROUP_VISITOR
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= $module::$actions[$action]
and $this->getUser('permission', $moduleId, $action)
)
)
and $output['access'] === true
) {
// Enregistrement du contenu de la méthode POST lorsqu'une notice est présente
if (common::$inputNotices) {
foreach ($_POST as $postId => $postValue) {
if (is_array($postValue)) {
foreach ($postValue as $subPostId => $subPostValue) {
common::$inputBefore[$postId . '_' . $subPostId] = $subPostValue;
}
} else {
common::$inputBefore[$postId] = $postValue;
}
}
}
// Sinon traitement des données de sortie qui requiert qu'aucune notice ne soit présente
else {
// Notification
if ($output['notification']) {
if ($output['state'] === true) {
$notification = 'ZWII_NOTIFICATION_SUCCESS';
} elseif ($output['state'] === false) {
$notification = 'ZWII_NOTIFICATION_ERROR';
} else {
$notification = 'ZWII_NOTIFICATION_OTHER';
}
$_SESSION[$notification] = $output['notification'];
}
// Redirection
if ($output['redirect']) {
http_response_code(301);
header('Location:' . $output['redirect']);
exit();
}
}
// Données en sortie applicables même lorsqu'une notice est présente
// Affichage
if ($output['display']) {
$this->addOutput([
'display' => $output['display']
]);
}
// Contenu brut
if ($output['content']) {
$this->addOutput([
'content' => $output['content']
]);
}
// Contenu par vue
elseif ($output['view']) {
// Chemin en fonction d'un module du coeur ou d'un module
$modulePath = in_array($moduleId, common::$coreModuleIds) ? 'core/' : '';
// CSS
$stylePath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.css';
if (file_exists($stylePath)) {
$this->addOutput([
'style' => file_get_contents($stylePath)
]);
}
if ($output['style']) {
$this->addOutput([
'style' => file_get_contents($output['style'])
]);
}
// JS
$scriptPath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php';
if (file_exists($scriptPath)) {
ob_start();
include $scriptPath;
$this->addOutput([
'script' => ob_get_clean()
]);
}
// Vue
$viewPath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.php';
if (file_exists($viewPath)) {
ob_start();
include $viewPath;
$modpos = $this->getData(['page', $this->getUrl(0), 'modulePosition']);
if ($modpos === 'top') {
$this->addOutput([
'content' => ob_get_clean() . ($output['showPageContent'] ? $pageContent : '')
]);
} else if ($modpos === 'free') {
if (strstr($pageContent, '[MODULE]', true) === false) {
$begin = strstr($pageContent, '[]', true);
} else {
$begin = strstr($pageContent, '[MODULE]', true);
}
if (strstr($pageContent, '[MODULE]') === false) {
$end = strstr($pageContent, '[]');
} else {
$end = strstr($pageContent, '[MODULE]');
}
$cut = 8;
$end = substr($end, -strlen($end) + $cut);
$this->addOutput([
'content' => ($output['showPageContent'] ? $begin : '') . ob_get_clean() . ($output['showPageContent'] ? $end : '')
]);
} else {
$this->addOutput([
'content' => ($output['showPageContent'] ? $pageContent : '') . ob_get_clean()
]);
}
}
}
// Librairies
if ($output['vendor'] !== $this->output['vendor']) {
$this->addOutput([
'vendor' => array_merge($this->output['vendor'], $output['vendor'])
]);
}
if ($output['title'] !== null) {
$this->addOutput([
'title' => $output['title']
]);
}
// Affiche le bouton d'édition de la page dans la barre de membre
if ($output['showBarEditButton']) {
$this->addOutput([
'showBarEditButton' => $output['showBarEditButton']
]);
}
}
// Erreur 403
else {
$access = false;
}
}
}
}
// Erreurs
if ($access === 'login') {
http_response_code(302);
header('Location:' . helper::baseUrl() . 'user/login/');
exit();
}
if ($access === false) {
http_response_code(403);
if ($accessInfo['userName']) {
$this->addOutput([
'title' => 'Accès verrouillé',
'content' => template::speech('<p>' . sprintf(helper::translate('La page %s est ouverte par l\'utilisateur %s</p><p><a style="color:inherit" href="javascript:history.back()">%s</a></p>'), $accessInfo['pageId'], $accessInfo['userName'], helper::translate('Retour')))
]);
} else {
if (
$this->getData(['locale', 'page403']) !== 'none'
and $this->getData(['page', $this->getData(['locale', 'page403'])])
) {
header('Location:' . helper::baseUrl() . $this->getData(['locale', 'page403']));
} else {
$this->addOutput([
'title' => 'Accès interdit',
'content' => template::speech('<p>' . helper::translate('Vous n\'êtes pas autorisé à consulter cette page (erreur 403)') . '</p><p><a style="color:inherit" href="javascript:history.back()">' . helper::translate('Retour') . '</a></p>')
]);
}
}
} elseif ($this->output['content'] === '') {
http_response_code(404);
// Pour éviter une 404, bascule dans l'espace correct si la page existe dans cette langue.
// Parcourir les espaces
foreach (common::$languages as $langId => $value) {;
if (
// l'espace existe
is_dir(common::DATA_DIR . $langId) &&
file_exists(common::DATA_DIR . $langId . '/page.json')
) {
// Lire les données des pages
$pagesId = json_decode(file_get_contents(common::DATA_DIR . $langId . '/page.json'), true);
if (
// La page existe
is_array($pagesId['page']) &&
array_key_exists($this->getUrl(0), $pagesId['page'])
) {
// Basculer
$_SESSION['ZWII_SITE_CONTENT'] = $langId;
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
exit();
}
}
}
if (
$this->getData(['locale', 'page404']) !== 'none'
and $this->getData(['page', $this->getData(['locale', 'page404'])])
) {
header('Location:' . helper::baseUrl() . $this->getData(['locale', 'page404']));
} else {
$this->addOutput([
'title' => 'Page indisponible',
'content' => template::speech('<p>' . helper::translate('La page demandée n\'existe pas ou est introuvable (erreur 404)') . '</p><p><a style="color:inherit" href="javascript:history.back()">' . helper::translate('Retour') . '</a></p>')
]);
}
}
// Mise en forme des métas
if ($this->output['metaTitle'] === '') {
if ($this->output['title']) {
$this->addOutput([
'metaTitle' => strip_tags($this->output['title']) . ' - ' . $this->getData(['locale', 'title'])
]);
} else {
$this->addOutput([
'metaTitle' => $this->getData(['locale', 'title'])
]);
}
}
if ($this->output['metaDescription'] === '') {
$this->addOutput([
'metaDescription' => $this->getData(['locale', 'metaDescription'])
]);
}
switch ($this->output['display']) {
// Layout brut
case common::DISPLAY_RAW:
echo $this->output['content'];
break;
// Layout vide
case common::DISPLAY_LAYOUT_BLANK:
require 'core/layout/blank.php';
break;
// Affichage en JSON
case common::DISPLAY_JSON:
header('Content-Type: application/json');
echo json_encode($this->output['content']);
break;
// RSS feed
case common::DISPLAY_RSS:
header('Content-type: application/rss+xml; charset=UTF-8');
echo $this->output['content'];
break;
// Layout allégé
case common::DISPLAY_LAYOUT_LIGHT:
ob_start();
require 'core/layout/light.php';
$content = ob_get_clean();
// Convertit la chaîne en UTF-8 pour conserver les caractères accentués
$content = mb_convert_encoding($content, 'UTF-8', 'UTF-8');
// Supprime les espaces, les sauts de ligne, les tabulations et autres caractères inutiles
$content = preg_replace('/[\t ]+/u', ' ', $content);
echo $content;
break;
// Layout principal
case common::DISPLAY_LAYOUT_MAIN:
ob_start();
require 'core/layout/main.php';
$content = ob_get_clean();
// Convertit la chaîne en UTF-8 pour conserver les caractères accentués
$content = mb_convert_encoding($content, 'UTF-8', 'UTF-8');
// Supprime les espaces, les sauts de ligne, les tabulations et autres caractères inutiles
$content = preg_replace('/[\t ]+/u', ' ', $content);
echo $content;
break;
}
}
}

View File

@ -93,19 +93,19 @@ class template
// Icône de l'opérateur et calcul du résultat
switch ($operator) {
case 1:
$operator = template::ico('plus', ['fontSize' => '2em;']);
$operator = template::ico('plus');
$result = $firstNumber + $secondNumber;
break;
case 2:
$operator = template::ico('minus', ['fontSize' => '2em;']);
$operator = template::ico('minus');
$result = $firstNumber - $secondNumber;
break;
case 3:
$operator = template::ico('cancel', ['fontSize' => '2em;']);
$operator = template::ico('cancel');
$result = $firstNumber * $secondNumber;
break;
case 4:
$operator = template::ico('divide', ['fontSize' => '2em;']);
$operator = template::ico('divide');
$limit2 = [10, 10, 6, 5, 4, 3, 2, 2, 2, 2];
for ($i = 1; $i <= $firstNumber; $i++) {
$limit = $limit2[$i - 1];
@ -134,7 +134,7 @@ class template
// Label
$html .= self::label(
$attributes['id'],
'<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" />&nbsp;<strong>' . $operator . '</strong>&nbsp;<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" />' . template::ico('eq', ['fontSize' => '2em;']),
'<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" />&nbsp;<strong>' . $operator . '</strong>&nbsp;<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" /> en chiffres ?',
[
'help' => $attributes['help']
]
@ -224,7 +224,6 @@ class template
* Crée un champ date
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @param string type date time datetime-local month week
* @return string
*/
public static function date($nameId, array $attributes = [])
@ -242,9 +241,8 @@ class template
'label' => '',
'name' => $nameId,
'placeholder' => '',
'readonly' => false,
'value' => '',
'type'=> 'date',
'readonly' => true,
'value' => ''
], $attributes);
// Traduction de l'aide et de l'étiquette
$attributes['label'] = helper::translate($attributes['label']);
@ -274,18 +272,21 @@ class template
// Date visible
$html .= '<div class="inputDateManagerWrapper">';
$html .= sprintf(
'<input type="' . $attributes['type'] . '" class="datepicker %s" value="%s" %s>',
'<input type="text" class="datepicker %s" value="%s" %s>',
$attributes['class'],
$attributes['value'],
helper::sprintAttributes($attributes, ['class', 'value'])
);
$html .= self::button($attributes['id'] . 'Delete', [
'class' => 'inputDateDelete',
'value' => self::ico('cancel')
]);
$html .= '</div>';
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
}
/**
* Crée un champ d'upload de fichier
@ -358,7 +359,7 @@ class template
%s
data-lity
>
' . self::ico('upload-cloud', ['margin' => 'right']) . '
' . self::ico('upload', ['margin' => 'right']) . '
<span class="inputFileLabel"></span>
</a>',
$attributes['class'],
@ -397,7 +398,7 @@ class template
$html = '<form id="' . $id . '" method="post">';
// Stock le token CSRF
$html .= self::hidden('csrf', [
'value' => htmlentities($_SESSION['csrf'], ENT_QUOTES | ENT_HTML5, 'UTF-8')
'value' => $_SESSION['csrf']
]);
// Retourne le html
return $html;
@ -467,12 +468,12 @@ class template
'attr' => '',
'help' => '',
'id' => '',
'alt' => '',
], $attributes);
// Traduction de l'aide
$attributes['help'] = helper::translate($attributes['help']);
// Contenu de l'icône
$alt = $attributes['help'] ? $attributes['help'] : $ico;
$item = $attributes['href'] ? '<a id="' . $attributes['id'] . '" data-tippy-content="' . $attributes['help'] . '" alt="' . $alt . '" href="' . $attributes['href'] . '" ' . $attributes['attr'] . ' >' : '';
$item = $attributes['href'] ? '<a id="' . $attributes['id'] . '" data-tippy-content="' . $attributes['help'] . '" alt="' . $attributes['help'] . '" href="' . $attributes['href'] . '" ' . $attributes['attr'] . ' >' : '';
$item .= '<span class="zwiico-' . $ico . ($attributes['margin'] ? ' zwiico-margin-' . $attributes['margin'] : '') . ($attributes['animate'] ? ' animate-spin' : '') . '" style="font-size:' . $attributes['fontSize'] . '"><!----></span>';
$item .= ($attributes['href']) ? '</a>' : '';
return $item;
@ -494,8 +495,8 @@ class template
$lang = $langId;
break;
case 'selected':
if (isset($_SESSION['ZWII_SITE_CONTENT'])) {
$lang = $_SESSION['ZWII_SITE_CONTENT'];
if (isset($_COOKIE['ZWII_CONTENT'])) {
$lang = $_COOKIE['ZWII_CONTENT'];
} else {
$lang = 'fr_FR';
}
@ -686,16 +687,15 @@ class template
'label' => '',
'name' => $nameId,
'selected' => '',
'font' => [],
'multiple' => ''
'fonts' => []
], $attributes);
// Traduction de l'aide et de l'étiquette
$attributes['label'] = helper::translate($attributes['label']);
$attributes['help'] = helper::translate($attributes['help']);
$attributes['help'] = helper::translate($attributes['help']);
// Stocker les fontes et remettre à zéro le tableau des fontes transmis pour éviter une erreur de sprintAttributes
if (empty($attributes['font']) === false) {
$fonts = $attributes['font'];
$attributes['font'] = [];
if (empty($attributes['fonts']) === false) {
$fonts = $attributes['fonts'];
$attributes['fonts'] = [];
}
// Sauvegarde des données en cas d'erreur
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
@ -716,11 +716,6 @@ class template
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Attribut multiple
if ($attributes['multiple'] === true) {
echo "ppp";
$attributes['multiple'] = 'multiple';
}
// Début sélection
$html .= sprintf(
'<select %s>',
@ -750,7 +745,6 @@ class template
return $html;
}
/**
* Crée une bulle de dialogue
* @param string $text Texte de la bulle

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -16,8 +16,8 @@ var core = {};
/**
* Crée un message d'alerte
*/
core.alert = function (text) {
var lightbox = lity(function ($) {
core.alert = function(text) {
var lightbox = lity(function($) {
return $("<div>")
.addClass("lightbox")
.append(
@ -28,14 +28,14 @@ core.alert = function (text) {
$("<a>")
.addClass("button")
.text("Ok")
.on("click", function () {
.on("click", function() {
lightbox.close();
})
)
)
}(jQuery));
// Validation de la lightbox avec le bouton entrée
$(document).on("keyup", function (event) {
$(document).on("keyup", function(event) {
if (event.keyCode === 13) {
lightbox.close();
}
@ -46,7 +46,7 @@ core.alert = function (text) {
/**
* Génère des variations d'une couleur
*/
core.colorVariants = function (rgba) {
core.colorVariants = function(rgba) {
rgba = rgba.match(/\(+(.*)\)/);
rgba = rgba[1].split(", ");
return {
@ -60,8 +60,8 @@ core.colorVariants = function (rgba) {
/**
* Crée un message de confirmation
*/
core.confirm = function (text, yesCallback, noCallback) {
var lightbox = lity(function ($) {
core.confirm = function(text, yesCallback, noCallback) {
var lightbox = lity(function($) {
return $("<div>")
.addClass("lightbox")
.append(
@ -72,7 +72,7 @@ core.confirm = function (text, yesCallback, noCallback) {
$("<a>")
.addClass("button grey")
.text("<?php echo helper::translate('Non');?>")
.on("click", function () {
.on("click", function() {
lightbox.options('button', true);
lightbox.close();
if (typeof noCallback !== "undefined") {
@ -82,7 +82,7 @@ core.confirm = function (text, yesCallback, noCallback) {
$("<a>")
.addClass("button")
.text("<?php echo helper::translate('Oui');?>")
.on("click", function () {
.on("click", function() {
lightbox.options('button', true);
lightbox.close();
if (typeof yesCallback !== "undefined") {
@ -94,7 +94,7 @@ core.confirm = function (text, yesCallback, noCallback) {
}(jQuery));
// Callback lors d'un clic sur le fond et sur la croix de fermeture
lightbox.options('button', false);
$(document).on('lity:close', function (event, instance) {
$(document).on('lity:close', function(event, instance) {
if (
instance.options('button') === false &&
typeof noCallback !== "undefined"
@ -103,7 +103,7 @@ core.confirm = function (text, yesCallback, noCallback) {
}
});
// Validation de la lightbox avec le bouton entrée
$(document).on("keyup", function (event) {
$(document).on("keyup", function(event) {
if (event.keyCode === 13) {
lightbox.close();
if (typeof yesCallback !== "undefined") {
@ -117,7 +117,7 @@ core.confirm = function (text, yesCallback, noCallback) {
/**
* Scripts à exécuter en dernier
*/
core.end = function () {
core.end = function() {
/**
* Modifications non enregistrées du formulaire
*/
@ -127,24 +127,24 @@ core.end = function () {
// - Les champs avec data-no-dirty
var inputsDOM = formDOM.find("input:not([data-no-dirty]), select:not([data-no-dirty]), textarea:not(.editorWysiwyg):not([data-no-dirty])");
var inputSerialize = inputsDOM.serialize();
$(window).on("beforeunload", function () {
$(window).on("beforeunload", function() {
if (inputsDOM.serialize() !== inputSerialize) {
message = "<?php echo helper::translate('Les modifications que vous avez apportées ne seront peut-être pas enregistrées.');?>";
return message;
}
});
formDOM.submit(function () {
formDOM.submit(function() {
$(window).off("beforeunload");
});
};
$(function () {
$(function() {
core.end();
});
/**
* Ajoute une notice
*/
core.noticeAdd = function (id, notice) {
core.noticeAdd = function(id, notice) {
$("#" + id + "Notice").text(notice).removeClass("displayNone");
$("#" + id).addClass("notice");
};
@ -152,7 +152,7 @@ core.noticeAdd = function (id, notice) {
/**
* Supprime une notice
*/
core.noticeRemove = function (id) {
core.noticeRemove = function(id) {
$("#" + id + "Notice").text("").addClass("displayNone");
$("#" + id).removeClass("notice");
};
@ -160,20 +160,18 @@ core.noticeRemove = function (id) {
/**
* Scripts à exécuter en premier
*/
core.start = function () {
core.start = function() {
/**
* Remonter en haut au clic sur le bouton
*/
var backToTopDOM = $("#backToTop");
backToTopDOM.on("click", function () {
$("body, html").animate({
scrollTop: 0
}, "400");
backToTopDOM.on("click", function() {
$("body, html").animate({ scrollTop: 0 }, "400");
});
/**
* Affiche / Cache le bouton pour remonter en haut
*/
$(window).on("scroll", function () {
$(window).on("scroll", function() {
if ($(this).scrollTop() > 200) {
backToTopDOM.fadeIn();
} else {
@ -185,15 +183,15 @@ core.start = function () {
*/
var notificationTimer;
$("#notification")
.on("mouseenter", function () {
.on("mouseenter", function() {
clearTimeout(notificationTimer);
$("#notificationProgress")
.stop()
.width("100%");
})
.on("mouseleave", function () {
.on("mouseleave", function() {
// Disparition de la notification
notificationTimer = setTimeout(function () {
notificationTimer = setTimeout(function() {
$("#notification").fadeOut();
}, 3000);
// Barre de progression
@ -202,7 +200,7 @@ core.start = function () {
}, 3000, "linear");
})
.trigger("mouseleave");
$("#notificationClose").on("click", function () {
$("#notificationClose").on("click", function() {
clearTimeout(notificationTimer);
$("#notification").fadeOut();
$("#notificationProgress").stop();
@ -211,7 +209,7 @@ core.start = function () {
/**
* Traitement du formulaire cookies
*/
$("#cookieForm").submit(function (event) {
$("#cookieForm").submit(function(event) {
// Variables des cookies
var getUrl = window.location;
@ -228,7 +226,7 @@ core.start = function () {
/**
* Fermeture de la popup des cookies
*/
$("#cookieConsent .cookieClose").on("click", function () {
$("#cookieConsent .cookieClose").on("click", function() {
$('#cookieConsent').addClass("displayNone");
});
@ -236,7 +234,7 @@ core.start = function () {
* Commande de gestion des cookies dans le footer
*/
$("#footerLinkCookie").on("click", function () {
$("#footerLinkCookie").on("click", function() {
$("#cookieConsent").removeClass("displayNone");
});
@ -244,21 +242,34 @@ core.start = function () {
* Affiche / Cache le menu en mode responsive
*/
var menuDOM = $("#menu");
$("#toggle").on("click", function () {
$("#toggle").on("click", function() {
menuDOM.slideToggle();
});
$(window).on("resize", function () {
$(window).on("resize", function() {
if ($(window).width() > 768) {
menuDOM.css("display", "");
}
});
/**
* Sélection d'une langue du site
*/
$("select#barSelectLanguage").on("change", function() {
var langUrl = $(this).val();
// Récupère la langue sélectionnée dans l'élément 6 d'un tableau
var lang = langUrl.split("/");
// Lit le cookie de langue
var langCookie = getCookie('ZWII_CONTENT');
// Change si différent, corrige le problème avec le thème et le rechargement de la langue.
if (lang[6] !== langCookie) {
$(location).attr("href", langUrl);
}
});
/**
* Choix de page dans la barre de membre
*/
$("#barSelectPage").on("change", function () {
$("#barSelectPage").on("change", function() {
var pageUrl = $(this).val();
if (pageUrl) {
$(location).attr("href", pageUrl);
@ -269,7 +280,7 @@ core.start = function () {
* Champs d'upload de fichiers
*/
// Mise à jour de l'affichage des champs d'upload
$(".inputFileHidden").on("change", function () {
$(".inputFileHidden").on("change", function() {
var inputFileHiddenDOM = $(this);
var fileName = inputFileHiddenDOM.val();
if (fileName === "") {
@ -282,31 +293,31 @@ core.start = function () {
inputFileHiddenDOM.parent().find(".inputFileLabel").text(fileName);
}).trigger("change");
// Suppression du fichier contenu dans le champ
$(".inputFileDelete").on("click", function () {
$(".inputFileDelete").on("click", function() {
$(this).parents(".inputWrapper").find(".inputFileHidden").val("").trigger("change");
});
// Suppression de la date contenu dans le champ
$(".inputDateDelete").on("click", function () {
$(".inputDateDelete").on("click", function() {
$(this).parents(".inputWrapper").find(".datepicker").val("").trigger("change");
});
// Confirmation de mise à jour
$("#barUpdate").on("click", function () {
message = "<?php echo helper::translate('Mise à jour') . ' ?';?>";
return core.confirm(message, function () {
$("#barUpdate").on("click", function() {
message = "<?php echo helper::translate('Mettre à jour') . ' ?';?>";
return core.confirm(message, function() {
$(location).attr("href", $("#barUpdate").attr("href"));
});
});
// Confirmation de déconnexion
$("#barLogout").on("click", function () {
message = "<?php echo helper::translate('Se déconnecter') . ' ?';?>";
return core.confirm(message, function () {
$("#barLogout").on("click", function() {
message = "<?php echo helper::translate('Se déconnecter') . '?';?>";
return core.confirm(message, function() {
$(location).attr("href", $("#barLogout").attr("href"));
});
});
/**
* Bloque la multi-soumission des boutons
*/
$("form").on("submit", function () {
$("form").on("submit", function() {
$(this).find(".uniqueSubmission")
.addClass("disabled")
.prop("disabled", true)
@ -318,7 +329,7 @@ core.start = function () {
/**
* Check adresse email
*/
$("[type=email]").on("change", function () {
$("[type=email]").on("change", function() {
var _this = $(this);
var pattern = /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i;
if (pattern.test(_this.val())) {
@ -334,7 +345,7 @@ core.start = function () {
*/
var elementDOM = $("iframe, video, embed, object");
// Calcul du ratio et suppression de la hauteur / largeur des iframes
elementDOM.each(function () {
elementDOM.each(function() {
var _this = $(this);
_this
.data("ratio", _this.height() / _this.width())
@ -342,13 +353,11 @@ core.start = function () {
.removeAttr("width height");
});
// Prend la largeur du parent et détermine la hauteur à l'aide du ratio lors du resize de la fenêtre
$(window).on("resize", function () {
elementDOM.each(function () {
$(window).on("resize", function() {
elementDOM.each(function() {
var _this = $(this);
var width = _this.parent().first().width();
if (width > _this.data("maxwidth")) {
width = _this.data("maxwidth");
}
if (width > _this.data("maxwidth")) { width = _this.data("maxwidth"); }
_this
.width(width)
.height(width * _this.data("ratio"));
@ -358,7 +367,7 @@ core.start = function () {
/*
* Header responsive
*/
$(window).on("resize", function () {
$(window).on("resize", function() {
var responsive = "<?php echo $this->getdata(['theme','header','imageContainer']);?>";
if (responsive === "cover" || responsive === "contain") {
var widthpx = "<?php echo $this->getdata(['theme','site','width']);?>";
@ -382,10 +391,10 @@ core.start();
/**
* Confirmation de suppression
*/
$("#pageDelete").on("click", function () {
$("#pageDelete").on("click", function() {
var _this = $(this);
message = "<?php echo helper::translate('Confirmez-vous la suppression de cette page ?');?>";
return core.confirm(message, function () {
return core.confirm(message, function() {
$(location).attr("href", _this.attr("href"));
});
});
@ -394,7 +403,7 @@ $("#pageDelete").on("click", function () {
/**
* Calcul de la luminance relative d'une couleur
*/
core.relativeLuminanceW3C = function (rgba) {
core.relativeLuminanceW3C = function(rgba) {
// Conversion en sRGB
var RsRGB = rgba[0] / 255;
var GsRGB = rgba[1] / 255;
@ -438,25 +447,17 @@ function capitalizeFirstLetter(string) {
}
$(document).ready(function () {
$(document).ready(function() {
/**
* Affiche le sous-menu quand il est sticky
*/
$("nav").mouseenter(function () {
$("#navfixedlogout .navSub").css({
'pointer-events': 'auto'
});
$("#navfixedconnected .navSub").css({
'pointer-events': 'auto'
});
$("nav").mouseenter(function() {
$("#navfixedlogout .navSub").css({ 'pointer-events': 'auto' });
$("#navfixedconnected .navSub").css({ 'pointer-events': 'auto' });
});
$("nav").mouseleave(function () {
$("#navfixedlogout .navSub").css({
'pointer-events': 'none'
});
$("#navfixedconnected .navSub").css({
'pointer-events': 'none'
});
$("nav").mouseleave(function() {
$("#navfixedlogout .navSub").css({ 'pointer-events': 'none' });
$("#navfixedconnected .navSub").css({ 'pointer-events': 'none' });
});
/**
@ -467,7 +468,7 @@ $(document).ready(function () {
/**
* Effet accordéon
*/
$('.accordion').each(function (e) {
$('.accordion').each(function(e) {
// on stocke l'accordéon dans une variable locale
var accordion = $(this);
// on récupère la valeur data-speed si elle existe
@ -492,7 +493,7 @@ $(document).ready(function () {
open(accordion.find('.active:first'), 0);
// au clic sur un titre...
accordion.on('click', '.accordion-title', function (ev) {
accordion.on('click', '.accordion-title', function(ev) {
ev.preventDefault();
// Masquer l'élément déjà actif
if ($(this).closest('.accordion-item').hasClass('active')) {
@ -507,7 +508,7 @@ $(document).ready(function () {
/**
* Icône du Menu Burger
*/
$("#toggle").click(function () {
$("#toggle").click(function() {
var changeIcon = $('#toggle').children("span");
if ($(changeIcon).hasClass('zwiico-menu')) {
$(changeIcon).removeClass('zwiico-menu').addClass('zwiico-cancel');
@ -519,34 +520,7 @@ $(document).ready(function () {
/**
* Remove ID Facebook from URL
*/
if (/^\?fbclid=/.test(location.search)) {
if (/^\?fbclid=/.test(location.search))
location.replace(location.href.replace(/\?fbclid.+/, ""));
};
/**
* Sélection d'une langue du site
*/
$("select#barSelectLanguage").on("change", function () {
// La langue courante ne déclenche pas de chargement
var langSelected = $(this).val();
var langSelected = langSelected.split("/");
// Lit le cookie de langue
var langSession = "<?php echo isset($_SESSION['ZWII_SITE_CONTENT']) ? $_SESSION['ZWII_SITE_CONTENT'] : '';?>";
// Découpe l'URL pour exclure le changement de page avec le thème
var url = window.location;
var currentUrl = url.href.split("/");
// Change si différent, corrige le problème avec le thème et le rechargement de la langue.
if ((currentUrl !== "?theme" ||
currentUrl !== "theme") &&
langSelected[6] !== langSession
) {
//$(location).attr("href", langUrl);
var select = document.getElementById("barSelectLanguage");
var selectedOption = select.options[select.selectedIndex];
if (selectedOption.value !== "") {
window.location = selectedOption.value; }
}
});
});

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +0,0 @@
<?php
/**
* Vérification de la version de PHP
*/
if(version_compare(PHP_VERSION, '7.2.0', '<') ) {
exit('PHP 7.2+ mini requis - PHP 7.2+ mini required');
}
if ( version_compare(PHP_VERSION, '8.3.999', '>') ) {
exit('PHP 8.3 pas encore supporté, installez PHP 7.n ou PHP 8.1.n - PHP 8.3 not yet supported, install PHP 7.n or PHP 8.1.n');
}
/**
* Check les modules installés
*/
$e = [
'gd',
'json',
'date',
'mbstring',
'zip',
'intl',
'exif',
'Phar',
'fileinfo',
'session'
];
$m = get_loaded_extensions();
$b = false;
foreach ($e as $k => $v) {
if (array_search($v,$m) === false) {
$b = true;
echo '<pre><p>Module PHP : ' . $v . ' manquant - Module PHP ' . $v . ' missing.</p></pre>';
}
}
if ($b)
exit('<pre><p>ZwiiCMS ne peut pas démarrer ; activez les extensions requises dans PHP.ini- ZwiiCMS cannot start, enabled PHP missing extensions into PHP.ini</p></pre>');
/**
* Contrôle les htacess
*/
$d = [
'',
'site/data/',
'site/backup/',
'site/tmp/',
// 'site/i18n/', pas contrôler pour éviter les pbs de mise à jour
];
foreach ($d as $key) {
if (file_exists($key . '.htaccess') === false)
exit('<pre>ZwiiCMS ne peut pas démarrer, le fichier ' .$key . '.htaccess est manquant.<br />ZwiiCMS cannot start, file ' . $key . '.htaccess is missing.</pre>' );
}

View File

@ -1,52 +0,0 @@
<?php
/**
* Mise à jour avant v12
* */
if (file_exists('site/data/core.json')) {
$core = json_decode(file_get_contents('site/data/core.json'), true);
$version = $core['core']['dataVersion'];
// Avant version 12.0.00
if (
$version < 12000
) {
// Correspondance pour les dossiers de langue à convertir
$languages = [
'fr' => 'fr_FR',
'en' => 'en_EN',
'pt' => 'pt_PT'
];
// Convertit les dossiers vers la nouvelle structure
foreach ($languages as $key => $value) {
if (
is_dir('site/data/' . $key) &&
!is_dir('site/data/' . $value)
) {
$end = rename('site/data/' . $key, 'site/data/' . $value);
}
}
sleep(1);
}
// Renomme les bases de données
if (
$version < 12400
) {
// Renommage les fichiers de données au pluriel
$t = [
'site/data/languages.json' => 'site/data/language.json',
'site/data/fonts.json' => 'site/data/font.json'
];
foreach ($t as $k => $v) {
if (file_exists($k)) {
$d = file_get_contents($k);
$d = str_replace('"' . basename($k, '.json') . '"' , '"' . basename($v, '.json') . '"', $d);
file_put_contents($v, $d);
unlink($k);
}
}
}
}

View File

@ -3,11 +3,7 @@
/**
* Mises à jour suivant les versions de Zwii
*/
// Pas d'installation depuis une version inférieur
if (
$this->getData(['core', 'dataVersion']) < 9227
) {
if ($this->getData(['core', 'dataVersion']) < 9227) {
// Arrêt du script
exit('ZwiiCMS version 12 est incompatible avec la base de données installée. L\'installation d\'une version intermédiaire 10 ou 11 est nécessaire.');
}
@ -18,19 +14,19 @@ if ($this->getData(['core', 'dataVersion']) < 10000) {
//----------------------------------------
// Mettre à jour les données des galeries
$hierarchy = array();
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
$pageList = array();
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
// Mise à jour des données pour la galerie v2
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
//La page a une galerie
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
// Parcourir les dossiers de la galerie
$tempData = $this->getData(['module', $parent]);
$tempData = $this->getData(['module', $parent]);
$i = 1;
foreach ($tempData as $galleryKey => $galleryItem) {
// Ordre de tri des galeries
@ -62,7 +58,7 @@ if ($this->getData(['core', 'dataVersion']) < 10000) {
}
}
// Contrôle des options php.ini pour la mise à jour auto
if (helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version') === false) {
if (helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version') === false) {
$this->setData(['config', 'autoUpdate', false]);
}
@ -75,8 +71,7 @@ if ($this->getData(['core', 'dataVersion']) < 10092) {
$dir = getcwd();
chdir('core/vendor/fullpage');
$files = glob('*');
foreach ($files as $file)
unlink($file);
foreach ($files as $file) unlink($file);
chdir($dir);
rmdir('core/vendor/fullpage/');
}
@ -135,7 +130,7 @@ if ($this->getData(['core', 'dataVersion']) < 10200) {
}
// Créer les en-têtes du journal
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
$this->secure_file_put_contents(self::DATA_DIR . 'journal.log', $d);
file_put_contents(self::DATA_DIR . 'journal.log', $d);
// Init préservation htaccess
$this->setData(['config', 'autoUpdateHtaccess', false]);
// Options de barre de membre simple
@ -168,8 +163,7 @@ if ($this->getData(['core', 'dataVersion']) < 10300) {
$dir = getcwd();
chdir('core/module/search');
$files = glob('*');
foreach ($files as $file)
unlink($file);
foreach ($files as $file) unlink($file);
chdir($dir);
rmdir('core/module/search/');
}
@ -179,15 +173,16 @@ if ($this->getData(['core', 'dataVersion']) < 10300) {
$this->setData(['config', 'searchPageId', '']);
// Mettre à jour les données des galeries
$hierarchy = array(); foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
$pageList = array();
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
// Mise à jour des données de thème de la galerie
// Les données de thème sont communes au site
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
//La page a une galerie
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
foreach ($this->getData(['module', $parent]) as $galleryKey => $galleryItem) {
@ -239,15 +234,15 @@ if ($this->getData(['core', 'dataVersion']) < 10304) {
// Version 10.3.06
if ($this->getData(['core', 'dataVersion']) < 10306) {
// Liste des pages
$hierarchy = array();
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
$pageList = array();
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
// Mettre à jour les données des blogs les articles sont dans posts
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
//La page a un blog
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
if (is_array($this->getData(['module', $parent]))) {
@ -262,7 +257,7 @@ if ($this->getData(['core', 'dataVersion']) < 10306) {
}
}
}
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
//La page a une news
if ($this->getData(['page', $parent, 'moduleId']) === 'news') {
if (is_array($this->getData(['module', $parent]))) {
@ -297,37 +292,37 @@ if ($this->getData(['core', 'dataVersion']) < 10400) {
// Ajouter les champs de blog v3
// Liste des pages dans pageList
$hierarchy = array();
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
$pageList = array();
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
// Parcourir pageList et rechercher les modules de blog
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
//La page est un blog
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
$articleIds = array_keys(helper::arrayColumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC'));
foreach ($articleIds as $key => $article) {
// Droits les deux groupes
$this->setData(['module', $parent, 'posts', $article, 'editConsent', 3]);
$this->setData(['module', $parent, 'posts', $article, 'editConsent', 3]);
// Limite de taille 500
$this->setData(['module', $parent, 'posts', $article, 'commentMaxlength', '500']);
$this->setData(['module', $parent, 'posts', $article, 'commentMaxlength', '500']);
// Pas d'approbation des commentaires
$this->setData(['module', $parent, 'posts', $article, 'commentApproved', false]);
$this->setData(['module', $parent, 'posts', $article, 'commentApproved', false]);
// pas de notification
$this->setData(['module', $parent, 'posts', $article, 'commentNotification', false]);
$this->setData(['module', $parent, 'posts', $article, 'commentNotification', false]);
// groupe de notification
$this->setData(['module', $parent, 'posts', $article, 'commentGroupNotification', 3]);
$this->setData(['module', $parent, 'posts', $article, 'commentGroupNotification', 3]);
}
// Traitement des commentaires
if (is_array($this->getData(['module', $parent, 'posts', $article, 'comment']))) {
foreach ($this->getData(['module', $parent, 'posts', $article, 'comment']) as $commentId => $comment) {
if (is_array($this->getData(['module', $parent, 'posts', $article, 'comment']))) {
foreach ($this->getData(['module', $parent, 'posts', $article, 'comment']) as $commentId => $comment) {
// Approbation
$this->setData(['module', $parent, 'posts', $article, 'comment', $commentId, 'approval', true]);
$this->setData(['module', $parent, 'posts', $article, 'comment', $commentId, 'approval', true]);
}
}
}
@ -388,15 +383,15 @@ if ($this->getData(['core', 'dataVersion']) < 10600) {
// Mise à jour des données des modules autonomes
// Liste des pages dans pageList
$hierarchy = array();
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
$pageList = array();
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
// Parcourir pageList et rechercher les modules au CSS autonomes
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
if (
$this->getData(['page', $parent, 'moduleId']) === 'search'
|| $this->getData(['page', $parent, 'moduleId']) === 'gallery'
@ -435,8 +430,7 @@ if ($this->getData(['core', 'dataVersion']) < 11000) {
$this->setData(['config', 'i18n', 'pt', 'none']);
// Supprimer les fichiers de backup
if (file_exists('site/data/.backup'))
unlink('site/data/.backup');
if (file_exists('site/data/.backup')) unlink('site/data/.backup');
$path = realpath('site/data');
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if (strpos($filename, 'backup.json')) {
@ -446,20 +440,20 @@ if ($this->getData(['core', 'dataVersion']) < 11000) {
// Externaliser les contenus des pages
// Liste des pages dans pageList
$hierarchy = array();
$pageList = array();
// Creation du contenu de la page
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
}
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
$content = $this->getData(['page', $parent, 'content']);
//$this->secure_file_put_contents(self::DATA_DIR . self::$siteContent . '/content/' . $parent . '.html', $content);
//file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $parent . '.html', $content);
$this->setPage($parent, $content, 'fr');
$this->setData(['page', $parent, 'content', $parent . '.html']);
}
@ -509,13 +503,13 @@ if ($this->getData(['core', 'dataVersion']) < 11200) {
$this->setData(['config', 'connect', 'captchaType', 'alpha']);
// Ajout de la variable shortTitle basée sur Title
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
$this->setData(['page', $parent, 'shortTitle', $this->getData(['page', $parent, 'title'])]);
}
@ -547,10 +541,10 @@ if ($this->getData(['core', 'dataVersion']) < 11200) {
if ($this->getData(['core', 'dataVersion']) < 11202) {
// Renommer les champs
$this->setData(['locale', 'cookies', 'mainLabel', $this->getData(['locale', 'cookies', 'cookiesZwiiText'])]);
$this->setData(['locale', 'cookies', 'gaLabel', $this->getData(['locale', 'cookies', 'cookiesGaText'])]);
$this->setData(['locale', 'cookies', 'titleLabel', $this->getData(['locale', 'cookies', 'cookiesTitleText'])]);
$this->setData(['locale', 'cookies', 'linkLegalLabel', $this->getData(['locale', 'cookies', 'cookiesLinkMlText'])]);
$this->setData(['locale', 'cookies', 'mainLabel', $this->getData(['locale', 'cookies', 'cookiesZwiiText'])]);
$this->setData(['locale', 'cookies', 'gaLabel', $this->getData(['locale', 'cookies', 'cookiesGaText'])]);
$this->setData(['locale', 'cookies', 'titleLabel', $this->getData(['locale', 'cookies', 'cookiesTitleText'])]);
$this->setData(['locale', 'cookies', 'linkLegalLabel', $this->getData(['locale', 'cookies', 'cookiesLinkMlText'])]);
$this->setData(['locale', 'cookies', 'checkboxGaLabel', $this->getData(['locale', 'cookies', 'cookiesCheckboxGaText'])]);
$this->setData(['locale', 'cookies', 'buttonValidLabel', $this->getData(['locale', 'cookies', 'cookiesButtonText'])]);
// Effacer les anciens champs
@ -573,26 +567,26 @@ if ($this->getData(['core', 'dataVersion']) < 11203) {
$c3 = 0;
$success = false;
// Boucler sur les pages
foreach ($this->getHierarchy() as $parentId => $childIds) {
$content = $this->getPage($parentId, self::$siteContent);
foreach ($this->getHierarchy(null, null, null) as $parentId => $childIds) {
$content = $this->getPage($parentId, self::$i18nContent);
$titre = $this->getData(['page', $parentId, 'title']);
$content = $titre . ' ' . $content;
$content = $titre . ' ' . $content;
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
$replace = str_replace('src="' . $old, 'src="' . $new, stripslashes($replace), $c2);
if ($c1 > 0 || $c2 > 0) {
$success = true;
$this->setPage($parentId, $replace, self::$siteContent);
$this->setPage($parentId, $replace, self::$i18nContent);
$c3 += $c1 + $c2;
}
foreach ($childIds as $childId) {
$content = $this->getPage($childId, self::$siteContent);
$content = $titre . ' ' . $content;
$content = $this->getPage($childId, self::$i18nContent);
$content = $titre . ' ' . $content;
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
$replace = str_replace('src="' . $old, 'src="' . $new, stripslashes($replace), $c2);
if ($c1 > 0 || $c2 > 0) {
$success = true;
$this->setPage($childId, $replace, self::$siteContent);
$this->setPage($childId, $replace, self::$i18nContent);
$c3 += $c1 + $c2;
}
}
@ -652,11 +646,11 @@ if ($this->getData(['core', 'dataVersion']) < 11300) {
$this->setData(['theme', 'footer', 'font', $fonts[$this->getData(['theme', 'footer', 'font'])]]);
$this->setData(['theme', 'header', 'font', $fonts[$this->getData(['theme', 'header', 'font'])]]);
$this->setData(['theme', 'menu', 'font', $fonts[$this->getData(['theme', 'menu', 'font'])]]);
$this->setData(['theme', 'text', 'font', $fonts[$this->getData(['theme', 'text', 'font'])]]);
$this->setData(['theme', 'title', 'font', $fonts[$this->getData(['theme', 'title', 'font'])]]);
$this->setData(['admin', 'fontTitle', $fonts[$this->getData(['admin', 'fontTitle'])]]);
$this->setData(['admin', 'fontText', $fonts[$this->getData(['admin', 'fontText'])]]);
$this->setData(['theme', 'menu', 'font', $fonts[$this->getData(['theme', 'menu', 'font'])]]);
$this->setData(['theme', 'text', 'font', $fonts[$this->getData(['theme', 'text', 'font'])]]);
$this->setData(['theme', 'title', 'font', $fonts[$this->getData(['theme', 'title', 'font'])]]);
$this->setData(['admin', 'fontTitle', $fonts[$this->getData(['admin', 'fontTitle'])]]);
$this->setData(['admin', 'fontText', $fonts[$this->getData(['admin', 'fontText'])]]);
unlink(self::DATA_DIR . 'admin.css');
unlink(self::DATA_DIR . 'theme.css');
@ -669,13 +663,13 @@ if ($this->getData(['core', 'dataVersion']) < 11300) {
if ($this->getData(['core', 'dataVersion']) < 11303) {
// Ajout de la variable shortTitle basée sur Title
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
$pageList[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
$pageList[] = $childKey;
}
}
foreach ($hierarchy as $parentKey => $parent) {
foreach ($pageList as $parentKey => $parent) {
$this->setData(['page', $parent, 'extraPosition', false]);
}
@ -688,10 +682,10 @@ if ($this->getData(['core', 'dataVersion']) < 11303) {
if ($this->getData(['core', 'dataVersion']) < 11306) {
// Supprime les fontes déclarées en double par la version précédentes
$files = $this->getData(['font', 'files']);
$files = $this->getData(['fonts', 'files']);
foreach ($files as $fontId => $fontFile) {
if (!is_null($this->getData(['font', 'imported', $fontId]))) {
$this->deleteData(['font', 'imported', $fontId]);
if (!is_null($this->getData(['fonts', 'imported', $fontId]))) {
$this->deleteData(['fonts', 'imported', $fontId]);
}
}
// Mise à jour
@ -703,7 +697,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
// Effacer le dossier
if (is_dir('core/module/addon')) {
$this->deleteDir('core/module/addon');
$this->removeDir('core/module/addon');
}
@ -720,12 +714,12 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
],
'droid-sans-2' => [
'name' => 'Droid Sans',
'font-family' => '\'Droid Sans\', sans-serif',
'font-family' => '\'Droid Sans\', sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/droid-sans-2'
],
'droid-serif-2' => [
'name' => 'Droid Serif',
'font-family' => '\'Droid Serif\', serif',
'font-family' => '\'Droid Serif\', serif',
'resource' => 'https://fonts.cdnfonts.com/css/droid-serif-2'
],
'indie-flower' => [
@ -801,51 +795,39 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
];
// Conversion des fontes locales
$files = $this->getData(['font', 'files']);
$files = $this->getData(['fonts', 'files']);
if (is_array($files)) {
foreach ($files as $fontId => $fontName) {
if (
gettype($fontName) === 'string'
&& file_exists(self::DATA_DIR . 'fonts/' . $fontName)
) {
$this->setData([
'font',
'files',
$fontId,
[
'name' => ucfirst($fontId),
'font-family' => '\'' . ucfirst($fontId) . '\', sans-serif',
'resource' => $fontName
]
]);
$this->setData(['fonts', 'files', $fontId, [
'name' => ucfirst($fontId),
'font-family' => '\'' . ucfirst($fontId) . '\', sans-serif',
'resource' => $fontName
]]);
}
}
}
// Consersion des fontes importées
$imported = $this->getData(['font', 'imported']);
$imported = $this->getData(['fonts', 'imported']);
if (is_array($imported)) {
foreach ($imported as $fontId => $fontUrl) {
if (gettype($fontUrl) === 'string') {
$this->setData([
'font',
'imported',
$fontId,
[
'name' => ucfirst($fontId),
'font-family' => '\'' . ucfirst($fontId) . '\', sans-serif',
'resource' => 'https:\\fonts.cdnfonts.com\css' . $fontUrl
]
]);
$this->setData(['fonts', 'imported', $fontId, [
'name' => ucfirst($fontId),
'font-family' => '\'' . ucfirst($fontId) . '\', sans-serif',
'resource' => 'https:\\fonts.cdnfonts.com\css' . $fontUrl
]]);
}
}
}
// Importation des fontes exemples
$template = $fonts;
foreach ($template as $fontId => $fontValue) {
$this->setData(['font', 'imported', $fontId, $fontValue]);
$this->setData(['fonts', 'imported', $fontId, $fontValue]);
}
// Redirection des pages d'administration vers la bannière de connexion
@ -897,16 +879,16 @@ if ($this->getData(['core', 'dataVersion']) < 12000) {
helper::deleteCookie('ZWII_CONTENTSCRIPT');
// Nettoyage de fichiers inutiles
if (file_exists('core/module/user/view/import/import.help.html')) {
unlink('core/module/user/view/import/import.help.html');
if (file_exists('core\module\user\view\import\import.help.html')) {
unlink('core\module\user\view\import\import.help.html');
}
// Supprimer les fichier associés
if (is_dir('core/module/translate/ressource')) {
$this->deleteDir('core/module/translate/ressource');
$this->removeDir('core/module/translate/ressource');
}
if (is_dir('core/vendor/i18n/css')) {
$this->deleteDir('core/vendor/i18n/css');
$this->removeDir('core/vendor/i18n/css');
}
if (file_exists('core/vendor/i18n/inc.json')) {
unlink('core/vendor/i18n/inc.json');
@ -932,187 +914,3 @@ if ($this->getData(['core', 'dataVersion']) < 12000) {
// Mise à jour
$this->setData(['core', 'dataVersion', 12000]);
}
// Version 12.3.01
if ($this->getData(['core', 'dataVersion']) < 12301) {
// Valeur par défaut du délai de recherche de mise à jour en ligne
$this->setData(['config', 'autoUpdateDelay', 86400]);
// Nettoyage de flatPickr
if (is_dir('core/vendor/flatpickr')) {
$this->deleteDir('core/vendor/flatpickr');
}
// email reply
$this->deleteData(['config', 'smtp', 'sender']);
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])]);
// Mise à jour
$this->setData(['core', 'dataVersion', 12301]);
}
// Version 12.3.08
if ($this->getData(['core', 'dataVersion']) < 12308) {
// Langue par défaut
$l = [
'fr_FR' => 'Français',
'en_EN' => 'English',
'es' => 'Español',
];
foreach ($l as $key => $value) {
if (is_dir(self::DATA_DIR . $key)) {
touch(self::DATA_DIR . $key . '/.default');
break;
}
}
// Mise à jour
$this->setData(['core', 'dataVersion', 12308]);
}
// Version 12.3.09
if ($this->getData(['core', 'dataVersion']) < 12309) {
// Mettre à jour les locales
foreach (self::$languages as $key => $value) {
// tableau des langues installées
if (is_dir(self::DATA_DIR . $key)) {
$d = json_decode(file_get_contents(self::DATA_DIR . $key . '/locale.json'), true);
$d = array_merge($d['locale'], ['poweredPageLabel' => 'Motorisé par']);
$t['locale'] = $d;
$this->secure_file_put_contents(self::DATA_DIR . $key . '/locale.json', $t);
}
}
// Mise à jour
$this->setData(['core', 'dataVersion', 12309]);
}
// Version 13.0.00
if ($this->getData(['core', 'dataVersion']) < 13000) {
// Nettoyage du dossier de langue d'installation'
if (file_exists('core/vendor/tinymce/langs/langs.zip'))
unlink('core/vendor/tinymce/langs/langs.zip');
if (file_exists('core/module/install/ressource/i18n/de.json'))
unlink('core/module/install/ressource/i18n/de.json');
if (file_exists('core/module/install/ressource/i18n/it.json'))
unlink('core/module/install/ressource/i18n/it.json');
if (file_exists('core/module/install/ressource/i18n/pt_PT.json'))
unlink('core/module/install/ressource/i18n/pt_PT.json');
if (file_exists('core/module/install/ressource/i18n/gr_GR.json'))
unlink('core/module/install/ressource/i18n/gr_GR.json');
// Création du dossier partage pour les nouveaux droits
if (!is_dir(self::FILE_DIR . 'source/partage')) {
mkdir(self::FILE_DIR . 'source/partage');
}
// Efface le dossier translate
if (is_dir('core/module/translate')) {
$this->deleteDir('core/module/translate');
}
// Renomme le fichier et le dossier des fontes
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
rename(self::DATA_DIR . 'fonts/fonts.html', self::DATA_DIR . 'fonts/font.html');
}
if (is_dir(self::DATA_DIR . 'fonts')) {
rename(self::DATA_DIR . 'fonts', self::DATA_DIR . 'font');
}
// Ajouter le prénom comme pseudo et le pseudo comme signature
foreach ($this->getData(['user']) as $userId => $userIds) {
switch ($this->getData(['user', $userId, 'group'])) {
case '1':
case '2':
$this->setData(['user', $userId, 'profil', 1]);
break;
default:
$this->setData(['user', $userId, 'profil', 0]);
break;
}
}
// Récupérer la liste de toutes les pages dans toutes langues
$hierarchy = array();
$languages = array();
// Tableau des langues non installées
foreach (self::$languages as $key => $value) {
if (is_dir(self::DATA_DIR . $key))
$languages[] = $key;
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
$hierarchy[] = $parentKey;
foreach ($parentValue as $childKey) {
$hierarchy[] = $childKey;
}
}
}
// Mise à jour des pages, le profil est mis à 0 pour les groupes sans profil et 1 pour es groupes avec profil
$currentlanguage = self::$siteContent;
foreach ($languages as $langId) {
foreach ($hierarchy as $parentKey => $parent) {
switch ($this->getData(['page', $parent, 'group'])) {
case 1:
case 2:
$this->setData(['page', $parent, 'profil', 1]);
break;
default:
$this->setData(['page', $parent, 'profil', 0]);
break;
}
}
}
$_SESSION['ZWII_SITE_CONTENT'] = $currentlanguage;
// Supprime la clé OpenOgraph
$this->deleteData(['config', 'seo', 'keyApi']);
// Mise à jour
$this->setData(['core', 'dataVersion', 13000]);
}
// Version 13.0.05
if ($this->getData(['core', 'dataVersion']) < 13005) {
if (is_dir('core/module/plugin/view/dataImport')) {
$this->deleteDir('core/module/plugin/view/dataImport');
}
if (file_exists('core/module/plugin/view/index/index.js.php')) {
unlink('core/module/plugin/view/index/index.js.php');
}
// Installe l'adresse d'envoi si non spécifiée
if (empty($this->getData(['config', 'smtp', 'from']))) {
$this->setData(['config', 'smtp', 'from', 'no-reply@localhost']);
}
// Fixe la taille de l'administration identique à la taille de site
$size = $this->getData(['theme', 'site', 'width']);
$this->setData(['admin', 'width', $size]);
// Ancienne déclaration oubliée !!
if ($this->getData(['admin', 'backgroundColorButtonHelp']) === null) {
$this->setData(['admin', 'backgroundColorButtonHelp', 'rgba(255, 153, 0, 1)']);
}
// Mise à jour
$this->setData(['core', 'dataVersion', 13005]);
}
// Version 13.1.01
if ($this->getData(['core', 'dataVersion']) < 13101) {
// Supprime le choix du thème à l'installation
if (is_dir('core/module/install/ressource/themes')) {
$this->deleteDir('core/module/install/ressource/themes') ;
}
// Mise à jour
$this->setData(['core', 'dataVersion', 13101]);
}

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -1,27 +1,22 @@
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<html prefix="og: http://ogp.me/ns#" lang="<?php echo self::$i18nContent;?>">
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showStyle(); ?>
<?php $layout->showFonts(); ?>
<?php if (file_exists(self::DATA_DIR . 'font/font.css')): ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>font/font.css?<?php echo md5_file(self::DATA_DIR . 'font/font.css'); ?>">
<?php endif; ?>
<?php $this->showMetaTitle(); ?>
<?php $this->showMetaDescription(); ?>
<?php $this->showMetaType(); ?>
<?php $this->showMetaImage(); ?>
<?php $this->showFavicon(); ?>
<?php $this->showVendor(); ?>
<?php $this->showStyle(); ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/blank.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
</head>
<body>
<?php $layout->showContent(); ?>
<?php $layout->showScript(); ?>
<?php $this->showContent(); ?>
<?php $this->showScript(); ?>
</body>
</html>

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -217,7 +217,7 @@ Signature dans les articles blog et news
.table tbody tr {
background: #F6F7F8;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
.table tbody tr:nth-child(2n + 2) {
@ -418,7 +418,7 @@ td>.col12 {
display: inline-block;
padding: 0 12px;
color: #FFF;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
#bar a:hover {
@ -617,7 +617,7 @@ nav li:hover ul {
nav a {
display: inherit;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
nav a:hover {
@ -892,7 +892,7 @@ footer #footerSocials span {
margin: 0 5px;
display: inline-block;
border-radius: 2px;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
footer #footerSocials .zwiico-facebook {
@ -951,38 +951,6 @@ 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 */
@ -1003,10 +971,9 @@ footer #footerSocials .zwiico-twitch:hover {
max-width: 500px;
width: 100%;
margin: 16px auto;
text-align: center;
text-align: left;
border-radius: 2px;
transition: background-color .3s ease-out;
z-index: 100;
transition: background .3s ease-out;
}
.speechBubble:before {
@ -1034,7 +1001,7 @@ footer #footerSocials .zwiico-twitch:hover {
cursor: pointer;
display: none;
border-radius: 50%;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
#backToTop:hover {
@ -1074,7 +1041,7 @@ footer #footerSocials .zwiico-twitch:hover {
margin-left: 10px;
padding: 4px 8px;
display: inline-block;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
#cookieConsentConfirm:hover {
@ -1167,11 +1134,6 @@ footer #footerSocials .zwiico-twitch:hover {
input[type='email'],
input[type='text'],
input[type='password'],
input[type='date'],
input[type='datetime-local'],
input[type='time'],
input[type='month'],
input[type='week'],
.inputFile,
select,
textarea {
@ -1192,11 +1154,6 @@ select {
input[type='email']:hover,
input[type='text']:hover,
input[type='password']:hover,
input[type='date']:hover,
input[type='datetime-local']:hover,
input[type='time']:hover,
input[type='month']:hover,
input[type='week']:hover,
.inputFile:hover,
select:hover,
textarea:hover {
@ -1206,11 +1163,6 @@ textarea:hover {
input[type='email'].notice,
input[type='text'].notice,
input[type='password'].notice,
input[type='date'].notice,
input[type='datetime-local'].notice,
input[type='time'].notice,
input[type='month'].notice,
input[type='week'].notice,
.inputFile.notice,
select.notice,
textarea.notice {
@ -1220,12 +1172,7 @@ textarea.notice {
input[type='email'].notice:hover,
input[type='text'].notice:hover,
input[type='password'].notice:hover
input[type='date'].notice:hover,
input[type='datetime-local'].notice:hover,
input[type='time'].notice:hover,
input[type='month'].notice:hover,
input[type='week'].notice:hover,
input[type='password'].notice:hover,
.inputFile.notice:hover,
select.notice:hover,
textarea.notice:hover {
@ -1252,7 +1199,7 @@ button {
cursor: pointer;
font-family: inherit;
border-radius: 2px;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
textarea {
@ -1297,7 +1244,7 @@ label {
user-select: none;
cursor: pointer;
border-radius: 2px;
transition: background-color .3s ease-out;
transition: background .3s ease-out;
}
@ -1322,20 +1269,15 @@ label {
/* Upload de fichiers */
.inputFile {
.inputFile,
.datepicker {
margin: 0;
display: inline-block;
width: 88% !important;
}
/*
.datepicker {
margin: 0;
display: inline-block;
width: 100% !important;
}
*/
.inputFileDelete {
.inputFileDelete,
.inputDateDelete {
display: block;
width: 10%;
padding: 10px 0;
@ -1352,11 +1294,13 @@ label {
/* Empêche le débordement et les sauts de ligne */
.inputFileManagerWrapper {
.inputFileManagerWrapper,
.inputDateManagerWrapper {
display: inline;
}
.inputFileManagerWrapper>.inputFile {
.inputFileManagerWrapper>.inputFile,
.inputDateManagerWrapper>.inputFile {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@ -1819,7 +1763,4 @@ th.col12 {
.bannerDisplay {
display: none;
}
header {
background-size: cover !important;
}
}
}

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -18,14 +18,6 @@
/* Site */
#site {
max-width: 600px !important;
border-radius: 5px !important;
}
#site > section:not(.message),
input[type='password'], input[type='text']
{
background-color: rgba(255, 255, 255, 1) !important;
color: rgba(33, 34, 35, 1) !important;
}
section {

View File

@ -1,30 +1,25 @@
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<html prefix="og: http://ogp.me/ns#" lang="<?php echo self::$i18nContent;?>">
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showStyle(); ?>
<?php $layout->showFonts(); ?>
<?php if (file_exists(self::DATA_DIR . 'font/font.css')): ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>font/font.css?<?php echo md5_file(self::DATA_DIR . 'font/font.css'); ?>">
<?php endif; ?>
<?php $this->showMetaTitle(); ?>
<?php $this->showMetaDescription(); ?>
<?php $this->showMetaType(); ?>
<?php $this->showMetaImage(); ?>
<?php $this->showFavicon(); ?>
<?php $this->showVendor(); ?>
<?php $this->showStyle(); ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/light.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
</head>
<body>
<?php $layout->showNotification(); ?>
<?php $this->showNotification(); ?>
<div id="site" class="container light">
<section><?php $layout->showContent(); ?></section>
<section><?php $this->showContent(); ?></section>
</div>
<?php $layout->showScript(); ?>
<?php $this->showScript(); ?>
</body>
</html>

View File

@ -1,8 +1,7 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$siteContent, 0, 2);?>">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="x-apple-disable-message-reformatting">

View File

@ -1,39 +1,27 @@
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<html prefix="og: http://ogp.me/ns#" lang="<?php echo self::$i18nContent; ?>">
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta meta="description=" content="ZwiiCMS le CMS multilingue sans base de données">
<meta name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showFonts(); ?>
<?php if (file_exists(self::DATA_DIR . 'font/font.css')): ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>font/font.css?<?php echo md5_file(self::DATA_DIR . 'font/font.css'); ?>">
<?php endif; ?>
<link rel="stylesheet"
href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css'); ?>">
<link rel="stylesheet"
href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR . 'theme.css'); ?>">
<link rel="stylesheet"
href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR . 'custom.css'); ?>">
<?php $this->showMetaTitle(); ?>
<?php $this->showMetaDescription(); ?>
<?php $this->showMetaType(); ?>
<?php $this->showMetaImage(); ?>
<?php $this->showFavicon(); ?>
<?php $this->showVendor(); ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR . 'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR . 'custom.css'); ?>">
<!-- Détection RSS -->
<?php if (
($this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog'
<?php if (($this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog'
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'news')
and $this->getData(['module', $this->getUrl(0), 'config', 'feeds']) === TRUE
): ?>
<link rel="alternate" type="application/rss+xml"
href="'<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" title="fLUX rss">
) : ?>
<link rel="alternate" type="application/rss+xml" href="'<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" title="fLUX rss">
<?php endif; ?>
<?php $layout->showStyle(); ?>
<?php $layout->showInlineStyle(); ?>
<?php $this->showStyle(); ?>
<!-- Script perso dans le header -->
<?php if (file_exists(self::DATA_DIR . 'head.inc.html')) {
include(self::DATA_DIR . 'head.inc.html');
@ -42,13 +30,15 @@
<body>
<!-- Barre d'administration -->
<?php if ($this->getUser('group') > self::GROUP_MEMBER): ?>
<?php $layout->showBar(); ?>
<?php if ($this->getUser('group') > self::GROUP_MEMBER) : ?>
<?php $this->showBar(); ?>
<?php endif; ?>
<!-- Notifications -->
<?php $layout->showNotification(); ?>
<?php $this->showNotification(); ?>
<!-- Menu dans le fond du site avant la bannière -->
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-first' || $this->getData(['theme', 'menu', 'position']) === 'top'): ?>
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-first' || $this->getData(['theme', 'menu', 'position']) === 'top') : ?>
<!-- Détermine si le menu est fixe en haut de page lorsque l'utilisateur n'est pas connecté -->
<?php
if (
@ -64,80 +54,75 @@
?>
<!-- Menu Burger -->
<div id="toggle">
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
</div>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
<!-- fin du menu burger -->
<?php
$menuClass = $this->getData(['theme', 'menu', 'position']) === 'top' ? 'class="container-large"' : 'class="container"';
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
$menuClass = $this->getData(['theme', 'menu', 'position']) === 'top' ? 'class="container-large"' : 'class="container"';
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
?>
<div id="menu" <?php echo $menuClass; ?>>
<?php $layout->showMenu(); ?>
<?php $this->showMenu(); ?>
</div> <!--fin menu -->
</nav>
<?php endif; ?>
<!-- Bannière dans le fond du site -->
<?php if ($this->getData(['theme', 'header', 'position']) === 'body'): ?>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
<?php if ($this->getData(['theme', 'header', 'position']) === 'body') : ?>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
<?php
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
$headerClass .= $this->getData(['theme', 'header', 'tinyHidden']) ? ' bannerDisplay ' : '';
$headerClass .= $this->getData(['theme', 'header', 'wide']) === 'none' ? '' : 'container';
?>
<header <?php echo empty($headerClass) ? '' : 'class="' . $headerClass . '"'; ?>>
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper'): ?>
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper') : ?>
<?php if (
$this->getData(['theme', 'header', 'textHide']) === false
// Affiche toujours le titre de la bannière pour l'édition du thème
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
): ?>
<span id="themeHeaderTitle">
<?php echo $this->getData(['locale', 'title']); ?>
</span>
<?php else: ?>
) : ?>
<span id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
<?php else : ?>
<span id="themeHeaderTitle">&nbsp;</span>
<?php endif; ?>
<?php else: ?>
<?php else : ?>
<div id="featureContent">
<?php echo $this->getData(['theme', 'header', 'featureContent']); ?>
</div>
<?php endif; ?>
</header>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
<?php endif; ?>
<!-- Menu dans le fond du site après la bannière -->
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-second'): ?>
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-second') : ?>
<nav>
<!-- Menu burger -->
<div id="toggle">
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
</div>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
<!-- fin du menu burger -->
<?php
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
?>
<div id="menu" <?php echo $menuClass; ?>>
<?php $layout->showMenu(); ?>
</div>
<?php $this->showMenu(); ?></div>
</nav>
<?php endif; ?>
<!-- Site -->
<div id="site" class="container">
<?php if ($this->getData(['theme', 'menu', 'position']) === 'site-first'): ?>
<?php if ($this->getData(['theme', 'menu', 'position']) === 'site-first') : ?>
<!-- Menu dans le site avant la bannière -->
<nav>
<div id="toggle">
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
</div>
<div id="menu" class="container">
<?php $layout->showMenu(); ?>
</div>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
<div id="menu" class="container"><?php $this->showMenu(); ?></div>
</nav>
<?php endif; ?>
<?php if (
@ -146,33 +131,31 @@
or ($this->getData(['theme', 'header', 'position']) === 'hide'
and $this->getUrl(0) === 'theme'
)
): ?>
) : ?>
<!-- Bannière dans le site -->
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
<?php
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
$headerClass .= $this->getData(['theme', 'header', 'tinyHidden']) ? ' bannerDisplay ' : '';
?>
<header <?php echo empty($headerClass) ? '' : 'class="' . $headerClass . '"'; ?>>
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper'): ?>
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper') : ?>
<?php if (
$this->getData(['theme', 'header', 'textHide']) === false
// Affiche toujours le titre de la bannière pour l'édition du thème
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
): ?>
<span id="themeHeaderTitle">
<?php echo $this->getData(['locale', 'title']); ?>
</span>
<?php else: ?>
) : ?>
<span id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
<?php else : ?>
<span id="themeHeaderTitle">&nbsp;</span>
<?php endif; ?>
<?php else: ?>
<?php else : ?>
<div id="featureContent">
<?php echo $this->getData(['theme', 'header', 'featureContent']); ?>
</diV>
<?php endif; ?>
</header>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
<?php endif; ?>
<?php if (
$this->getData(['theme', 'menu', 'position']) === 'site-second' ||
@ -181,37 +164,36 @@
or ($this->getData(['theme', 'menu', 'position']) === 'hide'
and $this->getUrl(0) === 'theme'
)
): ?>
) : ?>
<!-- Menu dans le site après la bannière -->
<nav <?php if ($this->getData(['theme', 'menu', 'position']) === 'hide'): ?>class="displayNone" <?php endif; ?>>
<nav <?php if ($this->getData(['theme', 'menu', 'position']) === 'hide') : ?>class="displayNone" <?php endif; ?>>
<div id="toggle">
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
</div>
<div id="menu" class="container">
<?php $layout->showMenu(); ?>
</div>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
<div id="menu" class="container"><?php $this->showMenu(); ?></div>
</nav>
<?php endif; ?>
<!-- Corps de page -->
<?php $layout->showMain(); ?>
<?php $this->showSection(); ?>
<!-- footer -->
<?php $layout->showFooter(); ?>
<?php $this->showFooter(); ?>
<!-- Fin du site -->
<?php echo $this->getData(['theme', 'footer', 'position']) === 'site' ? '</div>' : ''; ?>
<!-- Lien remonter en haut -->
<div id="backToTop">
<?php echo template::ico('up'); ?>
</div>
<div id="backToTop"><?php echo template::ico('up'); ?></div>
<!-- Affichage du consentement aux cookies-->
<?php $layout->showCookies(); ?>
<?php $this->showCookies(); ?>
<!-- Les scripts -->
<?php $layout->showScript(); ?>
<?php $this->showScript(); ?>
<!-- Script perso dans body -->
<?php if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include(self::DATA_DIR . 'body.inc.html');
} ?>
}?>
</body>
</html>

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -34,119 +34,119 @@ class config extends common
];
public static $timezones = [
'Pacific/Midway' => '(GMT-11:00) Midway Island',
'US/Samoa' => '(GMT-11:00) Samoa',
'US/Hawaii' => '(GMT-10:00) Hawaii',
'US/Alaska' => '(GMT-09:00) Alaska',
'US/Pacific' => '(GMT-08:00) Pacific Time (US &amp; Canada)',
'America/Tijuana' => '(GMT-08:00) Tijuana',
'US/Arizona' => '(GMT-07:00) Arizona',
'US/Mountain' => '(GMT-07:00) Mountain Time (US &amp; Canada)',
'America/Chihuahua' => '(GMT-07:00) Chihuahua',
'America/Mazatlan' => '(GMT-07:00) Mazatlan',
'America/Mexico_City' => '(GMT-06:00) Mexico City',
'America/Monterrey' => '(GMT-06:00) Monterrey',
'Canada/Saskatchewan' => '(GMT-06:00) Saskatchewan',
'US/Central' => '(GMT-06:00) Central Time (US &amp; Canada)',
'US/Eastern' => '(GMT-05:00) Eastern Time (US &amp; Canada)',
'US/East-Indiana' => '(GMT-05:00) Indiana (East)',
'America/Bogota' => '(GMT-05:00) Bogota',
'America/Lima' => '(GMT-05:00) Lima',
'America/Caracas' => '(GMT-04:30) Caracas',
'Canada/Atlantic' => '(GMT-04:00) Atlantic Time (Canada)',
'America/La_Paz' => '(GMT-04:00) La Paz',
'America/Santiago' => '(GMT-04:00) Santiago',
'Canada/Newfoundland' => '(GMT-03:30) Newfoundland',
'America/Buenos_Aires' => '(GMT-03:00) Buenos Aires',
'Greenland' => '(GMT-03:00) Greenland',
'Atlantic/Stanley' => '(GMT-02:00) Stanley',
'Atlantic/Azores' => '(GMT-01:00) Azores',
'Atlantic/Cape_Verde' => '(GMT-01:00) Cape Verde Is.',
'Africa/Casablanca' => '(GMT) Casablanca',
'Europe/Dublin' => '(GMT) Dublin',
'Europe/Lisbon' => '(GMT) Lisbon',
'Europe/London' => '(GMT) London',
'Africa/Monrovia' => '(GMT) Monrovia',
'Europe/Amsterdam' => '(GMT+01:00) Amsterdam',
'Europe/Belgrade' => '(GMT+01:00) Belgrade',
'Europe/Berlin' => '(GMT+01:00) Berlin',
'Europe/Bratislava' => '(GMT+01:00) Bratislava',
'Europe/Brussels' => '(GMT+01:00) Brussels',
'Europe/Budapest' => '(GMT+01:00) Budapest',
'Europe/Copenhagen' => '(GMT+01:00) Copenhagen',
'Europe/Ljubljana' => '(GMT+01:00) Ljubljana',
'Europe/Madrid' => '(GMT+01:00) Madrid',
'Europe/Paris' => '(GMT+01:00) Paris',
'Europe/Prague' => '(GMT+01:00) Prague',
'Europe/Rome' => '(GMT+01:00) Rome',
'Europe/Sarajevo' => '(GMT+01:00) Sarajevo',
'Europe/Skopje' => '(GMT+01:00) Skopje',
'Europe/Stockholm' => '(GMT+01:00) Stockholm',
'Europe/Vienna' => '(GMT+01:00) Vienna',
'Europe/Warsaw' => '(GMT+01:00) Warsaw',
'Europe/Zagreb' => '(GMT+01:00) Zagreb',
'Europe/Athens' => '(GMT+02:00) Athens',
'Europe/Bucharest' => '(GMT+02:00) Bucharest',
'Africa/Cairo' => '(GMT+02:00) Cairo',
'Africa/Harare' => '(GMT+02:00) Harare',
'Europe/Helsinki' => '(GMT+02:00) Helsinki',
'Europe/Istanbul' => '(GMT+02:00) Istanbul',
'Asia/Jerusalem' => '(GMT+02:00) Jerusalem',
'Europe/Kiev' => '(GMT+02:00) Kyiv',
'Europe/Minsk' => '(GMT+02:00) Minsk',
'Europe/Riga' => '(GMT+02:00) Riga',
'Europe/Sofia' => '(GMT+02:00) Sofia',
'Europe/Tallinn' => '(GMT+02:00) Tallinn',
'Europe/Vilnius' => '(GMT+02:00) Vilnius',
'Asia/Baghdad' => '(GMT+03:00) Baghdad',
'Asia/Kuwait' => '(GMT+03:00) Kuwait',
'Europe/Moscow' => '(GMT+03:00) Moscow',
'Africa/Nairobi' => '(GMT+03:00) Nairobi',
'Asia/Riyadh' => '(GMT+03:00) Riyadh',
'Europe/Volgograd' => '(GMT+03:00) Volgograd',
'Asia/Tehran' => '(GMT+03:30) Tehran',
'Asia/Baku' => '(GMT+04:00) Baku',
'Asia/Muscat' => '(GMT+04:00) Muscat',
'Asia/Tbilisi' => '(GMT+04:00) Tbilisi',
'Asia/Yerevan' => '(GMT+04:00) Yerevan',
'Asia/Kabul' => '(GMT+04:30) Kabul',
'Asia/Yekaterinburg' => '(GMT+05:00) Ekaterinburg',
'Asia/Karachi' => '(GMT+05:00) Karachi',
'Asia/Tashkent' => '(GMT+05:00) Tashkent',
'Asia/Kolkata' => '(GMT+05:30) Kolkata',
'Asia/Kathmandu' => '(GMT+05:45) Kathmandu',
'Asia/Almaty' => '(GMT+06:00) Almaty',
'Asia/Dhaka' => '(GMT+06:00) Dhaka',
'Asia/Novosibirsk' => '(GMT+06:00) Novosibirsk',
'Asia/Bangkok' => '(GMT+07:00) Bangkok',
'Asia/Jakarta' => '(GMT+07:00) Jakarta',
'Asia/Krasnoyarsk' => '(GMT+07:00) Krasnoyarsk',
'Asia/Chongqing' => '(GMT+08:00) Chongqing',
'Asia/Hong_Kong' => '(GMT+08:00) Hong Kong',
'Asia/Irkutsk' => '(GMT+08:00) Irkutsk',
'Asia/Kuala_Lumpur' => '(GMT+08:00) Kuala Lumpur',
'Australia/Perth' => '(GMT+08:00) Perth',
'Asia/Singapore' => '(GMT+08:00) Singapore',
'Asia/Taipei' => '(GMT+08:00) Taipei',
'Asia/Ulaanbaatar' => '(GMT+08:00) Ulaan Bataar',
'Asia/Urumqi' => '(GMT+08:00) Urumqi',
'Asia/Seoul' => '(GMT+09:00) Seoul',
'Asia/Tokyo' => '(GMT+09:00) Tokyo',
'Asia/Yakutsk' => '(GMT+09:00) Yakutsk',
'Australia/Adelaide' => '(GMT+09:30) Adelaide',
'Australia/Darwin' => '(GMT+09:30) Darwin',
'Australia/Brisbane' => '(GMT+10:00) Brisbane',
'Australia/Canberra' => '(GMT+10:00) Canberra',
'Pacific/Guam' => '(GMT+10:00) Guam',
'Australia/Hobart' => '(GMT+10:00) Hobart',
'Australia/Melbourne' => '(GMT+10:00) Melbourne',
'Pacific/Port_Moresby' => '(GMT+10:00) Port Moresby',
'Australia/Sydney' => '(GMT+10:00) Sydney',
'Asia/Vladivostok' => '(GMT+10:00) Vladivostok',
'Asia/Magadan' => '(GMT+11:00) Magadan',
'Pacific/Auckland' => '(GMT+12:00) Auckland',
'Pacific/Fiji' => '(GMT+12:00) Fiji',
'Asia/Kamchatka' => '(GMT+12:00) Kamchatka'
'Pacific/Midway' => '(GMT-11:00) Midway Island',
'US/Samoa' => '(GMT-11:00) Samoa',
'US/Hawaii' => '(GMT-10:00) Hawaii',
'US/Alaska' => '(GMT-09:00) Alaska',
'US/Pacific' => '(GMT-08:00) Pacific Time (US &amp; Canada)',
'America/Tijuana' => '(GMT-08:00) Tijuana',
'US/Arizona' => '(GMT-07:00) Arizona',
'US/Mountain' => '(GMT-07:00) Mountain Time (US &amp; Canada)',
'America/Chihuahua' => '(GMT-07:00) Chihuahua',
'America/Mazatlan' => '(GMT-07:00) Mazatlan',
'America/Mexico_City' => '(GMT-06:00) Mexico City',
'America/Monterrey' => '(GMT-06:00) Monterrey',
'Canada/Saskatchewan' => '(GMT-06:00) Saskatchewan',
'US/Central' => '(GMT-06:00) Central Time (US &amp; Canada)',
'US/Eastern' => '(GMT-05:00) Eastern Time (US &amp; Canada)',
'US/East-Indiana' => '(GMT-05:00) Indiana (East)',
'America/Bogota' => '(GMT-05:00) Bogota',
'America/Lima' => '(GMT-05:00) Lima',
'America/Caracas' => '(GMT-04:30) Caracas',
'Canada/Atlantic' => '(GMT-04:00) Atlantic Time (Canada)',
'America/La_Paz' => '(GMT-04:00) La Paz',
'America/Santiago' => '(GMT-04:00) Santiago',
'Canada/Newfoundland' => '(GMT-03:30) Newfoundland',
'America/Buenos_Aires' => '(GMT-03:00) Buenos Aires',
'Greenland' => '(GMT-03:00) Greenland',
'Atlantic/Stanley' => '(GMT-02:00) Stanley',
'Atlantic/Azores' => '(GMT-01:00) Azores',
'Atlantic/Cape_Verde' => '(GMT-01:00) Cape Verde Is.',
'Africa/Casablanca' => '(GMT) Casablanca',
'Europe/Dublin' => '(GMT) Dublin',
'Europe/Lisbon' => '(GMT) Lisbon',
'Europe/London' => '(GMT) London',
'Africa/Monrovia' => '(GMT) Monrovia',
'Europe/Amsterdam' => '(GMT+01:00) Amsterdam',
'Europe/Belgrade' => '(GMT+01:00) Belgrade',
'Europe/Berlin' => '(GMT+01:00) Berlin',
'Europe/Bratislava' => '(GMT+01:00) Bratislava',
'Europe/Brussels' => '(GMT+01:00) Brussels',
'Europe/Budapest' => '(GMT+01:00) Budapest',
'Europe/Copenhagen' => '(GMT+01:00) Copenhagen',
'Europe/Ljubljana' => '(GMT+01:00) Ljubljana',
'Europe/Madrid' => '(GMT+01:00) Madrid',
'Europe/Paris' => '(GMT+01:00) Paris',
'Europe/Prague' => '(GMT+01:00) Prague',
'Europe/Rome' => '(GMT+01:00) Rome',
'Europe/Sarajevo' => '(GMT+01:00) Sarajevo',
'Europe/Skopje' => '(GMT+01:00) Skopje',
'Europe/Stockholm' => '(GMT+01:00) Stockholm',
'Europe/Vienna' => '(GMT+01:00) Vienna',
'Europe/Warsaw' => '(GMT+01:00) Warsaw',
'Europe/Zagreb' => '(GMT+01:00) Zagreb',
'Europe/Athens' => '(GMT+02:00) Athens',
'Europe/Bucharest' => '(GMT+02:00) Bucharest',
'Africa/Cairo' => '(GMT+02:00) Cairo',
'Africa/Harare' => '(GMT+02:00) Harare',
'Europe/Helsinki' => '(GMT+02:00) Helsinki',
'Europe/Istanbul' => '(GMT+02:00) Istanbul',
'Asia/Jerusalem' => '(GMT+02:00) Jerusalem',
'Europe/Kiev' => '(GMT+02:00) Kyiv',
'Europe/Minsk' => '(GMT+02:00) Minsk',
'Europe/Riga' => '(GMT+02:00) Riga',
'Europe/Sofia' => '(GMT+02:00) Sofia',
'Europe/Tallinn' => '(GMT+02:00) Tallinn',
'Europe/Vilnius' => '(GMT+02:00) Vilnius',
'Asia/Baghdad' => '(GMT+03:00) Baghdad',
'Asia/Kuwait' => '(GMT+03:00) Kuwait',
'Europe/Moscow' => '(GMT+03:00) Moscow',
'Africa/Nairobi' => '(GMT+03:00) Nairobi',
'Asia/Riyadh' => '(GMT+03:00) Riyadh',
'Europe/Volgograd' => '(GMT+03:00) Volgograd',
'Asia/Tehran' => '(GMT+03:30) Tehran',
'Asia/Baku' => '(GMT+04:00) Baku',
'Asia/Muscat' => '(GMT+04:00) Muscat',
'Asia/Tbilisi' => '(GMT+04:00) Tbilisi',
'Asia/Yerevan' => '(GMT+04:00) Yerevan',
'Asia/Kabul' => '(GMT+04:30) Kabul',
'Asia/Yekaterinburg' => '(GMT+05:00) Ekaterinburg',
'Asia/Karachi' => '(GMT+05:00) Karachi',
'Asia/Tashkent' => '(GMT+05:00) Tashkent',
'Asia/Kolkata' => '(GMT+05:30) Kolkata',
'Asia/Kathmandu' => '(GMT+05:45) Kathmandu',
'Asia/Almaty' => '(GMT+06:00) Almaty',
'Asia/Dhaka' => '(GMT+06:00) Dhaka',
'Asia/Novosibirsk' => '(GMT+06:00) Novosibirsk',
'Asia/Bangkok' => '(GMT+07:00) Bangkok',
'Asia/Jakarta' => '(GMT+07:00) Jakarta',
'Asia/Krasnoyarsk' => '(GMT+07:00) Krasnoyarsk',
'Asia/Chongqing' => '(GMT+08:00) Chongqing',
'Asia/Hong_Kong' => '(GMT+08:00) Hong Kong',
'Asia/Irkutsk' => '(GMT+08:00) Irkutsk',
'Asia/Kuala_Lumpur' => '(GMT+08:00) Kuala Lumpur',
'Australia/Perth' => '(GMT+08:00) Perth',
'Asia/Singapore' => '(GMT+08:00) Singapore',
'Asia/Taipei' => '(GMT+08:00) Taipei',
'Asia/Ulaanbaatar' => '(GMT+08:00) Ulaan Bataar',
'Asia/Urumqi' => '(GMT+08:00) Urumqi',
'Asia/Seoul' => '(GMT+09:00) Seoul',
'Asia/Tokyo' => '(GMT+09:00) Tokyo',
'Asia/Yakutsk' => '(GMT+09:00) Yakutsk',
'Australia/Adelaide' => '(GMT+09:30) Adelaide',
'Australia/Darwin' => '(GMT+09:30) Darwin',
'Australia/Brisbane' => '(GMT+10:00) Brisbane',
'Australia/Canberra' => '(GMT+10:00) Canberra',
'Pacific/Guam' => '(GMT+10:00) Guam',
'Australia/Hobart' => '(GMT+10:00) Hobart',
'Australia/Melbourne' => '(GMT+10:00) Melbourne',
'Pacific/Port_Moresby' => '(GMT+10:00) Port Moresby',
'Australia/Sydney' => '(GMT+10:00) Sydney',
'Asia/Vladivostok' => '(GMT+10:00) Vladivostok',
'Asia/Magadan' => '(GMT+11:00) Magadan',
'Pacific/Auckland' => '(GMT+12:00) Auckland',
'Pacific/Fiji' => '(GMT+12:00) Fiji',
'Asia/Kamchatka' => '(GMT+12:00) Kamchatka'
];
// Type de proxy
public static $proxyType = [
@ -187,14 +187,7 @@ class config extends common
];
public static $captchaTypes = [
'num' => 'Chiffres',
'alpha' => 'Lettres'
];
public static $updateDelay = [
86400 => '1',
172800 => '2',
345600 => '4',
604800 => '7',
1209600 => '14',
'alpha' => 'Lettres'
];
// Langue traduite courante
@ -204,8 +197,6 @@ class config extends common
public static $onlineVersion = '';
public static $updateButtonText = 'Réinstaller';
public static $imageOpenGraph = [];
/**
* Génére les fichiers pour les crawlers
* Sitemap compressé et non compressé
@ -213,26 +204,16 @@ class config extends common
*/
public function siteMap()
{
// La page n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
// Mettre à jour le site map
$successSitemap = $this->updateSitemap();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => $successSitemap ? helper::translate('La carte du site a été mise à jour') : helper::translate('Echec de l\'écriture, vérifiez les permissions'),
'state' => $successSitemap
]);
}
// Mettre à jour le site map
$successSitemap = $this->createSitemap();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => $successSitemap ? helper::translate('La carte du site a été mise à jour') : helper::translate('Echec de l\'écriture, vérifiez les permissions'),
'state' => $successSitemap
]);
}
@ -242,10 +223,7 @@ class config extends common
public function backup()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
// Creation du ZIP
$filter = $this->getInput('configBackupOption', helper::FILTER_BOOLEAN) === true ? ['backup', 'tmp'] : ['backup', 'tmp', 'file'];
$fileName = helper::autoBackup(self::TEMP_DIR, $filter);
@ -301,8 +279,10 @@ class config extends common
}
}
// Traitement des données reçues valides.
if (!empty($token) && $data !== false) {
if (!empty($token) && $data !== false) {
$data = json_decode($data, true);
$img = $data['screenshot'];
// Effacer l'image et la miniature png
@ -315,9 +295,9 @@ class config extends common
$success = copy($img, self::FILE_DIR . 'source/screenshot.jpg');
}
$notification = empty($token)
$notification = empty($token)
? 'La clé de l\'API ne peut pas être vide'
: ($success === false ? 'Service en ligne inaccessible' : 'Capture d\'écran générée avec succès');
: ($success === false ? 'Service en ligne inaccessible' : 'Capture d\'écran générée avec succès');
// Valeurs en sortie
$this->addOutput([
@ -333,10 +313,7 @@ class config extends common
public function restore()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
$success = false;
@ -365,7 +342,12 @@ class config extends common
'state' => false
]);
}
// Lire le contenu de l'archive dans le tableau files
/*
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
$files[] = (basename($stat['name']));
}*/
// Extraction de l'archive dans un dossier temporaire
$tmpDir = uniqid(8);
$success = $zip->extractTo(self::TEMP_DIR . $tmpDir);
@ -373,7 +355,7 @@ class config extends common
$data = json_decode(file_get_contents(self::TEMP_DIR . $tmpDir . '/data/core.json'), true);
$dataVersion = $data['core']['dataVersion'];
// Version non prises en charge <9 ou erreur d'extraction
if (intval(substr($dataVersion, 0, 1)) <= 9 or !$success) {
if (intval(substr($dataVersion, 0, 1)) <= 9 or !$success) {
// Valeurs en sortie erreur
$this->addOutput([
'title' => helper::translate('Restaurer'),
@ -393,7 +375,7 @@ class config extends common
// Copie dans le dossier /site/data
$success = $this->copyDir(self::TEMP_DIR . $tmpDir, 'site/');
$this->deleteDir(self::TEMP_DIR . $tmpDir);
$this->removeDir(self::TEMP_DIR . $tmpDir);
// Restaurer les users originaux d'une v10 si option cochée
if (
@ -404,8 +386,8 @@ class config extends common
}
// Message de notification
$notification = $success === true ? 'Restauration effectuée avec succès' : 'Erreur inconnue';
$redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/';
$notification = $success === true ? 'Restauration effectuée avec succès' : 'Erreur inconnue';
$redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/';
// Valeurs en sortie erreur
$this->addOutput([
'redirect' => $redirect,
@ -428,10 +410,7 @@ class config extends common
public function index()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
// Basculement en mise à jour auto, remise à 0 du compteur
if (
@ -441,6 +420,7 @@ class config extends common
$this->setData(['core', 'lastAutoUpdate', 0]);
}
// Sauvegarder la configuration
$this->setData([
'config',
@ -456,7 +436,6 @@ class config extends common
'proxyType' => $this->getInput('configProxyType'),
'proxyUrl' => $this->getInput('configProxyUrl'),
'proxyPort' => $this->getInput('configProxyPort', helper::FILTER_INT),
'autoUpdateDelay' => $this->getInput('configAutoUpdateDelay', helper::FILTER_INT),
'social' => [
'facebookId' => $this->getInput('socialFacebookId'),
'linkedinId' => $this->getInput('socialLinkedinId'),
@ -465,25 +444,21 @@ class config extends common
'twitterId' => $this->getInput('socialTwitterId'),
'youtubeId' => $this->getInput('socialYoutubeId'),
'youtubeUserId' => $this->getInput('socialYoutubeUserId'),
'githubId' => $this->getInput('socialGithubId'),
'redditId' => $this->getInput('socialRedditId'),
'twitchId' => $this->getInput('socialTwitchId'),
'vimeoId' => $this->getInput('socialVimeoId'),
'steamId' => $this->getInput('socialSteamId'),
'githubId' => $this->getInput('socialGithubId')
],
'smtp' => [
'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN),
'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT),
'port' => $this->getInput('smtpPort', helper::FILTER_INT),
'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)),
'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN),
'secure' => $this->getInput('smtpSecure', helper::FILTER_STRING_SHORT),
'username' => $this->getInput('smtpUsername', 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),
'secure' => $this->getInput('smtpSecure', helper::FILTER_BOOLEAN),
'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))),
'sender' => $this->getInput('smtpSender', helper::FILTER_MAIL)
],
'seo' => [
'robots' => $this->getInput('seoRobots', helper::FILTER_BOOLEAN),
'openGraphImage' => $this->getInput('seoOpenGraphImage', helper::FILTER_STRING_SHORT),
'keyApi' => $this->getInput('seoKeyApi', helper::FILTER_STRING_SHORT),
],
'connect' => [
'attempt' => $this->getInput('connectAttempt', helper::FILTER_INT),
@ -508,8 +483,7 @@ class config extends common
unlink($filename);
}
}
if (file_exists('site/data/.backup'))
unlink('site/data/.backup');
if (file_exists('site/data/.backup')) unlink('site/data/.backup');
} else {
touch('site/data/.backup');
}
@ -523,8 +497,8 @@ class config extends common
) {
// Ajout des lignes dans le .htaccess
$fileContent = file_get_contents('.htaccess');
$rewriteData = PHP_EOL .
'# URL rewriting' . PHP_EOL .
$rewriteData = PHP_EOL .
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
@ -534,7 +508,7 @@ class config extends common
'</IfModule>' . PHP_EOL .
'# URL rewriting' . PHP_EOL;
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
$this->secure_file_put_contents(
file_put_contents(
'.htaccess',
$fileContent
);
@ -550,7 +524,7 @@ class config extends common
$fileContent = file_get_contents('.htaccess');
$fileContent = explode('# URL rewriting', $fileContent);
$fileContent = $fileContent[0] . '# URL rewriting' . $fileContent[2];
$this->secure_file_put_contents(
file_put_contents(
'.htaccess',
$fileContent
);
@ -569,72 +543,10 @@ class config extends common
]);
}
// Activation du bouton de mise à jour
if (
helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)
&& $this->getData(['core', 'updateAvailable']) === false
&& $this->getData(['config', 'autoUpdate'])
) {
$this->setData(['core', 'updateAvailable', true]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
]);
}
// Variable de version
if (helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)) {
self::$updateButtonText = helper::translate('Mise à jour');
}
// Sélecteur de délais, compléter avec la traduction en jours
foreach (self::$updateDelay as $key => $value) {
self::$updateDelay[$key] = $key === 86400 ? $value . ' ' . helper::translate('jour') : $value . ' ' . helper::translate('jours');
}
// Paramètres de l'image OpenGraph
$imagePath = self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']);
// Par défaut
self::$imageOpenGraph['type'] = '';
self::$imageOpenGraph['size'] = '';
self::$imageOpenGraph['wide'] = '';
self::$imageOpenGraph['height'] = '';
self::$imageOpenGraph['ratio'] = 0;
if (
$this->getData(['config', 'seo', 'openGraphImage'])
&& file_exists($imagePath)
) {
// Infos sur l'image Open Graph
$typeMime = exif_imagetype($imagePath);
switch ($typeMime) {
case IMAGETYPE_JPEG:
$typeMime = 'jpeg';
break;
case IMAGETYPE_PNG:
$typeMime = 'png';
break;
default:
$typeMime = image_type_to_mime_type($typeMime);
}
self::$imageOpenGraph['type'] = $typeMime;
$imageSize = getimagesize($imagePath);
self::$imageOpenGraph['wide'] = $imageSize[0];
self::$imageOpenGraph['height'] = $imageSize[1];
self::$imageOpenGraph['ratio'] = self::$imageOpenGraph['wide'] / self::$imageOpenGraph['height'];
self::$imageOpenGraph['size'] = filesize($imagePath);
$tailleEnOctets = filesize($imagePath);
if ($tailleEnOctets >= 1024 * 1024) {
// Si la taille est supérieure ou égale à 1 Mo, afficher en mégaoctets
self::$imageOpenGraph['size'] = round($tailleEnOctets / (1024 * 1024), 2) . ' Mo';
} else {
// Sinon, afficher en kilooctets
self::$imageOpenGraph['size'] = round($tailleEnOctets / 1024, 2) . ' Ko';
}
self::$onlineVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
if (self::$onlineVersion > common::ZWII_VERSION) {
self::$updateButtonText = helper::translate('Mettre à jour');
}
// Valeurs en sortie
@ -648,16 +560,13 @@ class config extends common
public function script()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
// Ecrire les fichiers de script
if ($this->geturl(2) === 'head') {
$this->secure_file_put_contents(self::DATA_DIR . 'head.inc.html', $this->getInput('configScriptHead', null));
file_put_contents(self::DATA_DIR . 'head.inc.html', $this->getInput('configScriptHead', null));
}
if ($this->geturl(2) === 'body') {
$this->secure_file_put_contents(self::DATA_DIR . 'body.inc.html', $this->getInput('configScriptBody', null));
file_put_contents(self::DATA_DIR . 'body.inc.html', $this->getInput('configScriptBody', null));
}
// Valeurs en sortie
$this->addOutput([
@ -686,36 +595,26 @@ class config extends common
public function logReset()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
if (file_exists(self::DATA_DIR . 'journal.log')) {
unlink(self::DATA_DIR . 'journal.log');
// Créer les en-têtes des journaux
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
file_put_contents(self::DATA_DIR . 'journal.log', $d);
// Valeurs en sortie
$this->addOutput([
'access' => false
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Journal réinitialisé avec succès'),
'state' => true
]);
} else {
if (file_exists(self::DATA_DIR . 'journal.log')) {
unlink(self::DATA_DIR . 'journal.log');
// Créer les en-têtes des journaux
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
$this->secure_file_put_contents(self::DATA_DIR . 'journal.log', $d);
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Journal réinitialisé avec succès'),
'state' => true
]);
} else {
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucun journal à effacer'),
'state' => false
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucun journal à effacer'),
'state' => false
]);
}
}
@ -726,35 +625,25 @@ class config extends common
*/
public function logDownload()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
$fileName = self::DATA_DIR . 'journal.log';
if (file_exists($fileName)) {
ob_start();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile($fileName);
exit();
} else {
// Valeurs en sortie
$this->addOutput([
'access' => false
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucun fichier journal à télécharger'),
'state' => false
]);
} else {
$fileName = self::DATA_DIR . 'journal.log';
if (file_exists($fileName)) {
ob_start();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile($fileName);
exit();
} else {
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucun fichier journal à télécharger'),
'state' => false
]);
}
}
}
@ -763,46 +652,36 @@ class config extends common
*/
public function blacklistDownload()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
ob_start();
$fileName = self::TEMP_DIR . 'blacklist.log';
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
file_put_contents($fileName, $d);
if (file_exists($fileName)) {
$d = $this->getData(['blacklist']);
$data = '';
foreach ($d as $key => $item) {
$data .= helper::dateUTF8('%Y %m %d', $item['lastFail']) . ' - ' . helper::dateUTF8('%H:%M', time());
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
}
file_put_contents($fileName, $data, FILE_APPEND);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile($fileName);
unlink(self::TEMP_DIR . 'blacklist.log');
exit();
} else {
// Valeurs en sortie
$this->addOutput([
'access' => false
'title' => helper::translate('Confighelper::translate(uration'),
'view' => 'index',
'notification' => helper::translate('Aucune liste noire à télécharger'),
'state' => false
]);
} else {
ob_start();
$fileName = self::TEMP_DIR . 'blacklist.log';
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
$this->secure_file_put_contents($fileName, $d);
if (file_exists($fileName)) {
$d = $this->getData(['blacklist']);
$data = '';
foreach ($d as $key => $item) {
$data .= helper::dateUTF8('%Y %m %d', $item['lastFail'], self::$i18nUI) . ' - ' . helper::dateUTF8('%H:%M', time(), self::$i18nUI);
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
}
$this->secure_file_put_contents($fileName, $data, FILE_APPEND);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
ob_clean();
ob_end_flush();
readfile($fileName);
unlink(self::TEMP_DIR . 'blacklist.log');
exit();
} else {
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucune liste noire à télécharger'),
'state' => false
]);
}
}
}
@ -812,33 +691,23 @@ class config extends common
public function blacklistReset()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
$this->setData(['blacklist', []]);
// Valeurs en sortie
$this->addOutput([
'access' => false
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Liste noire réinitialisée avec succès'),
'state' => true
]);
} else {
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
$this->setData(['blacklist', []]);
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Liste noire réinitialisée avec succès'),
'state' => true
]);
} else {
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucune liste noire à effacer'),
'state' => false
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => helper::translate('Aucune liste noire à effacer'),
'state' => false
]);
}
}
@ -847,26 +716,16 @@ class config extends common
*/
public function copyBackups()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
$success = $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup');
$success = $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup');
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => $success ? helper::translate('Copie terminée avec succès') : helper::translate('Copie terminée avec des erreurs'),
'state' => $success
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => $success ? helper::translate('Copie terminée avec succès') : helper::translate('Copie terminée avec des erreurs'),
'state' => $success
]);
}
/**
@ -874,32 +733,22 @@ class config extends common
*/
public function delBackups()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
$path = realpath(self::BACKUP_DIR);
$success = $fail = 0;
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if (strpos($filename, '.zip')) {
$path = realpath(self::BACKUP_DIR);
$success = $fail = 0;
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if (strpos($filename, '.zip')) {
$r = unlink($filename);
$success = $r === true ? $success + 1 : $success;
$fail = $r === false ? $fail + 1 : $fail;
}
$r = unlink($filename);
$success = $r === true ? $success + 1 : $success;
$fail = $r === false ? $fail + 1 : $fail;
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => $success . helper::translate('Fichiers effacés') . ' - ' . helper::translate('Échecs') . ': ' . $fail,
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'index',
'notification' => $success . helper::translate('Fichiers effacés') . ' - ' . helper::translate('Échecs') . ': ' . $fail,
'state' => true
]);
}
}
}

View File

@ -1,4 +0,0 @@
<Files "data.key">
Order Allow,Deny
Deny from all
</Files>

View File

@ -1,47 +0,0 @@
<?php
/*
Ce script PHP est conçu pour être appelé via une requête HTTP GET avec une clé spécifique pour déclencher la création d'une archive ZIP de sauvegarde.
Exemple d'appel dans une URL :
http://example.com/chemin/vers/autobackup.php?key=your_secret_key
La clé doit être fournie en tant que paramètre "key" dans l'URL et correspondre à celle stockée dans le fichier "data.key" pour que la création de l'archive soit autorisée. Si la clé est valide, le script parcourt le répertoire spécifié et ajoute les fichiers à l'archive ZIP. Si la clé est invalide ou absente, le script affiche un message d'erreur et termine son exécution.
*/
// Vérification de la clé
if (isset ($_GET['key'])) {
$key = $_GET['key'];
$storedKey = file_get_contents('data.key');
if ($key !== $storedKey) {
http_response_code(401);
exit();
}
// Création du ZIP
$filter = ['backup', 'tmp'];
$fileName = date('Y-m-d-H-i-s', time()) . '-rolling-backup.zip';
$zip = new ZipArchive();
$zip->open('../../../../site/backup/' . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$directory = '../../../../site';
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$directory,
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($fileInfo, $key, $iterator) use ($filter) {
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
}
)
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
http_response_code(201);
}

View File

@ -1,49 +0,0 @@
<?php
/*
Ce script PHP est conçu pour supprimer les fichiers ayant l'extension 'tar.gz' dans un répertoire de sauvegarde si leur dernière modification remonte à un certain nombre de jours spécifié via une requête HTTP GET.
Exemple d'appel dans une URL avec le nombre de jours spécifié :
http://example.com/chemin/vers/script.php?days=7&key=your_secret_key
Le script vérifie également la présence et la validité d'une clé spécifique pour déclencher son exécution. La clé doit être fournie en tant que paramètre "key" dans l'URL et correspondre à celle stockée dans le fichier "data.key" pour que la suppression des fichiers soit autorisée. Si la clé est invalide ou absente, le script affiche un message d'erreur et termine son exécution.
*/
// Vérification de la clé
if (isset ($_GET['key'])) {
// Récupération de la clé fournie en GET
$key = $_GET['key'];
// Récupération de la clé stockée dans le fichier data.key
$storedKey = file_get_contents('data.key');
// Vérification de correspondance entre les clés
if ($key !== $storedKey) {
http_response_code(401);
exit();
}
// Récupère le nombre de jours à partir de la variable GET 'days'
$days = isset ($_GET['days']) ? (int) $_GET['days'] : 1; // Par défaut à 1 si non spécifié
// Chemin vers le répertoire contenant les fichiers
$directory = '../../../../site/backup/'; // Remplacez par le chemin réel
// Convertit le nombre de jours en secondes
$timeLimit = strtotime("-$days days");
// Crée un nouvel objet DirectoryIterator
foreach (new DirectoryIterator($directory) as $file) {
// Vérifie si l'élément courant est un fichier et a l'extension 'tar.gz'
if ($file->isFile() && $file->getExtension() === 'tar.gz') {
// Vérifie si le fichier a été modifié avant la limite de temps
if ($file->getMTime() < $timeLimit) {
// Supprime le fichier
unlink($file->getRealPath());
}
}
}
// Si la clé est manquante, affiche un message d'erreur et arrête l'exécution du script
http_response_code(201);
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -5,8 +5,8 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready((function(){$("#configBackupForm").submit((function(e){e.preventDefault();var url="<?php echo helper::baseUrl() . $this->getUrl(0); ?>/backup",message_success="<?php echo helper::translate('Sauvegarde générée avec succès'); ?>",message_error="<?php echo helper::translate('Erreur : sauvegarde non générée !'); ?>",message_title="<?php echo helper::translate('Sauvegarder'); ?>";$.ajax({type:"POST",url:url,data:$("form").serialize(),success:function(data){$("body, .button").css("cursor","default"),core.alert(message_success)},error:function(data){$("body, .button").css("cursor","default"),core.alert(message_error)},complete:function(){$("#configBackupSubmit").removeClass("disabled").prop("disabled",!1),$("#configBackupSubmit").removeClass("uniqueSubmission").prop("uniqueSubmission",!1),$("#configBackupSubmit span").removeClass("zwiico-spin animate-spin"),$("#configBackupSubmit span").addClass("zwiico-check zwiico-margin-right").text(message_title)}})})),$("#configBackupSubmit").on("click",(function(){if($("input[name=configBackupOption]").is(":checked")){var message_warning="<?php echo helper::translate('La sauvegarde des fichiers peut prendre du temps. Continuer ?'); ?>";return core.confirm(message_warning,(function(){$("body, .button").css("cursor","wait"),$("form#configBackupForm").submit()}))}}))}));
$(document).ready((function(){$("#configBackupForm").submit((function(e){e.preventDefault();var url="<?php echo helper::baseUrl() . $this->getUrl(0); ?>/backup",message_success="<?php echo helper::translate('Sauvegarde générée avec succès.'); ?>",message_error="<?php echo helper::translate('Erreur : sauvegarde non générée !'); ?>",message_title="<?php echo helper::translate('Sauvegarder'); ?>";$.ajax({type:"POST",url:url,data:$("form").serialize(),success:function(data){$("body, .button").css("cursor","default"),core.alert(message_success)},error:function(data){$("body, .button").css("cursor","default"),core.alert(message_error)},complete:function(){$("#configBackupSubmit").removeClass("disabled").prop("disabled",!1),$("#configBackupSubmit").removeClass("uniqueSubmission").prop("uniqueSubmission",!1),$("#configBackupSubmit span").removeClass("zwiico-spin animate-spin"),$("#configBackupSubmit span").addClass("zwiico-check zwiico-margin-right").text(message_title)}})})),$("#configBackupSubmit").on("click",(function(){if($("input[name=configBackupOption]").is(":checked")){var message_warning="<?php echo helper::translate('La sauvegarde des fichiers peut prendre du temps. Continuer ?'); ?>";return core.confirm(message_warning,(function(){$("body, .button").css("cursor","wait"),$("form#configBackupForm").submit()}))}}))}));

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -52,16 +52,4 @@
.activeButton {
background-color: #00BFFF;
}
.greenInfo, .redInfo {
font-weight: bold;
}
.greenInfo {
color: green;
}
.redInfo {
color: red;
}
}

File diff suppressed because one or more lines are too long

View File

@ -9,20 +9,14 @@
</div>
<div class="col1">
<?php /**echo template::button('configHelp', [
'class' => 'buttonHelp',
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
'target' => '_blank',
'value' => template::ico('help'),
'help' => 'Consulter l\'aide en ligne'
]); */?>
'class' => 'buttonHelp',
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
'target' => '_blank',
'value' => template::ico('help'),
'help' => 'Consulter l\'aide en ligne'
]); */ ?>
</div>
<div class="col2 offset6">
<?php echo template::button('configLocaleButton', [
'value' => 'Identité',
'href' => helper::baseUrl() . 'language/site'
]); ?>
</div>
<div class="col2">
<div class="col2 offset8">
<?php echo template::submit('Submit'); ?>
</div>
</div>
@ -41,6 +35,7 @@
'value' => 'Connexion',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('configNetworkButton', [
'value' => 'Réseau',
'class' => 'buttonTab'

View File

@ -2,8 +2,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Paramètres'); ?>
<h4><?php echo helper::translate('Paramètres'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseau" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -38,8 +37,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('SMTP'); ?>
<h4><?php echo helper::translate('SMTP'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/smtp" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -47,69 +45,61 @@
</span>-->
</h4>
<div class="row">
<div class="col6">
<?php echo template::text('smtpFrom', [
'label' => 'Expéditeur',
'placeholder' => 'no-reply@host',
'value' => $this->getData(['config', 'smtp', 'from']),
<div class="col12">
<?php echo template::checkbox('smtpEnable', true, 'Activer SMTP', [
'checked' => $this->getData(['config', 'smtp', 'enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
]); ?>
</div>
</div>
<div id="smtpParam">
<div class="row">
<div class="col12">
<?php echo template::checkbox('smtpEnable', true, 'SMTP personnalisé', [
'checked' => $this->getData(['config', 'smtp', 'enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
<div class="col8">
<?php echo template::text('smtpHost', [
'label' => 'Adresse SMTP',
'placeholder' => 'smtp.fr',
'value' => $this->getData(['config', 'smtp', 'host'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('smtpPort', [
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp', 'port'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('smtpAuth', $module::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp', 'auth'])
]); ?>
</div>
</div>
<div id="smtpParam">
<div id="smtpAuthParam">
<div class="row">
<div class="col8">
<?php echo template::text('smtpHost', [
'label' => 'Adresse SMTP',
'placeholder' => 'smtp.fr',
'value' => $this->getData(['config', 'smtp', 'host'])
<div class="col5">
<?php echo template::text('smtpUsername', [
'label' => 'Nom utilisateur',
'value' => $this->getData(['config', 'smtp', 'username'])
]); ?>
</div>
<div class="col5">
<?php echo template::password('smtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp', 'username']) ? helper::decrypt($this->getData(['config', 'smtp', 'username']), $this->getData(['config', 'smtp', 'password'])) : ''
]); ?>
</div>
<div class="col2">
<?php echo template::text('smtpPort', [
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp', 'port'])
<?php echo template::select('smtpSecure', $module::$SMTPEnc, [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp', 'secure'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('smtpAuth', $module::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp', 'auth'])
]); ?>
</div>
</div>
<div id="smtpAuthParam">
<div class="row">
<div class="col5">
<?php echo template::text('smtpUsername', [
'label' => 'Nom utilisateur',
'value' => $this->getData(['config', 'smtp', 'username'])
]); ?>
</div>
<div class="col5">
<?php echo template::password('smtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp', 'password'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('smtpSecure', $module::$SMTPEnc, [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp', 'secure'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -5,7 +5,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -1,13 +1,14 @@
<?php echo template::formOpen('configRestoreForm'); ?>
<div class="row">
<div class="col1">
<div class="col2">
<?php echo template::button('configRestoreBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'value' => template::ico('left')
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset9">
<div class="col2 offset8">
<?php echo template::submit('configRestoreSubmit', [
'value' => 'Restaurer',
'uniqueSubmission' => true,

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -1,13 +1,14 @@
<?php echo template::formOpen('configScript'); ?>
<div class="row">
<div class="col1">
<div class="col2">
<?php echo template::button('configManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'value' => template::ico('left')
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset9">
<div class="col2 offset8">
<?php echo template::submit('configManageSubmit', [
'value' => 'Valider',
'ico' => 'check'

View File

@ -71,34 +71,29 @@
<?php echo template::checkbox('configAutoUpdate', true, 'Rechercher une mise à jour en ligne', [
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.',
'disabled' => empty(helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL))
'disabled' => !$module::$onlineVersion
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('configAutoUpdateHtaccess', true, 'Préserver le fichier htaccess racine', [
'checked' => $this->getData(['config', 'autoUpdateHtaccess']),
'help' => 'Lors d\'une mise à jour automatique, conserve le fichier htaccess de la racine du site.',
'disabled' => empty(helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL))
'disabled' => !$module::$onlineVersion
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::select('configAutoUpdateDelay', $module::$updateDelay, [
'label' => 'Fréquence de recherche',
'selected' => $this->getData(['config', 'autoUpdateDelay']),
]); ?>
<div class="col6">
<?php echo '<pre>Version installée : <strong>' . common::ZWII_VERSION . '</strong></pre>'; ?>
<?php echo $module::$onlineVersion ? '<pre>Version en ligne : <strong>' . $module::$onlineVersion . '</strong></pre>' : ''; ?>
</div>
<div class="col3 offset1 verticalAlignBottom">
<pre>Version installée : <strong><?php echo common::ZWII_VERSION ; ?></strong></pre>
<pre>Version en ligne : <strong><?php echo helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL) ; ?></strong></pre>
</div>
<div class="col3 offset2 verticalAlignBottom">
<div class="col4 verticalAlignBottom">
<?php echo template::button('configUpdateForced', [
'ico' => 'download-cloud',
'href' => helper::baseUrl() . 'install/update',
'value' => $module::$updateButtonText,
'class' => 'buttonRed',
'disabled' => !$module::$onlineVersion
]); ?>
</div>
</div>

View File

@ -2,8 +2,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Capture d\'écran Open Graph'); ?>
<h4><?php echo helper::translate('Capture d\'écran Open Graph'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -11,47 +10,32 @@
</span>-->
</h4>
<div class="row">
<div class="col6">
<div class="col7">
<div class="row">
<div class="col12">
<?php echo template::file('seoOpenGraphImage', [
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Image Open Graph',
'value' => $this->getData(['config', 'seo', 'openGraphImage']),
'type' => 1,
'help' => sprintf('%s : JPG - PNG<br />', helper::translate('Format')) .
sprintf('%s : 1200 x 630 pixels<br />', helper::translate('Dimensions minimales')) .
sprintf('%s : 1.91:1<br />', helper::translate('Ratio')) .
sprintf('%s : %s, %s<br />', helper::translate('Taille maximale du fichier'), helper::translate('5 Mo pour les images JPEG'), helper::translate('1 Mo pour les images PNG'))
<?php echo template::text('seoKeyApi', [
'label' => 'Clé de l\'API <a href="https://app.screenshotapi.net/" target="_blank">ScreenShotApi</a>',
'value' => $this->getData(['config', 'seo', 'keyApi']),
'help' => 'Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération'
]); ?>
</div>
</div>
<div class="row">
<div class="col10 textAlignCenter">
<?php if( !empty($module::$imageOpenGraph['type']) ): ?>
<p>
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenWide">%s</span> x <span id="screenHeight">%s</span> pixels', helper::translate('Dimensions minimales'), $module::$imageOpenGraph['wide'], $module::$imageOpenGraph['height'] ); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>' , helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?>
</p>
<?php endif; ?>
<div class="col6 offset3">
<?php echo template::button('socialMetaImage', [
'href' => helper::baseUrl() . 'config/configMetaImage',
'value' => 'Générer une capture Open Graph'
]); ?>
</div>
</div>
</div>
<div class="col6">
<?php if (
$this->getData(['config', 'seo', 'openGraphImage']) &&
file_exists(self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']))
): ?>
<img
src="<?php echo self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']); ?>" />
<div class="col5">
<?php if (file_exists(self::FILE_DIR . 'source/screenshot.jpg')) : ?>
<div class="row">
<div class="col8 offset2 textAlignCenter">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'source/screenshot.jpg'; ?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
</div>
</div>
<?php endif; ?>
</div>
</div>
@ -61,8 +45,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Référencement'); ?>
<h4><?php echo helper::translate('Référencement'); ?>
</h4>
<div class="row">
<div class="col4 offset1">
@ -83,8 +66,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Réseaux sociaux'); ?>
<h4><?php echo helper::translate('Réseaux sociaux'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseaux-sociaux" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -95,92 +77,61 @@
<div class="col3">
<?php echo template::text('socialFacebookId', [
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
'label' => template::ico('facebook', ['margin' => 'right']) . 'Facebook',
'label' => 'Facebook',
'value' => $this->getData(['config', 'social', 'facebookId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialInstagramId', [
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
'label' => template::ico('instagram', ['margin' => 'right']) . 'Instagram',
'label' => 'Instagram',
'value' => $this->getData(['config', 'social', 'instagramId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => template::ico('twitter', ['margin' => 'right']) . 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialRedditId', [
'help' => 'Saisissez votre ID Reddit : https://www.reddit.com/user/[ID].',
'label' => template::ico('reddit', ['margin' => 'right']) . 'Reddit',
'value' => $this->getData(['config', 'social', 'redditId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('socialYoutubeId', [
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
'label' => template::ico('youtube', ['margin' => 'right']) . 'Chaîne Youtube',
'label' => 'Chaîne Youtube',
'value' => $this->getData(['config', 'social', 'youtubeId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialYoutubeUserId', [
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
'label' => template::ico('youtube', ['margin' => 'right']) . 'Youtube',
'label' => 'Youtube',
'value' => $this->getData(['config', 'social', 'youtubeUserId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialVimeoId', [
'help' => 'Saisissez votre ID Viemo : https://vimeo.com/[ID].',
'label' => template::ico('vimeo', ['margin' => 'right']) . 'Vimeo',
'value' => $this->getData(['config', 'social', 'vimeoId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => template::ico('pinterest', ['margin' => 'right']) . 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('socialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialLinkedinId', [
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
'label' => template::ico('linkedin', ['margin' => 'right']) . 'Linkedin',
'label' => 'Linkedin',
'value' => $this->getData(['config', 'social', 'linkedinId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => template::ico('github', ['margin' => 'right']) . 'Github',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialTwitchId', [
'help' => 'Saisissez votre ID Twitch : https://www.twitch.tv/[ID].',
'label' => template::ico('twitch', ['margin' => 'right']) . 'Twitch',
'value' => $this->getData(['config', 'social', 'twitchId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('socialSteamId', [
'help' => 'Saisissez votre ID Viemo : https://steamcommunity.com/id/[ID].',
'label' => template::ico('steam', ['margin' => 'right']) . 'Steam',
'value' => $this->getData(['config', 'social', 'steamId'])
]); ?>
</div>
</div>
</div>
</div>

View File

@ -1,50 +0,0 @@
<?php
/**
* This file is part of Zwii.
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
class dashboard extends common
{
public static $actions = [
'index' => self::GROUP_ADMIN,
];
public static $infos = [];
/**
* Dashboard
*/
public function index()
{
self::$infos['webserver'] = $_SERVER['SERVER_SOFTWARE'];
self::$infos['php']['version'] = phpversion();
self::$infos['php']['extension'] = get_loaded_extensions();
self::$infos['system']['memory'] = memory_get_usage() . ' octets';
self::$infos['system']['peek'] = 'Pic de mémoire utilisée : ' . memory_get_peak_usage() . ' octets';
$loadAverage = sys_getloadavg();
self::$infos['system']['charge'] = 'Charge moyenne (1 min / 5 min / 15 min) : ' . implode(' / ', $loadAverage) . '</P>';
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Tableau de bord'),
'view' => 'index'
]);
}
}

View File

@ -1,54 +0,0 @@
<?php echo template::formOpen('dashboard'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('dashboardFormBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'value' => template::ico('home')
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Système'); ?>
</h4>
<div class="row">
<div class="col6">
<p>
<?php echo helper::translate('Serveur Web'); ?>
</p>
<p>
<?php echo $module::$infos['webserver']; ?>
</p>
</div>
<div class="col6">
<p>
<?php echo helper::translate('PHP') . ' ' . $module::$infos['php']['version']; ?>
</p>
<p>
<?php echo implode(' - ', $module::$infos['php']['extension']); ?>
</p>
</div>
</div>
<div class="row">
<div class="col12">
<p>
<?php echo helper::translate('Mémoire'); ?>
</p>
<p>
<?php echo $module::$infos['system']['memory']; ?>
</p>
<p>
<?php echo $module::$infos['system']['charge']; ?>
</p>
<p>
<?php echo $module::$infos['system']['peek']; ?>
</p>
</div>
</div>
</div>
</div>
</div>

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -30,7 +30,8 @@ class install extends common
'http://' => 'HTTP'
];
public static $updateButtonText = 'Réinstaller';
// Thèmes proposés à l'installation
public static $themes = [];
public static $newVersion;
@ -49,35 +50,37 @@ class install extends common
'access' => false
]);
}
// Soumission du formulaire
if (
//$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$lang = $this->getInput('installLanguage');
// Pour la suite de l'installation
// setcookie('ZWII_UI', $lang, time() + 3600, helper::baseUrl(false, false), '', false, false);
$_SESSION['ZWII_UI'] = $this->getInput('installLanguage');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'install/postinstall'
]);
// Accès autorisé
else {
// Soumission du formulaire
if ($this->isPost()) {
$lang = $this->getInput('installLanguage');
setcookie('ZWII_UI', $lang, time() + 3600, helper::baseUrl(false, false), '', helper::isHttps(), true);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'install/postinstall/' . $lang
]);
}
}
// Liste des langues UI disponibles
if (is_dir(self::I18N_DIR)) {
foreach ($this->getData(['language']) as $lang => $value) {
self::$i18nFiles[$lang] = self::$languages[$lang];
$dir = getcwd();
chdir(self::I18N_DIR);
$files = glob('*.json');
// Ajouter une clé au tableau avec le code de langue
foreach ($files as $file) {
// La langue est-elle référencée ?
if (array_key_exists(basename($file, '.json'), self::$languages)) {
self::$i18nFiles[basename($file, '.json')] = self::$languages[basename($file, '.json')];
}
}
chdir($dir);
}
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => helper::translate('ZwiiCMS Installation'),
'title' => helper::translate('Installation'),
'view' => 'index'
]);
}
@ -97,13 +100,13 @@ class install extends common
// Accès autorisé
else {
// Soumission du formulaire
if (
//$this->getUser('permission', __CLASS__, __FUNCTION__) !== true &&
$this->isPost()
) {
if ($this->isPost()) {
$success = true;
// Validation de la langue transmise
$lang = array_key_exists($this->getUrl(2), self::$languages) ? $this->getUrl(2) : 'fr_FR';
// Double vérification pour le mot de passe
if ($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
self::$inputNotices['installConfirmPassword'] = 'Incorrect';
@ -115,120 +118,140 @@ class install extends common
$userMail = $this->getInput('installMail', helper::FILTER_MAIL, true);
$userId = $this->getInput('installId', helper::FILTER_ID, true);
// Validation de la langue transmise
self::$i18nUI = $_SESSION['ZWII_UI'];
self::$i18nUI = array_key_exists(self::$i18nUI, self::$languages) ? self::$i18nUI : 'fr_FR';
// par défaut le contenu est la langue d'installation
$_SESSION['ZWII_SITE_CONTENT'] = self::$i18nUI;
// Création du dossier de langue avec le marqueur de langue par défaut
if (!is_dir(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT'])) {
mkdir(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT']);
touch(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT'] . '/.default');
}
// Installation du site de test
if (
$this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === false
&& $_SESSION['ZWII_SITE_CONTENT'] === 'fr_FR'
) {
$sample = true;
}
$this->initData('page', $_SESSION['ZWII_SITE_CONTENT'], $sample);
$this->initData('module', $_SESSION['ZWII_SITE_CONTENT'], $sample);
$this->initData('locale', $_SESSION['ZWII_SITE_CONTENT'], $sample);
// Création de l'utilisateur si les données sont complétées.
// success retour de l'enregistrement des données
$this->setData([
$success = $this->setData([
'user',
$userId,
[
'firstname' => $userFirstname,
'forgot' => 0,
'group' => self::GROUP_ADMIN,
'profil' => 0,
'lastname' => $userLastname,
'pseudo' => 'Admin',
'signature' => 1,
'mail' => $userMail,
'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true),
'language' => $_SESSION['ZWII_SITE_CONTENT']
'language' => $lang
]
]);
// Envoie le mail
// Sent contient true si réussite sinon code erreur d'envoi en clair
$this->sendMail(
$userMail,
'Installation de votre site',
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
'Voici les détails de votre installation.<br><br>' .
'<strong>URL du site :</strong> <a href="' . helper::baseUrl(false) . '" target="_blank">' . helper::baseUrl(false) . '</a><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
null,
'no-reply@localhost'
);
// Compte créé, envoi du mail et création des données du site
if ($success) { // Formulaire complété envoi du mail
// Envoie le mail
// Sent contient true si réussite sinon code erreur d'envoi en clair
$sent = $this->sendMail(
$userMail,
'Installation de votre site',
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
'Voici les détails de votre installation.<br><br>' .
'<strong>URL du site :</strong> <a href="' . helper::baseUrl(false) . '" target="_blank">' . helper::baseUrl(false) . '</a><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
null
);
// Nettoyage fr par défaut
if (
$_SESSION['ZWII_SITE_CONTENT'] !== 'fr_FR'
) {
if (is_dir(self::DATA_DIR . 'fr_FR'))
$this->deleteDir(self::DATA_DIR . 'fr_FR');
}
// Nettoyer les cookies de langue d'une précédente installation
helper::deleteCookie('ZWII_CONTENT');
// Sauvegarder la configuration du Proxy
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
// Images exemples livrées dans tous les cas
try {
// Décompression dans le dossier de fichier temporaires
if (file_exists(self::TEMP_DIR . 'files.tar.gz')) {
unlink(self::TEMP_DIR . 'files.tar.gz');
// Installation du site de test
if (
$this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === false
&& $lang === 'fr_FR'
) {
$this->initData('page', self::$i18nContent, true);
$this->initData('module', self::$i18nContent, true);
$this->setData(['module', 'blog', 'posts', 'mon-premier-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-deuxieme-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-troisieme-article', 'userId', $userId]);
}
if (file_exists(self::TEMP_DIR . 'files.tar')) {
unlink(self::TEMP_DIR . 'files.tar');
// Jeu réduit pour les pages étrangères
if ($lang !== 'fr_FR') {
$this->initData('page', self::$i18nContent, false);
$this->initData('module', self::$i18nContent, false);
}
copy('core/module/install/ressource/files.tar.gz', self::TEMP_DIR . 'files.tar.gz');
$pharData = new PharData(self::TEMP_DIR . 'files.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
} catch (Exception $e) {
$success = $e->getMessage();
// Sauvegarder la configuration du Proxy
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
// Images exemples livrées dans tous les cas
try {
// Décompression dans le dossier de fichier temporaires
if (file_exists(self::TEMP_DIR . 'files.tar.gz')) {
unlink(self::TEMP_DIR . 'files.tar.gz');
}
if (file_exists(self::TEMP_DIR . 'files.tar')) {
unlink(self::TEMP_DIR . 'files.tar');
}
copy('core/module/install/ressource/files.tar.gz', self::TEMP_DIR . 'files.tar.gz');
$pharData = new PharData(self::TEMP_DIR . 'files.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
} catch (Exception $e) {
$success = $e->getMessage();
}
// Nettoyage
unlink(self::TEMP_DIR . 'files.tar.gz');
unlink(self::TEMP_DIR . 'files.tar');
helper::deleteCookie('ZWII_UI');
// Créer le dossier des fontes
if (!is_dir(self::DATA_DIR . 'fonts')) {
mkdir(self::DATA_DIR . 'fonts');
}
// Installation du thème sélectionné
$dataThemes = file_get_contents('core/module/install/ressource/themes/themes.json');
$dataThemes = json_decode($dataThemes, true);
$themeId = $dataThemes[$this->getInput('installTheme', helper::FILTER_STRING_SHORT)]['filename'];
if ($themeId !== 'default') {
$theme = new theme;
$theme->import('core/module/install/ressource/themes/' . $themeId);
}
// Copie des thèmes dans les fichiers
if (!is_dir(self::FILE_DIR . 'source/theme')) {
mkdir(self::FILE_DIR . 'source/theme');
}
$this->copyDir('core/module/install/ressource/themes', self::FILE_DIR . 'source/theme');
unlink(self::FILE_DIR . 'source/theme/themes.json');
// Copie des langues de l'UI et génération de la base de données
if (is_dir(self::I18N_DIR) === false) {
mkdir(self::I18N_DIR);
}
// Créer la base de données des langues
copy('core/module/install/ressource/i18n/languages.json', self::DATA_DIR . 'languages.json');
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
unlink(self::I18N_DIR . 'languages.json');
// Créer sitemap
$this->createSitemap();
// Mise à jour de la liste des pages pour TinyMCE
$this->listPages();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(false),
'notification' => $sent === true ? helper::translate('Installation terminée') : $sent,
'state' => ($sent === true && $success === true) ? true : null
]);
}
// Nettoyage
unlink(self::TEMP_DIR . 'files.tar.gz');
unlink(self::TEMP_DIR . 'files.tar');
// Créer le dossier des fontes
if (!is_dir(self::DATA_DIR . 'font')) {
mkdir(self::DATA_DIR . 'font');
}
// Copie des langues de l'UI et génération de la base de données
if (is_dir(self::I18N_DIR) === false) {
mkdir(self::I18N_DIR);
}
// Créer la base de données des langues
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
// Fixe l'adresse from pour les envois d'email
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(),
'notification' => helper::translate('Installation terminée'),
'state' => true
]);
}
// Affichage du formulaire
// Récupération de la liste des thèmes
$dataThemes = file_get_contents('core/module/install/ressource/themes/themes.json');
$dataThemes = json_decode($dataThemes, true);
self::$themes = helper::arrayColumn($dataThemes, 'name');
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
@ -243,204 +266,122 @@ class install extends common
*/
public function steps()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
switch ($this->getInput('step', helper::FILTER_INT)) {
switch ($this->getInput('step', helper::FILTER_INT)) {
// Préparation
case 1:
$success = true;
$message = '';
// RAZ la mise à jour auto
$this->setData(['core', 'updateAvailable', false]);
// Backup du dossier Data
helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']);
// Sauvegarde htaccess
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
$success = copy('.htaccess', '.htaccess' . '.bak');
$message = $success ? '' : 'Erreur de copie du fichier htaccess';
}
// Nettoyage des fichiers d'installation précédents
if ($success && file_exists(self::TEMP_DIR . 'update.tar.gz')) {
$success = unlink(self::TEMP_DIR . 'update.tar.gz');
$message = $success ? '' : 'Impossible d\'effacer la mise à jour précédente';
}
if ($success && file_exists(self::TEMP_DIR . 'update.tar')) {
$success = unlink(self::TEMP_DIR . 'update.tar');
$message = $success ? '' : 'Impossible d\'effacer la mise à jour précédente';
}
// Sauvegarde le message dans le journal
if (!empty($message)) {
$this->saveLog($message);
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => $success ? null : json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
break;
case 1:
$success = true;
// RAZ la mise à jour auto
$this->setData(['core', 'updateAvailable', false]);
// Backup du dossier Data
helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']);
// Sauvegarde htaccess
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
$success = copy('.htaccess', '.htaccess' . '.bak');
}
// Nettoyage des fichiers d'installation précédents
if (file_exists(self::TEMP_DIR . 'update.tar.gz') && $success) {
$success = unlink(self::TEMP_DIR . 'update.tar.gz');
}
if (file_exists(self::TEMP_DIR . 'update.tar') && $success) {
$success = unlink(self::TEMP_DIR . 'update.tar');
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => null
]
]);
break;
// Téléchargement
case 2:
$success = true;
$message = '';
$this->secure_file_put_contents(self::TEMP_DIR . 'update.tar.gz', helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz'));
$md5origin = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.md5');
$md5origin = explode(' ', $md5origin);
$md5target = md5_file(self::TEMP_DIR . 'update.tar.gz');
// Vérifier si les checksums correspondent
if ($md5origin[0] === $md5target) {
$success = true;
$message = "";
} else {
$success = false;
$message = 'Erreur de téléchargement ou de somme de contrôle';
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
unlink(self::TEMP_DIR . 'update.tar.gz');
http_response_code(500);
}
}
// Sauvegarde le message dans le journal
if (!empty($message)) {
$this->saveLog($message);
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
break;
case 2:
file_put_contents(self::TEMP_DIR . 'update.tar.gz', helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz'));
$md5origin = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.md5');
$md5origin = (explode(' ', $md5origin));
$md5target = md5_file(self::TEMP_DIR . 'update.tar.gz');
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $md5origin[0] === $md5target,
'data' => null
]
]);
break;
// Installation
case 3:
$success = true;
$message = '';
// Check la réécriture d'URL avant d'écraser les fichiers
if (helper::checkRewrite()) {
touch(self::DATA_DIR . '.rewrite');
}
// Décompression et installation
try {
// Décompression dans le dossier de fichier temporaires
$pharData = new PharData(self::TEMP_DIR . 'update.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
} catch (Exception $e) {
$message = $e->getMessage();
$success = false;
http_response_code(500);
}
// Nettoyage du dossier
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
unlink(self::TEMP_DIR . 'update.tar.gz');
}
if (file_exists(self::TEMP_DIR . 'update.tar')) {
unlink(self::TEMP_DIR . 'update.tar');
}
// Sauvegarde le message dans le journal
if (!empty($message)) {
$this->saveLog($message);
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
break;
case 3:
$success = true;
// Check la réécriture d'URL avant d'écraser les fichiers
$rewrite = helper::checkRewrite();
// Décompression et installation
try {
// Décompression dans le dossier de fichier temporaires
$pharData = new PharData(self::TEMP_DIR . 'update.tar.gz');
$pharData->decompress();
// Installation
$pharData->extractTo(__DIR__ . '/../../../', null, true);
} catch (Exception $e) {
$success = $e->getMessage();
}
// Nettoyage du dossier
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
unlink(self::TEMP_DIR . 'update.tar.gz');
}
if (file_exists(self::TEMP_DIR . 'update.tar')) {
unlink(self::TEMP_DIR . 'update.tar');
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => $rewrite
]
]);
break;
// Configuration
case 4:
$success = true;
$message = '';
/**
* Restaure le fichier htaccess
*/
// Recopie htaccess
if (
$this->getData(['config', 'autoUpdateHtaccess']) === true
) {
// L'écraser avec le backup
$success = copy('.htaccess.bak', '.htaccess');
if ($success === false) {
$message = helper::translate('La copie de sauvegarde du fichier htaccess n\'a pas été restaurée !');
http_response_code(500);
}
// Effacer le backup
unlink('.htaccess.bak');
} else {
/**
* Restaure la réécriture d'URL
*/
if (file_exists(self::DATA_DIR . '.rewrite')) { // Ajout des lignes dans le .htaccess
$fileContent = file_get_contents('.htaccess');
$rewriteData = PHP_EOL .
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
'</IfModule>' . PHP_EOL .
'# URL rewriting' . PHP_EOL;
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
$success = $this->secure_file_put_contents(
'.htaccess',
$fileContent
);
unlink(self::DATA_DIR . '.rewrite');
}
}
/**
* Met à jour les dictionnaires des langues depuis les nouveaux modèles installés
*/
require_once('core/module/install/ressource/defaultdata.php');
$installedLanguages = $this->getData(['language']);
$defaultLanguages = init::$defaultData['language'];
foreach ($installedLanguages as $key => $value) {
if (
isset($defaultLanguages[$key]['date']) &&
$defaultLanguages[$key]['date'] > $value['date'] &&
isset($defaultLanguages[$key]['version']) &&
$defaultLanguages[$key]['version'] >= $value['version']
) {
copy('core/module/install/ressource/i18n/' . $key . '.json', self::I18N_DIR . $key . '.json');
$this->setData(['language', $key, $defaultLanguages[$key]]);
}
}
// Sauvegarde le message dans le journal
if (!empty($message)) {
$this->saveLog($message);
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
}
case 4:
$success = true;
$rewrite = $this->getInput('data');
// Réécriture d'URL
if ($rewrite === "true") { // Ajout des lignes dans le .htaccess
$fileContent = file_get_contents('.htaccess');
$rewriteData = PHP_EOL .
'# URL rewriting' . PHP_EOL .
'<IfModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
'</IfModule>' . PHP_EOL .
'# URL rewriting' . PHP_EOL;
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
file_put_contents(
'.htaccess',
$fileContent
);
}
// Recopie htaccess
if (
$this->getData(['config', 'autoUpdateHtaccess']) &&
$success && file_exists('.htaccess.bak')
) {
// L'écraser avec le backup
$success = copy('.htaccess.bak', '.htaccess');
// Effacer le backup
unlink('.htaccess.bak');
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => null
]
]);
break;
}
}
@ -449,31 +390,42 @@ class install extends common
*/
public function update()
{
// Action interdite
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
// Nouvelle version
self::$newVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
// Variable de version
if (helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)) {
self::$updateButtonText = helper::translate('Mise à jour');
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => helper::translate(self::$updateButtonText),
'view' => 'update'
]);
}
// Nouvelle version
self::$newVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => helper::translate('Mise à jour'),
'view' => 'update'
]);
}
}
/**
* Génère un fichier d'énumération des langues de l'UI
*/
private function makeUiLanguages()
{
// Générer une énumération absente
if (empty($enums)) {
if (is_dir(self::I18N_DIR) === false) {
mkdir(self::I18N_DIR);
}
$dir = getcwd();
chdir(self::I18N_DIR);
$files = glob('*.json');
chdir($dir);
$enums = [];
foreach ($files as $file => $value) {
if (basename($value, '.json') === 'languages') {
continue;
}
$enums[basename($value, '.json')] = [
'version' => "?",
'date' => 1672052400
];
}
$this->setData(['languages', $enums]);
}
}
}

View File

@ -5,7 +5,6 @@ class init extends common
'config' => [
'autoBackup' => true,
'autoUpdate' => true,
'autoUpdateDelay' => 86400,
'autoUpdateHtaccess' => false,
'favicon' => 'favicon.ico',
'faviconDark' => 'faviconDark.ico',
@ -26,11 +25,10 @@ class init extends common
'proxyType' => 'tcp://',
'smtp' => [
'enable' => false,
'from'=> 'no-reply@localhost'
],
'seo' => [
'robots' => true,
'openGraphImage' => 'screenshot.png'
'keyApi' => 'XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX'
],
'connect' => [
'timeout' => 600,
@ -46,13 +44,33 @@ class init extends common
]
],
'core' => [
'dataVersion' => 13000,
'dataVersion' => 11600,
'lastBackup' => 0,
'lastClearTmp' => 0,
'lastAutoUpdate' => 0,
'updateAvailable' => false
],
'font' => [
'locale' => [
'homePageId' => 'accueil',
'page302' => 'none',
'page403' => 'none',
'page404' => 'none',
'legalPageId' => 'none',
'searchPageId' => 'none',
'searchPageLabel' => 'Rechercher',
'sitemapPageLabel' => 'Plan du site',
'legalPageLabel' => 'Mentions légales',
'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.',
'title' => 'Votre site en quelques clics !',
'cookies' => [
'mainLabel' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.',
'titleLabel' => 'Cookies essentiels',
'linkLegalLabel' => 'Consulter les mentions légales',
'cookiesFooterText' => 'Cookies',
'buttonValidLabel' => 'J\'ai compris'
]
],
'fonts' => [
'files' => [],
'imported' => [
'arimo' => [
@ -72,12 +90,12 @@ class init extends common
],
'droid-sans-2' => [
'name' => 'Droid Sans',
'font-family' => '\'Droid Sans\', sans-serif',
'font-family' => '\'Droid Sans\', sans-serif',
'resource' => 'https://fonts.cdnfonts.com/css/droid-sans-2'
],
'droid-serif-2' => [
'name' => 'Droid Serif',
'font-family' => '\'Droid Serif\', serif',
'font-family' => '\'Droid Serif\', serif',
'resource' => 'https://fonts.cdnfonts.com/css/droid-serif-2'
],
'indie-flower' => [
@ -157,8 +175,39 @@ class init extends common
]
]
],
'page' => [
'accueil' => [
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'content' => 'accueil.html',
'hideTitle' => false,
'homePageId' => true,
'breadCrumb' => false,
'metaDescription' => '',
'metaTitle' => '',
'moduleId' => '',
'modulePosition' => 'bottom',
'parentPageId' => '',
'position' => 1,
'group' => self::GROUP_VISITOR,
'targetBlank' => false,
'title' => 'Accueil',
'shortTitle' => 'Accueil',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
'css' => '',
'js' => ''
]
],
'module' => [],
'user' => [],
'theme' => [
'theme' => [
'body' => [
'backgroundColor' => 'rgba(236, 239, 241, 1)',
'image' => '',
@ -281,489 +330,13 @@ class init extends common
'backgroundColorButtonGreen' => 'rgba(100, 207, 8, 1)',
'backgroundColorButtonHelp' => 'rgba(255, 153, 0, 1)',
'backgroundBlockColor' => 'rgba(236, 239, 241, 1)',
'borderBlockColor' => 'rgba(190, 202, 209, 1)',
'width' => '960px'
'borderBlockColor' => 'rgba(190, 202, 209, 1)'
],
'blacklist' => [],
'language' => [
"fr_FR" => [
"version" => 13007,
"date" => 1699354723
],
"es" => [
"version" => 13007,
"date" => 1699354723
],
"en_EN" => [
"version" => 13007,
"date" => 1699354723
]
],
'profil' => [
'-1' => [
'name' => 'Banni',
'readonly' => true,
'permanent' => true,
'comment' => 'Accès désactivé',
],
'0' => [
'name' => 'Visiteur',
'readonly' => true,
'permanent' => true,
'comment' => 'Accède au site',
],
'1' => [
'1' => [
'name' => 'Membre simple',
'readonly' => false,
'permanent' => true,
'comment' => 'Accède aux pages réservées',
'filemanager' => false,
'file' => [
'download' => false,
'edit' => false,
'create' => false,
'rename' => false,
'upload' => false,
'delete' => false,
'preview' => false,
'duplicate' => false,
'extract' => false,
'copycut' => false,
'chmod' => false
],
'folder' => [
'create' => false,
'delete' => false,
'rename' => false,
'copycut' => false,
'chmod' => false,
'share' => false,
'path' => null,
],
'page' => [
'add' => false,
'delete' => false,
'duplicate' => false,
'edit' => false,
'jsEditor' => false,
'cssEditor' => false,
'module' => false,
],
'blog' => [
'add' => false,
'delete' => false,
'edit' => false,
'option' => false,
'config' => false,
'comment' => false,
'commentApprove' => false,
'commentDelete' => false,
'commentDeleteAll' => false,
],
'form' => [
'option' => false,
'config' => false,
'data' => false,
'delete' => false,
'deleteAll' => false,
'export2csv' => false,
],
'gallery' => [
'config' => false,
'delete' => false,
'edit' => false,
'add' => false,
'option' => false,
'theme' => false,
],
'news' => [
'add' => false,
'config' => false,
'option' => false,
'delete' => false,
'edit' => false,
],
'redirection' => [
'config' => false,
],
'search' => [
'config' => false,
],
'user' => [
'edit' => true,
]
],
'2' => [
'name' => 'Membre avec droit de partage',
'readonly' => false,
'permanent' => false,
'comment' => 'Accède aux pages réservées et à un dossier partagé',
'filemanager' => true,
'file' => [
'download' => false,
'edit' => false,
'create' => false,
'rename' => false,
'upload' => false,
'delete' => false,
'preview' => false,
'duplicate' => false,
'extract' => false,
'copycut' => false,
'chmod' => false
],
'folder' => [
'create' => false,
'delete' => false,
'rename' => false,
'copycut' => false,
'chmod' => false,
'share' => true,
'path' => '/site/file/source/partage/',
],
'page' => [
'add' => false,
'delete' => false,
'duplicate' => false,
'edit' => false,
'jsEditor' => false,
'cssEditor' => false,
'module' => false,
],
'blog' => [
'add' => false,
'delete' => false,
'edit' => false,
'option' => false,
'config' => false,
'comment' => false,
'commentApprove' => false,
'commentDelete' => false,
'commentDeleteAll' => false,
],
'form' => [
'option' => false,
'config' => false,
'data' => false,
'delete' => false,
'deleteAll' => false,
'export2csv' => false,
],
'gallery' => [
'config' => false,
'delete' => false,
'edit' => false,
'add' => false,
'option' => false,
'theme' => false,
'dirs' => false,
'sortGalleries' => false,
'sortPictures' => false,
],
'news' => [
'add' => false,
'config' => false,
'option' => false,
'delete' => false,
'edit' => false,
],
'redirection' => [
'config' => false,
],
'search' => [
'config' => false,
],
'user' => [
'edit' => true,
]
],
],
'2' => [
'1' => [
'name' => 'Éditeur simple',
'readonly' => false,
'permanent' => true,
'comment' => 'Édition des pages',
'filemanager' => true,
'file' => [
'download' => true,
'edit' => true,
'create' => true,
'rename' => true,
'upload' => true,
'delete' => false,
'preview' => true,
'duplicate' => false,
'extract' => false,
'copycut' => false,
'chmod' => false
],
'folder' => [
'create' => false,
'delete' => false,
'rename' => false,
'copycut' => false,
'chmod' => false,
'share' => true,
'path' => '/site/file/source/partage/',
],
'page' => [
'add' => false,
'delete' => false,
'duplicate' => false,
'edit' => true,
'jsEditor' => true,
'cssEditor' => true,
'module' => true,
],
'blog' => [
'add' => true,
'delete' => false,
'edit' => true,
'option' => false,
'config' => false,
'comment' => false,
'commentApprove' => false,
'commentDelete' => false,
'commentDeleteAll' => false,
],
'form' => [
'option' => false,
'config' => false,
'data' => false,
'delete' => false,
'deleteAll' => false,
'export2csv' => false,
],
'gallery' => [
'config' => false,
'delete' => false,
'edit' => false,
'add' => false,
'option' => false,
'theme' => false,
],
'news' => [
'add' => true,
'config' => false,
'option' => false,
'delete' => false,
'edit' => true,
],
'redirection' => [
'config' => false,
],
'search' => [
'config' => false,
],
'user' => [
'edit' => true,
]
],
'2' => [
'name' => 'Rédacteur',
'readonly' => false,
'permanent' => false,
'comment' => 'Tous les droits d\'édition des contenus',
'filemanager' => true,
'file' => [
'download' => true,
'edit' => true,
'create' => true,
'rename' => true,
'upload' => true,
'delete' => true,
'preview' => true,
'duplicate' => true,
'extract' => true,
'copycut' => true,
'chmod' => true
],
'folder' => [
'create' => true,
'delete' => true,
'rename' => true,
'copycut' => true,
'chmod' => true,
'share' => true,
'path' => '/site/file/source/partage/',
],
'page' => [
'add' => true,
'delete' => true,
'duplicate' => true,
'edit' => true,
'jsEditor' => true,
'cssEditor' => true,
'module' => true,
],
'blog' => [
'add' => true,
'delete' => true,
'edit' => true,
'option' => true,
'config' => true,
'comment' => true,
'commentApprove' => true,
'commentDelete' => true,
'commentDeleteAll' => true,
],
'form' => [
'option' => true,
'config' => true,
'data' => true,
'delete' => true,
'deleteAll' => true,
'export2csv' => true,
],
'gallery' => [
'config' => true,
'delete' => true,
'edit' => true,
'add' => true,
'option' => true,
'theme' => true,
],
'news' => [
'add' => true,
'config' => true,
'option' => true,
'delete' => true,
'edit' => true,
],
'redirection' => [
'config' => true,
],
'search' => [
'config' => true,
],
'user' => [
'edit' => true,
]
],
],
'3' => [
'name' => 'Administrateur',
'readonly' => true,
'permanent' => true,
'comment' => 'Contrôle total',
]
]
'languages'=> [],
];
public static $defaultDataI18n = [
'fr_FR' => [
'locale' => [
'homePageId' => 'accueil',
'page302' => 'none',
'page403' => 'none',
'page404' => 'none',
'legalPageId' => 'none',
'searchPageId' => 'none',
'searchPageLabel' => 'Rechercher',
'sitemapPageLabel' => 'Plan du site',
'legalPageLabel' => 'Mentions légales',
'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.',
'title' => 'Votre site en quelques clics !',
'cookies' => [
'mainLabel' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.',
'titleLabel' => 'Cookies essentiels',
'linkLegalLabel' => 'Consulter les mentions légales',
'cookiesFooterText' => 'Cookies',
'buttonValidLabel' => 'J\'ai compris'
]
],
'page' => [
'accueil' => [
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'content' => 'accueil.html',
'hideTitle' => false,
'homePageId' => true,
'breadCrumb' => false,
'metaDescription' => '',
'metaTitle' => '',
'moduleId' => '',
'modulePosition' => 'bottom',
'parentPageId' => '',
'position' => 1,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Accueil',
'shortTitle' => 'Accueil',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
'css' => '',
'js' => ''
]
],
'module' => [],
'html' => '<h2>Bienvenue dans cette nouvelle installation de ZwiiCMS. Créez et gérez votre site facilement avec notre système convivial.</h2>'
],
'es' => [
'locale' => [
'homePageId' => 'inicio',
'page302' => 'none',
'page403' => 'none',
'page404' => 'none',
'legalPageId' => 'none',
'searchPageId' => 'none',
'searchPageLabel' => 'none',
'sitemapPageLabel' => 'none',
'legalPageLabel' => 'legales',
"metaDescription" => "Zwii es un CMS sin base de datos que facilita la creación y gestión de un sitio web sin necesidad de conocimientos de programación.",
"title" => "¡Tu sitio en unos clics!",
"cookies" => [
"mainLabel" => "Este sitio web utiliza cookies necesarias para su funcionamiento. Estas cookies permiten optimizar su funcionamiento, por ejemplo, memorizando los datos de conexión, el idioma que has elegido o la validación de este mensaje.",
"titleLabel" => "Cookies esenciales",
"linkLegalLabel" => "Consultar el aviso legal",
"cookiesFooterText" => "Cookies",
"buttonValidLabel" => "Aceptar"
]
],
'page' => [
'inicio' => [
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'content' => 'inico.html',
'hideTitle' => false,
'homePageId' => true,
'breadCrumb' => false,
'metaDescription' => '',
'metaTitle' => '',
'moduleId' => '',
'modulePosition' => 'bottom',
'parentPageId' => '',
'position' => 1,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Página de inicio',
'shortTitle' => 'Página de inicio',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
'css' => '',
'js' => ''
]
],
'module' => [],
'html' => '<h2>¡Bienvenido/a a esta nueva instalación de ZwiiCMS!</h2><p>Crea y administra tu sitio web de manera sencilla con nuestro sistema amigable.</p><p>Esta es tu primera página, inicia sesión para crear nuevas.</p>'
],
'default' => [
'en_EN' => [
'locale' => [
'homePageId' => 'home',
'page302' => 'none',
@ -773,7 +346,6 @@ class init extends common
'searchPageId' => 'none',
'searchPageLabel' => 'none',
'sitemapPageLabel' => 'none',
'poweredPageLabel' => 'Powered by',
'legalPageLabel' => 'legals',
'metaDescription' => 'Zwii is a database-free CMS that makes it easy to create and manage a website without any programming knowledge.',
'title' => 'Your site in a few clicks!',
@ -801,9 +373,8 @@ class init extends common
'parentPageId' => '',
'position' => 1,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Home page',
'title' => 'HomePage',
'shortTitle' => 'Home',
'block' => '12',
'barLeft' => '',
@ -816,11 +387,12 @@ class init extends common
'js' => ''
]
],
'module' => [],
'html' => '<h2>Welcome to this new installation of ZwiiCMS.</h2><p>Easily create and manage your website with our user-friendly system.</p><p>This is your first page, log in to create new ones.</p>'
'html' => 'Welcome in this ZiiCMS, this is you first page !'
]
];
public static $siteTemplate = [
public static $siteData = [
'page' => [
'accueil' => [
'typeMenu' => 'text',
@ -837,7 +409,6 @@ class init extends common
'parentPageId' => '',
'position' => 1,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Accueil',
'shortTitle' => 'Accueil',
@ -865,14 +436,13 @@ class init extends common
'parentPageId' => 'accueil',
'position' => 1,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Page Enfant',
'shortTitle' => 'Enfant',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
@ -893,14 +463,13 @@ class init extends common
'modulePosition' => 'bottom',
'position' => 2,
'group' => self::GROUP_MEMBER,
'profil' => 1,
'targetBlank' => false,
'title' => 'Page privée',
'shortTitle' => 'Privée',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
@ -921,14 +490,13 @@ class init extends common
'modulePosition' => 'bottom',
'position' => 2,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Mise en page',
'shortTitle' => 'Mise en page',
'block' => '4-8',
'barLeft' => 'barre',
'barRight' => '',
'displayMenu' => 'none',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
@ -949,14 +517,13 @@ class init extends common
'modulePosition' => 'bottom',
'position' => 3,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Barre latérale avec menu',
'shortTitle' => 'Menu latéral',
'block' => '9-3',
'barLeft' => '',
'barRight' => 'barrelateraleavecmenu',
'displayMenu' => 'none',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
@ -977,14 +544,13 @@ class init extends common
'parentPageId' => '',
'position' => 3,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Blog',
'shortTitle' => 'Blog',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
@ -1005,14 +571,13 @@ class init extends common
'parentPageId' => '',
'position' => 4,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Galeries d\'images',
'shortTitle' => 'Galeries',
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => 'none',
'displayMenu' => 'none',
'hideMenuSide' => false,
'hideMenuChildren' => false,
'extraPosition' => false,
@ -1034,7 +599,6 @@ class init extends common
'parentPageId' => '',
'position' => 5,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => true,
'title' => 'Site de Zwii',
'shortTitle' => 'Site de Zwii',
@ -1062,7 +626,6 @@ class init extends common
'parentPageId' => '',
'position' => 6,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Contact',
'shortTitle' => 'Contact',
@ -1090,7 +653,6 @@ class init extends common
'parentPageId' => '',
'position' => 0,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Barre latérale',
'shortTitle' => 'Barre latérale',
@ -1118,7 +680,6 @@ class init extends common
'parentPageId' => '',
'position' => 0,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Barre latérale avec menu',
'shortTitle' => 'Barre latérale avec menu',
@ -1145,8 +706,7 @@ class init extends common
'modulePosition' => 'bottom',
'parentPageId' => '',
'position' => 0,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'group' => 0,
'targetBlank' => false,
'title' => 'Mentions légales',
'shortTitle' => 'Mentions légales',
@ -1175,7 +735,6 @@ class init extends common
'parentPageId' => '',
'position' => 0,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Maintenance en cours',
'shortTitle' => 'Maintenance en cours',
@ -1204,7 +763,6 @@ class init extends common
'parentPageId' => '',
'position' => 0,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Erreur 403',
'shortTitle' => 'Erreur 403',
@ -1232,7 +790,6 @@ class init extends common
'parentPageId' => '',
'position' => 0,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Erreur 404',
'shortTitle' => 'Erreur 404',
@ -1260,7 +817,6 @@ class init extends common
'parentPageId' => '',
'position' => 7,
'group' => self::GROUP_VISITOR,
'profil' => 0,
'targetBlank' => false,
'title' => 'Recherche dans le site',
'shortTitle' => 'Rechercher',
@ -1299,17 +855,17 @@ class init extends common
'picturePosition' => 'left',
'hidePicture' => false,
'pictureSize' => 20,
'picturePosition' => 'left',
'publishedOn' => 1548790902,
'state' => true,
'title' => 'Mon premier article',
'userId' => '',
// Géré au moment de l'installation
'userId' => '', // Géré au moment de l'installation
'editConsent' => 'all',
'commentMaxlength' => '500',
'commentApproved' => false,
'commentClose' => false,
'commentNotification' => false,
'commentGroupNotification' => 1
'commentApproved' => false,
'commentClose' => false,
'commentNotification' => false,
'commentGroupNotification' => 1
],
'mon-deuxieme-article' => [
'closeComment' => false,
@ -1319,17 +875,17 @@ class init extends common
'hidePicture' => false,
'picturePosition' => 'right',
'pictureSize' => 40,
'picturePosition' => 'right',
'publishedOn' => 1550432502,
'state' => true,
'title' => 'Mon deuxième article',
'userId' => '',
// Géré au moment de l'installation
'userId' => '', // Géré au moment de l'installation
'editConsent' => 'all',
'commentMaxlength' => '500',
'commentApproved' => false,
'commentClose' => false,
'commentNotification' => false,
'commentGroupNotification' => 1
'commentApproved' => false,
'commentClose' => false,
'commentNotification' => false,
'commentGroupNotification' => 1
],
'mon-troisieme-article' => [
'closeComment' => true,
@ -1339,17 +895,17 @@ class init extends common
'hidePicture' => false,
'picturePosition' => 'left',
'pictureSize' => 100,
'picturePosition' => 'left',
'publishedOn' => 1550864502,
'state' => true,
'title' => 'Mon troisième article',
'userId' => '',
// Géré au moment de l'installation
'userId' => '', // Géré au moment de l'installation
'editConsent' => 'all',
'commentMaxlength' => '500',
'commentApproved' => false,
'commentClose' => false,
'commentNotification' => false,
'commentGroupNotification' => 1
'commentApproved' => false,
'commentClose' => false,
'commentNotification' => false,
'commentGroupNotification' => 1
],
],
],
@ -1361,9 +917,7 @@ class init extends common
'directory' => self::FILE_DIR . 'source/galerie/landscape',
'homePicture' => 'iceberg.jpg',
'sort' => 'SORT_ASC',
'position' => 1,
'showPageContent' => false,
'fullScreen' => false
'position' => 1
],
'legend' => [
'desertjpg' => 'Un désert',
@ -1382,9 +936,7 @@ class init extends common
'directory' => self::FILE_DIR . 'source/galerie/space',
'homePicture' => 'nebula.jpg',
'sort' => 'SORT_ASC',
'position' => 2,
'showPageContent' => false,
'fullScreen' => false
'position' => 2
],
'legend' => [
'earthjpg' => 'La Terre et la Lune',
@ -1399,24 +951,24 @@ class init extends common
],
],
'theme' => [
'thumbAlign' => 'center',
'thumbWidth' => '18em',
'thumbHeight' => '15em',
'thumbMargin' => '.5em',
'thumbBorder' => '.1em',
'thumbOpacity' => '.7',
'thumbAlign' => 'center',
'thumbWidth' => '18em',
'thumbHeight' => '15em',
'thumbMargin' => '.5em',
'thumbBorder' => '.1em',
'thumbOpacity' => '.7',
'thumbBorderColor' => 'rgba(221, 221, 221, 1)',
'thumbRadius' => '.3em',
'thumbShadows' => '1px 1px 10px',
'thumbRadius' => '.3em',
'thumbShadows' => '1px 1px 10px',
'thumbShadowsColor' => 'rgba(125, 125, 125, 1)',
'legendHeight' => '.375em',
'legendAlign' => 'center',
'legendTextColor' => 'rgba(255, 255, 255, 1)',
'legendBgColor' => 'rgba(0, 0, 0, .6)',
'style' => 'site/data/modules/gallery/galeries.css'
'legendHeight' => '.375em',
'legendAlign' => 'center',
'legendTextColor' => 'rgba(255, 255, 255, 1)',
'legendBgColor' => 'rgba(0, 0, 0, .6)',
'style' => 'site/data/modules/gallery/galeries.css'
],
'config' => [
'versionData' => '3.0'
'versionData' => '3.0'
],
],
'site-de-zwii' => [
@ -1434,7 +986,7 @@ class init extends common
'data' => [],
'input' => [
[
'name' => 'Adresse électronique',
'name' => 'Adresse mail',
'position' => 1,
'required' => true,
'type' => 'mail',
@ -1464,20 +1016,9 @@ class init extends common
'page404' => 'none',
'legalPageId' => 'none',
'searchPageId' => 'none',
'poweredPageLabel' => 'Motorisé par',
'searchPageLabel' => 'Rechercher',
'sitemapPageLabel' => 'Plan du site',
'legalPageLabel' => 'Mentions légales',
'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.',
'title' => 'Votre site en quelques clics !',
'cookies' => [
'mainLabel' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.',
'titleLabel' => 'Cookies essentiels',
'linkLegalLabel' => 'Consulter les mentions légales',
'cookiesFooterText' => 'Cookies',
'buttonValidLabel' => 'J\'ai compris'
]
],
'title' => 'Votre site en quelques clics !'
]
];
public static $siteContent = [
@ -1550,11 +1091,11 @@ class init extends common
<p justify="">Le site internet propose les services suivants :</p>
<p justify="">Publication</p>
<p justify="">Le site est accessible gratuitement en tout lieu &agrave; tout Utilisateur ayant un acc&egrave;s &agrave; Internet. Tous les frais support&eacute;s par l\'Utilisateur pour acc&eacute;der au service (mat&eacute;riel informatique, logiciels, connexion Internet, etc.) sont &agrave; sa charge.</p>
<p justify="">L&rsquo;Utilisateur non membre n\'a pas acc&egrave;s aux services r&eacute;serv&eacute;s. Pour cela, il doit s&rsquo;inscrire en remplissant le formulaire. En acceptant de s&rsquo;inscrire aux services r&eacute;serv&eacute;s, l&rsquo;Utilisateur membre s&rsquo;engage &agrave; fournir des informations sinc&egrave;res et exactes concernant son &eacute;tat civil et ses coordonn&eacute;es, notamment son Adresse électronique.</p>
<p justify="">L&rsquo;Utilisateur non membre n\'a pas acc&egrave;s aux services r&eacute;serv&eacute;s. Pour cela, il doit s&rsquo;inscrire en remplissant le formulaire. En acceptant de s&rsquo;inscrire aux services r&eacute;serv&eacute;s, l&rsquo;Utilisateur membre s&rsquo;engage &agrave; fournir des informations sinc&egrave;res et exactes concernant son &eacute;tat civil et ses coordonn&eacute;es, notamment son adresse email.</p>
<p justify="">Pour acc&eacute;der aux services, l&rsquo;Utilisateur doit ensuite s\'identifier &agrave; l\'aide de son identifiant et de son mot de passe qui lui seront communiqu&eacute;s apr&egrave;s son inscription.</p>
<p justify="">Tout Utilisateur membre r&eacute;guli&egrave;rement inscrit pourra &eacute;galement solliciter sa d&eacute;sinscription en se rendant &agrave; la page d&eacute;di&eacute;e sur son espace personnel. Celle-ci sera effective dans un d&eacute;lai raisonnable.</p>
<p justify="">Tout &eacute;v&eacute;nement d&ucirc; &agrave; un cas de force majeure ayant pour cons&eacute;quence un dysfonctionnement du site ou serveur et sous r&eacute;serve de toute interruption ou modification en cas de maintenance, n\'engage pas la responsabilit&eacute; de www.site.com. Dans ces cas, l&rsquo;Utilisateur accepte ainsi ne pas tenir rigueur &agrave; l&rsquo;&eacute;diteur de toute interruption ou suspension de service, m&ecirc;me sans pr&eacute;avis.</p>
<p justify="">L\'Utilisateur a la possibilit&eacute; de contacter le site par messagerie &eacute;lectronique &agrave; l&rsquo;Adresse électronique de l&rsquo;&eacute;diteur communiqu&eacute; &agrave; l&rsquo;ARTICLE 1.</p>
<p justify="">L\'Utilisateur a la possibilit&eacute; de contacter le site par messagerie &eacute;lectronique &agrave; l&rsquo;adresse email de l&rsquo;&eacute;diteur communiqu&eacute; &agrave; l&rsquo;ARTICLE 1.</p>
<h2>ARTICLE 3 : Collecte des donn&eacute;es</h2>
<p justify="">Le site est exempt&eacute; de d&eacute;claration &agrave; la Commission Nationale Informatique et Libert&eacute;s (CNIL) dans la mesure o&ugrave; il ne collecte aucune donn&eacute;e concernant les Utilisateurs.</p>
<h2>ARTICLE 4&nbsp;: Propri&eacute;t&eacute; intellectuelle</h2>
@ -1596,4 +1137,4 @@ class init extends common
'content' => '<h1>Rechercher dans le site</h1>'
]
];
}
}

View File

@ -1,59 +1,46 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'Do not display' creates an orphan page not accessible through menus.",
"'Sauvegarder et télécharger les données du module": "'Save and download module data",
"1 jour": "1 jour",
"1/4 : Préparation...": "1/4: preparation ...",
"10 minutes": "10 minutes",
"10 tentatives": "10 attempts",
"14 jours": "14 days",
"15 minutes": "15 minutes",
"2 jours": "2 days",
"2/4 : Téléchargement...": "2/4: Download ...",
"3 tentatives": "3 attempts",
"3/4 : Installation...": "3/4 : Installation...",
"4 jours": "4 days",
"4/4 : Configuration...": "4/4 : Setup...",
"5 minutes": "5 minutes",
"5 tentatives": "5 attempts",
"7 jours": "7 days",
"Accueil": "Homepage",
"Accède au site": "Access to the site",
"Accède aux pages réservées": "Access to restricted pages",
"Accède aux pages réservées et à un dossier partagé": "Access to restricted pages and a shared folder",
"Accès aux pages privées": "Access to private pages",
"Accès bloqué %d minutes": "Blocked access %d minutes",
"Accès désactivé": "Access disabled",
"Accès interdit, erreur 403": "Access prohibited, error 403",
"Action interdite": "Prohibited action",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Compulsory activation according to French laws unless you use your own consent system.",
"Activer": "Enable",
"Activer SMTP": "Active SMTP",
"Activer la journalisation": "Activate journalization",
"Actualiser": "Update",
"Adaptation": "Adaptation",
"Administrateur": "Administrator",
"Administration": "Administration",
"Administration complète du site": "Complete site administration",
"Adresse SMTP": "SMTP Address",
"Adresse du proxy": "Proxy address",
"Adresse électronique": "email address",
"Affectation": "Assignment",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Displays the name of the parent page followed by the page name, the title should not be hidden.",
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "Displays account management and logout icons for logged-in regular members",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "In order to ensure the proper functioning of Zwii, please do not close this page before the end of the operation.",
"Aide": "Help",
"Ajouter": "Add",
"Ajouter un profil": "Add Profile",
"Ajout - Édition - Suppression de fichiers": "Addition - Edition - Deletion of files",
"Ajout - Édition - Suppression de pages": "Addition - Edition - Deletion of pages",
"Ajouter un utilisateur": "Add a user",
"Ajouter une fonte": "Add a cast iron",
"Alignement": "Alignment",
"Aligner la bannière avec le contenu": "Align the banner with the contents",
"Ancien mot de passe": "Old Password",
"Anonymat des adresses IP": "Anonymity of IP addresses",
"Apache URL intelligent": "Intelligent Apache URL",
"Apache URL intelligentes": "Intelligent Apache URL",
"Apparence": "Appearance",
"Appliquer": "Apply",
"Approuver un commentaire": "Approve Comment",
"Après": "After",
"Après la bannière": "After the banner",
"Après le contenu de la page": "After the content of the page",
"Archive": "Archive",
"Archive ZIP": "Zip archive",
@ -69,46 +56,28 @@
"Arrière plan": "Background",
"Arrière plan des blocs": "Blocks background",
"Arrière plan des champs": "Fields background",
"Arrondi des angles": "Rounding of angles",
"Au centre": "Center",
"Au début": "At first",
"Au milieu au centre": "In the middle in the center",
"Au milieu à droite": "In the middle right",
"Au milieu à gauche": "In the middle on the left",
"Au-dessus du site": "Above the site",
"Aucun": "None",
"Aucun dossier": "No Folder",
"Aucun fichier journal à télécharger": "No log file to download",
"Aucun journal à effacer": "No log file to erase",
"Aucun menu": "No menu",
"Aucune": "None",
"Aucune liste noire à effacer": "No blacklist to erase",
"Aucune liste noire à télécharger": "No blacklist to download",
"Auteur :": "Author:",
"Authentification": "Authentication",
"Automatique": "Automatique",
"Autoriser les robots à référencer le site": "Allow robots to reference the site",
"Autorisé": "Allowed",
"Avant la bannière": "Before the banner",
"Avant le contenu de la page": "Before the content of the page",
"Background": "Background",
"Banni": "Ban",
"Bannière": "Banner",
"Bannière cliquable": "Clickable banner",
"Barre 1/3 - page 2/3": "Sidebar 1/3 - page 2/3",
"Barre 1/4 - page 1/2 - barre 1/4": "Sidebar 1/4 - page 1/2 - Sidebar 1/4",
"Barre 1/4 - page 3/4": "Sidebar 1/4 - page 3/4",
"Barre 2/12 - page 7/12 - barre 3/12": "Sidebar 2/12 - page 7/12 - Sidebar 3/12",
"Barre 3/12 - page 7/12 - barre 2/12": "Sidebar 3/12 - page 7/12 - Sidebar 2/12",
"Barre de membre": "Member bar",
"Barre latérale": "Sidebar",
"Barre latérale droite :": "Right sidebar:",
"Barre latérale gauche :": "Left sidebar:",
"Barres latérales": "Side bars",
"Bienvenue %s %s": "Welcome %s %s",
"Blocage après échecs": "Blocking after chess",
"Blog": "Blog",
"Bords arrondis": "Rounded edges",
"Bordure des blocs": "Blocks border",
"Bordure des champs": "Fields border",
"Bouton Aide": "Help button",
@ -119,14 +88,11 @@
"Bouton standard": "Standard button",
"Bouton validation": "Validation button",
"Boutons": "Buttons",
"Caché": "Hidden",
"Cachée": "Hidden",
"Captcha complexe": "Complex captcha",
"Captcha à la connexion": "Captcha at connecting",
"Captcha, identifiant ou mot de passe incorrects": "Incorrect captcha, login or password",
"Capture d'écran Open Graph": "Open Graph screenshot",
"Capture d'écran générée avec succès": "Successful generated screenshot",
"Casse": "Case",
"Catalogue": "Store",
"Catégorie": "Category",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "This member upload or download files in the 'Sharing' folder and its subfolders",
@ -134,34 +100,27 @@
"Cette redirection ne concerne que les pages d'administration du site.": "This redirection only concerns the administration pages of the site.",
"Chaîne Youtube": "Youtube channel",
"Chiffres": "Numbers",
"Cible": "Target",
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Click on an area to access its customization options.",
"Commentaire": "Comment",
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "API key <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>",
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "API key <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
"Complète": "Complete",
"Compte administrateur": "Administrator account",
"Compte de l'utilisateur": "User Account",
"Compte verrouillé": "Locked",
"Configuration": "Setup",
"Configuration du module": "Module setup",
"Configurer": "Configure",
"Configurer mon compte": "Set up my account",
"Confirmation": "Confirmation",
"Confirmer la suppression de cet utilisateur": "Confirm the deletion of this user",
"Confirmer la dissociation du module de cette page": "Confirm the dissociation of the module of this page",
"Confirmer la désinstallation du module": "Confirm the uninstalling of the module",
"Confirmer la suppression de cet utilisateur": "Confirm the deletion of this user",
"Confirmer la suppression de cette langue": "Confirm deletion of this language",
"Confirmer la suppression de la page": "Confirm the deletion of the page",
"Confirmer la suppression des données du module": "Confirm the deletion of module data",
"Confirmez-vous la suppression de cette page ?": "Do you confirm the deletion of this page?",
"Connexion": "Connection",
"Consulter l'aide en ligne": "Online help",
"Contents": "Contents",
"Contenu": "Contents",
"Contenu HTML": "HTML contents",
"Contenu avancé": "Advanced contents",
"Contenu du menu vertical": "Vertical menu content",
"Contrôle total": "Full control",
"Contenu personnalisé": "Personalized contents",
"Cookies": "Cookies",
"Cookies Zwii": "Cookies Zwii",
"Copie de contenus localisés": "Localized content copy",
@ -169,53 +128,32 @@
"Copie des traductions rédigées": "Copy of written translations",
"Copie terminée avec des erreurs": "Copy finished with errors",
"Copie terminée avec succès": "Copy successfully completed",
"Copier": "Copy",
"Copier sauvegardes auto": "Copy auto backups",
"Couleur de fond automatique": "Automatic background color",
"Couleur icône haut de page": "Color of top page icon",
"Couleur texte page active": "Active page text color",
"Couleur unie ou papier-peint": "United color or wallpaper",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency.",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency. The color of the text is automatic.",
"Couleurs": "Colors",
"Dans le site": "Into the site",
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Create a free account, copy the key, then validate the form before clicking the generation button",
"Dans quelle langue utiliserez-vous Zwii ?": "In which language will you use Zwii?",
"Date": "Date",
"De": "Of",
"Description": "Site description",
"Disponible si le consentement des cookies est activé.": "Available if cookie consent is enabled.",
"Disposition": "Layout",
"Données %s copiées vers %s": "Data %s copied to %s",
"Données des modules": "Module data",
"Données importées": "Imported data",
"Dossier": "Folder",
"Droits sur les dossiers": "Folder authorizations",
"Droits sur les fichiers": "File authorizations",
"Dupliquer": "Duplicate",
"Du": "From",
"Dupliquer la page": "Duplicate the page",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Disconnects the previously opened sessions on other browsers or terminals. Recommended activation.",
"Déconnecter": "Disconnect",
"Déconnexion !": "Logout!",
"Déconnexion automatique": "Automatic disconnection",
"Définir par défaut": "Set as default",
"Dévoiler le mot de passe": "Reveal the password",
"Effacer": "Delete",
"Echec de l'écriture, vérifiez les permissions": "Failure of writing, check permissions",
"Effacer la page": "Delete the page",
"Effacer tous les commentaires": "Delete all Comments",
"Effacer toutes les statistiques": "Delete all statistics",
"Effacer un commentaire": "Delete Comment",
"Effacer une catégorie": "Delete category",
"Emplacement :": "Location:",
"Emplacement dans le menu": "Location in the menu",
"En bas au centre": "Down in the center",
"En bas à droite": "At the bottom right",
"En bas à gauche": "At the bottom left",
"En cas de changement de module, les données du module précédent seront supprimées.": "In the event of a module change, data from the previous module will be deleted.",
"En dessous du site": "Below the site",
"En haut au centre": "Top in the center",
"En haut à droite": "Top right",
"En haut à gauche": "On the top corner left",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "In free position add the module by placing [module] to the desired location in your page.",
"En-dehors du site": "Outside the site",
"Enregistrer": "Save",
"Envoyer un message de confirmation": "Send a confirmation message",
"Erreur : sauvegarde non générée !": "Error: non-generated backup!",
@ -226,20 +164,15 @@
"Erreur de lecture, vérifiez les permissions": "Reading error, check permissions",
"Erreur inconnue": "unknown error",
"Erreur inconnue, le module n'est pas installé": "Unknown error, the module is not installed",
"Export CSV": "Export CSV",
"Expéditeur": "From",
"Extension": "Extension",
"Extraire": "Extract",
"Facebook": "Facebook",
"Famille": "Family",
"Favicon thème sombre": "Dark theme favicon",
"Feuille de style spécifique à la page.": "Style sheet specific to the page.",
"Fichiers": "Files",
"Fichiers effacés": "Erased files",
"Fil d'Ariane dans le titre": "Breadcrumb in the title",
"Fond du sous-menu": "Background of the submenu",
"FontId": "FontId",
"Fonte": "Font",
"FontId": "Font",
"Fonte actualisée": "Update",
"Fonte créée": "Font created",
"Fonte en ligne": "Online font",
@ -248,36 +181,22 @@
"Fonte supprimée": "Font deleted",
"Fontes": "Fonts",
"Format incorrect": "Wrong format",
"Formulaire": "Form",
"Fréquence de recherche": "Search frequency",
"Fuseau horaire": "Time zone",
"Gabarits de page - Barre latérale": "Page templates - Sidebar",
"Gestion": "Management",
"Gestion des modules": "Module management",
"Gestion des thèmes": "Themes management",
"Gestionnaire de fichiers": "File Manager",
"Github": "Github",
"Grande": "Large",
"Grande (220%)": "Grande (220%)",
"Grande (300px)": "Grande (300px)",
"Gras": "Fetter",
"Groupe": "Group",
"Groupe associé": "Associated Group",
"Groupe requis pour accéder à la page :": "Group required to access the page:",
"Groupes": "Groups",
"Générer sitemap.xml et robots.txt": "Generate sitemap.xml and robots.txt",
"Générer une capture Open Graph": "Generate an Open Graph capture",
"Gérer les catégories": "Manage categories",
"Gérer les commentaires": "Manage comments",
"Gérer les données": "Manage Data",
"Hauteur": "Height:",
"Hauteur de l'image": "Image Height",
"Hauteur de l'image sélectionnée": "Selected Image Height",
"Hauteur maximale": "Maximum height",
"Gérer les fichiers": "Managing files",
"Gérer les modules": "Manage modules",
"Hauteur de l'image :": "Image height:",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "Channel ID: https://www.youtube.com/channel/ [ID].",
"Icône": "Icon",
"Icône avec bulle de texte": "Icon with text bubble",
"Icône haut de page, couleur arrière-plan": "Top page icon, background color",
"Identifiant": "Identifier",
"Identifiant (sans espace ni majuscule)": "Identifier (without space or capital letters)",
"Identité": "Identity",
@ -285,9 +204,6 @@
"Identité du site": "Site identity",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "It appears in the title bar and sharing on social networks.",
"Image": "Image",
"Image étirée (100% 100%)": "Stretched image (100% 100%)",
"Important": "Important",
"Importante": "Important",
"Importation d'utilisateurs": "Import of users",
"Importation de fichier plat CSV": "CSV flat file import",
"Importation effectuée": "Import done",
@ -296,13 +212,13 @@
"Importer des utilisateurs en masse": "Import mass users",
"Impossible d'ouvrir l'archive": "Impossible to open the archive",
"Impossible de modifier votre propre groupe.": "Unable to modify your own group.",
"Impossible de soumettre le formulaire, car il contient des erreurs": "Unable to submit the form, as it contains errors",
"Impossible de supprimer une page contenant des pages enfants": "Unable to delete a page containing children's pages",
"Impossible de supprimer votre propre compte": "Unable to delete your own account",
"Inclure le contenu du gestionnaire de fichiers": "Include the content of the file manager",
"Incorrect": "Incorrect",
"Informations": "Informations",
"Instagram": "Instagram",
"Installation": "Installation",
"Installation terminée": "Installation completed",
"Installer": "Install",
"Installer depuis le catalogue en ligne": "Install from the online catalog",
@ -319,29 +235,25 @@
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "The archive was deposited in the file manager. Archives below version 9 are not accepted.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "The identifier is defined when creating the account, it cannot be changed.",
"La carte du site a été mise à jour": "The site card has been updated",
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "Backup copy of htaccess file has not been restored!",
"La clé de l'API ne peut pas être vide": "The key to the API cannot be empty",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "The description of a page participates in its referencing, each page must have a different description.",
"La page %s est ouverte par l'utilisateur %s": "Page %s opened by user %s",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "This page does not exists (error 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "The page is displayed in a horizontal menu but not in the vertical menu of a sidebar.",
"La première page que vos visiteurs verront.": "The first page that your visitors will see.",
"La règlementation française impose un anonymat de niveau 2": "French regulations require level 2 anonymity",
"La réécriture d'URL n'a pas été restaurée !": "URL rewriting has not been restored!",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "The backup of the files can take time. Continue?",
"La suppression a échoué": "The deletion failed",
"La version installée est plus récente": "The installed version is more recent",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "The verification is daily. Option deactivated if the server configuration does not allow it.",
"Langue de l'administration": "Language of administration",
"Langue du site par défaut": "Default site language",
"Langue du site sélectionnée": "Selected site language",
"Langue par défaut": "Default language",
"Langues": "Languages",
"Langues disponibles": "Available languages",
"Langues installées": "Installed languages",
"Largeur": "Width",
"Largeur de l'image": "Image Width",
"Largeur du site": "Site Width",
"Largeur de l'image :": "Image width:",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "The horizontal cursor regulates the level of transparency, place it on the left for invisible highlights.",
"Le curseur horizontal règle le niveau de transparence.": "The horizontal cursor regulates the level of transparency.",
"Le fuseau horaire est utile au bon référencement": "The time zone is useful for the right SEO",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "The accessory menu is aligned to the right of the menu bar, it is a place reserved for flags and the login button.",
"Le menu horizontal intégral": "The full horizontal menu",
@ -354,80 +266,54 @@
"Les langues sélectionnées sont identiques": "The selected languages are identical",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Legal notices are compulsory in France. An option of the footer adds a discrete link to this page.",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "The changes you have made may not be recorded.",
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "The font sizes of the banner, menu and footer are proportional to this size.",
"Lettres": "Letters",
"Libre": "Libre",
"Licence :": "Licence:",
"Lien de connexion": "Login link",
"Lien page des mentions légales.": "Link of legal notices.",
"Liens": "Links",
"Limitation des tentatives": "Limitation of attempts",
"Limitée au site": "Limited to the site",
"Linkedin": "Linkedin",
"Liste noire": "Blacklist",
"Liste noire réinitialisée avec succès": "Blacklist successfully reset",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "During an automatic update, keeps the htaccess file of the site root.",
"Léger": "Light",
"Légère": "Light",
"Maigre": "Lean",
"Maintenance": "Maintenance",
"Majuscule à chaque mot": "Capper with each word",
"Majuscules": "Capital letters",
"Marges verticales": "Vertical margins",
"Masquer la bannière en écran réduit": "Hide the banner in reduced screen",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Hide the page and children's pages in the menu of a sidebar",
"Masquer les pages enfants dans le menu horizontal": "Hide children's pages in the horizontal menu",
"Membre": "Member",
"Membre avec droit de partage": "Member with sharing rights",
"Membre simple": "Simple member",
"Mentions légales": "Legal notice",
"Menu": "Menu",
"Menu accessoire": "Accessory menu",
"Menu burger dans écran réduit": "Burger menu in reduced screen",
"Menu standard": "Standard menu",
"Message d'acceptation des Cookies": "Cookie acceptance message",
"Message de consentement aux cookies": "Cookie consent message",
"Mettre à jour": "Update",
"Mettre à jour le module orphelin": "Update the orphan module",
"Minuscules": "Tiny",
"Mise en forme des titres": "Formatting of titles",
"Mise en forme du texte": "Text formatting",
"Mise en forme du titre": "Title formatting",
"Mise en page": "Layout",
"Mise à jour": "Update",
"Mise à jour automatisée": "Automated update",
"Mise à jour de ZwiiCMS": "Zwiicms update",
"Mise à jour terminée avec succès.": "Successful update completed.",
"Modifications enregistrées": "Modifications recorded",
"Module": "Module",
"Module de la page": "Page module",
"Modules": "Modules",
"Modules configurés": "Configured modules",
"Modules installés": "Installed modules",
"Modules orphelins": "Orphaned modules",
"Mot de passe": "Password",
"Mot de passe oublié": "Forgot your password",
"Mot de passe perdu": "Lost password",
"Motorisé par": "Powered by",
"Moyen": "Medium",
"Moyenne": "Medium",
"Moyenne (200%)": "Average (200%)",
"Moyenne (200px)": "Average (200px)",
"Multilingue": "Multilanguage",
"Méta-description": "Meta-description",
"Méta-titre": "Meta title",
"Ne pas afficher": "Do not display",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Do not load the example of a site (advanced users)",
"Ne pas répéter": "Do not repeat",
"Ne pas saisir les balises": "Don't type tags",
"News": "",
"Niveau 1 (192.168.12.x)": "Level 1 (192.168.12.x)",
"Niveau 2 (192.168.x.x)": "Level 2 (192.168.x.x)",
"Niveau 3 (192.x.x.x)": "Level 3 (192.x.x.x)",
"Nom": "Last Name",
"Nom Prénom": "Last name First Name",
"Nom du profil": "Profile Name",
"Nom utilisateur": "Username",
"Non": "No",
"Non tronquée": "Unmanned",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Our site is currently under maintenance. We are sorry for the inconvenience caused and do our best to be quickly back.",
"Nouveau contenu localisé": "New localized content",
"Nouveau mot de passe": "New Password",
@ -435,11 +321,8 @@
"Nouvel utilisateur": "New user",
"Nouvelle page créée": "New page created",
"Nouvelle page ou barre latérale": "New page or sidebar",
"Obligatoire": "Missing",
"Ombre": "Shadow",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Active option in disconnected mode only, children's pages are visible and accessible.",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Recommended option to secure the connection. Applies to all the Captchas of the site. Simple Captcha is limited to an addition of numbers from 0 to 10. Complex Captcha uses four numbers of 0 to 20. Recommended activation.",
"Options": "Options",
"Options avancées": "Advanced options",
"Origine": "Origin",
"Oui": "Yes",
@ -447,7 +330,6 @@
"Page 2/3 - barre 1/3": "Page 2/3 - Sidebar 1/3",
"Page 3/4 - barre 1/4": "Page 3/4 - Sidebar 1/4",
"Page associée": "Associated page",
"Page de recherche": "Search page",
"Page dupliquée": "Duplicate page",
"Page et module dupliqués": "Duplicated page and module",
"Page inexistante, erreur 404": "Page non-existent, error 404",
@ -464,19 +346,12 @@
"Paramètres": "Settings",
"Paramètres de la localisation": "Location parameters",
"Paramètres de la sauvegarde": "Backup settings",
"Paramètres du profil": "Profile Settings",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Settings to use when your host does not offer the mail sending feature.",
"Pas de marge au-dessus et en dessous du site": "No margin above and below the site",
"Partage de fichiers autorisé": "Authorized file sharing",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Remember to delete your browser's cache if the favicon does not change.",
"Permission": "Permission",
"Permission et référencement": "Permission and SEO",
"Permissions": "Permissions",
"Permissions sur les dossiers": "Folder Permissions",
"Permissions sur les fichiers": "File Permissions",
"Permissions sur les pages": "Page Permissions",
"Petite": "Small",
"Petite (150px)": "Small (150px)",
"Petite (180%)": "Petite (180%)",
"Permissions :": "Permissions:",
"Pied de page": "Footer",
"Pinterest": "Pinterest",
"Plan du site": "Sitemap",
@ -487,39 +362,24 @@
"Position": "Position",
"Position du module": "Position of the module",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "To define the page as a sidebar, choose the option from the list.",
"Presse Papier": "Clipboard",
"Presse papier": "Clipboard",
"Profils des groupes": "Group Profiles",
"Proportionnelle à la taille définie dans le site.": "Proportional to that defined in the site.",
"Prénom": "First name",
"Prénom Nom": "Firstname name",
"Préparation de la mise à jour": "Preparation of the update",
"Préserver le fichier htaccess racine": "Preserve the root htaccess file",
"Préserver les comptes des utilisateurs déjà installés": "Preserve user accounts already installed",
"Prévenir l'utilisateur par mail": "Prevent the user by email",
"Prévisualiser": "Preview",
"Pseudo": "Pseudo",
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "Rank 9 > Rank 1. The profile of Rank 1 is not editable.",
"Ratio": "Ratio",
"Ratio :": "Ratio:",
"Recherche": "Search",
"Recherche dans le site": "Search on the site",
"Rechercher": "Search",
"Rechercher une mise à jour en ligne": "Search for an online update",
"Redirection": "Redirection",
"Redirection vers la connexion": "Redirection to connection",
"Renommer": "Rename",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Fill in the fields below to finalize the installation.",
"Responsive (contain)": "Responsive (contain)",
"Responsive (cover)": "Responsive (cover)",
"Restauration des bases de données absentes": "Restoring missing databases",
"Restauration effectuée avec succès": "Restoration successfully completed",
"Restaurer": "Restore",
"Restaurer les données du site": "Restore site data",
"Rester connecté sur ce navigateur": "Stay connected on this browser",
"Retour": "Return",
"Rien à importer, erreur de format ou fichier incorrect": "Nothing to import, format error or incorrect file",
"Rédacteur": "Editor",
"Référencement": "SEO",
"Réinitialisation du mot de passe": "Reset password",
"Réinitialiser avec le thème par défaut": "Reset with the default theme",
@ -527,12 +387,10 @@
"Réinitialiser la liste": "Reset the list",
"Réinitialiser le journal": "Reset the log file",
"Réinstaller": "Reinstall",
"Répétition": "Repetition",
"Réseau": "Network",
"Réseaux sociaux": "Social networks",
"S'ouvre dans un nouvel onglet": "Opens in a new tab",
"SMTP": "SMTP",
"SMTP personnalisé": "Custom SMTP",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Enter the key, then validate the form before clicking on the generation button",
"Saisissez le Titre de gestion des cookies.": "Enter the title of the cookie management window.",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Enter the message for cookies set by Zwiicms, necessary for operation and which do not require consent.",
@ -547,7 +405,7 @@
"Sauvegarde": "Backup",
"Sauvegarde automatique quotidienne du site": "Daily automatic backup of the site",
"Sauvegarde du thème dans le": "Backup of the theme in the",
"Sauvegarde générée avec succès": "Successfully generated backup.",
"Sauvegarde générée avec succès.": "Successfully generated backup.",
"Sauvegarder": "Backup",
"Sauvegarder et télécharger le module": "Save and download the module",
"Sauvegarder le module dans le gestionnaire de fichiers": "Save the module in the file manager",
@ -563,20 +421,13 @@
"Signature": "Signature",
"Site": "Site",
"Site en maintenance": "Site under maintenance",
"Size": "Size",
"Source": "Source",
"Standard": "Standard",
"Style": "Style",
"Suppression interdite": "Deletion prohibited",
"Suppression interdite, page active dans la configuration de la langue du site": "Deletion not allowed, page is active in the site's language configuration",
"Suppression interdite, page active dans la configuration du site": "Deletion prohibited, active page in site configuration",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Deletes the question mark in the URLs, the option is unavailable with other web servers",
"Supprimer": "Delete",
"Supprimer la page": "Delete the page",
"Supprimer le module": "Delete the module",
"Supprimer toutes les sauvegardes automatiques ?": "Remove all automatic backups?",
"Sur l'axe horizontal": "On the horizontal axis",
"Sur l'axe vertical": "On the vertical axis",
"Sur les deux axes": "On both axes",
"Sécurité": "Security",
"Sécurité de la connexion": "Connection security",
"Sécurité désactivée": "Safety deactivated",
@ -587,10 +438,8 @@
"Sélectionnez une image ou une icône de petite dimension": "Select a small image or icon",
"Sélectionnez une langue": "Select a language",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Select a page containing the 'research' module. An option of the footer adds a discrete link to this page.",
"Sélectionnez une page pour activer": "Select a page to activate",
"Séparateur": "Separator",
"Taille": "Size",
"Text": "Text",
"Texte": "Text",
"Thème": "Theme",
"Thème de l'administration": "Administration theme",
@ -599,23 +448,9 @@
"Thèmes": "Themes",
"Titre": "Title",
"Titre court": "Short title",
"Titre masqué": "Masked title",
"Titre masqué dans la page": "Masked hidden in the page",
"Titres": "Titles",
"Tous les dossiers": "All Folders",
"Tous les droits d'édition des contenus": "All content editing rights",
"Tout Effacer": "Clear All",
"Traduction supprimée": "Translation deleted",
"Très grande": "Very large",
"Très grande (240%)": "Very large (240%)",
"Très grande (400px)": "Very large (400px)",
"Très important": "Very important",
"Très importante": "Very important",
"Très léger": "Very light",
"Très légère": "Very light",
"Très petite": "Very small",
"Très petite (100px) ": "Very small (100px)",
"Très petite (160%)": "Very small (160%)",
"Twitter": "Twitter",
"Type de captcha": "Type of Captcha",
"Type de proxy": "Proxy type",
@ -624,7 +459,6 @@
"Télécharger la liste": "Download list",
"Télécharger le journal": "Download logs",
"Télécharger le module dans le gestionnaire de fichiers": "Download the module in the file manager",
"Téléverser": "Upload",
"URL incorrecte": "Incorrect url",
"Un mail a été envoyé pour confirmer la réinitialisation": "An email was sent to confirm the reset",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "An archive of the file /site/data is kept for 30 days. Recommended activation",
@ -633,61 +467,32 @@
"Utilisateur inexistant": "Non-existent user",
"Utilisateur supprimé": "User deleted",
"Utilisateurs": "Users",
"Valider": "Submit",
"Valider": "To validate",
"Vers": "Towards",
"Version": "Version",
"Version n°": "Version n°",
"Vider dossier sauvegardes auto": "Empty auto backup files",
"Visiteur": "Visitor",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "You are not authorised to view this page (error 403)",
"Youtube": "Youtube",
"ZwiiCMS - Installation": "ZwiiCMS - Installation",
"actualisé": "updated",
"favicon.ico": "favicon.ico",
"faviconDark.ico": "favicondark.ico",
"gestionnaire de fichiers": "file manager",
"installé": "installed",
"jour": "day",
"jours": "days",
"largeur de site :": "site width:",
"largeur du site": "site width",
"sauvegardé avec succès": "successfully saved",
"vers": "to",
"À droite": "Right",
"À gauche": "Left",
"vers ZwiiCMS": "to ZwiiCMS",
"À l'emplacement du mot clé [MODULE] dans la page": "At the location of the keyword [MODULE] on the page",
"Échec de l'écriture, vérifiez les permissions": "Failure of writing, check permissions",
"Échecs": "Fail",
"Éditer": "Edit",
"Éditer la page": "Edit the page",
"Éditer les dialogues": "Edit dialogs",
"Éditer une catégorie": "Edit category",
"Éditeur": "Editor",
"Éditeur CSS": "CSS editor",
"Éditeur JS": "JS editor",
"Éditeur de script %s": "Script editor %s",
"Éditeur de script dans Body": "Script editor in Body",
"Éditeur de script dans Head": "Script editor in Head",
"Éditeur simple": "Simple editor",
"Édition des pages": "Page editing",
"Édition du profil %s": "Edit Profile %s",
"Éléments": "Items",
"Étendu sur la page": "Spread across the page",
"Étiquettes des pages spéciales": "Special pages labels",
"Dimensions minimales": "Minimum dimensions",
"Taille maximale du fichier": "Maximum file size",
"5 Mo pour les images JPEG": "5 MB for JPEG images",
"1 Mo pour les images PNG": "1 MB for PNG images",
"Poids": "Weight",
"Supprimer ce profil ?": "Delete this profile?",
"Masqué": "Hidden",
"Haut de page": "Top of Page",
"Bas de page": "Bottom of Page",
"Petit triangle": "Small Triangle",
"Grand triangle": "Large Triangle",
"Flèche": "Arrow",
"Modèle": "Template",
"Bouton de navigation droit": "Right Navigation Button",
"Bouton de navigation gauche": "Left Navigation Button",
"Groupes / Profils": "Groups / Profiles",
"Prénom commence par": "First Name starts with",
"Nom commence par": "Last Name starts with",
"Impossible de réinitialiser le mot de passe de ce compte !": "Impossible to reset this account password!"
"Étiquettes des pages spéciales": "Special pages labels"
}

View File

@ -1,59 +1,46 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'No mostrar' crea una página huérfana a la que no se puede acceder a través de los menús.",
"'Sauvegarder et télécharger les données du module": "Guardar y descargar de los datos del módulo",
"1 jour": "1 Jour",
"1/4 : Préparation...": "1/4: Preparando...",
"10 minutes": "10 minutos",
"10 tentatives": "6 intentos",
"14 jours": "14 dias",
"15 minutes": "15 minutos",
"2 jours": "2 dias",
"2/4 : Téléchargement...": "2/4: Descargando...",
"3 tentatives": "3 intentos",
"3/4 : Installation...": "3/4: Instalando...",
"4 jours": "4 días",
"4/4 : Configuration...": "4/4: Configuración...",
"5 minutes": "5 minutos",
"5 tentatives": "5 intentos",
"7 jours": "7 días",
"Accueil": "Inicio",
"Accède au site": "Acceso al sitio",
"Accède aux pages réservées": "Acceso a páginas restringidas",
"Accède aux pages réservées et à un dossier partagé": "Acceso a páginas restringidas y una carpeta compartida",
"Accès aux pages privées": "Acceso a páginas privadas",
"Accès bloqué %d minutes": "Acceso bloqueado minutos",
"Accès désactivé": "Acceso desactivado",
"Accès interdit, erreur 403": "Acceso denegado, error 403",
"Action interdite": "Acción no permitida",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Activación obligatoria según las leyes francesas a menos que utilice su propio sistema de consentimiento.",
"Activer": "Activar",
"Activer SMTP": "Habilitar SMTP",
"Activer la journalisation": "Habilitar registro",
"Actualiser": "Actualizar",
"Adaptation": "Adaptación",
"Administrateur": "Administrador",
"Administration": "Administración",
"Administration complète du site": "Administración completa del sitio",
"Adresse SMTP": "Dirección SMTP",
"Adresse du proxy": "Dirección proxy",
"Adresse électronique": "Correo electrónico",
"Affectation": "Asignación",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Mostrar el nombre de la página principal seguido del nombre de la página, el título no debe ocultarse.",
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "Muestra los iconos de gestión de cuenta y cierre de sesión para miembros regulares conectados",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Para garantizar el correcto funcionamiento de Zwii, no cierre esta página antes de que se complete la operación",
"Aide": "Ayuda",
"Ajouter": "Agregar",
"Ajouter un profil": "Agregar un perfil",
"Ajout - Édition - Suppression de fichiers": "Agregar/Editar/Eliminar Archivos",
"Ajout - Édition - Suppression de pages": "Adición - Edición - Eliminación de páginas",
"Ajouter un utilisateur": "Agregar usuario",
"Ajouter une fonte": "Añadir tipografía",
"Alignement": "Alineación de contenido",
"Aligner la bannière avec le contenu": "Alinear el banner con el contenido",
"Ancien mot de passe": "Antigua contraseña",
"Anonymat des adresses IP": "Anonimato de la dirección IP",
"Apache URL intelligent": "URL inteligente de Apache",
"Apache URL intelligentes": "URL inteligentes de Apache",
"Apparence": "Apariencia",
"Appliquer": "Aplicar",
"Approuver un commentaire": "Aprobar comentarios",
"Après": "Después",
"Après la bannière": "Después del banner",
"Après le contenu de la page": "Después del contenido de la página",
"Archive": "Archivo",
"Archive ZIP": "Archivo ZIP",
@ -69,46 +56,28 @@
"Arrière plan": "Fondo",
"Arrière plan des blocs": "Fondo de bloques",
"Arrière plan des champs": "Fondo de zona",
"Arrondi des angles": "Redondeo de ángulos",
"Au centre": "En el centro",
"Au début": "Al principio",
"Au milieu au centre": "En el medio en el centro",
"Au milieu à droite": "En el medio derecho",
"Au milieu à gauche": "En el medio a la izquierda",
"Au-dessus du site": "Por encima del sitio",
"Aucun": "Ninguno",
"Aucun dossier": "Sin carpeta",
"Aucun fichier journal à télécharger": "No hay archivos de registro para descargar",
"Aucun journal à effacer": "No hay registros para borrar",
"Aucun menu": "Ningún menú",
"Aucune": "Ninguna",
"Aucune liste noire à effacer": "No hay lista negra para borrar",
"Aucune liste noire à télécharger": "No hay lista negra para descargar",
"Auteur :": "Autor",
"Authentification": "Autenticación",
"Automatique": "Automáquica",
"Autoriser les robots à référencer le site": "Permitir que los robots hagan referencia al sitio",
"Autorisé": "Autorizado",
"Avant la bannière": "Antes del banner",
"Avant le contenu de la page": "Antes del contenido de la página",
"Background": "Fondo",
"Banni": "Prohibición",
"Bannière": "Banner",
"Bannière cliquable": "Banner",
"Barre 1/3 - page 2/3": "Barra 1/3 - página 2/3",
"Barre 1/4 - page 1/2 - barre 1/4": "Barra 1/4 - página 1/2 - Barra 1/4",
"Barre 1/4 - page 3/4": "Barra 1/4 - página 3/4",
"Barre 2/12 - page 7/12 - barre 3/12": "Barra 2/12 - página 7/12 - Barra 3/12",
"Barre 3/12 - page 7/12 - barre 2/12": "Barra 3/12 - página 7/12 - Barra 2/12",
"Barre de membre": "Barra de miembro",
"Barre latérale": "Barra lateral",
"Barre latérale droite :": "Barra lateral derecha:",
"Barre latérale gauche :": "Barra lateral izquierda:",
"Barres latérales": "Barras laterales",
"Bienvenue %s %s": "Bienvenido %s %s",
"Blocage après échecs": "Bloquear después de fallar",
"Blog": "Blog",
"Bords arrondis": "Bordes redondeados",
"Bordure des blocs": "Borde de bloques",
"Bordure des champs": "Borde de zona",
"Bouton Aide": "Boton de ayuda",
@ -119,14 +88,11 @@
"Bouton standard": "Botón estándar",
"Bouton validation": "Botón de validación",
"Boutons": "Botones",
"Caché": "Oculto",
"Cachée": "Oculto",
"Captcha complexe": "Captcha complejo",
"Captcha à la connexion": "Captcha al iniciar sesión",
"Captcha, identifiant ou mot de passe incorrects": "Captcha, nombre de usuario o contraseña incorrecta",
"Capture d'écran Open Graph": "Captura de pantalla de Open Graph",
"Capture d'écran générée avec succès": "Captura de pantalla generada con éxito",
"Casse": "Roto",
"Catalogue": "Catálogo",
"Catégorie": "Categoría",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "Este miembro podrá cargar o descargar archivos en la carpeta 'compartir' y sus subcarpetas",
@ -134,34 +100,27 @@
"Cette redirection ne concerne que les pages d'administration du site.": "Esta redirección solo afecta a las páginas de administración del sitio.",
"Chaîne Youtube": "Canal de Youtube",
"Chiffres": "Cifras",
"Cible": "Objetivo",
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Haga clic en un área para acceder a sus opciones de personalización.",
"Commentaire": "Comentario",
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "Clave API <a href=",
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "Clave API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
"Complète": "sin truncar",
"Compte administrateur": "Cuenta de administrador",
"Compte de l'utilisateur": "Cuenta de usuario",
"Compte verrouillé": "Cuenta bloqueada",
"Configuration": "Configuración",
"Configuration du module": "Configuración del módulo",
"Configurer": "Configurar",
"Configurer mon compte": "Configurar mi cuenta",
"Confirmation": "Confirmación",
"Confirmer la suppression de cet utilisateur": "Confirmar eliminación de este usuario",
"Confirmer la dissociation du module de cette page": "Confirmar desvincular módulo de esta página",
"Confirmer la désinstallation du module": "Confirmar la desinstalación del módulo",
"Confirmer la suppression de cet utilisateur": "Confirme la eliminación de este usuario",
"Confirmer la suppression de cette langue": "Confirmar eliminación de este idioma",
"Confirmer la suppression de la page": "Confirmar la eliminación de la página",
"Confirmer la suppression des données du module": "Confirmar la eliminación de datos del módulo",
"Confirmez-vous la suppression de cette page ?": "¿Confirma la eliminación de esta página?",
"Connexion": "Conexión",
"Consulter l'aide en ligne": "Consultar la ayuda en línea",
"Contents": "Contenido",
"Contenu": "Contenido",
"Contenu HTML": "Contenido HTML",
"Contenu avancé": "Contenido avanzado",
"Contenu du menu vertical": "Contenido del menú vertical",
"Contrôle total": "Control total",
"Contenu personnalisé": "Contenido personalizado",
"Cookies": "Cookies",
"Cookies Zwii": "Cookies Zwii",
"Copie de contenus localisés": "Copia de contenidos localizados",
@ -169,53 +128,32 @@
"Copie des traductions rédigées": "Copia de traducciones redactadas",
"Copie terminée avec des erreurs": "Copia completada con errores",
"Copie terminée avec succès": "Copia completada con éxito",
"Copier": "Copiar",
"Copier sauvegardes auto": "Copiar guardados automáticos",
"Couleur de fond automatique": "Color de fondo automático",
"Couleur icône haut de page": "Color del icono superior de la página",
"Couleur texte page active": "Color del texto de página activa",
"Couleur unie ou papier-peint": "Color unido o papel tapiz",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Color visible en ausencia de una imagen.<br />El control deslizante horizontal ajusta el nivel de transparencia.",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Color visible en ausencia de una imagen.<br />El control deslizante horizontal ajusta el nivel de transparencia. El color del texto es automático.",
"Couleurs": "Colores",
"Dans le site": "En el sitio",
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Cree una cuenta gratuita, copie la clave, luego valide el formulario antes de hacer clic en el botón generar",
"Dans quelle langue utiliserez-vous Zwii ?": "¿En qué idioma usará Zwii?",
"Date": "fecha",
"De": "De",
"Description": "Descripción del sitio",
"Disponible si le consentement des cookies est activé.": "Disponible si se ha otorgado el consentimiento de las cookies.",
"Disposition": "Arreglo",
"Données %s copiées vers %s": "Datos %s copiados hacia %s",
"Données des modules": "Datos de los módulos",
"Données importées": "Datos importados",
"Dossier": "Carpeta",
"Droits sur les dossiers": "Derechos de las carpetas",
"Droits sur les fichiers": "Derechos de los archivos",
"Dupliquer": "Duplicar",
"Du": "Del",
"Dupliquer la page": "Duplicar la página",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Desconecte sesiones abiertas previamente en otros navegadores o dispositivos. Activación recomendada.",
"Déconnecter": "Desconectar",
"Déconnexion !": "¡Cerrar sesión!",
"Déconnexion automatique": "Cierre de sesión automático",
"Définir par défaut": "Establecer como predeterminado",
"Dévoiler le mot de passe": "Revelar la contraseña",
"Effacer": "Borrar",
"Echec de l'écriture, vérifiez les permissions": "Escritura fallida, verifique los permisos",
"Effacer la page": "Borrar página",
"Effacer tous les commentaires": "Borrar todos los comentarios",
"Effacer toutes les statistiques": "Borrar todas las estadísticas",
"Effacer un commentaire": "Borrar el comentario",
"Effacer une catégorie": "Borrar categoría",
"Emplacement :": "Ubicación",
"Emplacement dans le menu": "Ubicación en el menú",
"En bas au centre": "Abajo en el centro",
"En bas à droite": "Abajo a la derecha",
"En bas à gauche": "Abajo a la izquierda",
"En cas de changement de module, les données du module précédent seront supprimées.": "Al cambiar de módulo se borrarán los datos del módulo anterior.",
"En dessous du site": "Debajo del sitio",
"En haut au centre": "Cubra en el centro",
"En haut à droite": "Arriba a la derecha",
"En haut à gauche": "Arriba a la izquierda",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "En posición libre agregue el módulo colocando [MODULE] en la ubicación deseada en su página.",
"En-dehors du site": "Fuera del sitio",
"Enregistrer": "Registrar",
"Envoyer un message de confirmation": "Enviar mensaje de confirmación",
"Erreur : sauvegarde non générée !": "Error: copia de seguridad no generada!",
@ -226,20 +164,15 @@
"Erreur de lecture, vérifiez les permissions": "Error de lectura, verifique los permisos",
"Erreur inconnue": "error desconocido",
"Erreur inconnue, le module n'est pas installé": "Error desconocido, el módulo no está instalado",
"Export CSV": "Exportar CSV",
"Expéditeur": "Remitente",
"Extension": "Extensión",
"Extraire": "Extraer",
"Facebook": "Facebook",
"Famille": "Vínculo",
"Favicon thème sombre": "favicon de tema oscuro",
"Feuille de style spécifique à la page.": "Hoja de estilo específica de la página.",
"Fichiers": "Archivos",
"Fichiers effacés": "archivos borrados",
"Fil d'Ariane dans le titre": "Migas de pan en el título",
"Fond du sous-menu": "Fondo del submenú",
"FontId": "ID de fuente",
"Fonte": "Fuente",
"Fonte actualisée": "fuente actualizada",
"Fonte créée": "Fuente creada",
"Fonte en ligne": "Tipografía en línea",
@ -248,36 +181,22 @@
"Fonte supprimée": "Fuente eliminada",
"Fontes": "Tipografias",
"Format incorrect": "Formato incorrecto",
"Formulaire": "Formulario",
"Fréquence de recherche": "Frecuencia de búsqueda",
"Fuseau horaire": "Zona horaria",
"Gabarits de page - Barre latérale": "Patrón de página - Barra lateral",
"Gestion": "Administrar",
"Gestion des modules": "Gestión de módulos",
"Gestion des thèmes": "Gestión de temas",
"Gestionnaire de fichiers": "Administrador de archivos",
"Github": "Github",
"Grande": "Grande",
"Grande (220%)": "Grande (220%)",
"Grande (300px)": "Grande (300px)",
"Gras": "Negrita",
"Groupe": "Grupo",
"Groupe associé": "Grupo asociado",
"Groupe requis pour accéder à la page :": "Grupo necesario para acceder a la página:",
"Groupes": "Grupos",
"Générer sitemap.xml et robots.txt": "Generar sitemap.xml y robots.txt",
"Générer une capture Open Graph": "Generar una captura de Open Graph",
"Gérer les catégories": "Gestionar categorías",
"Gérer les commentaires": "Administrar comentarios",
"Gérer les données": "Administrar datos",
"Hauteur": "Altura",
"Hauteur de l'image": "Altura de la imagen",
"Hauteur de l'image sélectionnée": "Altura de la imagen seleccionada",
"Hauteur maximale": "Altura máxima",
"Gérer les fichiers": "Gestión de archivos",
"Gérer les modules": "Administrar módulos",
"Hauteur de l'image :": "Altura de imagen",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "ID del canal: https://www.youtube.com/channel/[ID].",
"Icône": "Icono",
"Icône avec bulle de texte": "Icono con burbuja de texto",
"Icône haut de page, couleur arrière-plan": "Icono superior de la página, color de fondo",
"Identifiant": "Identificación",
"Identifiant (sans espace ni majuscule)": "Identificación (sin espacios ni mayúsculas)",
"Identité": "Identificación",
@ -285,9 +204,6 @@
"Identité du site": "identidad del sitio",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Aparece en la barra de título y se comparte en redes sociales.",
"Image": "Imagen",
"Image étirée (100% 100%)": "Imagen estirada (100% 100%)",
"Important": "Importante",
"Importante": "Importante",
"Importation d'utilisateurs": "Importación de usuarios",
"Importation de fichier plat CSV": "Importar archivo plano CSV",
"Importation effectuée": "Importación realizada",
@ -296,13 +212,13 @@
"Importer des utilisateurs en masse": "Importar usuarios de forma masiva",
"Impossible d'ouvrir l'archive": "No se puede abrir el archivo",
"Impossible de modifier votre propre groupe.": "No puede editar su propio grupo.",
"Impossible de soumettre le formulaire, car il contient des erreurs": "No se puede enviar el formulario porque contiene errores",
"Impossible de supprimer une page contenant des pages enfants": "No se puede eliminar una página que contiene páginas secundarias",
"Impossible de supprimer votre propre compte": "No puede eliminar su propia cuenta",
"Inclure le contenu du gestionnaire de fichiers": "Incluir el contenido del administrador de archivos",
"Incorrect": "Incorrecto",
"Informations": "Información",
"Instagram": "Instagram",
"Installation": "Instalación",
"Installation terminée": "instalación completa",
"Installer": "Instalar",
"Installer depuis le catalogue en ligne": "Instalar desde el archivo en línea",
@ -319,29 +235,25 @@
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "El archivo ha sido depositado en el administrador de archivos. No se aceptan archivos inferiores a la versión 9.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "El identificador se define al crear la cuenta, no se puede modificar.",
"La carte du site a été mise à jour": "El mapa del sitio ha sido actualizado.",
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "¡La copia de seguridad del archivo htaccess no ha sido restaurada!",
"La clé de l'API ne peut pas être vide": "La clave API no puede estar vacía",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "La descripción de una página participa en su referenciación, cada página debe tener una descripción diferente.",
"La page %s est ouverte par l'utilisateur %s": "La página %s ha sido abierta por el usuario %s",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "La page demandée n'existe pas ou est introuvable (erreur 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "La página se muestra en un menú horizontal pero no en el menú vertical de una barra lateral.",
"La première page que vos visiteurs verront.": "La primera página que verán tus visitantes.",
"La règlementation française impose un anonymat de niveau 2": "La normativa francesa impone el anonimato de nivel 2",
"La réécriture d'URL n'a pas été restaurée !": "¡La reescritura de URL no ha sido restaurada!",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "La copia de seguridad de los archivos puede tardar un poco. ¿Desea continuar?",
"La suppression a échoué": "Eliminación fallida",
"La version installée est plus récente": "La versión instalada es más nueva.",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "La comprobación es diaria. Opción deshabilitada si la configuración del servidor no lo permite.",
"Langue de l'administration": "Idioma de la administración",
"Langue du site par défaut": "Idioma predeterminado del sitio",
"Langue du site sélectionnée": "Idioma del sitio web seleccionado",
"Langue par défaut": "Idioma predeterminado",
"Langues": "Idiomas",
"Langues disponibles": "Idiomas Disponibles",
"Langues installées": "Idiomas instalados",
"Largeur": "Anchura o Ancho",
"Largeur de l'image": "Ancho de la imagen",
"Largeur du site": "Ancho del sitio",
"Largeur de l'image :": "Ancho de la imagen",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "El control deslizante horizontal establece el nivel de transparencia, colóquelo completamente hacia la izquierda para obtener un resaltado invisible.",
"Le curseur horizontal règle le niveau de transparence.": "El cursor horizontal regula el nivel de transparencia.",
"Le fuseau horaire est utile au bon référencement": "La zona horaria es útil para una buena referencia",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "El menù accesorio está alineado a la derecha de la barra de menú, es un marcador de posición para las banderas y el botón de inicio de sesión",
"Le menu horizontal intégral": "El menú horizontal completo",
@ -354,80 +266,54 @@
"Les langues sélectionnées sont identiques": "Los idiomas seleccionados son idénticos",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Los avisos legales son obligatorios en Francia. Una opción en el pie de página agrega un enlace discreto a esta página.",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Es posible que no se guarden los cambios realizados.",
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "Los tamaños de fuente del banner, menú y pie de página son proporcionales a este tamaño.",
"Lettres": "Letras",
"Libre": "Libre",
"Licence :": "Licencia",
"Lien de connexion": "Enlace de inicio de sesión",
"Lien page des mentions légales.": "Enlace página aviso legal.",
"Liens": "Enlaces",
"Limitation des tentatives": "Limitación de intentos",
"Limitée au site": "Limitado al sitio",
"Linkedin": "Linkedin",
"Liste noire": "Lista negra",
"Liste noire réinitialisée avec succès": "Lista negra restablecida con éxito",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Durante una actualización automática, mantenga el archivo htaccess de la raíz del sitio.",
"Léger": "Ligero",
"Légère": "Ligera",
"Maigre": "Delgado",
"Maintenance": "Mantenimiento",
"Majuscule à chaque mot": "Capper con cada palabra",
"Majuscules": "Letras mayúsculas",
"Marges verticales": "Márgenes verticales",
"Masquer la bannière en écran réduit": "Ocultar el banner en pantalla reducida",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Ocultar página y páginas secundarias en un menú de la barra lateral",
"Masquer les pages enfants dans le menu horizontal": "Ocultar páginas secundarias en el menú horizontal",
"Membre": "Miembro",
"Membre avec droit de partage": "Miembro con derecho de compartir",
"Membre simple": "Miembro simple",
"Mentions légales": "Notas legales",
"Menu": "Menù",
"Menu accessoire": "Menú accesorio",
"Menu burger dans écran réduit": "Menú hamburguesa en pantalla reducida",
"Menu standard": "Menú estándar",
"Message d'acceptation des Cookies": "Mensaje de aceptación de cookies",
"Message de consentement aux cookies": "Mensaje de consentimiento de cookies",
"Mettre à jour": "Actualizar",
"Mettre à jour le module orphelin": "Actualizar módulo huérfano",
"Minuscules": "Diminuto",
"Mise en forme des titres": "Formato de título",
"Mise en forme du texte": "Formato de texto",
"Mise en forme du titre": "Formato de título",
"Mise en page": "Diseño",
"Mise à jour": "actualización",
"Mise à jour automatisée": "Actualización automática",
"Mise à jour de ZwiiCMS": "Actualización de ZwiiCMS",
"Mise à jour terminée avec succès.": "Actualización completada con éxito.",
"Modifications enregistrées": "Cambios guardados",
"Module": "Módulo",
"Module de la page": "Módulo de página",
"Modules": "Módulos",
"Modules configurés": "Módulos Configurados",
"Modules installés": "Módulos instalados",
"Modules orphelins": "Módulos huérfanos",
"Mot de passe": "Contraseña",
"Mot de passe oublié": "Contraseña olvidada",
"Mot de passe perdu": "Contraseña perdida",
"Motorisé par": "Motorizado por",
"Moyen": "Medio",
"Moyenne": "Media",
"Moyenne (200%)": "Promedio (200%)",
"Moyenne (200px)": "Promedio (200px)",
"Multilingue": "Multilingüe",
"Méta-description": "Meta-descripción",
"Méta-titre": "Meta-título",
"Ne pas afficher": "No se muestra",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "No cargar sitio de muestra (usuarios avanzados)",
"Ne pas répéter": "No repitas",
"Ne pas saisir les balises": "No ingrese las etiquetas",
"News": "Noticias",
"Niveau 1 (192.168.12.x)": "Nivel 1 (192.168.12.x)",
"Niveau 2 (192.168.x.x)": "Nivel 2 (192.168.x.x)",
"Niveau 3 (192.x.x.x)": "Nivel 3 (192.x.x.x)",
"Nom": "Nombre",
"Nom Prénom": "Apellido nombre",
"Nom du profil": "Nombre del perfil",
"Nom utilisateur": "Nombre de usuario",
"Non": "No",
"Non tronquée": "Sin personal",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Nuestro sitio está actualmente en mantenimiento. Lamentamos las molestias y estamos haciendo todo lo posible para regresar lo antes posible",
"Nouveau contenu localisé": "Nuevo contenido localizado",
"Nouveau mot de passe": "Nueva contraseña",
@ -435,11 +321,8 @@
"Nouvel utilisateur": "Nuevo usuario",
"Nouvelle page créée": "Nueva página creada",
"Nouvelle page ou barre latérale": "Nueva página o barra lateral",
"Obligatoire": "Obligatorio",
"Ombre": "Sombra",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Opción activa solo en modo fuera de línea, las páginas secundarias son visibles y accesibles.",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Opción recomendada para asegurar la conexión. Se aplica a todos los captchas en el sitio. El captcha simple está limitado a una suma de números del 0 al 10. El captcha complejo usa cuatro operaciones de números del 0 al 20. Activación recomendada.",
"Options": "Opciones",
"Options avancées": "Opciones avanzadas",
"Origine": "Origen",
"Oui": "Sí",
@ -447,7 +330,6 @@
"Page 2/3 - barre 1/3": "página 2/3 - Barra 1/3",
"Page 3/4 - barre 1/4": "página 3/4 - Barra 1/4",
"Page associée": "Página asociada",
"Page de recherche": "Página de búsqueda",
"Page dupliquée": "Página duplicada",
"Page et module dupliqués": "Página y módulo duplicados",
"Page inexistante, erreur 404": "La página no existe, error 404",
@ -464,19 +346,12 @@
"Paramètres": "Configuraciones",
"Paramètres de la localisation": "Configuración de la ubicación",
"Paramètres de la sauvegarde": "Configuración de copia de seguridad",
"Paramètres du profil": "Configuración del perfil",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Configuraciones para usar cuando su host no ofrece la funcionalidad para enviar correo.",
"Pas de marge au-dessus et en dessous du site": "Sin margen encima y debajo del sitio",
"Partage de fichiers autorisé": "Compartir archivos permitido",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Recuerde eliminar el caché de su navegador si el favicon no cambia.",
"Permission": "Permiso",
"Permission et référencement": "Permiso y referenciación",
"Permissions": "Permisos",
"Permissions sur les dossiers": "Permisos de las carpetas",
"Permissions sur les fichiers": "Permisos de los archivos",
"Permissions sur les pages": "Permisos de las páginas",
"Petite": "Pequeño",
"Petite (150px)": "Pequeño (150px)",
"Petite (180%)": "Petite (180%)",
"Permissions :": "Permisos",
"Pied de page": "Pie de página",
"Pinterest": "Pinterest",
"Plan du site": "Mapa del sitio",
@ -487,39 +362,24 @@
"Position": "Posición",
"Position du module": "Posición del módulo",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Para configurar la página como barra lateral, elija la opción de la lista.",
"Presse Papier": "Portapapeles",
"Presse papier": "Portapapeles",
"Profils des groupes": "Perfiles de grupos",
"Proportionnelle à la taille définie dans le site.": "Proporcional a la definida en el sitio.",
"Prénom": "Nombre de pila",
"Prénom Nom": "Nombre Apellido",
"Préparation de la mise à jour": "Preparáción de la actualización",
"Préserver le fichier htaccess racine": "Conservar archivo raíz htaccess",
"Préserver les comptes des utilisateurs déjà installés": "Conservar las cuentas de usuario ya instaladas",
"Prévenir l'utilisateur par mail": "Notificar al usuario por correo electrónico",
"Prévisualiser": "Previsualizar",
"Pseudo": "Apodo",
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "Rango 9 > rango 1. El perfil del rango 1 no se puede modificar.",
"Ratio": "Proporción",
"Ratio :": "Relación",
"Recherche": "Buscar",
"Recherche dans le site": "Buscar en el sitio",
"Rechercher": "Buscar",
"Rechercher une mise à jour en ligne": "Buscar una actualización en línea",
"Redirection": "Redirección",
"Redirection vers la connexion": "Redirección hacia conexión",
"Renommer": "Renombrar",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Complete las zonas a continuación para terminar la instalación.",
"Responsive (contain)": "Responsivo (contener)",
"Responsive (cover)": "Responsivo (cobertura)",
"Restauration des bases de données absentes": "Restauración de bases de datos faltantes",
"Restauration effectuée avec succès": "Restauración completada con éxito",
"Restaurer": "Restaurar",
"Restaurer les données du site": "Restaurar datos del sitio",
"Rester connecté sur ce navigateur": "Permanecer conectado en este navegador",
"Retour": "Retroceder",
"Rien à importer, erreur de format ou fichier incorrect": "Nada que importar, error de formato o archivo incorrecto",
"Rédacteur": "Editor",
"Référencement": "Referenciación",
"Réinitialisation du mot de passe": "Restablecer la contraseña de usuario",
"Réinitialiser avec le thème par défaut": "establecer tema predeterminado",
@ -527,12 +387,10 @@
"Réinitialiser la liste": "Restablecer lista",
"Réinitialiser le journal": "Restablecer registro",
"Réinstaller": "Reinstalar",
"Répétition": "Repetición",
"Réseau": "La red",
"Réseaux sociaux": "Redes sociales",
"S'ouvre dans un nouvel onglet": "Se abre en una nueva pestaña",
"SMTP": "SMTP",
"SMTP personnalisé": "SMTP personalizado",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Ingrese la clave, luego valide el formulario antes de hacer clic en el botón generar",
"Saisissez le Titre de gestion des cookies.": "Introduce el título de la ventana de gestión de cookies.",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Ingrese el mensaje para las cookies colocadas por ZwiiCMS, necesarias para su funcionamiento y que no requieren consentimiento.",
@ -547,7 +405,7 @@
"Sauvegarde": "Salvaguardad",
"Sauvegarde automatique quotidienne du site": "Copia de seguridad diaria automática del sitio",
"Sauvegarde du thème dans le": "Guardando tema en el",
"Sauvegarde générée avec succès": "Copia de seguridad generada con éxito",
"Sauvegarde générée avec succès.": "Copia de seguridad generada con éxito",
"Sauvegarder": "Para salvaguardar",
"Sauvegarder et télécharger le module": "Guardar y descargar módulo",
"Sauvegarder le module dans le gestionnaire de fichiers": "Guardar módulo en el administrador de archivos",
@ -563,20 +421,13 @@
"Signature": "Firma",
"Site": "Idiomas instalados",
"Site en maintenance": "Sitio en mantenimiento",
"Size": "Tamaño",
"Source": "Fuente",
"Standard": "Estándar",
"Style": "Estilo",
"Suppression interdite": "Borrado prohibido",
"Suppression interdite, page active dans la configuration de la langue du site": "Eliminación no permitida, la página está activa en la configuración de idioma del sitio",
"Suppression interdite, page active dans la configuration du site": "Eliminación prohibida, página activa en la configuración del sitio",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Eliminar el signo de interrogación en las URL, la opción no está disponible con otros servidores web",
"Supprimer": "Borrar",
"Supprimer la page": "Eliminar página",
"Supprimer le module": "Eliminar módulo",
"Supprimer toutes les sauvegardes automatiques ?": "¿Eliminar todos los guardados automáticos?",
"Sur l'axe horizontal": "En el eje horizontal",
"Sur l'axe vertical": "En el eje vertical",
"Sur les deux axes": "En ambos hachas",
"Sécurité": "Seguridad",
"Sécurité de la connexion": "Seguridad de la conexión",
"Sécurité désactivée": "Seguridad desactivada",
@ -587,10 +438,8 @@
"Sélectionnez une image ou une icône de petite dimension": "Seleccione una imagen o icono pequeño",
"Sélectionnez une langue": "Seleccione un idioma",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Seleccione una página que contenga el módulo 'Buscar'. Una opción de pie de página agrega un enlace discreto a esta página.",
"Sélectionnez une page pour activer": "Seleccione una página para activar",
"Séparateur": "Separador",
"Taille": "Tamaño",
"Text": "Texto",
"Texte": "Texto",
"Thème": "Tema",
"Thème de l'administration": "Tema de administración",
@ -599,23 +448,9 @@
"Thèmes": "Temas",
"Titre": "Título",
"Titre court": "Título corto",
"Titre masqué": "Título enmascarado",
"Titre masqué dans la page": "Título oculto en la página",
"Titres": "Títulos",
"Tous les dossiers": "Todas las carpetas",
"Tous les droits d'édition des contenus": "Todos los derechos de edición de contenido",
"Tout Effacer": "Borrar todo",
"Traduction supprimée": "Traducción eliminada",
"Très grande": "Muy grande",
"Très grande (240%)": "Muy grande (240%)",
"Très grande (400px)": "Muy grande (400px)",
"Très important": "Muy importante",
"Très importante": "Muy importante",
"Très léger": "Muy ligero",
"Très légère": "Muy ligera",
"Très petite": "Muy pequeño",
"Très petite (100px) ": "Muy pequeño (100px)",
"Très petite (160%)": "Muy pequeño (160%)",
"Twitter": "Twitter",
"Type de captcha": "Tipo de captcha",
"Type de proxy": "Tipo de proxy",
@ -624,7 +459,6 @@
"Télécharger la liste": "Descargar la revista",
"Télécharger le journal": "Descargar la revista",
"Télécharger le module dans le gestionnaire de fichiers": "Descargar módulo al administrador de archivos",
"Téléverser": "Subir",
"URL incorrecte": "URL incorrecta",
"Un mail a été envoyé pour confirmer la réinitialisation": "Se ha enviado un correo electrónico para confirmar el restablecimiento.",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Un archivo que contiene la carpeta /site/data se conserva durante 30 días. Activación recomendada .",
@ -634,60 +468,31 @@
"Utilisateur supprimé": "Usuario eliminado",
"Utilisateurs": "Usuarios",
"Valider": "Validar",
"Vers": "Hacia",
"Version": "Versión",
"Version n°": "Número de versión",
"Vider dossier sauvegardes auto": "Carpeta de autoguardado vacía",
"Visiteur": "Visitante",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "No está autorizado para ver esta página (error 403)",
"Youtube": "YouTube",
"ZwiiCMS - Installation": "ZwiiCMS - Instalación",
"actualisé": "actualizado",
"favicon.ico": "Recuerde borrar el caché de su navegador si el favicon no cambia.",
"faviconDark.ico": "faviconDark.ico",
"gestionnaire de fichiers": "administrador de archivos",
"installé": "instalado",
"jour": "día",
"jours": "días",
"largeur de site :": "ancho del sitio",
"largeur du site": "ancho del sitio",
"sauvegardé avec succès": "Guardado exitosamente",
"vers": "hacia",
"À droite": "A la derecha",
"À gauche": "A la izquierda",
"vers": "Hacia",
"vers ZwiiCMS": "Hacia ZwiiCMS",
"À l'emplacement du mot clé [MODULE] dans la page": "En la ubicación de la palabra clave [MODULE] en la página",
"Échec de l'écriture, vérifiez les permissions": "Escritura fallida, verifique los permisos",
"Échecs": "Fracasos",
"Éditer": "Editar",
"Éditer la page": "Editar página",
"Éditer les dialogues": "Editar los diálogos",
"Éditer une catégorie": "Editar categoría",
"Éditeur": "Editor",
"Éditeur CSS": "Editor de CSS",
"Éditeur JS": "Editor de JS",
"Éditeur de script %s": "Editor de script %s",
"Éditeur de script dans Body": "Éditor del script en el Body",
"Éditeur de script dans Head": "Éditor del script en el Head",
"Éditeur simple": "Editor simple",
"Édition des pages": "Edición de páginas",
"Édition du profil %s": "Edición del perfil %s",
"Éléments": "Elementos",
"Étendu sur la page": "Extendido en la página",
"Étiquettes des pages spéciales": "Etiquetas de páginas especiales",
"Dimensions minimales": "Dimensiones mínimas",
"Taille maximale du fichier": "Tamaño máximo de archivo",
"5 Mo pour les images JPEG": "5 MB para imágenes JPEG",
"1 Mo pour les images PNG": "1 MB para imágenes PNG",
"Poids": "Peso",
"Supprimer ce profil ?": "¿Eliminar este perfil?",
"Masqué": "Oculto",
"Haut de page": "Parte superior de la página",
"Bas de page": "Parte inferior de la página",
"Petit triangle": "Triángulo pequeño",
"Grand triangle": "Triángulo grande",
"Flèche": "Flecha",
"Modèle": "Plantilla",
"Bouton de navigation droit": "Botón de navegación derecha",
"Bouton de navigation gauche": "Botón de navegación izquierda",
"Groupes / Profils": "Grupos / Perfiles",
"Prénom commence par": "El nombre comienza con",
"Nom commence par": "El apellido comienza con",
"Impossible de réinitialiser le mot de passe de ce compte !": "No puedo restablecer la contraseña de esta cuenta."
"Étiquettes des pages spéciales": "Etiquetas de página especiales"
}

View File

@ -1,59 +1,46 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "",
"'Sauvegarder et télécharger les données du module": "",
"1 jour": "",
"1/4 : Préparation...": "",
"10 minutes": "",
"10 tentatives": "",
"14 jours": "",
"15 minutes": "",
"2 jours": "",
"2/4 : Téléchargement...": "",
"3 tentatives": "",
"3/4 : Installation...": "",
"4 jours": "",
"4/4 : Configuration...": "",
"5 minutes": "",
"5 tentatives": "",
"7 jours": "",
"Accueil": "",
"Accède au site": "",
"Accède aux pages réservées": "",
"Accède aux pages réservées et à un dossier partagé": "",
"Accès aux pages privées": "",
"Accès bloqué %d minutes": "",
"Accès désactivé": "",
"Accès interdit, erreur 403": "",
"Action interdite": "",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "",
"Activer": "",
"Activer SMTP": "",
"Activer la journalisation": "",
"Actualiser": "",
"Adaptation": "",
"Administrateur": "",
"Administration": "",
"Administration complète du site": "",
"Adresse SMTP": "",
"Adresse du proxy": "",
"Adresse électronique": "",
"Affectation": "",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "",
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "",
"Aide": "",
"Ajouter": "",
"Ajouter un profil": "",
"Ajout - Édition - Suppression de fichiers": "",
"Ajout - Édition - Suppression de pages": "",
"Ajouter un utilisateur": "",
"Ajouter une fonte": "",
"Alignement": "",
"Aligner la bannière avec le contenu": "",
"Ancien mot de passe": "",
"Anonymat des adresses IP": "",
"Apache URL intelligent": "",
"Apache URL intelligentes": "",
"Apparence": "",
"Appliquer": "",
"Approuver un commentaire": "",
"Après": "",
"Après la bannière": "",
"Après le contenu de la page": "",
"Archive": "",
"Archive ZIP": "",
@ -69,46 +56,28 @@
"Arrière plan": "",
"Arrière plan des blocs": "",
"Arrière plan des champs": "",
"Arrondi des angles": "",
"Au centre": "",
"Au début": "",
"Au milieu au centre": "",
"Au milieu à droite": "",
"Au milieu à gauche": "",
"Au-dessus du site": "",
"Aucun": "",
"Aucun dossier": "",
"Aucun fichier journal à télécharger": "",
"Aucun journal à effacer": "",
"Aucun menu": "",
"Aucune": "",
"Aucune liste noire à effacer": "",
"Aucune liste noire à télécharger": "",
"Auteur :": "",
"Authentification": "",
"Automatique": "",
"Autoriser les robots à référencer le site": "",
"Autorisé": "",
"Avant la bannière": "",
"Avant le contenu de la page": "",
"Background": "",
"Banni": "",
"Bannière": "",
"Bannière cliquable": "",
"Barre 1/3 - page 2/3": "",
"Barre 1/4 - page 1/2 - barre 1/4": "",
"Barre 1/4 - page 3/4": "",
"Barre 2/12 - page 7/12 - barre 3/12": "",
"Barre 3/12 - page 7/12 - barre 2/12": "",
"Barre de membre": "",
"Barre latérale": "",
"Barre latérale droite :": "",
"Barre latérale gauche :": "",
"Barres latérales": "",
"Bienvenue %s %s": "",
"Blocage après échecs": "",
"Blog": "",
"Bords arrondis": "",
"Bordure des blocs": "",
"Bordure des champs": "",
"Bouton Aide": "",
@ -119,14 +88,11 @@
"Bouton standard": "",
"Bouton validation": "",
"Boutons": "",
"Caché": "",
"Cachée": "",
"Captcha complexe": "",
"Captcha à la connexion": "",
"Captcha, identifiant ou mot de passe incorrects": "",
"Capture d'écran Open Graph": "",
"Capture d'écran générée avec succès": "",
"Casse": "",
"Catalogue": "",
"Catégorie": "",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "",
@ -134,34 +100,27 @@
"Cette redirection ne concerne que les pages d'administration du site.": "",
"Chaîne Youtube": "",
"Chiffres": "",
"Cible": "",
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "",
"Commentaire": "",
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "",
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "",
"Complète": "",
"Compte administrateur": "",
"Compte de l'utilisateur": "",
"Compte verrouillé": "",
"Configuration": "",
"Configuration du module": "",
"Configurer": "",
"Configurer mon compte": "",
"Confirmation": "",
"Confirmer la suppression de cet utilisateur": "",
"Confirmer la dissociation du module de cette page": "",
"Confirmer la désinstallation du module": "",
"Confirmer la suppression de cet utilisateur": "",
"Confirmer la suppression de cette langue": "",
"Confirmer la suppression de la page": "",
"Confirmer la suppression des données du module": "",
"Confirmez-vous la suppression de cette page ?": "",
"Connexion": "",
"Consulter l'aide en ligne": "",
"Contents": "",
"Contenu": "",
"Contenu HTML": "",
"Contenu avancé": "",
"Contenu du menu vertical": "",
"Contrôle total": "",
"Contenu personnalisé": "",
"Cookies": "",
"Cookies Zwii": "",
"Copie de contenus localisés": "",
@ -169,53 +128,32 @@
"Copie des traductions rédigées": "",
"Copie terminée avec des erreurs": "",
"Copie terminée avec succès": "",
"Copier": "",
"Copier sauvegardes auto": "",
"Couleur de fond automatique": "",
"Couleur icône haut de page": "",
"Couleur texte page active": "",
"Couleur unie ou papier-peint": "",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "",
"Couleurs": "",
"Dans le site": "",
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "",
"Dans quelle langue utiliserez-vous Zwii ?": "",
"Date": "",
"De": "",
"Description": "",
"Disponible si le consentement des cookies est activé.": "",
"Disposition": "",
"Données %s copiées vers %s": "",
"Données des modules": "",
"Données importées": "",
"Dossier": "",
"Droits sur les dossiers": "",
"Droits sur les fichiers": "",
"Dupliquer": "",
"Du": "",
"Dupliquer la page": "",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "",
"Déconnecter": "",
"Déconnexion !": "",
"Déconnexion automatique": "",
"Définir par défaut": "",
"Dévoiler le mot de passe": "",
"Effacer": "",
"Echec de l'écriture, vérifiez les permissions": "",
"Effacer la page": "",
"Effacer tous les commentaires": "",
"Effacer toutes les statistiques": "",
"Effacer un commentaire": "",
"Effacer une catégorie": "",
"Emplacement :": "",
"Emplacement dans le menu": "",
"En bas au centre": "",
"En bas à droite": "",
"En bas à gauche": "",
"En cas de changement de module, les données du module précédent seront supprimées.": "",
"En dessous du site": "",
"En haut au centre": "",
"En haut à droite": "",
"En haut à gauche": "",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "",
"En-dehors du site": "",
"Enregistrer": "",
"Envoyer un message de confirmation": "",
"Erreur : sauvegarde non générée !": "",
@ -226,20 +164,15 @@
"Erreur de lecture, vérifiez les permissions": "",
"Erreur inconnue": "",
"Erreur inconnue, le module n'est pas installé": "",
"Export CSV": "",
"Expéditeur": "",
"Extension": "",
"Extraire": "",
"Facebook": "",
"Famille": "",
"Favicon thème sombre": "",
"Feuille de style spécifique à la page.": "",
"Fichiers": "",
"Fichiers effacés": "",
"Fil d'Ariane dans le titre": "",
"Fond du sous-menu": "",
"FontId": "",
"Fonte": "",
"Fonte actualisée": "",
"Fonte créée": "",
"Fonte en ligne": "",
@ -248,36 +181,22 @@
"Fonte supprimée": "",
"Fontes": "",
"Format incorrect": "",
"Formulaire": "",
"Fréquence de recherche": "",
"Fuseau horaire": "",
"Gabarits de page - Barre latérale": "",
"Gestion": "",
"Gestion des modules": "",
"Gestion des thèmes": "",
"Gestionnaire de fichiers": "",
"Github": "",
"Grande": "",
"Grande (220%)": "",
"Grande (300px)": "",
"Gras": "",
"Groupe": "",
"Groupe associé": "",
"Groupe requis pour accéder à la page :": "",
"Groupes": "",
"Générer sitemap.xml et robots.txt": "",
"Générer une capture Open Graph": "",
"Gérer les catégories": "",
"Gérer les commentaires": "",
"Gérer les données": "",
"Hauteur": "",
"Hauteur de l'image": "",
"Hauteur de l'image sélectionnée": "",
"Hauteur maximale": "",
"Gérer les fichiers": "",
"Gérer les modules": "",
"Hauteur de l'image :": "",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "",
"Icône": "",
"Icône avec bulle de texte": "",
"Icône haut de page, couleur arrière-plan": "",
"Identifiant": "",
"Identifiant (sans espace ni majuscule)": "",
"Identité": "",
@ -285,9 +204,6 @@
"Identité du site": "",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "",
"Image": "",
"Image étirée (100% 100%)": "",
"Important": "",
"Importante": "",
"Importation d'utilisateurs": "",
"Importation de fichier plat CSV": "",
"Importation effectuée": "",
@ -296,13 +212,13 @@
"Importer des utilisateurs en masse": "",
"Impossible d'ouvrir l'archive": "",
"Impossible de modifier votre propre groupe.": "",
"Impossible de soumettre le formulaire, car il contient des erreurs": "",
"Impossible de supprimer une page contenant des pages enfants": "",
"Impossible de supprimer votre propre compte": "",
"Inclure le contenu du gestionnaire de fichiers": "",
"Incorrect": "",
"Informations": "",
"Instagram": "",
"Installation": "",
"Installation terminée": "",
"Installer": "",
"Installer depuis le catalogue en ligne": "",
@ -319,29 +235,25 @@
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "",
"La carte du site a été mise à jour": "",
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "",
"La clé de l'API ne peut pas être vide": "",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "",
"La page %s est ouverte par l'utilisateur %s": "",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "",
"La première page que vos visiteurs verront.": "",
"La règlementation française impose un anonymat de niveau 2": "",
"La réécriture d'URL n'a pas été restaurée !": "",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "",
"La suppression a échoué": "",
"La version installée est plus récente": "",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "",
"Langue de l'administration": "",
"Langue du site par défaut": "",
"Langue du site sélectionnée": "",
"Langue par défaut": "",
"Langues": "",
"Langues disponibles": "",
"Langues installées": "",
"Largeur": "",
"Largeur de l'image": "",
"Largeur du site": "",
"Largeur de l'image :": "",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "",
"Le curseur horizontal règle le niveau de transparence.": "",
"Le fuseau horaire est utile au bon référencement": "",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "",
"Le menu horizontal intégral": "",
@ -354,80 +266,54 @@
"Les langues sélectionnées sont identiques": "",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "",
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "",
"Lettres": "",
"Libre": "",
"Licence :": "",
"Lien de connexion": "",
"Lien page des mentions légales.": "",
"Liens": "",
"Limitation des tentatives": "",
"Limitée au site": "",
"Linkedin": "",
"Liste noire": "",
"Liste noire réinitialisée avec succès": "",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "",
"Léger": "",
"Légère": "",
"Maigre": "",
"Maintenance": "",
"Majuscule à chaque mot": "",
"Majuscules": "",
"Marges verticales": "",
"Masquer la bannière en écran réduit": "",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "",
"Masquer les pages enfants dans le menu horizontal": "",
"Membre": "",
"Membre avec droit de partage": "",
"Membre simple": "",
"Mentions légales": "",
"Menu": "",
"Menu accessoire": "",
"Menu burger dans écran réduit": "",
"Menu standard": "",
"Message d'acceptation des Cookies": "",
"Message de consentement aux cookies": "",
"Mettre à jour": "",
"Mettre à jour le module orphelin": "",
"Minuscules": "",
"Mise en forme des titres": "",
"Mise en forme du texte": "",
"Mise en forme du titre": "",
"Mise en page": "",
"Mise à jour": "",
"Mise à jour automatisée": "",
"Mise à jour de ZwiiCMS": "",
"Mise à jour terminée avec succès.": "",
"Modifications enregistrées": "",
"Module": "",
"Module de la page": "",
"Modules": "",
"Modules configurés": "",
"Modules installés": "",
"Modules orphelins": "",
"Mot de passe": "",
"Mot de passe oublié": "",
"Mot de passe perdu": "",
"Motorisé par": "",
"Moyen": "",
"Moyenne": "",
"Moyenne (200%)": "",
"Moyenne (200px)": "",
"Multilingue": "",
"Méta-description": "",
"Méta-titre": "",
"Ne pas afficher": "",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "",
"Ne pas répéter": "",
"Ne pas saisir les balises": "",
"News": "",
"Niveau 1 (192.168.12.x)": "",
"Niveau 2 (192.168.x.x)": "",
"Niveau 3 (192.x.x.x)": "",
"Nom": "",
"Nom Prénom": "",
"Nom du profil": "",
"Nom utilisateur": "",
"Non": "",
"Non tronquée": "",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "",
"Nouveau contenu localisé": "",
"Nouveau mot de passe": "",
@ -435,11 +321,8 @@
"Nouvel utilisateur": "",
"Nouvelle page créée": "",
"Nouvelle page ou barre latérale": "",
"Obligatoire": "",
"Ombre": "",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "",
"Options": "",
"Options avancées": "",
"Origine": "",
"Oui": "",
@ -447,7 +330,6 @@
"Page 2/3 - barre 1/3": "",
"Page 3/4 - barre 1/4": "",
"Page associée": "",
"Page de recherche": "",
"Page dupliquée": "",
"Page et module dupliqués": "",
"Page inexistante, erreur 404": "",
@ -464,19 +346,12 @@
"Paramètres": "",
"Paramètres de la localisation": "",
"Paramètres de la sauvegarde": "",
"Paramètres du profil": "",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "",
"Pas de marge au-dessus et en dessous du site": "",
"Partage de fichiers autorisé": "",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "",
"Permission": "",
"Permission et référencement": "",
"Permissions": "",
"Permissions sur les dossiers": "",
"Permissions sur les fichiers": "",
"Permissions sur les pages": "",
"Petite": "",
"Petite (150px)": "",
"Petite (180%)": "",
"Permissions :": "",
"Pied de page": "",
"Pinterest": "",
"Plan du site": "",
@ -487,39 +362,24 @@
"Position": "",
"Position du module": "",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "",
"Presse Papier": "",
"Presse papier": "",
"Profils des groupes": "",
"Proportionnelle à la taille définie dans le site.": "",
"Prénom": "",
"Prénom Nom": "",
"Préparation de la mise à jour": "",
"Préserver le fichier htaccess racine": "",
"Préserver les comptes des utilisateurs déjà installés": "",
"Prévenir l'utilisateur par mail": "",
"Prévisualiser": "",
"Pseudo": "",
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "",
"Ratio": "",
"Ratio :": "",
"Recherche": "",
"Recherche dans le site": "",
"Rechercher": "",
"Rechercher une mise à jour en ligne": "",
"Redirection": "",
"Redirection vers la connexion": "",
"Renommer": "",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "",
"Responsive (contain)": "",
"Responsive (cover)": "",
"Restauration des bases de données absentes": "",
"Restauration effectuée avec succès": "",
"Restaurer": "",
"Restaurer les données du site": "",
"Rester connecté sur ce navigateur": "",
"Retour": "",
"Rien à importer, erreur de format ou fichier incorrect": "",
"Rédacteur": "",
"Référencement": "",
"Réinitialisation du mot de passe": "",
"Réinitialiser avec le thème par défaut": "",
@ -527,12 +387,10 @@
"Réinitialiser la liste": "",
"Réinitialiser le journal": "",
"Réinstaller": "",
"Répétition": "",
"Réseau": "",
"Réseaux sociaux": "",
"S'ouvre dans un nouvel onglet": "",
"SMTP": "",
"SMTP personnalisé": "",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "",
"Saisissez le Titre de gestion des cookies.": "",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "",
@ -547,7 +405,7 @@
"Sauvegarde": "",
"Sauvegarde automatique quotidienne du site": "",
"Sauvegarde du thème dans le": "",
"Sauvegarde générée avec succès": "",
"Sauvegarde générée avec succès.": "",
"Sauvegarder": "",
"Sauvegarder et télécharger le module": "",
"Sauvegarder le module dans le gestionnaire de fichiers": "",
@ -563,20 +421,13 @@
"Signature": "",
"Site": "",
"Site en maintenance": "",
"Size": "",
"Source": "",
"Standard": "",
"Style": "",
"Suppression interdite": "",
"Suppression interdite, page active dans la configuration de la langue du site": "",
"Suppression interdite, page active dans la configuration du site": "",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "",
"Supprimer": "",
"Supprimer la page": "",
"Supprimer le module": "",
"Supprimer toutes les sauvegardes automatiques ?": "",
"Sur l'axe horizontal": "",
"Sur l'axe vertical": "",
"Sur les deux axes": "",
"Sécurité": "",
"Sécurité de la connexion": "",
"Sécurité désactivée": "",
@ -587,10 +438,8 @@
"Sélectionnez une image ou une icône de petite dimension": "",
"Sélectionnez une langue": "",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "",
"Sélectionnez une page pour activer": "",
"Séparateur": "",
"Taille": "",
"Text": "",
"Texte": "",
"Thème": "",
"Thème de l'administration": "",
@ -599,23 +448,9 @@
"Thèmes": "",
"Titre": "",
"Titre court": "",
"Titre masqué": "",
"Titre masqué dans la page": "",
"Titres": "",
"Tous les dossiers": "",
"Tous les droits d'édition des contenus": "",
"Tout Effacer": "",
"Traduction supprimée": "",
"Très grande": "",
"Très grande (240%)": "",
"Très grande (400px)": "",
"Très important": "",
"Très importante": "",
"Très léger": "",
"Très légère": "",
"Très petite": "",
"Très petite (100px) ": "",
"Très petite (160%)": "",
"Twitter": "",
"Type de captcha": "",
"Type de proxy": "",
@ -624,7 +459,6 @@
"Télécharger la liste": "",
"Télécharger le journal": "",
"Télécharger le module dans le gestionnaire de fichiers": "",
"Téléverser": "",
"URL incorrecte": "",
"Un mail a été envoyé pour confirmer la réinitialisation": "",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "",
@ -634,60 +468,31 @@
"Utilisateur supprimé": "",
"Utilisateurs": "",
"Valider": "",
"Vers": "",
"Version": "",
"Version n°": "",
"Vider dossier sauvegardes auto": "",
"Visiteur": "",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "",
"Youtube": "",
"ZwiiCMS - Installation": "",
"actualisé": "",
"favicon.ico": "",
"faviconDark.ico": "",
"gestionnaire de fichiers": "",
"installé": "",
"jour": "",
"jours": "",
"largeur de site :": "",
"largeur du site": "",
"sauvegardé avec succès": "",
"vers": "",
"À droite": "",
"À gauche": "",
"vers ZwiiCMS": "",
"À l'emplacement du mot clé [MODULE] dans la page": "",
"Échec de l'écriture, vérifiez les permissions": "",
"Échecs": "",
"Éditer": "",
"Éditer la page": "",
"Éditer les dialogues": "",
"Éditer une catégorie": "",
"Éditeur": "",
"Éditeur CSS": "",
"Éditeur JS": "",
"Éditeur de script %s": "",
"Éditeur de script dans Body": "",
"Éditeur de script dans Head": "",
"Éditeur simple": "",
"Édition des pages": "",
"Édition du profil %s": "",
"Éléments": "",
"Étendu sur la page": "",
"Étiquettes des pages spéciales": "",
"Dimensions minimales": "",
"Taille maximale du fichier": "",
"5 Mo pour les images JPEG": "",
"1 Mo pour les images PNG": "",
"Poids": "",
"Supprimer ce profil ?": "",
"Masqué": "",
"Haut de page": "",
"Bas de page": "",
"Petit triangle": "",
"Grand triangle": "",
"Flèche": "",
"Modèle": "",
"Bouton de navigation droit": "",
"Bouton de navigation gauche": "",
"Groupes / Profils": "",
"Prénom commence par": "",
"Nom commence par": "",
"Impossible de réinitialiser le mot de passe de ce compte !": ""
"Étiquettes des pages spéciales": ""
}

View File

@ -0,0 +1,498 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'Μην δείχνετε'δημιουργεί μια ορφανή σελίδα στην οποία δεν είναι δυνατή η πρόσβαση μέσω των μενού.",
"'Sauvegarder et télécharger les données du module": "Αποθήκευση και ανάκτηση δεδομένων της Πρόσθετος",
"1/4 : Préparation...": "1/4: Προετοιμασία...",
"10 minutes": "10 λεπτά",
"10 tentatives": "10 προσπάθειες",
"15 minutes": "15 λεπτά",
"2/4 : Téléchargement...": "2/4: Λήψη...",
"3 tentatives": "3 προσπάθειες",
"3/4 : Installation...": "3/4: Εγκατάσταση...",
"4/4 : Configuration...": "4/4: Διαμόρφωση...",
"5 minutes": "5 λεπτά",
"5 tentatives": "5 προσπάθειες",
"Accueil": "Αρχική",
"Accès aux pages privées": "Πρόσβαση σε ιδιωτικές σελίδες",
"Accès bloqué %d minutes": "Μπλοκαρισμένη πρόσβαση %d λεπτά",
"Accès interdit, erreur 403": "Άρνηση πρόσβασης, σφάλμα 403",
"Action interdite": "Απαγορευμένη ενέργεια",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Υποχρεωτική ενεργοποίηση σύμφωνα με τη γαλλική νομοθεσία, εκτός αν χρησιμοποιείτε το δικό σας σύστημα συγκατάθεσης.",
"Activer": "Ενεργοποίηση",
"Activer SMTP": "Ενεργοποίηση SMTP",
"Activer la journalisation": "Ενεργοποίηση ημερήσιας καταγραφής συμβάντων",
"Actualiser": "Ενημέρωση",
"Administration": "Θέμα διαχείρισης",
"Administration complète du site": "Πλήρης διαχείριση του ιστότοπου",
"Adresse SMTP": "Διεύθυνση SMTP",
"Adresse du proxy": "Τύπος διακομιστή μεσολάβησης",
"Adresse électronique": "Διεύθυνση e-mail",
"Affectation": "Ανάθεση",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Εμφανίζει το όνομα της μητρικής σελίδας ακολουθούμενο από το όνομα της σελίδας, ο τίτλος δεν πρέπει να είναι κρυμμένος",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Για να διασφαλιστεί η σωστή λειτουργία του Zwii, παρακαλούμε να μην κλείσετε αυτή τη σελίδα μέχρι να ολοκληρωθεί η λειτουργία.",
"Aide": "Βοήθεια",
"Ajout - Édition - Suppression de fichiers": "Προσθήκη - Επεξεργασία - Διαγραφή αρχείων",
"Ajout - Édition - Suppression de pages": "Προσθήκη - Επεξεργασία - Διαγραφή σελίδων",
"Ajouter un utilisateur": "Προσθέστε έναν χρήστη",
"Ajouter une fonte": "Προσθήκη γραμματοσειράς",
"Ancien mot de passe": "Παλαιός κωδικός πρόσβασης",
"Anonymat des adresses IP": "Ανωνυμία διευθύνσεων IP",
"Apache URL intelligent": "Ευφυής διεύθυνση URL του Apache",
"Apache URL intelligentes": "Έξυπνες διευθύνσεις URL Apache",
"Apparence": "Εμφάνιση",
"Appliquer": "Ισχύουν",
"Après": "Μετά",
"Après le contenu de la page": "Μετά το περιεχόμενο της σελίδας",
"Archive": "αρχείο",
"Archive ZIP": "ZIP αρχείο",
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "Το αρχείο αντιγράφεται στο φάκελο Modules του διαχειριστή αρχείων",
"Archive de thème invalide": "Μη έγκυρο αρχείο θέματος",
"Archive invalide": "Μη έγκυρο αρχείο",
"Archive invalide, l'écriture dans le dossier core est interdite": "Μη έγκυρο αρχείο, δεν επιτρέπεται η εγγραφή στο φάκελο πυρήνα",
"Archive invalide, le descripteur est absent": "Μη έγκυρο αρχείο, λείπει ο περιγραφέας",
"Archive invalide, le fichier de classe est absent": "Μη έγκυρο αρχείο, το αρχείο κλάσης λείπει",
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Μη έγκυρο αρχείο, οι εγγραφές δεν ταιριάζουν με τον περιγραφέα",
"Archive non spécifiée ou introuvable": "Το αρχείο δεν έχει καθοριστεί ή δεν βρέθηκε",
"Archive à restaurer": "Αρχείο προς αποκατάσταση",
"Arrière plan": "Φόντο ",
"Arrière plan des blocs": "Μπλοκ φόντο",
"Arrière plan des champs": "Φόντο των πεδίων",
"Au début": "Στην αρχή",
"Aucun fichier journal à télécharger": "Δεν υπάρχουν αρχεία καταγραφής για λήψη",
"Aucun journal à effacer": "Δεν υπάρχει αρχείο καταγραφής προς διαγραφή",
"Aucun menu": "Δεν υπάρχει μενού",
"Aucune liste noire à effacer": "Δεν υπάρχει μαύρη λίστα για διαγραφή",
"Aucune liste noire à télécharger": "Δεν υπάρχει μαύρη λίστα για λήψη",
"Auteur :": "Συγγραφέας",
"Authentification": "Αυθεντικοποίηση",
"Autoriser les robots à référencer le site": "Επιτρέψτε στα ρομπότ να αναφέρουν τον ιστότοπο",
"Avant le contenu de la page": "Πριν από το περιεχόμενο της σελίδας",
"Bannière": "Πανό",
"Barre 1/3 - page 2/3": "πλευρική στήλη 1/3 - σελίδα 2/3",
"Barre 1/4 - page 1/2 - barre 1/4": "πλευρική στήλη 1/4 - σελίδα 1/2 - πλευρική στήλη 1/4",
"Barre 1/4 - page 3/4": "πλευρική στήλη 1/4 - σελίδα 3/4",
"Barre 2/12 - page 7/12 - barre 3/12": "πλευρική στήλη 2/12 - σελίδα 7/12 - πλευρική στήλη 3/12",
"Barre 3/12 - page 7/12 - barre 2/12": "πλευρική στήλη 3/12 - σελίδα 7/12 - πλευρική στήλη 2/12",
"Barre latérale": "πλευρική στήλη",
"Barre latérale droite :": "Δεξιά πλευρική στήλη",
"Barre latérale gauche :": "Αριστερή πλευρική στήλη",
"Barres latérales": "Πλαϊνές μπάρες",
"Bienvenue %s %s": "Καλώς ήρθατε %s %s",
"Blocage après échecs": "Αποκλεισμός μετά από αποτυχίες",
"Bordure des blocs": "Πάχος γραμμής Μπλοκ ",
"Bordure des champs": " περιγράμματος πεδίου",
"Bouton Aide": "Κουμπί βοήθειας",
"Bouton Standard": "Τυπικό κουμπί",
"Bouton de validation": "Κουμπί επιβεβαίωση",
"Bouton effacement": "Κουμπί διαγραφής",
"Bouton retour": "Κουμπί επιστροφής",
"Bouton standard": "τυπικό κουμπί",
"Bouton validation": "Κουμπί επικύρωσης",
"Boutons": "Κουμπιά",
"Captcha complexe": "Πολύπλοκο Captcha",
"Captcha à la connexion": "Captcha για σύνδεση στον ιστότοπο",
"Captcha, identifiant ou mot de passe incorrects": "Λανθασμένο captcha, όνομα χρήστη ή κωδικός πρόσβασης",
"Capture d'écran Open Graph": "Στιγμιότυπο του Open Graph",
"Capture d'écran générée avec succès": "Επιτυχώς δημιουργημένο στιγμιότυπο οθόνης",
"Catalogue": "κατάλογος",
"Catégorie": "Κατηγορία",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "Αυτό το μέλος θα μπορεί να πραγματοποιεί μεταφόρτωση ή λήψη αρχείων στο φάκελο \"share\" και στους υποφακέλους του.",
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "Αυτή η σελίδα δεν θα πρέπει να εμφανίζεται στο δέντρο μενού. Δημιουργήστε μια ορφανή σελίδα.",
"Cette redirection ne concerne que les pages d'administration du site.": "Αυτή η ανακατεύθυνση αφορά μόνο τις σελίδες διαχείρισης της ιστοσελίδας",
"Chaîne Youtube": "Κανάλι σας στο Youtube",
"Chiffres": "Αριθμοί",
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "Key API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>",
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "Κey API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
"Complète": "πλήρης",
"Compte administrateur": "πρόσβαση Διαχειριστής",
"Compte verrouillé": "Κλειδωμένος λογαριασμός",
"Configuration": "Διαμόρφωση",
"Configuration du module": "Ρύθμιση πρόσθετου",
"Configurer mon compte": "Ρύθμιση του λογαριασμού μου",
"Confirmation": "Επιβεβαίωση",
"Confirmer la suppression de cet utilisateur": "Επιβεβαίωση διαγραφής αυτού του χρήστη",
"Confirmer la dissociation du module de cette page": "Επιβεβαιώστε το διαχωρισμό του πρόσθετου από αυτή τη σελίδα",
"Confirmer la désinstallation du module": "Επιβεβαιώστε την απεγκατάσταση του πρόσθετου",
"Confirmer la suppression de la page": "Επιβεβαίωση διαγραφής της σελίδας",
"Confirmer la suppression des données du module": "Επιβεβαίωση της διαγραφής των δεδομένων του πρόσθετου",
"Confirmez-vous la suppression de cette page ?": "Επιβεβαιώνετε τη διαγραφή αυτής της σελίδας ?",
"Connexion": "Σύνδεση",
"Consulter l'aide en ligne": "Συμβουλευτείτε τη διαδικτυακή βοήθεια",
"Contenu": "Περιεχόμενο",
"Contenu avancé": "Προηγμένο περιεχόμενο",
"Contenu du menu vertical": "Περιεχόμενο του κάθετου μενού",
"Contenu personnalisé": "Προσαρμοσμένο περιεχόμενο",
"Cookies": "Cookies",
"Cookies Zwii": "Cookies Zwii",
"Copie de contenus localisés": "Αντίγραφο εντοπισμένου περιεχομένου",
"Copie de sites inter-langues": "Αντιγραφή ιστότοπων πολλαπλών γλωσσών",
"Copie des traductions rédigées": "Αντίγραφο γραπτών μεταφράσεων",
"Copie terminée avec des erreurs": "Η αντιγραφή ολοκληρώθηκε με σφάλματα",
"Copie terminée avec succès": "Η αντιγραφή ολοκληρώθηκε με επιτυχία",
"Copier sauvegardes auto": "Αντιγραφή αυτόματου αντιγράφου ασφαλείας",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Το χρώμα που είναι ορατό ελλείψει εικόνας.<br />Το οριζόντιο ρυθμιστικό ρυθμίζει το επίπεδο διαφάνειας. ",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Το χρώμα που είναι ορατό ελλείψει εικόνας.<br />Το οριζόντιο ρυθμιστικό ρυθμίζει το επίπεδο διαφάνειας. Το χρώμα κειμένου είναι αυτόματο.",
"Couleurs": "Χρώματα",
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Δημιουργήστε έναν δωρεάν λογαριασμό, αντιγράψτε το κey και, στη συνέχεια, επικυρώστε τη φόρμα πριν κάνετε κλικ στο κουμπί generate",
"Dans quelle langue utiliserez-vous Zwii ?": "Σε ποια γλώσσα θα χρησιμοποιείτε το Zwii;",
"Date": "Ημερομηνία",
"De": "Από",
"Description": "Περιγραφή της ιστοσελίδας",
"Disposition": "Σχέδιο",
"Données %s copiées vers %s": "Τα δεδομένα %s αντιγράφηκαν στο %s",
"Données des modules": "Δεδομένα Πρόσθετα",
"Données importées": "Εισαγόμενα δεδομένα",
"Du": "από",
"Dupliquer la page": "Διπλασιάστε τη σελίδα",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Αποσύνδεση περιόδων σύνδεσης που είχαν ανοίξει προηγουμένως σε άλλα προγράμματα περιήγησης ιστού ή τερματικά υπολογιστή. Συνιστάται ενεργοποιημένη.",
"Déconnecter": "Αποσύνδεση",
"Déconnexion !": "Έξοδος",
"Déconnexion automatique": "Αυτόματη αποσύνδεση",
"Dévoiler le mot de passe": "αποκαλύψτε τον κωδικό πρόσβασης",
"Echec de l'écriture, vérifiez les permissions": "Η εγγραφή απέτυχε, ελέγξτε τα δικαιώματα",
"Effacer la page": "Διαγραφή σελίδας",
"Emplacement :": "Τοποθεσία",
"Emplacement dans le menu": "Θέση στο μενού",
"En cas de changement de module, les données du module précédent seront supprimées.": "Εάν αλλάξετε το πρόσθετο, τα δεδομένα της προηγούμενης ενότητας θα διαγραφούν.",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "Στην ελεύθερη θέση προσθέστε την ενότητα τοποθετώντας το [module] στην επιθυμητή θέση στη σελίδα σας. ",
"Enregistrer": "Αποθήκευση ",
"Envoyer un message de confirmation": "Στείλτε ένα μήνυμα επιβεβαίωσης",
"Erreur : sauvegarde non générée !": "Σφάλμα: δεν δημιουργήθηκε αντίγραφο ασφαλείας!",
"Erreur d'URL": "Σφάλμα URL",
"Erreur d'extraction, vérifiez les permissions": "Σφάλμα εξαγωγής, ελέγξτε τα δικαιώματα",
"Erreur de copie": "Σφάλμα αντιγραφής",
"Erreur de copie, vérifiez les permissions": "Σφάλμα αντιγραφής, έλεγχος δικαιωμάτων",
"Erreur de lecture, vérifiez les permissions": "Σφάλμα ανάγνωσης, ελέγξτε τα δικαιώματα",
"Erreur inconnue": "Άγνωστο σφάλμα",
"Erreur inconnue, le module n'est pas installé": "Άγνωστο σφάλμα, το πρόσθετο δεν έχει εγκατασταθεί",
"Extension": "Επέκταση",
"Facebook": "Facebook",
"Famille": "Οικογένεια γραμματοσειρών",
"Favicon thème sombre": "Favicon σκοτεινό θέμα",
"Feuille de style spécifique à la page.": "Σελίδα-συγκεκριμένο φύλλο στυλ css",
"Fichiers effacés": "Διαγραμμένα αρχεία",
"Fil d'Ariane dans le titre": "Διαδρομή στον τίτλο",
"Fond du sous-menu": "Φόντο υπομενού",
"FontId": "FontId",
"Fonte actualisée": "Ενημερωμένο χυτοσίδηρο",
"Fonte créée": "Χυτοσίδηρος που δημιουργήθηκε",
"Fonte en ligne": "online γραμματοσειρά",
"Fonte installée": "Εγκατεστημένη γραμματοσειρά",
"Fonte non créée, ressource absente !": "Ο χυτοσίδηρος δεν δημιουργήθηκε, ο πόρος δεν είναι διαθέσιμος!",
"Fonte supprimée": "Διαγράφεται χυτοσίδηρος",
"Fontes": "Γραμματοσειρές",
"Format incorrect": "Λάθος μορφή",
"Fuseau horaire": "Ζώνη ώρας",
"Gabarits de page - Barre latérale": "Πρότυπα σελίδας - Πλαϊνή μπάρα",
"Gestion": "Διαχείριση θεμάτων",
"Gestion des modules": "Διαχείριση πρόσθετων",
"Gestion des thèmes": "Διαχείριση θεμάτων",
"Github": "Github",
"Groupe": "Ομάδα",
"Groupe requis pour accéder à la page :": "Ομάδα που απαιτείται για την πρόσβαση στη σελίδα",
"Générer sitemap.xml et robots.txt": "Δημιουργία sitemap.xml και robots.txt",
"Générer une capture Open Graph": "Δημιουργήστε ένα στιγμιότυπο Open Graph",
"Gérer les fichiers": "Διαχείριση αρχείων",
"Gérer les modules": "Διαχείριση των ενοτήτων",
"Hauteur de l'image :": "Ύψος της εικόνας",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID : https://www.youtube.com/channel/[ID].",
"Icône": "Εικονίδιο",
"Icône avec bulle de texte": "Εικονίδιο με φυσαλίδα κειμένου",
"Identifiant": "αναγνωριστικό",
"Identifiant (sans espace ni majuscule)": "Όνομα χρήστη (χωρίς κενά ή κεφαλαία γράμματα)",
"Identité": "Ταυτότητα",
"Identité de la fonte": "Ταυτότητα της γραμματοσειράς",
"Identité du site": "Ταυτότητα του ιστότοπου",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Εμφανίζεται στη γραμμή τίτλου και στα κοινά μέσα κοινωνικής δικτύωσης.",
"Image": "Εικόνα",
"Importation d'utilisateurs": "Εισαγωγή χρηστών",
"Importation de fichier plat CSV": "Εισαγωγή επίπεδου αρχείου CSV",
"Importation effectuée": "Η εισαγωγή έγινε",
"Importer": "Εισαγωγή ",
"Importer dans": "Εισαγωγή σε",
"Importer des utilisateurs en masse": "Εισαγωγή μεγάλου αριθμού χρηστών",
"Impossible d'ouvrir l'archive": "Άγνωστο σφάλμα, το πρόσθετο δεν έχει εγκατασταθεί",
"Impossible de modifier votre propre groupe.": "Δεν μπορείτε να αλλάξετε τη δική σας ομάδα.",
"Impossible de supprimer une page contenant des pages enfants": "Αδυναμία διαγραφής μιας σελίδας που περιέχει παιδικές σελίδες",
"Impossible de supprimer votre propre compte": "Αδυναμία διαγραφής του δικού σας λογαριασμού",
"Inclure le contenu du gestionnaire de fichiers": "Συμπεριλάβετε τα περιεχόμενα του διαχειριστή αρχείων",
"Incorrect": "Λανθασμένο",
"Informations": "Πληροφορίες",
"Instagram": "Instagram",
"Installation": "Εγκατάσταση",
"Installation terminée": "Η εγκατάσταση ολοκληρώθηκε",
"Installer": "Εγκαταστήστε ",
"Installer depuis le catalogue en ligne": "Εγκατάσταση από τον online κατάλογο",
"Installer depuis une archive": "Εγκατάσταση από το αρχείο",
"Installer les données d'un module": "Εγκαταστήστε τα δεδομένα ενός πρόσθετου",
"Installer ou mettre à jour un module téléchargé": "Εγκατάσταση ή ενημέρωση μιας Κατεβασμένο Πρόσθετο",
"Installer un module": "Εγκαταστήστε ένα πρόσθετο",
"Installer un thème archivé (site ou administration)": "Εγκαταστήστε ένα αρχειοθετημένο θέμα (τοποθεσία ή διαχείριση)",
"Instructions JS ou jquery spécifiques à la page.": "Οδηγίες JS ή jquery για συγκεκριμένη σελίδα",
"Interface": "Διασύνδεση",
"Jeton invalide": "Μη έγκυρο token",
"Journal réinitialisé avec succès": "Το αρχείο καταγραφής μηδενίστηκε επιτυχώς",
"Journalisation": "ημερήσιας καταγραφής",
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "Το αρχείο έχει κατατεθεί στον διαχειριστή αρχείων. Αρχεία κάτω από την έκδοση 9 δεν γίνονται δεκτά.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "Το αναγνωριστικό χρήστη ορίζεται κατά τη δημιουργία του προφίλ χρήστη και δεν μπορεί να αλλάξει.",
"La carte du site a été mise à jour": "Ο χάρτης του ιστότοπου έχει ενημερωθεί",
"La clé de l'API ne peut pas être vide": "Το κey API δεν μπορεί να είναι άδειο",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "Η περιγραφή μιας ιστοσελίδας συμβάλλει στην παραπομπή της, κάθε ιστοσελίδα πρέπει να έχει διαφορετική περιγραφή.",
"La page %s est ouverte par l'utilisateur %s": "Η σελίδα %s είναι ανοιχτή από τον χρήστη %s",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "Η ζητούμενη σελίδα δεν υπάρχει ή δεν μπορεί να βρεθεί (σφάλμα 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "Η σελίδα εμφανίζεται σε ένα οριζόντιο μενού αλλά όχι στο κάθετο μενού μιας πλευρικής μπάρας",
"La première page que vos visiteurs verront.": "Η πρώτη σελίδα που θα δουν οι επισκέπτες σας.",
"La règlementation française impose un anonymat de niveau 2": "Οι γαλλικοί κανονισμοί επιβάλλουν την ανωνυμία επιπέδου 2",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "Η δημιουργία αντιγράφων ασφαλείας αρχείων ενδέχεται να διαρκέσει κάποιο χρόνο. Θέλετε να συνεχίσετε;",
"La suppression a échoué": "Η διαγραφή απέτυχε",
"La version installée est plus récente": "Η εγκατεστημένη έκδοση είναι πιο πρόσφατη",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "Ο έλεγχος είναι καθημερινός. Η επιλογή είναι απενεργοποιημένη εάν η διαμόρφωση του διακομιστή δεν το επιτρέπει.",
"Langue de l'administration": "Διοικητική γλώσσα",
"Langue du site sélectionnée": "Επιλεγμένη γλώσσα ιστότοπου",
"Langue par défaut": "Προεπιλεγμένη γλώσσα",
"Langues": "Γλώσσες",
"Langues disponibles": "Διαθέσιμες γλώσσες",
"Langues installées": "Εγκατεστημένες γλώσσες",
"Largeur de l'image :": "Πλάτος εικόνας",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "Το οριζόντιο ρυθμιστικό ρυθμίζει το επίπεδο διαφάνειας, τοποθετώντας το στο άκρο αριστερά για αόρατη επισήμανση.",
"Le fuseau horaire est utile au bon référencement": "Η ζώνη ώρας είναι χρήσιμη για καλή αναφορά",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "Το μενού αξεσουάρ είναι ευθυγραμμισμένο στα δεξιά της γραμμής μενού και είναι μια θέση που προορίζεται για τις σημαίες και το κουμπί σύνδεσης.",
"Le menu horizontal intégral": "Το πλήρες οριζόντιο μενού",
"Le module %s a été %s": "Το πρόσθετο %s έχει γίνει %s",
"Le module %s de la page %s a été supprimé": "Το πρόσθετο %s στη σελίδα %s έχει αφαιρεθεί",
"Le module %s est désinstallé, il reste peut-être des données dans %s": "Το πρόσθετο %s έχει απεγκατασταθεί, ενδέχεται να έχουν απομείνει δεδομένα στο %s",
"Le sous-menu de la page parente": "Το υπομενού της μητρικής σελίδας",
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Αν περάσετε το ποντίκι πάνω από ένα εικονίδιο στην οθόνη σύνδεσης, εμφανίζεται προσωρινά ο κωδικός πρόσβασης.",
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "Ο σύντομος τίτλος εμφανίζεται στα μενού. Μπορεί να είναι πανομοιότυπος με τον τίτλο της σελίδας",
"Les langues sélectionnées sont identiques": "Οι επιλεγμένες γλώσσες είναι ίδιες",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "τα Νομικά στοιχεία είναι υποχρεωτικές στη Γαλλία. Μια επιλογή υποσέλιδου προσθέτει έναν διακριτικό σύνδεσμο σε αυτή τη σελίδα.",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Οι αλλαγές που κάνατε ενδέχεται να μην αποθηκευτούν.",
"Lettres": "Γράμματα",
"Licence :": "Αδεια",
"Lien page des mentions légales.": "Σύνδεσμος προς τά νομικά στοιχεία",
"Liens": "σύνδεσμοι",
"Limitation des tentatives": "Περιορισμός προσπαθειών σύνδεσης",
"Linkedin": "Linkedin",
"Liste noire": "Μαύρη λίστα",
"Liste noire réinitialisée avec succès": "Επαναφορά μαύρης λίστας με επιτυχία",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Κατά τη διάρκεια μιας αυτόματης ενημέρωσης, διατηρεί το αρχείο htaccess της ρίζας του ιστότοπου.",
"Maintenance": "Συντήρηση",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Απόκρυψη σελίδας και υποσελίδων σε ένα μενού πλευρικής μπάρας",
"Masquer les pages enfants dans le menu horizontal": "Απόκρυψη παιδικών σελίδων στο οριζόντιο μενού",
"Mentions légales": "Νομικά στοιχεία",
"Menu": "Μενού",
"Menu accessoire": "Προαιρετικό μενού",
"Menu standard": "Τυπικό μενού",
"Message d'acceptation des Cookies": "Μήνυμα αποδοχής cookies",
"Message de consentement aux cookies": "Μήνυμα συγκατάθεσης για cookies",
"Mettre à jour": "Ενημέρωση",
"Mettre à jour le module orphelin": "Ενημέρωση ορφανής Πρόσθετος",
"Mise en forme des titres": "Μορφοποίηση τίτλων",
"Mise en forme du texte": "Μορφοποίηση κειμένου",
"Mise en forme du titre": "Μορφοποίηση τίτλου",
"Mise en page": "Διάταξη ",
"Mise à jour": "Ενημέρωση",
"Mise à jour automatisée": "Αυτοματοποιημένη ενημέρωση",
"Mise à jour de ZwiiCMS": "Ενημέρωση ZwiiCMS",
"Mise à jour terminée avec succès.": "Η ενημέρωση ολοκληρώθηκε με επιτυχία",
"Modifications enregistrées": "Αποθηκευμένες αλλαγές",
"Module": "Πρόσθετο (Module)",
"Module de la page": "πρόσθετο σελίδας",
"Modules configurés": "προσθήκες ρυθμισμένες",
"Modules installés": "Εγκατεστημένες Πρόσθετα",
"Modules orphelins": "ορφανά πρόσθετα",
"Mot de passe": "Κωδικός πρόσβασης",
"Mot de passe oublié": "Ξεχάσατε τον κωδικό σας;",
"Multilingue": "Πολύγλωσσο",
"Méta-description": "Μετα- περιγραφή",
"Méta-titre": "Μετα-τίτλος",
"Ne pas afficher": "Να μην εμφανίζεται",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Να μην φορτώνεται δείγμα ιστότοπου (προχωρημένοι χρήστες)",
"Ne pas saisir les balises": "Μην εισάγετε ετικέτες",
"Niveau 1 (192.168.12.x)": "Επίπεδο 1",
"Niveau 2 (192.168.x.x)": "Επίπεδο 2",
"Niveau 3 (192.x.x.x)": "Επίπεδο 3",
"Nom": "Όνομα",
"Nom utilisateur": "Όνομα χρήστη",
"Non": "Όχι",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Ο ιστότοπός μας υποβάλλεται επί του παρόντος σε συντήρηση. Ζητούμε συγγνώμη για την αναστάτωση και κάνουμε ό,τι μπορούμε για να επιστρέψουμε σύντομα.",
"Nouveau contenu localisé": "Νέο εντοπισμένο περιεχόμενο",
"Nouveau mot de passe": "Νέος κωδικός πρόσβασης",
"Nouveau mot de passe enregistré": "Νέος κωδικός πρόσβασης αποθηκευμένος",
"Nouvel utilisateur": "Καινούργιος χρήστης",
"Nouvelle page créée": "Δημιουργία νέας σελίδας",
"Nouvelle page ou barre latérale": "Νέα σελίδα ή sidebar",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Επιλογή ενεργή μόνο σε λειτουργία εκτός σύνδεσης, οι παιδικές σελίδες είναι ορατές και προσβάσιμες",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Synistómeni epilogí gia na asfalísete ti sýndesi. Ischýei gia óla ta captcha ston istótopo. I aplí captcha periorízetai se mia prosthíki arithmón apó to 0 éos to 10. Tο Πολύπλοκο Captcha chrisimopoieí tésseris leitourgíes arithmón apó to 0 éos to 20. ",
"Options avancées": "Προηγμένες επιλογές",
"Origine": "Προέλευση",
"Oui": "Ναί",
"Page": "Σελίδα",
"Page 2/3 - barre 1/3": "σελίδα 2/3 - πλευρική στήλη 1/3",
"Page 3/4 - barre 1/4": "σελίδα 3/4 - πλευρική στήλη 1/4",
"Page associée": "Συνδεδεμένη σελίδα",
"Page dupliquée": "Διπλή σελίδα",
"Page et module dupliqués": "Διπλή σελίδα και πρόσθετου",
"Page inexistante, erreur 404": "Η σελίδα δεν υπάρχει, σφάλμα 404",
"Page non cliquable": "Σελίδα χωρίς δυνατότητα κλικ",
"Page parent": "Σελίδα γονέα",
"Page standard": "Τυπική σελίδα",
"Page supprimée": "Σελίδα διαγράφηκε",
"Pages dans le menu": "Σελίδες στο μενού",
"Pages du site": "Ιστοσελίδες",
"Pages et les modules de": "Σελίδες και Πρόσθετα στο",
"Pages orphelines": "Ορφανές σελίδες",
"Papier peint": "Εικόνα φόντου",
"Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.": "Από προεπιλογή, το μενού εμφανίζεται ΜΕΤΑ το περιεχόμενο της σελίδας. Για να το τοποθετήσετε σε μια συγκεκριμένη θέση, εισαγάγετε το [MENU] στο περιεχόμενο της σελίδας.",
"Paramètres": "Παράμετροι",
"Paramètres de la localisation": "Ρυθμίσεις τοποθεσίας",
"Paramètres de la sauvegarde": "Ρυθμίσεις αντιγράφων ασφαλείας",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Ρυθμίσεις που πρέπει να χρησιμοποιείτε όταν ο πάροχος φιλοξενίας σας δεν προσφέρει τη δυνατότητα αποστολής μηνυμάτων.",
"Partage de fichiers autorisé": "Επιτρέπεται η κοινή χρήση αρχείων",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Θυμηθείτε να διαγράψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας εάν το favicon δεν αλλάξει",
"Permission": "Άδεια",
"Permission et référencement": "Άδεια και αναφορά στο διαδίκτυο",
"Permissions :": "Πρόσβαση σε ιδιωτικές σελίδες",
"Pied de page": "Υποσέλιδο",
"Pinterest": "Pinterest",
"Plan du site": "Χάρτης ιστοσελίδας",
"Police des titres": "Γραμματοσειρά τίτλου",
"Police du texte": "Γραμματοσειρά κειμένου",
"Port SMTP": "Θύρα SMTP",
"Port du proxy": "θύρα διακομιστή μεσολάβησης",
"Position": "Θέση",
"Position du module": "Θέση του πρόσθετου",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Για να ορίσετε τη σελίδα ως πλευρική μπάρα, επιλέξτε την επιλογή από τη λίστα.",
"Prénom": "επίθετο",
"Préparation de la mise à jour": "Προετοιμάστε την ενημέρωση",
"Préserver le fichier htaccess racine": "Διατηρήστε το αρχείο htaccess root",
"Préserver les comptes des utilisateurs déjà installés": "Διατήρηση των λογαριασμών των χρηστών που είναι ήδη εγκατεστημένοι",
"Prévenir l'utilisateur par mail": "Ειδοποιήστε τον χρήστη μέσω email",
"Pseudo": "Το ψευδώνυμο",
"Ratio :": "αναλογία",
"Recherche dans le site": "Αναζήτηση στον ιστότοπο",
"Rechercher": "Αναζήτηση",
"Rechercher une mise à jour en ligne": "Ελέγξτε για ενημέρωση online",
"Redirection vers la connexion": "Ανακατεύθυνση στη σύνδεση",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Συμπληρώστε τα παρακάτω πεδία για να ολοκληρώσετε την εγκατάσταση.",
"Restauration effectuée avec succès": "Η αποκατάσταση ολοκληρώθηκε με επιτυχία",
"Restaurer": "αποκατάσταση",
"Restaurer les données du site": "Επαναφορά δεδομένων ιστότοπου",
"Rester connecté sur ce navigateur": "Παραμονή συνδεδεμένου σε αυτό το Περιηγητής",
"Retour": "Επιστροφή",
"Rien à importer, erreur de format ou fichier incorrect": "Τίποτα για εισαγωγή, σφάλμα μορφοποίησης ή λανθασμένο αρχείο",
"Référencement": "Αναφορά στο διαδίκτυο",
"Réinitialisation du mot de passe": "Επαναφορά κωδικού πρόσβασης",
"Réinitialiser avec le thème par défaut": "Επαναφορά στο προεπιλεγμένο θέμα",
"Réinitialiser la feuille de style": "Επαναφορά του φύλλου στυλ css",
"Réinitialiser la liste": "Επαναφορά λίστας",
"Réinitialiser le journal": "Επαναφορά του αρχείου καταγραφής συμβάντων",
"Réinstaller": "Επανεγκατάσταση",
"Réseau": "δίκτυο",
"Réseaux sociaux": "Κοινωνικά δίκτυα",
"S'ouvre dans un nouvel onglet": "Ανοίγει σε νέα καρτέλα",
"SMTP": "SMTP",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Πληκτρολογήστε το κey και, στη συνέχεια, επικυρώστε τη φόρμα προτού κάνετε κλικ στο κουμπί δημιουργίας",
"Saisissez le Titre de gestion des cookies.": "Εισάγετε τον τίτλο του παραθύρου διαχείρισης cookies.",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Εισαγάγετε το μήνυμα για τα cookies που κατατέθηκαν από το ZwiiCMS, απαραίτητα για τη λειτουργία και τα οποία δεν απαιτούν συναίνεση.",
"Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.": "Εισαγάγετε το κείμενο του συνδέσμου προς τά νομικά στοιχεία, η σελίδα πρέπει να οριστεί στη διαμόρφωση του ιστότοπου.",
"Saisissez votre ID : https://pinterest.com/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID : https://pinterest.com/[ID].",
"Saisissez votre ID : https://twitter.com/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID : https://twitter.com/[ID].",
"Saisissez votre ID : https://www.facebook.com/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID : https://www.facebook.com/[ID] : https://www.facebook.com/[ID]",
"Saisissez votre ID : https://www.instagram.com/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID : https://www.instagram.com/[ID]. : https://www.instagram.com/[ID].",
"Saisissez votre ID Github : https://github.com/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID : https://github.com/[ID].",
"Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].": "Εισαγάγετε το αναγνωριστικό σας ID Linkedin : https://fr.linkedin.com/in/[ID].",
"Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].": "Εισαγάγετε το αναγνωριστικό σας User ID : https://www.youtube.com/user/[ID].",
"Sauvegarde": "Αντιγράφων ασφαλείας",
"Sauvegarde automatique quotidienne du site": "Αυτόματη ημερήσια δημιουργία αντιγράφων ασφαλείας ιστότοπου",
"Sauvegarde du thème dans le": "Αποθήκευση του θέματος στο",
"Sauvegarde générée avec succès.": "Δημιουργία αντιγράφου ασφαλείας με επιτυχία.",
"Sauvegarder": "Αποθήκευση αλλαγών",
"Sauvegarder et télécharger le module": "Αποθηκεύστε και κατεβάστε την Πρόσθετο",
"Sauvegarder le module dans le gestionnaire de fichiers": "Αποθηκεύστε την το module στη διαχείριση αρχείων σας",
"Sauvegarder les données du module dans le gestionnaire de fichiers": "Αποθηκεύστε τα δεδομένα της Πρόσθετος στον διαχειριστή αρχείων",
"Sauvegarder les données du site": "αποθήκευση δεδομένων από τον ιστότοπο",
"Script dans body": "προσθέστε Script στο τμήμα body",
"Script dans head": "προσθέστε Script στο τμήμα head",
"Scripts externes": "Εξωτερικά Scripts ",
"Se déconnecter": "Αποσύνδεση",
"Service en ligne inaccessible": "Η online υπηρεσία δεν είναι διαθέσιμη",
"Seul un administrateur peut se connecter lors d'une maintenance": "Μόνο ένας διαχειριστής μπορεί να συνδεθεί κατά τη διάρκεια της συντήρησης",
"Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.": "άν τα περιεχόμενα του διαχειριστή αρχείων είναι πολύ μεγάλα, είναι προτιμότερο να τα αντιγράψετε μέσω FTP.",
"Signature": "Υπογραφή",
"Site": "Ιστότοπος",
"Site en maintenance": "Η τοποθεσία υπό συντήρηση",
"Suppression interdite": "Απαγορεύεται η διαγραφή",
"Suppression interdite, page active dans la configuration du site": "Απαγορεύεται η διαγραφή, η σελίδα είναι ενεργή στη διαμόρφωση της τοποθεσίας",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Καταργήστε το ερωτηματικό στις διευθύνσεις URL, η επιλογή δεν είναι διαθέσιμη με άλλους διακομιστές ιστού",
"Supprimer": "για διαγραφή",
"Supprimer la page": "Διαγραφή σελίδας",
"Supprimer le module": "Διαγράψτε την Πρόσθετο",
"Supprimer toutes les sauvegardes automatiques ?": "Θέλετε να διαγράψετε όλες τις αυτόματες αποθηκεύσεις;",
"Sécurité": "Ασφάλεια",
"Sécurité de la connexion": "Ασφάλεια σύνδεσης",
"Sécurité désactivée": "Απενεργοποιημένη ασφάλεια",
"Sélectionner un fichier": "Επιλέξτε ένα αρχείο",
"Sélectionnez au moins un contenu à afficher": "Επιλέξτε τουλάχιστον ένα περιεχόμενο που θα εμφανιστεί",
"Sélectionnez la langue à copier vers une langue cible": "Επιλέξτε γλώσσα για αντιγραφή σε γλώσσα-στόχο",
"Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Επιλέξτε ένα εικονίδιο κατάλληλο για ένα σκοτεινό θέμα.<br>Θυμηθείτε να διαγράψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας εάν το favicon δεν αλλάξει.",
"Sélectionnez une image ou une icône de petite dimension": "Επιλέξτε μια μικρή εικόνα ή εικονίδιο",
"Sélectionnez une langue": "Επιλέξτε μια γλώσσα",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Επιλέξτε μια σελίδα που περιέχει τo module \"Αναζήτηση\". Μια επιλογή στο κάτω μέρος της σελίδας προσθέτει έναν διακριτικός σύνδεσμο προς αυτή τη σελίδα.",
"Séparateur": "Διαχωριστής",
"Taille": "Μέγεθος γραμματοσειράς",
"Texte": "Κείμενο",
"Thème": "Πρότυπο",
"Thème de l'administration": "Θέμα Διαχείρισης",
"Thème du site": "Θέμα ιστότοπου",
"Thème importé": "Εισαγόμενο θέμα",
"Thèmes": "Θέματα",
"Titre": "Τίτλος",
"Titre court": "Σύντομος τίτλος",
"Titre masqué dans la page": "Τίτλος κρυμμένος στη σελίδα",
"Titres": "Τίτλοι",
"Traduction supprimée": "Μετάφραση διαγράφεται",
"Twitter": "Twitter",
"Type de captcha": "τύπος captcha",
"Type de proxy": "διακομιστής μεσολάβησης ",
"Téléchargement et validation de l'archive": "Λήψη και επικύρωση του αρχείου",
"Télécharger": "Λήψη θέματος",
"Télécharger la liste": "Κατεβάστε τη λίστα",
"Télécharger le journal": "Κατεβάστε το περιοδικό",
"Télécharger le module dans le gestionnaire de fichiers": "Λήψη μιας Πρόσθετος στη διαχείριση αρχείων",
"URL incorrecte": "Μη έγκυρη διεύθυνση URL",
"Un mail a été envoyé pour confirmer la réinitialisation": "Ένα email εστάλη για να επιβεβαιώσει την επαναφορά",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Διατηρείται αρχείο του φακέλου /site/data για 30 ημέρες. Συνιστάται ενεργοποίηση",
"Une erreur est survenue lors de l'étape :": "Εμφανίστηκε σφάλμα στο βήμα",
"Url du fichier de fonte": "URL αρχείου γραμματοσειράς",
"Utilisateur inexistant": "Μη υπαρκτός χρήστης",
"Utilisateur supprimé": "Διαγραμμένος χρήστης",
"Utilisateurs": "Οι χρήστες",
"Valider": "Επικύρωση",
"Vers": "Προς το",
"Version": "Έκδοση",
"Version n°": "Έκδοση αριθ.",
"Vider dossier sauvegardes auto": "Αδειάστε το φάκελο αυτόματο αντίγραφο ασφαλείας",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "Δεν είστε εξουσιοδοτημένοι να προβάλετε αυτήν τη σελίδα (σφάλμα 403)",
"Youtube": "Youtube",
"actualisé": "ενημερωμένο",
"favicon.ico": "εικονίδιο αγαπημένων (favicon.ico)",
"faviconDark.ico": "faviconDark.ico",
"gestionnaire de fichiers": "Διαχείριση αρχείων",
"installé": "εγκατεστημένο",
"largeur de site :": "πλάτος ιστότοπου",
"largeur du site": "πλάτος ιστότοπου",
"sauvegardé avec succès": "αποθηκεύτηκε επιτυχώς",
"vers": "προς",
"vers ZwiiCMS": "προς το ZwiiCMS",
"À l'emplacement du mot clé [MODULE] dans la page": "Στη θέση της λέξης-κλειδί [MODULE] στη σελίδα",
"Échecs": "Αποτυχίες",
"Éditer": "Επεξεργασία κειμένου",
"Éditer la page": "Επεξεργασία σελίδας",
"Éditer les dialogues": "Επεξεργασία διαλόγων",
"Éditeur CSS": "Εκδότης CSS",
"Éditeur JS": "Εκδότης JS",
"Éditeur de script %s": "Συντάκτης του script %s",
"Éditeur de script dans Body": "Επεξεργαστής script στο Body",
"Éditeur de script dans Head": "Επεξεργαστής script στο Head",
"Étiquettes des pages spéciales": "Ειδικές ετικέτες σελίδων"
}

View File

@ -0,0 +1,498 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'Non mostrare' crea una pagina orfana a cui non si può accedere tramite i menu",
"'Sauvegarder et télécharger les données du module": "Salva e scarica i dati del modulo",
"1/4 : Préparation...": "1/4 : Preparazione...",
"10 minutes": "10 minuti",
"10 tentatives": "10 tentativi",
"15 minutes": "15 minuti",
"2/4 : Téléchargement...": "2/4 : Download...",
"3 tentatives": "3 tentativi",
"3/4 : Installation...": "3/4: Installazione...",
"4/4 : Configuration...": "4/4 : Configurazione...",
"5 minutes": "5 minuti",
"5 tentatives": "5 tentativi",
"Accueil": "Casa",
"Accès aux pages privées": "Accesso alle pagine private",
"Accès bloqué %d minutes": "Accesso bloccato per %d minuti",
"Accès interdit, erreur 403": "Accesso negato, errore 403",
"Action interdite": "Azione vietata",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Attivazione obbligatoria secondo le leggi francesi, a meno che non si utilizzi il proprio sistema di consenso.",
"Activer": "Attivare",
"Activer SMTP": "Attivare SMTP",
"Activer la journalisation": "Abilita la registrazione",
"Actualiser": "Aggiornamento",
"Administration": "Amministrazione",
"Administration complète du site": "Amministrazione completa del sito",
"Adresse SMTP": "Indirizzo SMTP",
"Adresse du proxy": "Indirizzo proxy",
"Adresse électronique": "Indirizzo e-mail",
"Affectation": "Assegnazione",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Visualizza il nome della pagina madre seguito dal nome della pagina; il titolo non deve essere nascosto",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Per garantire il corretto funzionamento di Zwii, non chiudere questa pagina fino al completamento dell'operazione.",
"Aide": "Aiuto",
"Ajout - Édition - Suppression de fichiers": "Aggiungi - Modifica - Elimina file",
"Ajout - Édition - Suppression de pages": "Aggiungere - Modificare - Cancellare pagine",
"Ajouter un utilisateur": "Aggiungere utente",
"Ajouter une fonte": "Aggiungi un carattere",
"Ancien mot de passe": "Password precedente",
"Anonymat des adresses IP": "Anonimato degli indirizzi IP",
"Apache URL intelligent": "Apache URL smart",
"Apache URL intelligentes": "Apache Smart URLs",
"Apparence": "Aspetto",
"Appliquer": "Applicare",
"Après": "Dopo",
"Après le contenu de la page": "Dopo il contenuto della pagina",
"Archive": "Archivio",
"Archive ZIP": "Archivio ZIP",
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "Archivio copiato nella cartella Modulo del file manager.",
"Archive de thème invalide": "Archivio tema non valido",
"Archive invalide": "Archivio non valido",
"Archive invalide, l'écriture dans le dossier core est interdite": "Archivio non valido, la scrittura nella cartella core non è consentita",
"Archive invalide, le descripteur est absent": "Archivio non valido, manca il descrittore",
"Archive invalide, le fichier de classe est absent": "Archivio non valido, manca il file di classe.",
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Archivio non valido, le cartelle non corrispondono al descrittore",
"Archive non spécifiée ou introuvable": "Archivio non specificato o non trovato",
"Archive à restaurer": "Archivio da ripristinare",
"Arrière plan": "Sfondo",
"Arrière plan des blocs": "Sfondo dei blocchi",
"Arrière plan des champs": "Sfondo dei campi",
"Au début": "All'inizio",
"Aucun fichier journal à télécharger": "Nessun file di log da scaricare",
"Aucun journal à effacer": "Nessun registro da eliminare",
"Aucun menu": "Nessun menu",
"Aucune liste noire à effacer": "Nessuna lista nera da cancellare",
"Aucune liste noire à télécharger": "Nessuna lista nera da scaricare",
"Auteur :": "Autore:",
"Authentification": "Autenticazione",
"Autoriser les robots à référencer le site": "Consentire ai robot di fare riferimento al sito",
"Avant le contenu de la page": "Prima del contenuto della pagina",
"Bannière": "Banner",
"Barre 1/3 - page 2/3": "Barra 1/3 - pagina 2/3",
"Barre 1/4 - page 1/2 - barre 1/4": "Barra 1/4 - pagina 1/2 - barra 1/4",
"Barre 1/4 - page 3/4": "Barra 1/4 - pagina 3/4",
"Barre 2/12 - page 7/12 - barre 3/12": "Barra 2/12 - pagina 7/12 - barra 3/12",
"Barre 3/12 - page 7/12 - barre 2/12": "Barra 3/12 - pagina 7/12 - barra 2/12",
"Barre latérale": "Barra laterale",
"Barre latérale droite :": "Barra laterale destra:",
"Barre latérale gauche :": "Barra laterale sinistra:",
"Barres latérales": "Barre laterali",
"Bienvenue %s %s": "Benvenuto %s %s",
"Blocage après échecs": "Blocco dopo i fallimenti",
"Bordure des blocs": "Confini dei blocchi",
"Bordure des champs": "Bordo campo",
"Bouton Aide": "Pulsante di aiuto",
"Bouton Standard": "Pulsante standard",
"Bouton de validation": "Pulsante di convalida",
"Bouton effacement": "Pulsante di cancellazione",
"Bouton retour": "Pulsante posteriore",
"Bouton standard": "Pulsante standard",
"Bouton validation": "Pulsante di convalida",
"Boutons": "Pulsanti",
"Captcha complexe": "captcha complesso",
"Captcha à la connexion": "Captcha al login",
"Captcha, identifiant ou mot de passe incorrects": "Captcha, nome utente o password non corretti",
"Capture d'écran Open Graph": "Schermata Open Graph",
"Capture d'écran générée avec succès": "Screenshot generato con successo",
"Catalogue": "Gestisci",
"Catégorie": "Categoria",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "Questo membro potrà caricare o scaricare file nella cartella 'share' e nelle sue sottocartelle",
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "Questa pagina non dovrebbe apparire nell'albero dei menu. Creare una pagina orfana",
"Cette redirection ne concerne que les pages d'administration du site.": "Questo reindirizzamento è solo per le pagine di amministrazione del sito",
"Chaîne Youtube": "Canale Youtube",
"Chiffres": "Numeri",
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "Chiave API<a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>",
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "Chiave API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
"Complète": "Completo",
"Compte administrateur": "Account amministratore",
"Compte verrouillé": "Account bloccato",
"Configuration": "Configurazione",
"Configuration du module": "Configurazione del modulo",
"Configurer mon compte": "Configurare il mio account",
"Confirmation": "Conferma",
"Confirmer la suppression de cet utilisateur": "Confermare la cancellazione di questo utente",
"Confirmer la dissociation du module de cette page": "Confermare la dissociazione del modulo da questa pagina",
"Confirmer la désinstallation du module": "Confermare la disinstallazione del modulo",
"Confirmer la suppression de la page": "Confermare la cancellazione della pagina",
"Confirmer la suppression des données du module": "Confermare la cancellazione dei dati del modulo",
"Confirmez-vous la suppression de cette page ?": "Confermi la cancellazione di questa pagina?",
"Connexion": "Login",
"Consulter l'aide en ligne": "Consultare la guida in linea",
"Contenu": "Contenuto",
"Contenu avancé": "Contenuto avanzato",
"Contenu du menu vertical": "Contenuto del menu verticale",
"Contenu personnalisé": "Contenuto personalizzato",
"Cookies": "Cookies",
"Cookies Zwii": "Zwii Cookies",
"Copie de contenus localisés": "Copia del contenuto localizzato",
"Copie de sites inter-langues": "Copia di siti in più lingue",
"Copie des traductions rédigées": "Copia di traduzioni scritte",
"Copie terminée avec des erreurs": "Copia completata con errori",
"Copie terminée avec succès": "Copia completata con successo",
"Copier sauvegardes auto": "Copia dei backup automatici",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Colore visibile senza immagine. Il cursore orizzontale imposta il livello di trasparenza",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Colore visibile senza immagine. Il cursore orizzontale imposta il livello di trasparenza. Il colore del testo è automatico",
"Couleurs": "Colori",
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Creare un account gratuito, copiare la chiave, quindi convalidare il modulo prima di fare clic sul pulsante genera",
"Dans quelle langue utiliserez-vous Zwii ?": "In quale lingua utilizzerete Zwii?",
"Date": "Data",
"De": "Da",
"Description": "Descrizione del sito",
"Disposition": "Layout",
"Données %s copiées vers %s": "Dati %s copiati in %s",
"Données des modules": "Dati dei moduli",
"Données importées": "Dati importati",
"Du": "Da",
"Dupliquer la page": "Duplicare la pagina",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Disconnette le sessioni precedentemente aperte su altri browser o terminali. Consigliata l'abilitazione",
"Déconnecter": "Disconnessione",
"Déconnexion !": "Logout!",
"Déconnexion automatique": "Auto Logout",
"Dévoiler le mot de passe": "Svelare il password",
"Echec de l'écriture, vérifiez les permissions": "Scrittura fallita, controllare i permessi",
"Effacer la page": "Cancella pagina",
"Emplacement :": "Posizione:",
"Emplacement dans le menu": "Posizione nel menu",
"En cas de changement de module, les données du module précédent seront supprimées.": "Quando si cambia il modulo, i dati del modulo precedente vengono cancellati.",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "In posizione libera aggiungere il modulo posizionando [MODULO] nel punto desiderato della pagina.",
"Enregistrer": "Salva",
"Envoyer un message de confirmation": "Invia messaggio di conferma",
"Erreur : sauvegarde non générée !": "Errore: backup non generato!",
"Erreur d'URL": "Errore URL",
"Erreur d'extraction, vérifiez les permissions": "Errore di estrazione, controllare le autorizzazioni",
"Erreur de copie": "Errore di copia",
"Erreur de copie, vérifiez les permissions": "Errore di copia, controllare le autorizzazioni",
"Erreur de lecture, vérifiez les permissions": "Errore di lettura, controllare le autorizzazioni",
"Erreur inconnue": "Errore sconosciuto",
"Erreur inconnue, le module n'est pas installé": "Errore sconosciuto, modulo non installato",
"Extension": "Estensione",
"Facebook": "Facebook",
"Famille": "Famiglia",
"Favicon thème sombre": "Favicon tema scuro",
"Feuille de style spécifique à la page.": "Foglio di stile specifico della pagina.",
"Fichiers effacés": "File eliminati",
"Fil d'Ariane dans le titre": "Breadcrumb nel titolo",
"Fond du sous-menu": "Sfondo del sottomenu",
"FontId": "FontId",
"Fonte actualisée": "Font aggiornato",
"Fonte créée": "Font creato",
"Fonte en ligne": "Font online",
"Fonte installée": "Font installata",
"Fonte non créée, ressource absente !": "Font non creato, risorsa non presente!",
"Fonte supprimée": "Font cancellato",
"Fontes": "Caratteri",
"Format incorrect": "Formato non corretto",
"Fuseau horaire": "Fuso orario",
"Gabarits de page - Barre latérale": "Modelli di pagina - Barra laterale",
"Gestion": "Gestione",
"Gestion des modules": "Gestione dei moduli",
"Gestion des thèmes": "Gestione del tema",
"Github": "Github",
"Groupe": "Gruppo",
"Groupe requis pour accéder à la page :": "Gruppo richiesto per accedere alla pagina:",
"Générer sitemap.xml et robots.txt": "Generare sitemap.xml e robots.txt",
"Générer une capture Open Graph": "Generare l'acquisizione di Open Graph",
"Gérer les fichiers": "Gestione dei file",
"Gérer les modules": "Gestisci moduli",
"Hauteur de l'image :": "Altezza immagine:",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "ID del canale: https://www.youtube.com/channel/[ID].",
"Icône": "Icona",
"Icône avec bulle de texte": "Icona con bolla di testo",
"Identifiant": "Nome utente",
"Identifiant (sans espace ni majuscule)": "Identificatore (senza spazi o lettere maiuscole)",
"Identité": "Identità",
"Identité de la fonte": "Identità del carattere",
"Identité du site": "Identità del sito",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Appare nella barra del titolo e viene condiviso sui social network",
"Image": "Immagine",
"Importation d'utilisateurs": "Importazione di utenti",
"Importation de fichier plat CSV": "Importazione di un file piatto CSV",
"Importation effectuée": "Importazione completata",
"Importer": "Importazione",
"Importer dans": "Importazione in",
"Importer des utilisateurs en masse": "Importazione di utenti in blocco",
"Impossible d'ouvrir l'archive": "Impossibile aprire l'archivio",
"Impossible de modifier votre propre groupe.": "Impossibile modificare il proprio gruppo",
"Impossible de supprimer une page contenant des pages enfants": "Impossibile cancellare una pagina contenente pagine figlio",
"Impossible de supprimer votre propre compte": "Impossibile eliminare il proprio account",
"Inclure le contenu du gestionnaire de fichiers": "Includi il contenuto del gestore del sito",
"Incorrect": "Non corretto",
"Informations": "Informazioni",
"Instagram": "Instagram",
"Installation": "Installazione",
"Installation terminée": "Installazione completata",
"Installer": "Installa",
"Installer depuis le catalogue en ligne": "Installa dal catalogo online",
"Installer depuis une archive": "Installa da archivio",
"Installer les données d'un module": "Installazione di dati da un modulo",
"Installer ou mettre à jour un module téléchargé": "Installare o aggiornare un modulo scaricato",
"Installer un module": "Installare un modulo",
"Installer un thème archivé (site ou administration)": "Installa il tema archiviato (sito o amministrazione)",
"Instructions JS ou jquery spécifiques à la page.": "Istruzioni JS o jquery specifiche della pagina.",
"Interface": "Interfaccia",
"Jeton invalide": "Token non valido",
"Journal réinitialisé avec succès": "Registro resettato con successo",
"Journalisation": "Registrazione",
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "L'archivio è stato scaricato nel file manager. Gli archivi inferiori alla versione 9 non sono accettati.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "Il nome utente viene impostato alla creazione dell'account, non può essere modificato",
"La carte du site a été mise à jour": "La mappa del sito è stata aggiornata",
"La clé de l'API ne peut pas être vide": "La chiave API non può essere vuota",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "La descrizione di una pagina contribuisce alla sua referenziazione; ogni pagina deve avere una descrizione diversa.",
"La page %s est ouverte par l'utilisateur %s": "La pagina %s è stata aperta dall'utente %s",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "La pagina richiesta non esiste o non può essere trovata (errore 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "La pagina viene visualizzata in un menu orizzontale ma non nel menu verticale di una barra laterale.",
"La première page que vos visiteurs verront.": "La prima pagina che i visitatori vedranno",
"La règlementation française impose un anonymat de niveau 2": "La legge francese richiede l'anonimato di livello 2",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "Il backup dei file può richiedere del tempo. Continuare?",
"La suppression a échoué": "Cancellazione fallita",
"La version installée est plus récente": "La versione installata è più recente.",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "La verifica è quotidiana. Disattivato se la configurazione del server non lo consente.",
"Langue de l'administration": "Lingua dell'amministrazione",
"Langue du site sélectionnée": "Lingua del sito selezionata",
"Langue par défaut": "Lingua predefinita",
"Langues": "Lingue",
"Langues disponibles": "Lingue disponibili",
"Langues installées": "Lingue installate",
"Largeur de l'image :": "Larghezza immagine :",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "Il cursore orizzontale regola il livello di trasparenza; posizionarlo all'estrema sinistra per ottenere un'evidenziazione invisibile",
"Le fuseau horaire est utile au bon référencement": "Il fuso orario è utile per una buona SEO.",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "Il menu accessorio è allineato a destra della barra dei menu, è un segnaposto per le bandiere e il pulsante di accesso.",
"Le menu horizontal intégral": "Il menu orizzontale completo",
"Le module %s a été %s": "Il modulo %s è stato %s",
"Le module %s de la page %s a été supprimé": "Il modulo %s a pagina %s è stato cancellato",
"Le module %s est désinstallé, il reste peut-être des données dans %s": "Il modulo %s è stato disinstallato, potrebbero essere rimasti dei dati in %s",
"Le sous-menu de la page parente": "Il sottomenu della pagina madre",
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Passando il mouse su un'icona nella schermata di accesso si visualizza temporaneamente la password",
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "Il titolo breve viene visualizzato nei menu. Può essere identico al titolo della pagina",
"Les langues sélectionnées sont identiques": "Le lingue selezionate sono identiche",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Le comunicazioni legali sono obbligatorie in Francia. Un'opzione a piè di pagina aggiunge un link discreto a questa pagina",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Le modifiche apportate potrebbero non essere salvate",
"Lettres": "Lettere",
"Licence :": "Licenza:",
"Lien page des mentions légales.": "Link alla pagina delle note legali.",
"Liens": "Link",
"Limitation des tentatives": "Limitazione dei tentativi",
"Linkedin": "Linkedin",
"Liste noire": "Liste nera",
"Liste noire réinitialisée avec succès": "Lista nera resettata con successo",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Durante un aggiornamento automatico, conserva il file htaccess principale del sito.",
"Maintenance": "Manutenzione",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Nascondi pagina e pagine figlio in un menu della barra laterale",
"Masquer les pages enfants dans le menu horizontal": "Nascondi le pagine figlio nel menu orizzontale",
"Mentions légales": "Avviso legale",
"Menu": "Menu",
"Menu accessoire": "Menu accessorio",
"Menu standard": "Menu standard",
"Message d'acceptation des Cookies": "Messaggio di accettazione dei cookie",
"Message de consentement aux cookies": "Messaggio di consenso ai cookie",
"Mettre à jour": "Aggiornamento",
"Mettre à jour le module orphelin": "Aggiornamento del modulo orfano",
"Mise en forme des titres": "Formattazione dei titoli",
"Mise en forme du texte": "Formattazione del testo",
"Mise en forme du titre": "Formattazione del titolo",
"Mise en page": "Layout",
"Mise à jour": "Aggiornamento",
"Mise à jour automatisée": "Aggiornamento automatico",
"Mise à jour de ZwiiCMS": "Aggiornare ZwiiCMS",
"Mise à jour terminée avec succès.": "Aggiornamento completato con successo.",
"Modifications enregistrées": "Modifiche salvate",
"Module": "Modulo",
"Module de la page": "Modulo pagina",
"Modules configurés": "Moduli configurati",
"Modules installés": "Moduli installati",
"Modules orphelins": "Moduli orfani",
"Mot de passe": "Password",
"Mot de passe oublié": "Password dimenticata",
"Multilingue": "Multilingua",
"Méta-description": "Meta descrizione",
"Méta-titre": "Meta titolo",
"Ne pas afficher": "Non visualizzare",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Non caricare il sito di esempio (utenti avanzati)",
"Ne pas saisir les balises": "Non inserire i tag",
"Niveau 1 (192.168.12.x)": "Livello 1 (192.168.12.x)",
"Niveau 2 (192.168.x.x)": "Livello 2 (192.168.x.x)",
"Niveau 3 (192.x.x.x)": "Livello 3 (192.x.x.x)",
"Nom": "Cognome",
"Nom utilisateur": "Nome utente",
"Non": "No",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Il nostro sito è attualmente in manutenzione. Ci scusiamo per l'inconveniente e stiamo facendo del nostro meglio per tornare presto",
"Nouveau contenu localisé": "Nuovo contenuto localizzato",
"Nouveau mot de passe": "Nuova password",
"Nouveau mot de passe enregistré": "Nuova password salvata",
"Nouvel utilisateur": "Nuovo utente",
"Nouvelle page créée": "Nuova pagina creata",
"Nouvelle page ou barre latérale": "Nuova pagina o barra laterale",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Opzione attiva solo in modalità offline, le pagine dei bambini sono visibili e accessibili",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Opzione consigliata per proteggere la connessione. Si applica a tutti i captchas del sito. Il captcha semplice si limita all'aggiunta di numeri da 0 a 10. Il captcha complesso utilizza quattro operazioni su numeri da 0 a 20. Attivazione consigliata.",
"Options avancées": "Opzioni avanzate",
"Origine": "Origine",
"Oui": "Sì",
"Page": "Pagina",
"Page 2/3 - barre 1/3": "Pagina 2/3 - barra 1/3",
"Page 3/4 - barre 1/4": "Pagina 3/4 - barra 1/4",
"Page associée": "Pagina correlata",
"Page dupliquée": "Pagina duplicata",
"Page et module dupliqués": "Pagina e modulo duplicati",
"Page inexistante, erreur 404": "La pagina non esiste, errore 404",
"Page non cliquable": "Pagina non cliccabile",
"Page parent": "Pagina madre",
"Page standard": "Pagina standard",
"Page supprimée": "Pagina eliminata",
"Pages dans le menu": "Pagine nel menu",
"Pages du site": "Pagine del sito",
"Pages et les modules de": "Pagine e moduli di",
"Pages orphelines": "Pagine orfane",
"Papier peint": "Sfondo",
"Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.": "Per impostazione predefinita, il menu viene visualizzato DOPO il contenuto della pagina. Per posizionarlo in una posizione specifica, inserire [MENU] nel contenuto della pagina.",
"Paramètres": "Impostazioni",
"Paramètres de la localisation": "Impostazioni di posizione",
"Paramètres de la sauvegarde": "Impostazioni di backup",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Impostazioni da utilizzare quando l'host non offre la funzionalità di invio della posta.",
"Partage de fichiers autorisé": "Condivisione di file consentita",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Considerate di cancellare la cache del browser se la favicon non cambia",
"Permission": "Autorizzazione",
"Permission et référencement": "Permessi e riferimenti",
"Permissions :": "Autorizzazioni:",
"Pied de page": "Piè di pagina",
"Pinterest": "Pinterest",
"Plan du site": "Mappa del sito",
"Police des titres": "Font del titolo",
"Police du texte": "Font di testo",
"Port SMTP": "Porta SMTP",
"Port du proxy": "Porta proxy",
"Position": "Posizione",
"Position du module": "Posizione del modulo",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Per impostare la pagina come barra laterale, scegliere l'opzione dall'elenco.",
"Prénom": "Nome",
"Préparation de la mise à jour": "Preparazione dell'aggiornamento",
"Préserver le fichier htaccess racine": "Conserva il file htaccess principale",
"Préserver les comptes des utilisateurs déjà installés": "Conserva gli account utente già installati",
"Prévenir l'utilisateur par mail": "Notifica all'utente via e-mail",
"Pseudo": "Nickname",
"Ratio :": "Rapporto :",
"Recherche dans le site": "Cerca nel sito",
"Rechercher": "Ricerca",
"Rechercher une mise à jour en ligne": "Cercare un aggiornamento online",
"Redirection vers la connexion": "Reindirizzamento al login",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Compilare i campi sottostanti per completare l'installazione.",
"Restauration effectuée avec succès": "Ripristino completato con successo",
"Restaurer": "Ripristino",
"Restaurer les données du site": "Ripristino dei dati del sito",
"Rester connecté sur ce navigateur": "Rimani connesso su questo browser",
"Retour": "Indietro",
"Rien à importer, erreur de format ou fichier incorrect": "Niente da importare, errore di formato o file non corretto",
"Référencement": "Referenziamento",
"Réinitialisation du mot de passe": "Reimpostare la password",
"Réinitialiser avec le thème par défaut": "Reimpostare il tema predefinito",
"Réinitialiser la feuille de style": "Reimpostare il foglio di stile",
"Réinitialiser la liste": "Reset del elenco",
"Réinitialiser le journal": "Registrazione reset",
"Réinstaller": "Reinstallare",
"Réseau": "Rete",
"Réseaux sociaux": "Reti sociali",
"S'ouvre dans un nouvel onglet": "Si apre in una nuova scheda",
"SMTP": "SMTP",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Inserire la chiave, quindi convalidare il modulo prima di fare clic sul pulsante di generazione",
"Saisissez le Titre de gestion des cookies.": "Inserire il titolo della finestra di gestione dei cookie",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Inserire il messaggio per i cookie depositati da ZwiiCMS, che sono necessari per il funzionamento e non richiedono consenso.",
"Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.": "Inserire il testo del link alla nota legale; la pagina deve essere definita nella configurazione del sito.",
"Saisissez votre ID : https://pinterest.com/[ID].": "Inserire il proprio ID: https://pinterest.com/[ID].",
"Saisissez votre ID : https://twitter.com/[ID].": "Inserire il proprio ID: https://twitter.com/[ID].",
"Saisissez votre ID : https://www.facebook.com/[ID].": "Inserire il proprio ID: https://www.facebook.com/[ID].",
"Saisissez votre ID : https://www.instagram.com/[ID].": "Inserire il proprio ID: https://www.instagram.com/[ID].",
"Saisissez votre ID Github : https://github.com/[ID].": "Inserire il proprio ID Github: https://github.com/[ID].",
"Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].": "Inserire il proprio ID Linkedin: https://fr.linkedin.com/in/[ID].",
"Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].": "Inserire il proprio ID: https://www.youtube.com/user/[ID].",
"Sauvegarde": "Backup",
"Sauvegarde automatique quotidienne du site": "Backup automatico giornaliero del sito",
"Sauvegarde du thème dans le": "Salva tema nel",
"Sauvegarde générée avec succès.": "Backup generato con successo",
"Sauvegarder": "Salva",
"Sauvegarder et télécharger le module": "Salva e scarica il modulo",
"Sauvegarder le module dans le gestionnaire de fichiers": "Salva il modulo nel file manager",
"Sauvegarder les données du module dans le gestionnaire de fichiers": "Salva i dati del modulo nel file manager",
"Sauvegarder les données du site": "Salva i dati del sito",
"Script dans body": "Script nel corpo",
"Script dans head": "Scrittura in testa",
"Scripts externes": "Script esterni",
"Se déconnecter": "Log out",
"Service en ligne inaccessible": "Servizio online inaccessibile",
"Seul un administrateur peut se connecter lors d'une maintenance": "Solo un amministratore può accedere durante la manutenzione",
"Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.": "Se il contenuto del file manager è molto grande, meglio copiare via FTP",
"Signature": "Firma",
"Site": "Sito",
"Site en maintenance": "Sito in mantenimento",
"Suppression interdite": "Cancellazione vietata",
"Suppression interdite, page active dans la configuration du site": "Cancellazione vietata, pagina attiva nella configurazione del sito",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Rimuove il punto interrogativo negli URL; l'opzione non è disponibile con altri server web",
"Supprimer": "Cancella",
"Supprimer la page": "Cancella pagina",
"Supprimer le module": "Elimina modulo",
"Supprimer toutes les sauvegardes automatiques ?": "Cancellare tutti i backup automatici?",
"Sécurité": "Sicurezza",
"Sécurité de la connexion": "Sicurezza della connessione",
"Sécurité désactivée": "Sicurezza disabilitata",
"Sélectionner un fichier": "Selezionare un file",
"Sélectionnez au moins un contenu à afficher": "Selezionare almeno un contenuto da visualizzare",
"Sélectionnez la langue à copier vers une langue cible": "Selezionare la lingua da copiare in una lingua di destinazione",
"Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Selezionare un'icona adatta a un tema scuro.<br>Ricordarsi di cancellare la cache del browser se la favicon non cambia.",
"Sélectionnez une image ou une icône de petite dimension": "Selezionare un'immagine o un'icona piccola",
"Sélectionnez une langue": "Selezionare una lingua",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Selezionare una pagina contenente il modulo 'Ricerca'. Un'opzione a piè di pagina aggiunge un link discreto a questa pagina.",
"Séparateur": "Separatore",
"Taille": "Dimensione",
"Texte": "Testo",
"Thème": "Tema",
"Thème de l'administration": "Tema dell'amministrazione",
"Thème du site": "Tema del sito",
"Thème importé": "Tema importato",
"Thèmes": "Temi",
"Titre": "Titolo",
"Titre court": "Titolo breve",
"Titre masqué dans la page": "Titolo nascosto nella pagina",
"Titres": "Titoli",
"Traduction supprimée": "Traduzione cancellata",
"Twitter": "Twitter",
"Type de captcha": "Tipo di Captcha",
"Type de proxy": "Tipo di proxy",
"Téléchargement et validation de l'archive": "Scaricare e convalidare l'archivio",
"Télécharger": "Scarica",
"Télécharger la liste": "Scarica l'elenco",
"Télécharger le journal": "Scarica la rivista",
"Télécharger le module dans le gestionnaire de fichiers": "Scarica il modulo nel file manager",
"URL incorrecte": "URL non corretto",
"Un mail a été envoyé pour confirmer la réinitialisation": "È stata inviata un'e-mail per confermare il reset",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Un archivio della directory /sito/dati viene conservato per 30 giorni. Attivazione consigliata",
"Une erreur est survenue lors de l'étape :": "Si è verificato un errore nel passaggio:",
"Url du fichier de fonte": "Url del file di font",
"Utilisateur inexistant": "L'utente non esiste",
"Utilisateur supprimé": "Utente cancellato",
"Utilisateurs": "Utenti",
"Valider": "Convalidare",
"Vers": "A",
"Version": "Versione",
"Version n°": "Versione n°",
"Vider dossier sauvegardes auto": "Svuota la cartella di backup automatico",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "Non sei autorizzato a visualizzare questa pagina (errore 403)",
"Youtube": "Youtube",
"actualisé": "aggiornato",
"favicon.ico": "favicon.ico",
"faviconDark.ico": "faviconDark.ico",
"gestionnaire de fichiers": "File manager",
"installé": "installato",
"largeur de site :": "larghezza del sito:",
"largeur du site": "Larghezza del sito",
"sauvegardé avec succès": "backup riuscito",
"vers": "A",
"vers ZwiiCMS": "a ZwiiCMS",
"À l'emplacement du mot clé [MODULE] dans la page": "Nella posizione della parola chiave [MODULO] nella pagina",
"Échecs": "Fallito",
"Éditer": "Modifica",
"Éditer la page": "Modifica pagina",
"Éditer les dialogues": "Modifica finestre",
"Éditeur CSS": "Editor CSS",
"Éditeur JS": "Editor JS",
"Éditeur de script %s": "Script Editor %s",
"Éditeur de script dans Body": "Editor di script in Body",
"Éditeur de script dans Head": "Editor di script in Head.",
"Étiquettes des pages spéciales": "Etichette di pagina speciali"
}

View File

@ -0,0 +1,28 @@
{
"languages": {
"fr_FR": {
"version": "4",
"date": 1675459590
},
"es": {
"version": "4",
"date": 1675459590
},
"it": {
"version": "4",
"date": 1675459590
},
"pt_PT": {
"version": "4",
"date": 1675459590
},
"en_EN": {
"version": "4",
"date": 1675459590
},
"gr_GR": {
"version": "4",
"date": 1675459590
}
}
}

View File

@ -0,0 +1,498 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'Não mostrar' cria uma página órfã que não pode ser acessada pelos menus.",
"'Sauvegarder et télécharger les données du module": "Salvar e baixar dados do módulo",
"1/4 : Préparation...": "1/4: Preparando...",
"10 minutes": "10 minutos",
"10 tentatives": "10 tentativas",
"15 minutes": "15 minutos",
"2/4 : Téléchargement...": "2/4: Baixando...",
"3 tentatives": "3 tentativas",
"3/4 : Installation...": "3/4: Instalando...",
"4/4 : Configuration...": "4/4: Contexto...",
"5 minutes": "5 minutos",
"5 tentatives": "5 tentativas",
"Accueil": "Começar",
"Accès aux pages privées": "Acesso a páginas privadas",
"Accès bloqué %d minutes": "Minutos de acesso bloqueado",
"Accès interdit, erreur 403": "Acesso negado, erro 403",
"Action interdite": "ação não permitida",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Ativação obrigatória de acordo com as leis francesas, a menos que você use seu próprio sistema de consentimento.",
"Activer": "Permitir",
"Activer SMTP": "Ativar SMTP",
"Activer la journalisation": "Ativar registro",
"Actualiser": "Actualizar",
"Administration": "Gestão",
"Administration complète du site": "Administração completa do site",
"Adresse SMTP": "Endereço SMTP",
"Adresse du proxy": "Endereço proxy",
"Adresse électronique": "Endereço de email",
"Affectation": "Atribuição",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Mostre o nome da página principal seguido do nome da página, o título não deve ficar oculto.",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Para garantir o funcionamento adequado do Zwii, não feche esta página antes que a operação seja concluída",
"Aide": "Ajuda",
"Ajout - Édition - Suppression de fichiers": "Adicionar/editar/excluir arquivos",
"Ajout - Édition - Suppression de pages": "Adicionando - Editando - Excluindo páginas",
"Ajouter un utilisateur": "Adicionar usuário",
"Ajouter une fonte": "Adicionar uma fonte",
"Ancien mot de passe": "Senha Antiga",
"Anonymat des adresses IP": "Anonimato dos endereços IP",
"Apache URL intelligent": "URL inteligente do Apache",
"Apache URL intelligentes": "URLs inteligentes do Apache",
"Apparence": "Apariencia",
"Appliquer": "Aplicar",
"Après": "Depois",
"Après le contenu de la page": "Depois do conteúdo da página",
"Archive": "Arquivo",
"Archive ZIP": "Arquivo ZIP",
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "Arquivo copiado para a pasta do Módulos Gerenciador de arquivos",
"Archive de thème invalide": "Arquivo de tema inválido",
"Archive invalide": "arquivo inválido",
"Archive invalide, l'écriture dans le dossier core est interdite": "Arquivo inválido, é proibido gravar na pasta principal",
"Archive invalide, le descripteur est absent": "Arquivo inválido, descritor ausente",
"Archive invalide, le fichier de classe est absent": "Arquivo inválido, arquivo de classe está faltando",
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Arquivo inválido, as pastas não correspondem ao descritor",
"Archive non spécifiée ou introuvable": "Arquivo não especificado ou não encontrado",
"Archive à restaurer": "Arquivo para restaurar",
"Arrière plan": "Fundo",
"Arrière plan des blocs": "Fundo de blocos",
"Arrière plan des champs": "Plano de fundo do campo",
"Au début": "No princípio",
"Aucun fichier journal à télécharger": "Nenhum arquivo de log para download",
"Aucun journal à effacer": "Não há registros para excluir",
"Aucun menu": "Sem menu",
"Aucune liste noire à effacer": "Não há lista negra para excluir",
"Aucune liste noire à télécharger": "Nenhuma lista negra para baixar",
"Auteur :": "Autor",
"Authentification": "Autenticação",
"Autoriser les robots à référencer le site": "Permitir que robôs façam referência ao site",
"Avant le contenu de la page": "Antes do conteúdo da página",
"Bannière": "Bandeira",
"Barre 1/3 - page 2/3": "Barra 1/3 - página 2/3",
"Barre 1/4 - page 1/2 - barre 1/4": "Barra 1/4 - página 1/2 - barra 1/4",
"Barre 1/4 - page 3/4": "Barra 1/4 - página 3/4",
"Barre 2/12 - page 7/12 - barre 3/12": "Barra 2/12 - página 7/12 - barra 3/12",
"Barre 3/12 - page 7/12 - barre 2/12": "Barra 3/12 - página 7/12 - barra 2/12",
"Barre latérale": "Barra lateral",
"Barre latérale droite :": "Barra lateral direita:",
"Barre latérale gauche :": "barra lateral esquerda:",
"Barres latérales": "Barras laterais",
"Bienvenue %s %s": "Bem-vindo %s %s",
"Blocage après échecs": "Bloqueio após falhas",
"Bordure des blocs": "Borda dos blocos",
"Bordure des champs": "Borda do campo",
"Bouton Aide": "Botão de ajuda",
"Bouton Standard": "botão padrão",
"Bouton de validation": "Botão de validação",
"Bouton effacement": "Botão Excluir",
"Bouton retour": "botão voltar",
"Bouton standard": "botão padrão",
"Bouton validation": "Botão de validação",
"Boutons": "Botões",
"Captcha complexe": "Captcha Complexo",
"Captcha à la connexion": "Captcha no login",
"Captcha, identifiant ou mot de passe incorrects": "Captcha, nome de usuário ou senha incorretos",
"Capture d'écran Open Graph": "Captura de tela do Open Graph",
"Capture d'écran générée avec succès": "Captura de tela gerada com sucesso",
"Catalogue": "Catálogo",
"Catégorie": "Categoria",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "Este membro poderá fazer upload ou download de arquivos na pasta 'compartilhar' e suas subpastas",
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "Esta página não deve aparecer na árvore do menu. Crie uma página órfã..",
"Cette redirection ne concerne que les pages d'administration du site.": "Este redirecionamento diz respeito apenas às páginas de administração do site.",
"Chaîne Youtube": "canal do Youtube",
"Chiffres": "Cifras",
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "Chave de API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>",
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "Chave de API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
"Complète": "Completo",
"Compte administrateur": "Conta de administrador",
"Compte verrouillé": "Conta bloqueada",
"Configuration": "Configuração",
"Configuration du module": "Configuração do módulo",
"Configurer mon compte": "Configurar a minha conta",
"Confirmation": "Confirmação",
"Confirmer la suppression de cet utilisateur": "Confirme a exclusão deste usuário",
"Confirmer la dissociation du module de cette page": "Confirme o módulo de desvinculação desta página",
"Confirmer la désinstallation du module": "Confirme a desinstalação do módulo",
"Confirmer la suppression de la page": "Confirmar exclusão de página",
"Confirmer la suppression des données du module": "Confirme a exclusão de dados do módulo",
"Confirmez-vous la suppression de cette page ?": "Confirma a eliminação desta página?",
"Connexion": "Conecte-se",
"Consulter l'aide en ligne": "Consulte a ajuda online",
"Contenu": "Conteúdo",
"Contenu avancé": "Conteúdo avançado",
"Contenu du menu vertical": "Conteúdo do menu vertical",
"Contenu personnalisé": "Conteúdo personalizado",
"Cookies": "Cookies",
"Cookies Zwii": "Cookies Zwii",
"Copie de contenus localisés": "Cópia do conteúdo localizado",
"Copie de sites inter-langues": "Copiando sites em vários idiomas",
"Copie des traductions rédigées": "Cópia de traduções editadas",
"Copie terminée avec des erreurs": "Cópia concluída com erros",
"Copie terminée avec succès": "Cópia concluída com sucesso",
"Copier sauvegardes auto": "Copiar salvamentos automáticos",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Cor visível na ausência de uma imagem.<br />O controle deslizante horizontal ajusta o nível de transparência.",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Cor visível na ausência de uma imagem.<br />O controle deslizante horizontal ajusta o nível de transparência. A cor do texto é automática.",
"Couleurs": "Cores",
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Crie uma conta gratuita, copie a chave e valide o formulário antes de clicar no botão gerar",
"Dans quelle langue utiliserez-vous Zwii ?": "Qual idioma o Zwii usará?",
"Date": "Data",
"De": "Do",
"Description": "Descrição do Site",
"Disposition": "Arranjo",
"Données %s copiées vers %s": "Dados %s copiados para %s",
"Données des modules": "Dados do módulo",
"Données importées": "Dados importados",
"Du": "Del",
"Dupliquer la page": "duplicar a página",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Desconecta sessões previamente abertas em outros navegadores ou terminais. Ativação recomendada.",
"Déconnecter": "Desconectar",
"Déconnexion !": "Fechar Sessão!",
"Déconnexion automatique": "Logout automático",
"Dévoiler le mot de passe": "Revele a senha",
"Echec de l'écriture, vérifiez les permissions": "Falha na gravação, verifique as permissões",
"Effacer la page": "limpar página",
"Emplacement :": "Localização",
"Emplacement dans le menu": "Localização no menu",
"En cas de changement de module, les données du module précédent seront supprimées.": "Ao alterar o módulo, os dados do módulo anterior serão apagados.",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "Na posição livre adicione o módulo colocando [MODULE] no local desejado em sua página.",
"Enregistrer": "Registrar",
"Envoyer un message de confirmation": "Envie uma mensagem de confirmação",
"Erreur : sauvegarde non générée !": "Erro: backup não gerado!",
"Erreur d'URL": "Erro de URL",
"Erreur d'extraction, vérifiez les permissions": "Extrair erro, verificar permissões",
"Erreur de copie": "Erro de cópia",
"Erreur de copie, vérifiez les permissions": "Erro de cópia, verifique as permissões",
"Erreur de lecture, vérifiez les permissions": "Erro de leitura, verifique as permissões",
"Erreur inconnue": "Erro desconhecido",
"Erreur inconnue, le module n'est pas installé": "Erro desconhecido, o módulo não está instalado",
"Extension": "Extensão",
"Facebook": "Facebook",
"Famille": "família",
"Favicon thème sombre": "favicon tema escuro",
"Feuille de style spécifique à la page.": "Hoja de estilo específica de la página.",
"Fichiers effacés": "arquivos excluídos",
"Fil d'Ariane dans le titre": "Farinha de rosca no título",
"Fond du sous-menu": "Plano de fundo do submenu",
"FontId": "ID da fonte",
"Fonte actualisée": "Fonte atualizada",
"Fonte créée": "Fonte criada",
"Fonte en ligne": "Elenco on-line",
"Fonte installée": "Tipografía instalada",
"Fonte non créée, ressource absente !": "Fonte não criada, por falta de recursos!",
"Fonte supprimée": "fonte removida",
"Fontes": "Fontes",
"Format incorrect": "Formato incorreto",
"Fuseau horaire": "Fuso horário",
"Gabarits de page - Barre latérale": "Mestre da página - Barra lateral",
"Gestion": "Gerenciar",
"Gestion des modules": "Gerenciamento de módulo",
"Gestion des thèmes": "Gerenciamento de tópicos",
"Github": "Github",
"Groupe": "Banda",
"Groupe requis pour accéder à la page :": "Grupo necessário para acessar a página:",
"Générer sitemap.xml et robots.txt": "Gerar sitemap.xml e robots.txt",
"Générer une capture Open Graph": "Gerar uma captura do Open Graph",
"Gérer les fichiers": "Gestão de ficheiros",
"Gérer les modules": "Gerenciar módulos",
"Hauteur de l'image :": "Altura da imagem",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "ID do canal: https://www.youtube.com/channel/[ID].",
"Icône": "Ícone",
"Icône avec bulle de texte": "Ícone com bolha de texto",
"Identifiant": "Identificador",
"Identifiant (sans espace ni majuscule)": "Identificador (sem espaços ou maiúsculas)",
"Identité": "Identificação",
"Identité de la fonte": "Identidade tipográfica",
"Identité du site": "Identidade do site",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Ele aparece na barra de título e nos compartilhamentos de mídia social.",
"Image": "Imagen",
"Importation d'utilisateurs": "Importação de usuários",
"Importation de fichier plat CSV": "Importar arquivo CSV simples",
"Importation effectuée": "Importação concluída",
"Importer": "Importar",
"Importer dans": "Importar para",
"Importer des utilisateurs en masse": "Importar usuários em massa",
"Impossible d'ouvrir l'archive": "Não é possível abrir o arquivo",
"Impossible de modifier votre propre groupe.": "Não foi possível editar seu próprio grupo.",
"Impossible de supprimer une page contenant des pages enfants": "Não é possível excluir uma página que contém páginas filhas",
"Impossible de supprimer votre propre compte": "Você não pode excluir sua própria conta",
"Inclure le contenu du gestionnaire de fichiers": "Captura de tela gerada com sucesso",
"Incorrect": "Incorreta",
"Informations": "Informação",
"Instagram": "Instagram",
"Installation": "Instalação",
"Installation terminée": "instalação completa",
"Installer": "Instalar",
"Installer depuis le catalogue en ligne": "Instalar a partir do catálogo online",
"Installer depuis une archive": "Instalar do arquivo",
"Installer les données d'un module": "Instalar dados de um módulo",
"Installer ou mettre à jour un module téléchargé": "Instalar ou atualizar um módulo baixado",
"Installer un module": "Instalar um módulo",
"Installer un thème archivé (site ou administration)": "Instale um tema arquivado (site ou administrador)",
"Instructions JS ou jquery spécifiques à la page.": "Instrucciones JS o jquery específicas de la página.",
"Interface": "Interface",
"Jeton invalide": "Símbolo inválido",
"Journal réinitialisé avec succès": "Registro redefinido com sucesso",
"Journalisation": "Conecte-se",
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "O arquivo foi depositado no gerenciador de arquivos. Arquivos anteriores à versão 9 não são aceitos.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "O identificador é definido ao criar a conta, não pode ser modificado.",
"La carte du site a été mise à jour": "O mapa do site foi atualizado.",
"La clé de l'API ne peut pas être vide": "A chave de API não pode estar vazia",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "A descrição de uma página participa de sua referenciação, cada página deve ter uma descrição diferente.",
"La page %s est ouverte par l'utilisateur %s": "A página %s é aberta pelo utilizador %s",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "A página solicitada não existe ou não pode ser encontrada (erro 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "A página é exibida em um menu horizontal, mas não no menu vertical de uma barra lateral.",
"La première page que vos visiteurs verront.": "A primeira página que seus visitantes verão.",
"La règlementation française impose un anonymat de niveau 2": "Regulamentos franceses impõem anonimato de nível 2",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "O backup de arquivos pode demorar um pouco. Você deseja continuar?",
"La suppression a échoué": "exclusão malsucedida",
"La version installée est plus récente": "A versão instalada é mais recente.",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "A verificação é diária. Opção desabilitada se a configuração do servidor não permitir.",
"Langue de l'administration": "Idioma de administração",
"Langue du site sélectionnée": "Idioma do site selecionado",
"Langue par défaut": "Idioma padrão",
"Langues": "Línguas",
"Langues disponibles": "Idiomas disponíveis",
"Langues installées": "Idiomas instalados",
"Largeur de l'image :": "Largura da imagem",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "O controle deslizante horizontal define o nível de transparência, defina-o totalmente para a esquerda para um destaque invisível.",
"Le fuseau horaire est utile au bon référencement": "O fuso horário é útil para uma boa referência",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "O menu de acessórios está alinhado à direita da barra de menus, é um espaço reservado para sinalizadores e o botão de login.",
"Le menu horizontal intégral": "O menu horizontal completo",
"Le module %s a été %s": "O módulo %s foi %s",
"Le module %s de la page %s a été supprimé": "Módulo %s de página %s removido",
"Le module %s est désinstallé, il reste peut-être des données dans %s": "O módulo %s é desinstalado, os dados podem permanecer %s",
"Le sous-menu de la page parente": "O submenu da página pai",
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Passar o mouse sobre um ícone da tela de login exibe temporariamente a senha.",
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "O título curto é exibido nos menus. Pode ser o mesmo que o título da página.",
"Les langues sélectionnées sont identiques": "Os idiomas selecionados são idênticos",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Avisos legais são obrigatórios na França. Uma opção de rodapé adiciona um link discreto a esta página.",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "As alterações feitas podem não ser salvas.",
"Lettres": "Letras",
"Licence :": "Licença",
"Lien page des mentions légales.": "Link da página de aviso legal.",
"Liens": "Links",
"Limitation des tentatives": "Limitação de tentativa",
"Linkedin": "Linkedin",
"Liste noire": "Lista negra",
"Liste noire réinitialisée avec succès": "Lista negra redefinida com sucesso",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Durante uma atualização automática, mantém o arquivo htaccess da raiz do site.",
"Maintenance": "Manutenção",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Seleccione una imagen o icono pequeño",
"Masquer les pages enfants dans le menu horizontal": "Selecione uma pequena imagem ou ícone",
"Mentions légales": "Notícia legal",
"Menu": "Menu",
"Menu accessoire": "Menu de acessórios",
"Menu standard": "Menu normal",
"Message d'acceptation des Cookies": "Mensagem de aceitação de cookies",
"Message de consentement aux cookies": "Mensagem de consentimento de cookies",
"Mettre à jour": "Actualizar",
"Mettre à jour le module orphelin": "Atualizar módulo órfão",
"Mise en forme des titres": "Formato do título",
"Mise en forme du texte": "Formato de texto",
"Mise en forme du titre": "Formato do título",
"Mise en page": "Esquema",
"Mise à jour": "Atualizar",
"Mise à jour automatisée": "atualização automática",
"Mise à jour de ZwiiCMS": "Atualização do ZwiiCMS",
"Mise à jour terminée avec succès.": "Atualização concluída com sucesso.",
"Modifications enregistrées": "Alterações salvas",
"Module": "Módulo",
"Module de la page": "Módulo de página",
"Modules configurés": "Módulos Configurados",
"Modules installés": "Módulos instalados",
"Modules orphelins": "Módulos órfãos",
"Mot de passe": "Senha",
"Mot de passe oublié": "Senha esquecida",
"Multilingue": "Multilíngue",
"Méta-description": "Meta Descrição",
"Méta-titre": "Meta-título",
"Ne pas afficher": "Não exibido",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Não carregue o site de amostra (usuários avançados)",
"Ne pas saisir les balises": "Não insira tags",
"Niveau 1 (192.168.12.x)": "Nivel 1 (192.168.12.x)",
"Niveau 2 (192.168.x.x)": "Nivel 2 (192.168.x.x)",
"Niveau 3 (192.x.x.x)": "Nivel 3 (192.x.x.x)",
"Nom": "Nome",
"Nom utilisateur": "Nome de usuário",
"Non": "Não",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Nosso site está atualmente em manutenção. Lamentamos o transtorno e estamos fazendo o possível para retornar o mais breve possível.",
"Nouveau contenu localisé": "Novo conteúdo localizado",
"Nouveau mot de passe": "Nova Senha",
"Nouveau mot de passe enregistré": "Nova senha salva",
"Nouvel utilisateur": "Novo usuário",
"Nouvelle page créée": "Nova página criada",
"Nouvelle page ou barre latérale": "Nova página ou barra lateral",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Opção ativa apenas no modo offline, as páginas filhas ficam visíveis e acessíveis.",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Opção recomendada para proteger a conexão. Aplica-se a todos os captchas do site. O captcha simples está limitado à adição de números de 0 a 10. O captcha complexo utiliza quatro operações de números de 0 a 20. Ativação recomendada.",
"Options avancées": "Opções avançadas",
"Origine": "Fonte",
"Oui": "Sim",
"Page": "Página",
"Page 2/3 - barre 1/3": "Página 2/3 - barra 1/3",
"Page 3/4 - barre 1/4": "Página 3/4 - barra 1/4",
"Page associée": "página relacionada",
"Page dupliquée": "Página duplicada",
"Page et module dupliqués": "Página y módulo duplicados",
"Page inexistante, erreur 404": "A página não existe, erro 404",
"Page non cliquable": "A página não é clicável",
"Page parent": "Página principal",
"Page standard": "Página normal",
"Page supprimée": "página excluída",
"Pages dans le menu": "Páginas no menu",
"Pages du site": "Páginas do site",
"Pages et les modules de": "Páginas e módulos",
"Pages orphelines": "Páginas órfãs",
"Papier peint": "Cor de fundo",
"Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.": "Por padrão, o menu é exibido APÓS o conteúdo da página. Para colocá-lo em um local específico, insira [MENU] no conteúdo da página.",
"Paramètres": "Definições",
"Paramètres de la localisation": "Configurações de localização",
"Paramètres de la sauvegarde": "Configurações de backup",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Parâmetros a serem usados quando seu host não oferece a funcionalidade de envio de e-mail.",
"Partage de fichiers autorisé": "Compartilhamento de arquivos permitido",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Lembre-se de excluir o cache do seu navegador se o favicon não mudar.",
"Permission": "Permissão",
"Permission et référencement": "Permissão e referência",
"Permissions :": "Permissões",
"Pied de page": "Rodapé",
"Pinterest": "Pinterest",
"Plan du site": "Mapa do site",
"Police des titres": "tipografia do título",
"Police du texte": "Fonte de texto",
"Port SMTP": "Porta SMTP",
"Port du proxy": "Porta proxy",
"Position": "Posição",
"Position du module": "Posição do módulo",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Para definir a página como barra lateral, escolha a opção na lista.",
"Prénom": "Primeiro nome",
"Préparation de la mise à jour": "Preparaação para a atualização",
"Préserver le fichier htaccess racine": "Preservar o arquivo htaccess raiz",
"Préserver les comptes des utilisateurs déjà installés": "Preservar contas de usuário já instaladas",
"Prévenir l'utilisateur par mail": "Notifique o usuário por e-mail",
"Pseudo": "Pseudo",
"Ratio :": "Relação",
"Recherche dans le site": "Pesquisa de sites",
"Rechercher": "Buscar",
"Rechercher une mise à jour en ligne": "verifique se há uma atualização on-line",
"Redirection vers la connexion": "Redirecionar para login",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Complete as zonas abaixo para concluir a instalação.",
"Restauration effectuée avec succès": "Restauração concluída com sucesso",
"Restaurer": "Restaurar",
"Restaurer les données du site": "Restaurar dados do site",
"Rester connecté sur ce navigateur": "Permaneça conectado neste navegador",
"Retour": "De volta",
"Rien à importer, erreur de format ou fichier incorrect": "Nada para importar, erro de formatação ou arquivo incorreto",
"Référencement": "referenciando",
"Réinitialisation du mot de passe": "Redefinir a senha do usuário",
"Réinitialiser avec le thème par défaut": "Redefinir para o tema padrão",
"Réinitialiser la feuille de style": "redefinir folha de estilo",
"Réinitialiser la liste": "Redefinir lista",
"Réinitialiser le journal": "Restablecer registro",
"Réinstaller": "Reinstalar",
"Réseau": "La red",
"Réseaux sociaux": "Redes sociais",
"S'ouvre dans un nouvel onglet": "Abre em uma nova guia",
"SMTP": "SMTP",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Digite a chave e valide o formulário antes de clicar no botão gerar",
"Saisissez le Titre de gestion des cookies.": "Digite o título da janela de gerenciamento de cookies.",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Insira a mensagem para cookies depositados pelo ZwiiCMS, necessários para o funcionamento e que não requerem consentimento.",
"Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.": "Digite o texto do link para os avisos legais, a página deve ser definida na configuração do site.",
"Saisissez votre ID : https://pinterest.com/[ID].": "Digite seu ID: https://pinterest.com/[ID].",
"Saisissez votre ID : https://twitter.com/[ID].": "Digite seu ID: https://twitter.com/[ID].",
"Saisissez votre ID : https://www.facebook.com/[ID].": "Digite seu ID: https://www.facebook.com/[ID].",
"Saisissez votre ID : https://www.instagram.com/[ID].": "Digite seu ID: https://www.instagram.com/[ID].",
"Saisissez votre ID Github : https://github.com/[ID].": "Digite seu ID do Github: https://github.com/[ID].",
"Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].": "Digite seu ID do Linkedin: https://fr.linkedin.com/in/[ID].",
"Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].": "Digite seu ID de usuário: https://www.youtube.com/user/[ID].",
"Sauvegarde": "Salvaguarda",
"Sauvegarde automatique quotidienne du site": "Backup diário automático do site",
"Sauvegarde du thème dans le": "Salvando tema para",
"Sauvegarde générée avec succès.": "Backup gerado com sucesso",
"Sauvegarder": "Para salvaguardar",
"Sauvegarder et télécharger le module": "Salve e baixe o módulo",
"Sauvegarder le module dans le gestionnaire de fichiers": "Salvar módulo no gerenciador de arquivos",
"Sauvegarder les données du module dans le gestionnaire de fichiers": "Salve os dados do módulo no gerenciador de arquivos",
"Sauvegarder les données du site": "Salvar dados do site",
"Script dans body": "Script en el body",
"Script dans head": "Script en el head",
"Scripts externes": "Scripts externos",
"Se déconnecter": "Sair",
"Service en ligne inaccessible": "Serviço online inacessível",
"Seul un administrateur peut se connecter lors d'une maintenance": "Somente um administrador pode fazer login durante uma manutenção",
"Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.": "Se o conteúdo do gerenciador de arquivos for muito grande, é melhor copiar por FTP.",
"Signature": "Assinatura",
"Site": "Sitio",
"Site en maintenance": "Site em manutenção",
"Suppression interdite": "exclusão proibida",
"Suppression interdite, page active dans la configuration du site": "Exclusão proibida, página ativa nas configurações do site",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Eliminar el signo de interrogación en las URL, la opción no está disponible con otros servidores web",
"Supprimer": "Deletar",
"Supprimer la page": "Excluir página",
"Supprimer le module": "Excluir módulo",
"Supprimer toutes les sauvegardes automatiques ?": "Remover todos os salvamentos automáticos?",
"Sécurité": "Segurança",
"Sécurité de la connexion": "segurança de conexão",
"Sécurité désactivée": "Segurança desativada",
"Sélectionner un fichier": "Seleccione um ficheiro",
"Sélectionnez au moins un contenu à afficher": "Selecione pelo menos um conteúdo para exibir",
"Sélectionnez la langue à copier vers une langue cible": "Selecione o idioma para copiar para outro idioma",
"Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Selecione um ícone adequado para um tema escuro.<br>Lembre-se de excluir o cache do seu navegador se o favicon não mudar.",
"Sélectionnez une image ou une icône de petite dimension": "Selecione uma pequena imagem ou ícone",
"Sélectionnez une langue": "Selecione um idioma",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Selecione uma página contendo o módulo 'Pesquisar'. Uma opção de rodapé adiciona um link discreto a esta página.",
"Séparateur": "Separador",
"Taille": "Tamanho",
"Texte": "Texto",
"Thème": "Tema",
"Thème de l'administration": "Tema administrativo",
"Thème du site": "Tema do site",
"Thème importé": "Tema importado",
"Thèmes": "Temas",
"Titre": "Título",
"Titre court": "Título curto",
"Titre masqué dans la page": "Título mascarado na página",
"Titres": "Títulos",
"Traduction supprimée": "Tradução removida",
"Twitter": "Twitter",
"Type de captcha": "Tipo de captcha",
"Type de proxy": "Tipo de proxy",
"Téléchargement et validation de l'archive": "Download e validação de arquivos",
"Télécharger": "Baixar",
"Télécharger la liste": "Descarregar a lista",
"Télécharger le journal": "Descarregar a revista",
"Télécharger le module dans le gestionnaire de fichiers": "Carregar módulo para o gerenciador de arquivos",
"URL incorrecte": "URL errada",
"Un mail a été envoyé pour confirmer la réinitialisation": "Um e-mail foi enviado para confirmar a redefinição.",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Um arquivo da pasta /site/data é mantido por 30 dias. Ativação recomendada",
"Une erreur est survenue lors de l'étape :": "Ocorreu um erro durante o processo",
"Url du fichier de fonte": "URL do arquivo de fonte",
"Utilisateur inexistant": "Usuário inexistente",
"Utilisateur supprimé": "Usuário excluído",
"Utilisateurs": "Usuários",
"Valider": "Validar",
"Vers": "Para",
"Version": "Versão",
"Version n°": "Número da versão",
"Vider dossier sauvegardes auto": "Pasta de salvamento automático vazia",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "Não está autorizado a ver esta página (erro 403)",
"Youtube": "YouTube",
"actualisé": "Atualizada",
"favicon.ico": "favicon.ico",
"faviconDark.ico": "faviconDark.ico",
"gestionnaire de fichiers": "Gerenciador de arquivos",
"installé": "Instalado",
"largeur de site :": "Largura do site",
"largeur du site": "Largura do site",
"sauvegardé avec succès": "Salvo com sucesso",
"vers": "Para",
"vers ZwiiCMS": "Rumo ao ZwiiCMS",
"À l'emplacement du mot clé [MODULE] dans la page": "No local da palavra-chave [MODULE] na página",
"Échecs": "Falhas",
"Éditer": "Editar",
"Éditer la page": "Editar página",
"Éditer les dialogues": "Editar caixas de diálogo",
"Éditeur CSS": "Editor de CSS",
"Éditeur JS": "Editor de JS",
"Éditeur de script %s": "Editor de script %s",
"Éditeur de script dans Body": "Éditor do script no Body",
"Éditeur de script dans Head": "Éditor do script no Head",
"Étiquettes des pages spéciales": "Tags de página especiais"
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,22 @@
{
"defaut" : {
"name": "Le thème par défaut, ambiance bleu et montagne",
"filename": ""
},
"moderne": {
"name": "Thème avec la nouvelle bannière personnalisable",
"filename": "theme_moderne.zip"
},
"affaire": {
"name": "Thème affaire, bannière centre d'appel, ambiance prune",
"filename": "theme_affaire.zip"
},
"black": {
"name": "Thème de nuit, ambiance nocturne",
"filename": "theme_orange_black.zip"
},
"facebook": {
"name": "Thème Facebook ancienne génération, pas de bannière, menu fixe fond bleu",
"filename": "theme_old_facebook.zip"
}
}

View File

@ -1,18 +0,0 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -1,22 +1 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.title {
font-weight: bold;
}
/* Vide */

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -2,77 +2,71 @@
<?php echo helper::translate('Renseignez les champs ci-dessous pour finaliser l\'installation.'); ?>
</p>
<?php echo template::formOpen('installForm'); ?>
<div class="row">
<div class="col12">
<details open>
<summary>
<span class="title">
<?php echo helper::translate('Compte administrateur'); ?>
</span>
</summary>
<div class="row">
<div class="col6">
<?php echo template::text('installFirstname', [
'autocomplete' => 'off',
'label' => 'Prénom'
]); ?>
</div>
<div class="col6">
<?php echo template::text('installLastname', [
'autocomplete' => 'off',
'label' => 'Nom'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('installId', [
'autocomplete' => 'off',
'label' => 'Identifiant'
]); ?>
</div>
<div class="col6">
<?php echo template::mail('installMail', [
'autocomplete' => 'off',
'label' => 'Adresse électronique'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::password('installPassword', [
'autocomplete' => 'off',
'label' => 'Mot de passe'
]); ?>
</div>
<div class="col6">
<?php echo template::password('installConfirmPassword', [
'autocomplete' => 'off',
'label' => 'Confirmation'
]); ?>
</div>
</div>
</details>
<h3>
<?php echo helper::translate('Compte administrateur'); ?>
</h3>
<div>
<div class="row">
<div class="col12">
<?php echo template::text('installId', [
'autocomplete' => 'off',
'label' => 'Identifiant'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::password('installPassword', [
'autocomplete' => 'off',
'label' => 'Mot de passe'
]); ?>
</div>
<div class="col6">
<?php echo template::password('installConfirmPassword', [
'autocomplete' => 'off',
'label' => 'Confirmation'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::mail('installMail', [
'autocomplete' => 'off',
'label' => 'Adresse électronique'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('installFirstname', [
'autocomplete' => 'off',
'label' => 'Prénom'
]); ?>
</div>
<div class="col6">
<?php echo template::text('installLastname', [
'autocomplete' => 'off',
'label' => 'Nom'
]); ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<details close>
<summary>
<span class="title">
<?php echo helper::translate('Options avancées'); ?>
</span>
</summary>
<?php if ($_SESSION['ZWII_UI'] === 'fr_FR'): ?>
<div class="row">
<div class="col12">
<?php echo template::checkbox('installDefaultData', true, 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
'checked' => false
]);
?>
</div>
<ul class="accordion" data-speed="150">
<li class="accordion-item">
<h3 class="accordion-title">
<?php echo '&#9655; ' . helper::translate('Options avancées'); ?>
</h3>
<div class="accordion-content">
<?php if ($this->getUrl(2) === 'fr_FR'): ?>
<div class="row">
<div class="col12">
<?php echo template::checkbox('installDefaultData', true, 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
'checked' => false
]);
?>
</div>
<?php endif; ?>
</div>
<?php endif;?>
<div class="row">
<div class="col3">
<?php echo template::select('installProxyType', $module::$proxyType, [
@ -94,14 +88,18 @@
</div>
<div class="row">
<div class="col12">
<?php echo template::select('installTheme', $module::$themes, [
'label' => 'Thème'
]); ?>
<?php echo template::hidden('installLanguage', [
'value' => $this->getUrl(2)
]); ?>
</div>
</div>
</div>
</div>
</details>
</div>
</li>
</ul>
<div class="row">
<div class="col2">
<?php echo template::button('installPrevious', [

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -1,10 +1,6 @@
function step(i, data) {
var errors = ["<?php echo helper::translate('Préparation de la mise à jour'); ?>", "<?php echo helper::translate('Téléchargement et validation de l\'archive'); ?>", "<?php echo helper::translate('Installation'); ?>", "<?php echo helper::translate('Configuration'); ?>"];
$(".installUpdateProgressText").hide(), $(".installUpdateProgressText[data-id=" + i + "]").show();
$("body").css("cursor", "wait");
$.ajax({
$(".installUpdateProgressText").hide(), $(".installUpdateProgressText[data-id=" + i + "]").show(), $.ajax({
type: "POST",
url: "<?php echo helper::baseUrl(false); ?>?install/steps",
data: {
@ -13,61 +9,12 @@ function step(i, data) {
},
success: function (result) {
setTimeout((function () {
if (4 === i) {
$("#installUpdateSuccess").show();
$("body").css("cursor", "default");
$("#installUpdateEnd").removeClass("disabled");
$("#installUpdateProgress").hide();
} else {
step(i + 1, result.data);
}
!0 === result.success ? 4 === i ? ($("#installUpdateSuccess").show(), $("#installUpdateEnd").removeClass("disabled"), $("#installUpdateProgress").hide()) : step(i + 1, result.data) : ($("#installUpdateErrorStep").text(errors[i]), $("#installUpdateError").show(), $("#installUpdateEnd").removeClass("disabled"), $("#installUpdateProgress").hide(), console.error(result), $("#installUpdateErrorMessage").text(result.replace(/<[^p].*?>/g, "")))
}), 2e3)
},
error: function (xhr) {
// Balance tout dans la console
console.log(i);
console.log(xhr.responseText);
console.log(errors);
// Appel de la fonction de gestion d'erreur
showError(i, xhr.responseText, errors);
$("#installUpdateErrorStep").text(errors[1]), $("#installUpdateError").show(), $("#installUpdateEnd").removeClass("disabled"), $("#installUpdateProgress").hide(), console.error(xhr.responseText), $("#installUpdateErrorMessage").text(xhr.responseText.replace(/<[^p].*?>/g, ""))
}
});
})
}
function showError(step, message, errors) {
$("body").css("cursor", "default");
$("#installUpdateErrorStep").text(errors[step] + " (étape n°" + step + ")");
$("#installUpdateError").show();
$("#installUpdateEnd").removeClass("disabled");
$("#installUpdateProgress").hide();
// Vérifier si l'accolade ouvrante est trouvée et qu'elle n'est pas en première position
if (typeof message !== 'object') {
// Trouver la position du premier "{" pour repérer le début du tableau
const startOfArray = message.indexOf('{');
// Extraire le message du warning jusqu'au début du tableau
const warningMessage = message.substring(0, startOfArray).trim();
// Extraire le tableau JSON entre les accolades
const jsonString = message.substring(startOfArray);
const jsonData = JSON.parse(jsonString);
// Afficher les résultats
if (jsonData) {
$("#installUpdateErrorMessage").html("<strong>Détails de l'erreur :</strong><br> " +
jsonData.data.replace(/^"(.*)"$/, '$1') +
"<br>" +
warningMessage.replace(/<[^p].*?>/g, ""));
}
} else {
// Vous pouvez également faire quelque chose d'autre ici, par exemple, afficher un message à l'utilisateur, etc.
$("#installUpdateErrorMessage").html(message);
}
}
$(window).on("load", function () {
step(1, null);
});
$(window).on("load", step(1, null));

View File

@ -1,56 +1,55 @@
<div id="updateContainer">
<p><strong>
<?php echo helper::translate('Version'); ?>
&nbsp;
<?php echo self::ZWII_VERSION; ?>
<?php echo helper::translate('vers'); ?>
&nbsp;
<?php echo $module::$newVersion; ?>
</strong></p>
<p>
<?php echo helper::translate('Afin d\'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l\'opération.'); ?>
</p>
<div class="row">
<div class="col9 verticalAlignMiddle">
<div id="installUpdateProgress">
<?php echo template::ico('spin', ['animate' => true]); ?>
<span class="installUpdateProgressText" data-id="1">
<?php echo helper::translate('1/4 : Préparation...'); ?>
</span>
<span class="installUpdateProgressText displayNone" data-id="2">
<?php echo helper::translate('2/4 : Téléchargement...'); ?>
</span>
<span class="installUpdateProgressText displayNone" data-id="3">
<?php echo helper::translate('3/4 : Installation...'); ?>
</span>
<span class="installUpdateProgressText displayNone" data-id="4">
<?php echo helper::translate('4/4 : Configuration...'); ?>
</span>
</div>
<div id="installUpdateError" class="message colorRed displayNone">
<?php echo template::ico('cancel'); ?>
<strong>
<?php echo helper::translate('Une erreur est survenue lors de l\'étape :') . '<br>'; ?>
<span id="installUpdateErrorStep"> </span>.
</strong>
</div>
<div id="installUpdateSuccess" class="message colorGreen displayNone">
<?php echo template::ico('check'); ?>
<?php echo helper::translate('Mise à jour terminée avec succès.'); ?>
</div>
<p><strong>
<?php echo helper::translate('Mise à jour de ZwiiCMS'); ?>
&nbsp;
<?php echo self::ZWII_VERSION; ?>
<?php echo helper::translate('vers ZwiiCMS'); ?>
&nbsp;
<?php echo $module::$newVersion; ?>.
</strong></p>
<p>
<?php echo helper::translate('Afin d\'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l\'opération.'); ?>
</p>
<div class="row">
<div class="col9 verticalAlignMiddle">
<div id="installUpdateProgress">
<?php echo template::ico('spin', ['animate' => true]); ?>
<span class="installUpdateProgressText" data-id="1">
<?php echo helper::translate('1/4 : Préparation...'); ?>
</span>
<span class="installUpdateProgressText displayNone" data-id="2">
<?php echo helper::translate('2/4 : Téléchargement...'); ?>
</span>
<span class="installUpdateProgressText displayNone" data-id="3">
<?php echo helper::translate('3/4 : Installation...'); ?>
</span>
<span class="installUpdateProgressText displayNone" data-id="4">
<?php echo helper::translate('4/4 : Configuration...'); ?>
</span>
</div>
<div class="col3 verticalAlignTop">
<?php echo template::button('installUpdateEnd', [
'value' => 'Terminer',
'href' => helper::baseUrl() . 'config',
'ico' => 'check',
'class' => 'disabled'
]); ?>
<div id="installUpdateError" class="colorRed displayNone">
<?php echo template::ico('cancel'); ?>
<strong>
<?php echo helper::translate('Une erreur est survenue lors de l\'étape :'); ?>
&nbsp;
<span id="installUpdateErrorStep"> </span>.
</strong>
</div>
<div id="installUpdateSuccess" class="colorGreen displayNone">
<?php echo template::ico('check'); ?>
<?php echo helper::translate('Mise à jour terminée avec succès.'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<p><em><span class="colorRed" id="installUpdateErrorMessage"></span></em></p>
</div>
<div class="col3 verticalAlignTop">
<?php echo template::button('installUpdateEnd', [
'value' => 'Terminer',
'href' => helper::baseUrl() . 'config',
'ico' => 'check',
'class' => 'disabled'
]); ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<p><em><span class="colorRed" id="installUpdateErrorMessage"></span></em></p>
</div>
</div

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -41,7 +41,7 @@ class maintenance extends common
? ''
: $this->getData(['page', $this->getData(['locale', 'page302']), 'title']),
//'content' => $this->getdata(['page',$this->getData(['locale','page302']),'content']),
'content' => $this->getPage($this->getData(['locale', 'page302']), self::$siteContent),
'content' => $this->getPage($this->getData(['locale', 'page302']), self::$i18nContent),
'view' => 'index'
]);
} else {

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -18,12 +18,12 @@ class page extends common
{
public static $actions = [
'add' => self::GROUP_EDITOR,
'delete' => self::GROUP_EDITOR,
'edit' => self::GROUP_EDITOR,
'duplicate' => self::GROUP_EDITOR,
'jsEditor' => self::GROUP_EDITOR,
'cssEditor' => self::GROUP_EDITOR
'add' => self::GROUP_MODERATOR,
'delete' => self::GROUP_MODERATOR,
'edit' => self::GROUP_MODERATOR,
'duplicate' => self::GROUP_MODERATOR,
'jsEditor' => self::GROUP_MODERATOR,
'cssEditor' => self::GROUP_MODERATOR
];
public static $pagesNoParentId = [
'' => 'Aucune'
@ -41,42 +41,28 @@ class page extends common
// Position du module
public static $modulePosition = [
'bottom' => 'Après le contenu de la page',
'top' => 'Avant le contenu de la page',
'free' => 'À l\'emplacement du mot clé [MODULE] dans la page'
'top' => 'Avant le contenu de la page',
'free' => 'À l\'emplacement du mot clé [MODULE] dans la page'
];
public static $pageBlocks = [
'12' => 'Page standard',
'bar' => 'Barre latérale',
'4-8' => 'Barre 1/3 - page 2/3',
'8-4' => 'Page 2/3 - barre 1/3',
'3-9' => 'Barre 1/4 - page 3/4',
'9-3' => 'Page 3/4 - barre 1/4',
'12' => 'Page standard',
'bar' => 'Barre latérale',
'4-8' => 'Barre 1/3 - page 2/3',
'8-4' => 'Page 2/3 - barre 1/3',
'3-9' => 'Barre 1/4 - page 3/4',
'9-3' => 'Page 3/4 - barre 1/4',
'3-6-3' => 'Barre 1/4 - page 1/2 - barre 1/4',
'2-7-3' => 'Barre 2/12 - page 7/12 - barre 3/12',
'3-7-2' => 'Barre 3/12 - page 7/12 - barre 2/12',
];
public static $displayMenu = [
'none' => 'Aucun menu',
'parents' => 'Le menu horizontal intégral',
'children' => 'Le sous-menu de la page parente'
'none' => 'Aucun menu',
'parents' => 'Le menu horizontal intégral',
'children' => 'Le sous-menu de la page parente'
];
public static $extraPosition = [
false => 'Menu standard',
true => 'Menu accessoire'
];
public static $userProfils = [];
public static $navIconTemplate = [
'dir' => 'Petit triangle',
'open' => 'Grand triangle',
'big' => 'Flèche',
];
public static $navIconPosition = [
'none' => 'Masqué',
'top' => 'Haut de page',
'bottom' => 'Bas de page',
false => 'Menu standard',
true => 'Menu accessoire'
];
@ -85,55 +71,56 @@ class page extends common
*/
public function duplicate()
{
// La session ne correspond pas au site ouvert dans cet onglet
if (
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
) {
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
exit();
}
// Adresse sans le token
$page = $this->getUrl(2);
$url = explode('&', $this->getUrl(2));
// La page n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['page', $page]) === null
) {
if ($this->getData(['page', $url[0]]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
// Duplication de la page
$pageTitle = $this->getData(['page', $page, 'title']);
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$pageId = helper::increment($pageId, self::$coreModuleIds);
$pageId = helper::increment($pageId, self::$moduleIds);
$data = $this->getData([
'page',
$page
]);
// Ecriture
$this->setData(['page', $pageId, $data]);
$notification = helper::translate('Page dupliquée');
// Duplication du module présent
if ($this->getData(['page', $page, 'moduleId'])) {
$data = $this->getData(['module', $page]);
$this->setData(['module', $pageId, $data]);
$notification = helper::translate('Page et module dupliqués');
}
} // Jeton incorrect
elseif (!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId . '/' . self::$siteContent,
'notification' => $notification,
'state' => true
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Jeton invalide')
]);
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Suppression interdite')
]);
}
// Duplication de la page
$pageTitle = $this->getData(['page', $url[0], 'title']);
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$pageId = helper::increment($pageId, self::$coreModuleIds);
$pageId = helper::increment($pageId, self::$moduleIds);
$data = $this->getData([
'page',
$url[0]
]);
// Ecriture
$this->setData(['page', $pageId, $data]);
$notification = helper::translate('Page dupliquée');
// Duplication du module présent
if ($this->getData(['page', $url[0], 'moduleId'])) {
$data = $this->getData([
'module',
$url[0]
]);
// Ecriture
$this->setData(['module', $pageId, $data]);
$notification = helper::translate('Page et module dupliqués');
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId,
'notification' => $notification,
'state' => true
]);
}
@ -142,76 +129,55 @@ class page extends common
*/
public function add()
{
// La session ne correspond pas au site ouvert dans cet onglet
if (
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
) {
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
exit();
$pageTitle = 'Nouvelle page';
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$this->setData([
'page',
$pageId,
[
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'content' => $pageId . '.html',
'hideTitle' => false,
'breadCrumb' => false,
'metaDescription' => '',
'metaTitle' => '',
'moduleId' => '',
'parentPageId' => '',
'modulePosition' => 'bottom',
'position' => 0,
'group' => self::GROUP_VISITOR,
'targetBlank' => false,
'title' => $pageTitle,
'shortTitle' => $pageTitle,
'block' => '12',
'barLeft' => '',
'barRight' => '',
'displayMenu' => '0',
'hideMenuSide' => false,
'hideMenuHead' => false,
'hideMenuChildren' => false,
'js' => '',
'css' => ''
]
]);
// Creation du contenu de la page
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
}
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} else {
$pageTitle = 'Nouvelle page';
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$this->setData([
'page',
$pageId,
[
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'content' => $pageId . '.html',
'hideTitle' => false,
'breadCrumb' => false,
'metaDescription' => '',
'metaTitle' => '',
'moduleId' => '',
'parentPageId' => '',
'modulePosition' => 'bottom',
'position' => 0,
'group' => self::GROUP_VISITOR,
'targetBlank' => false,
'title' => $pageTitle,
'shortTitle' => $pageTitle,
'block' => '12',
'barLeft' => '',
'barRight' => '',
'navLeft' => 'none',
'navRight' => 'none',
'navTemplate' => 'dir',
'displayMenu' => '0',
'hideMenuSide' => false,
'hideMenuHead' => false,
'hideMenuChildren' => false,
'js' => '',
'css' => ''
]
]);
// Creation du contenu de la page
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
}
//$this->secure_file_put_contents(self::DATA_DIR . self::$siteContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>');
$this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$siteContent);
// Met à jour le sitemap
$this->updateSitemap();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $pageId,
'notification' => helper::translate('Nouvelle page créée'),
'state' => true
]);
}
//file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>');
$this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$i18nContent);
// Met à jour le site map
$this->createSitemap('all');
// Mise à jour de la liste des pages pour TinyMCE
$this->listPages();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $pageId,
'notification' => helper::translate('Nouvelle page créée'),
'state' => true
]);
}
/**
@ -219,105 +185,120 @@ class page extends common
*/
public function delete()
{
// La session ne correspond pas au site ouvert dans cet onglet
if (
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
) {
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
exit();
}
// $url prend l'adresse sans le token
$page = $this->getUrl(2);
$url = explode('&', $this->getUrl(2));
// La page n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['page', $page]) === null
) {
if ($this->getData(['page', $url[0]]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} // Jeton incorrect
elseif (!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Jeton invalide')
]);
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Suppression interdite')
]);
}
// Impossible de supprimer la page d'accueil
elseif ($page === $this->getData(['locale', 'homePageId'])) {
elseif ($url[0] === $this->getData(['locale', 'homePageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
]);
}
// Impossible de supprimer la page affectée
elseif ($page === $this->getData(['locale', 'searchPageId'])) {
// Impossible de supprimer la page de recherche affectée
elseif ($url[0] === $this->getData(['locale', 'searchPageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
]);
}
// Impossible de supprimer la page affectée
elseif ($page === $this->getData(['locale', 'legalPageId'])) {
// Impossible de supprimer la page des mentions légales affectée
elseif ($url[0] === $this->getData(['locale', 'legalPageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
]);
}
// Impossible de supprimer la page affectée
elseif ($page === $this->getData(['locale', 'page404'])) {
// Impossible de supprimer la page des mentions légales affectée
elseif ($url[0] === $this->getData(['locale', 'page404'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
]);
}
// Impossible de supprimer la page affectée
elseif ($page === $this->getData(['locale', 'page403'])) {
// Impossible de supprimer la page des mentions légales affectée
elseif ($url[0] === $this->getData(['locale', 'page403'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
]);
}
// Impossible de supprimer la page affectée
elseif ($page === $this->getData(['locale', 'page302'])) {
// Impossible de supprimer la page des mentions légales affectée
elseif ($url[0] === $this->getData(['locale', 'page302'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
]);
}
// Jeton incorrect
elseif (!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Jeton invalide')
]);
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Suppression interdite')
]);
}
// Impossible de supprimer une page contenant des enfants
elseif ($this->getHierarchy($page, null)) {
elseif ($this->getHierarchy($url[0], null)) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $page . '/' . self::$siteContent,
'notification' => helper::translate('Impossible de supprimer une page contenant des pages enfants')
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => helper::translate('Impossible de supprimer une page contenant des pages enfants')
]);
}
// Suppression
else {
// Effacer le dossier du module
$moduleId = $this->getData(['page', $page, 'moduleId']);
$moduleId = $this->getData(['page', $url[0], 'moduleId']);
$modulesData = helper::getModules();
if (
array_key_exists($moduleId, $modulesData)
&& is_dir($modulesData[$moduleId]['dataDirectory'] . $page)
&& is_dir($modulesData[$moduleId]['dataDirectory'] . $url[0])
) {
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $page);
$this->removeDir($modulesData[$moduleId]['dataDirectory'] . $url[0]);
}
// Effacer la page
$this->deleteData(['page', $page]);
if (file_exists(self::DATA_DIR . self::$siteContent . '/content/' . $page . '.html')) {
unlink(self::DATA_DIR . self::$siteContent . '/content/' . $page . '.html');
$this->deleteData(['page', $url[0]]);
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html')) {
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html');
}
$this->deleteData(['module', $page]);
// Met à jour le sitemap
$this->updateSitemap();
$this->deleteData(['module', $url[0]]);
// Met à jour le site map
$this->createSitemap('all');
// Mise à jour de la liste des pages pour TinyMCE
$this->listPages();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(false),
@ -333,22 +314,8 @@ class page extends common
*/
public function edit()
{
// La session ne correspond pas au site ouvert dans cet onglet
if (
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
) {
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
exit();
}
// La page n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['page', $this->getUrl(2)]) === null
) {
if ($this->getData(['page', $this->getUrl(2)]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
@ -357,10 +324,7 @@ class page extends common
// La page existe
else {
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
// Si le Title n'est pas vide, premier test pour positionner la notification du champ obligatoire
if ($this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '') {
// Génére l'ID si le titre de la page a changé
@ -394,7 +358,7 @@ class page extends common
// Placer la feuille de style dans un dossier au nom de la nouvelle instance
mkdir($modulesData[$moduleId]['dataDirectory'] . $pageId, 0755);
copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId);
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
$this->removeDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
// Mettre à jour le nom de la feuille de style
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId]);
}
@ -411,8 +375,8 @@ class page extends common
// Supprime l'ancienne page si l'id a changée
if ($pageId !== $this->getUrl(2)) {
$this->deleteData(['page', $this->getUrl(2)]);
if (file_exists(self::DATA_DIR . self::$siteContent . '/content/' . $this->getUrl(2) . '.html')) {
unlink(self::DATA_DIR . self::$siteContent . '/content/' . $this->getUrl(2) . '.html');
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html')) {
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html');
}
}
// Traitement des pages spéciales affectées dans la config :
@ -469,7 +433,7 @@ class page extends common
// Une page parent devient orpheline, les pages enfants le devienne pour éviter une incohérence
if (
$position === 0 &&
$position !== $this->getData(['page', $this->getUrl(2), 'position']) &&
$position !== $this->getData(['page', $this->getUrl(2), 'position']) &&
$this->getinput('pageEditBlock') !== 'bar'
) {
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
@ -498,18 +462,6 @@ class page extends common
}
}
}
// Détermine le groupe selon que la page est une barre ou une page standard
$group = $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0;
//Détermine le profil d'utilisateur en fonction du groupe sinon le groupe vaut 0
$profil = 0;
if (
$this->getinput('pageEditBlock') !== 'bar' ||
$group === 1 ||
$group === 2
) {
$profil = $this->getInput('pageEditProfil' . $group, helper::FILTER_INT);
}
// Modifie la page ou en crée une nouvelle si l'id a changé
$this->setData([
@ -528,36 +480,34 @@ class page extends common
'modulePosition' => $this->getInput('pageModulePosition'),
'parentPageId' => $this->getInput('pageEditParentPageId'),
'position' => $position,
'group' => $group,
'profil' => $profil,
'group' => $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0,
'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN),
'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT),
'shortTitle' => $this->getInput('pageEditShortTitle', helper::FILTER_STRING_SHORT, true),
'block' => $this->getinput('pageEditBlock'),
'barLeft' => $barLeft,
'barRight' => $barRight,
'navLeft' => $this->getInput('pageEditNavLeft'),
'navRight' => $this->getInput('pageEditNavRight'),
'navTemplate' => $this->getInput('pageEditNavTemplate'),
'displayMenu' => $this->getinput('pageEditDisplayMenu'),
'hideMenuSide' => $this->getinput('pageEditHideMenuSide', helper::FILTER_BOOLEAN),
'hideMenuHead' => $this->getinput('pageEditHideMenuHead', helper::FILTER_BOOLEAN),
'hideMenuChildren' => $this->getinput('pageEditHideMenuChildren', helper::FILTER_BOOLEAN),
'extraPosition' => $this->getinput('pageEditExtraPosition', helper::FILTER_BOOLEAN),
'css' => $this->getData(['page', $this->getUrl(2), 'css']) == null ? '' : $this->getData(['page', $this->getUrl(2), 'css']),
'js' => $this->getData(['page', $this->getUrl(2), 'js']) == null ? '' : $this->getData(['page', $this->getUrl(2), 'js']),
'css' => $this->getData(['page', $this->getUrl(2), 'css']),
'js' => $this->getData(['page', $this->getUrl(2), 'js']),
]
]);
// Creation du contenu de la page
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
}
$content = empty($this->getInput('pageEditContent', null)) ? '<p></p>' : str_replace('<p></p>', '<p>&nbsp;</p>', $this->getInput('pageEditContent', null));
$this->setPage($pageId, $content, self::$siteContent);
$this->setPage($pageId, $content, self::$i18nContent);
// Met à jour le sitemap
$this->updateSitemap();
// Met à jour le site map
$this->createSitemap('all');
// Mise à jour de la liste des pages pour TinyMCE
$this->listPages();
// Redirection vers la configuration
if (
@ -579,19 +529,7 @@ class page extends common
}
}
}
// Construction du formulaire
// Met à jour le sitemap
$this->updateSitemap();
// Création du sélecteur de modules
self::$moduleIds = [];
foreach (helper::getModules() as $key => $values) {
self::$moduleIds[$key] = $values['realName'] . ' (' . $key . ')';
}
self::$moduleIds = array_merge(['' => 'Aucun'], self::$moduleIds);
// Pages sans parent
self::$moduleIds = array_merge(['' => 'Aucun'], helper::arrayColumn(helper::getModules(), 'realName', 'SORT_ASC')); // Pages sans parent
foreach ($this->getHierarchy() as $parentPageId => $childrenPageIds) {
if ($parentPageId !== $this->getUrl(2)) {
self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
@ -606,20 +544,6 @@ class page extends common
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
}
}
// Profils installés
// Profils disponibles
foreach ($this->getData(['profil']) as $profilId => $profilData) {
if ($profilId < self::GROUP_MEMBER) {
continue;
}
if ($profilId === self::GROUP_ADMIN) {
self::$userProfils[$profilId][self::GROUP_ADMIN] = $profilData['name'];
continue;
}
foreach ($profilData as $key => $value) {
self::$userProfils[$profilId][$key] = $profilData[$key]['name'];
}
}
// Valeurs en sortie
$this->addOutput([
'title' => $this->getData(['page', $this->getUrl(2), 'title']),
@ -637,22 +561,18 @@ class page extends common
public function cssEditor()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$css = $this->getInput('pageCssEditorContent', helper::FILTER_STRING_LONG) === null ? '' : $this->getInput('pageCssEditorContent', helper::FILTER_STRING_LONG);
if ($this->isPost()) {
// Supprime les balises styles si elles ont été saisies
$css = $this->getInput('pageCssEditorContent', null);
// Enregistre le CSS
$this->setData([
'page',
$this->getUrl(2),
'css',
'page', $this->getUrl(2), 'css',
$css
]);
// Valeurs en sortie
$this->addOutput([
'notification' => helper::translate('Modifications enregistrées'),
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'state' => true
]);
}
@ -672,22 +592,18 @@ class page extends common
public function jsEditor()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$js = $this->getInput('pageJsEditorContent', helper::FILTER_STRING_LONG) === null ? '' : $this->getInput('pageJsEditorContent', helper::FILTER_STRING_LONG);
if ($this->isPost()) {
// Supprime les balises scripts si elles ont été saisies
$js = $this->getInput('pageJsEditorContent', null);
// Enregistre le JS
$this->setData([
'page',
$this->getUrl(2),
'js',
'page', $this->getUrl(2), 'js',
$js
]);
// Valeurs en sortie
$this->addOutput([
'notification' => helper::translate('Modifications enregistrées'),
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'state' => true
]);
}
@ -700,18 +616,4 @@ class page extends common
'view' => 'jsEditor'
]);
}
/**
* Retourne les informations sur les pages en omettant les clés CSS et JS qui occasionnent des bugs d'affichage dans l'éditeur de page
* @return string tableau associatif des pages dans le menu
*/
public function getPageInfo()
{
$p = $this->getData(['page']);
$d = array_map(function ($d) {
unset ($d["css"], $d["js"]);
return $d;
}, $p);
return json_encode($d);
}
}
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -3,7 +3,7 @@
<div class="col1">
<?php echo template::button('pageCssEditorBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -44,7 +44,3 @@
background-color: #00BFFF;
}
#pageEditProfil1Wrapper,
#pageEditProfil2Wrapper {
padding: 0;
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -23,7 +23,7 @@
});
});
$("#pageEditModuleId").on("change", function() {
$("#pageEditModuleId").on("click", function() {
protectModule();
});
@ -54,16 +54,6 @@ function protectModule() {
*/
$( document ).ready(function() {
// Changement de profil
$(".pageEditGroupProfil").hide();
$("#pageEditGroupProfil" + $("#pageEditGroup").val()).show();
$("#pageEditGroup").on("change", function () {
$(".pageEditGroupProfil").hide();
$("#pageEditGroupProfil" + $(this).val()).show();
});
/**
* Sélection des onglets
*/
@ -193,7 +183,6 @@ $( document ).ready(function() {
$("#pageEditSeoWrapper").slideUp();
$("#pageEditAdvancedWrapper").removeClass("disabled");
$("#pageEditAdvancedWrapper").slideUp();
$(".navSelect").slideUp();
/*
$("#pageEditBlockLayout").removeClass("col6");
$("#pageEditBlockLayout").addClass("col12");
@ -510,7 +499,6 @@ pageEditBlockDOM.on("change", function() {
$("#pageEditModuleConfig").slideUp();
$("#pageEditDisplayMenuWrapper").addClass("disabled");
$("#pageEditDisplayMenuWrapper").slideDown();
$(".navSelect").slideUp();
/*
$("#pageEditBlockLayout").removeClass("col6");
$("#pageEditBlockLayout").addClass("col12");
@ -531,7 +519,6 @@ pageEditBlockDOM.on("change", function() {
$("#pageEditModuleConfig").slideDown();
$("#pageEditDisplayMenuWrapper").removeClass("disabled");
$("#pageEditDisplayMenuWrapper").slideUp();
$(".navSelect").slideDown();
if ($("#pageEditParentPageId").val() !== "") {
$("#pageEditbreadCrumbWrapper").addClass("disabled");
$("#pageEditbreadCrumbWrapper").slideDown();
@ -657,7 +644,7 @@ $("#pageEditParentPageId").on("change", function() {
function buildPagesList(extraPosition) {
var hierarchy = <?php echo json_encode($this->getHierarchy()); ?>;
var pages = <?php echo $module->getPageInfo(); ?>;
var pages = <?php echo json_encode($this->getData(['page'])); ?>;
var positionInitial = <?php echo $this->getData(['page',$this->getUrl(2),"position"]); ?>;
var extraPosition = $("#pageEditExtraPosition").val();
var positionDOM = $("#pageEditPosition");

View File

@ -1,32 +1,34 @@
<?php echo template::formOpen('pageEditForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('configModulesBack', [
<?php $href = helper::baseUrl() . $this->getUrl(2); ?>
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code') $href = helper::baseUrl(); ?>
<?php echo template::button('pageEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(2),
'value' => template::ico('left')
'href' => $href,
'value' => template::ico('home')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('pageEditHelp', [
'href' => 'https://doc.zwiicms.fr/edition-des-pages',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]); */?>
'href' => 'https://doc.zwiicms.fr/edition-des-pages',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]); */ ?>
</div>
<div class="col1 offset6">
<?php echo template::button('pageEditDelete', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Effacer la page'
]); ?>
</div>
<div class="col1">
<?php echo template::button('pageEditDuplicate', [
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('clone'),
'help' => 'Dupliquer la page'
]); ?>
@ -65,8 +67,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Titres'); ?>
<h4><?php echo helper::translate('Titres'); ?>
<!--<span id="infoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/informations-generales" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -108,7 +109,7 @@
<div class="col12">
<?php echo template::textarea('pageEditContent', [
'class' => 'editorWysiwyg',
'value' => $this->getPage($this->getUrl(2), self::$siteContent)
'value' => $this->getPage($this->getUrl(2), self::$i18nContent)
]); ?>
</div>
</div>
@ -118,8 +119,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Emplacement dans le menu'); ?>
<h4><?php echo helper::translate('Emplacement dans le menu'); ?>
<!--<span id="positionHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/emplacement-dans-le-menu" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -135,11 +135,11 @@
]); ?>
</div>
<div class="col4">
<?php if ($this->getHierarchy($this->getUrl(2), false)): ?>
<?php if ($this->getHierarchy($this->getUrl(2), false)) : ?>
<?php echo template::hidden('pageEditParentPageId', [
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php else: ?>
<?php else : ?>
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
'label' => 'Page parent',
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
@ -148,7 +148,7 @@
</div>
<div class="col4">
<?php echo template::select('pageEditExtraPosition', $module::$extraPosition, [
'label' => 'Emplacement',
'label' => 'Emplacement :',
'selected' => $this->getData(['page', $this->getUrl(2), 'extraPosition']),
'help' => 'Le menu accessoire est aligné à droite de la barre de menu, c\'est un emplacement réservé aux drapeaux et au bouton de connexion.'
]); ?>
@ -174,8 +174,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Options avancées'); ?>
<h4><?php echo helper::translate('Options avancées'); ?>
<!--<span id="advancedHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/options-d-emplacement-avancee" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -222,8 +221,7 @@
<div class="row">
<div class="col6">
<div class="block">
<h4>
<?php echo helper::translate('Module'); ?>
<h4><?php echo helper::translate('Module'); ?>
</h4>
<div class="row">
<div class="col10">
@ -260,9 +258,7 @@
</div>
<div class="col6">
<div class="block">
<h4>
<?php echo helper::translate('Contenu avancé'); ?>
</h4>
<h4><?php echo helper::translate('Contenu avancé');?></h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::button('pageEditCssEditor', [
@ -290,8 +286,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Mise en page'); ?>
<h4><?php echo helper::translate('Mise en page'); ?>
<!--<span id="layoutHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mise-en-page-2" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -313,21 +308,21 @@
</div>
<div class="col6">
<!-- Sélection des barres latérales -->
<?php if ($this->getHierarchy($this->getUrl(2), false, true)): ?>
<?php if ($this->getHierarchy($this->getUrl(2), false, true)) : ?>
<?php echo template::hidden('pageEditBarLeft', [
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php else: ?>
<?php else : ?>
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
'label' => 'Barre latérale gauche :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php endif; ?>
<?php if ($this->getHierarchy($this->getUrl(2), false, true)): ?>
<?php if ($this->getHierarchy($this->getUrl(2), false, true)) : ?>
<?php echo template::hidden('pageEditBarRight', [
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php else: ?>
<?php else : ?>
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
'label' => 'Barre latérale droite :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
@ -340,26 +335,6 @@
]); ?>
</div>
</div>
<div class="row navSelect">
<div class="col4">
<?php echo template::select('pageEditNavLeft', $module::$navIconPosition, [
'label' => 'Bouton de navigation gauche',
'selected' => $this->getData(['page', $this->getUrl(2), 'navLeft']),
]); ?>
</div>
<div class="col4">
<?php echo template::select('pageEditNavTemplate', $module::$navIconTemplate, [
'label' => 'Modèle',
'selected' => $this->getData(['page', $this->getUrl(2), 'navTemplate']),
]); ?>
</div>
<div class="col4">
<?php echo template::select('pageEditNavRight', $module::$navIconPosition, [
'label' => 'Bouton de navigation droit',
'selected' => $this->getData(['page', $this->getUrl(2), 'navRight']),
]); ?>
</div>
</div>
</div>
</div>
</div>
@ -370,8 +345,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Permission et référencement'); ?>
<h4><?php echo helper::translate('Permission et référencement');?>
<!--<span id="seoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/permission-et-referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
@ -382,31 +356,10 @@
<div class="row">
<div class='col6'>
<?php echo template::select('pageEditGroup', self::$groupPublics, [
'label' => 'Groupe minimal pour accéder à la page',
'selected' => $this->getData(['page', $this->getUrl(2), 'group']),
'help' => 'Les groupes de niveau supérieur accèdent à la page.'
'label' => 'Groupe requis pour accéder à la page :',
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
]); ?>
</div>
<div class="col6">
<div class="pageEditGroupProfil displayNone"
id="pageEditGroupProfil<?php echo self::GROUP_MEMBER; ?>">
<?php echo template::select('pageEditProfil' . self::GROUP_MEMBER, $module::$userProfils[self::GROUP_MEMBER], [
'label' => 'Profil minimal pour accéder à la page',
'selected' => $this->getData(['page', $this->getUrl(2), 'profil']),
'help' => 'Les profils de niveau supérieur accèdent à la page.',
]); ?>
</div>
<div class="pageEditGroupProfil displayNone"
id="pageEditGroupProfil<?php echo self::GROUP_EDITOR; ?>">
<?php echo template::select('pageEditProfil' . self::GROUP_EDITOR, $module::$userProfils[self::GROUP_EDITOR], [
'label' => 'Profil minimal pour accéder à la page',
'selected' => $this->getData(['page', $this->getUrl(2), 'profil']),
'help' => 'Les profils de niveau supérieur accèdent à la page.',
]); ?>
</div>
</div>
</div>
<div class="row">
<div class='col12'>
<?php echo template::text('pageEditMetaTitle', [
'label' => 'Méta-titre',

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -3,7 +3,7 @@
<div class="col1">
<?php echo template::button('pageJsEditorBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -21,6 +21,12 @@ class plugin extends common
'index' => self::GROUP_ADMIN,
'delete' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN,
// Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire
'dataExport' => self::GROUP_ADMIN,
// Fonction muette d'exportation
'dataImport' => self::GROUP_ADMIN,
// les données d'un module
'dataDelete' => self::GROUP_ADMIN,
'store' => self::GROUP_ADMIN,
'item' => self::GROUP_ADMIN,
// détail d'un objet
@ -56,29 +62,28 @@ class plugin extends common
public function delete()
{
// Action interdite
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'access' => false
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => helper::translate('Action interdite')
]);
} else {
// Suppression des dossiers
$infoModules = helper::getModules();
$module = $this->getUrl(2);
//Liste des dossiers associés au module non effacés
if (
is_dir('./module/' . $module) &&
$this->deleteDir('./module/' . $module) === true
) {
if ($this->removeDir('./module/' . $module) === true) {
$success = true;
$notification = 'Module ' . $module . ' désinstallé';
if (($infoModules[$this->getUrl(2)]['dataDirectory'])) {
if (
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])
&& !$this->removeDir($infoModules[$this->getUrl(2)]['dataDirectory'])
) {
$s = $this->deleteDir($infoModules[$this->getUrl(2)]['dataDirectory']);
$notification = $s === false ? sprintf(helper::translate('Le module %s est désinstallé, il reste peut-être des données dans %s'), $module, $infoModules[$this->getUrl(2)]['dataDirectory']) : $notification;
$notification = sprintf(helper::translate('Le module %s est désinstallé, il reste peut-être des données dans %s'), $module, $infoModules[$this->getUrl(2)]['dataDirectory']);
}
}
} else {
@ -131,7 +136,7 @@ class plugin extends common
$module = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . 'enum.json'), true);
} else {
// Message de retour
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
@ -146,7 +151,7 @@ class plugin extends common
// Vérification de la présence des dossier décrits
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
// Message de retour
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
@ -156,7 +161,7 @@ class plugin extends common
// Interdire l'écriture dans le dossier core
if (strstr($dest, 'core') !== false) {
// Message de retour
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
@ -171,7 +176,7 @@ class plugin extends common
*/
if (!file_exists(self::TEMP_DIR . $tempFolder . $module['name'] . '.php')) {
// Message de retour
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
@ -204,7 +209,7 @@ class plugin extends common
$installOk = true;
} else {
// Message de retour
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
@ -224,28 +229,27 @@ class plugin extends common
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
mkdir(self::TEMP_DIR . $tempFolder . $src);
}
$success = $success || $this->copyDir(self::TEMP_DIR . $tempFolder . $src, $dest);
$success = $success && $this->copyDir(self::TEMP_DIR . $tempFolder . $src, $dest);
}
}
// Message de retour
$t = isset($versionInstalled) ? helper::translate('actualisé') : helper::translate('installé');
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => $success,
'notification' => $success
? sprintf(helper::translate('Le module %s a été %s'), $module['name'], $t)
: helper::translate('Erreur inconnue, le module n\'est pas installé')
'notification' => $success
? sprintf(helper::translate('Le module %s a été %s'), $module['name'], $t)
: helper::translate('Erreur inconnue, le module n\'est pas installé')
]);
} else {
// Supprimer le dossier temporaire
$this->deleteDir(self::TEMP_DIR . $tempFolder);
$zip->close();
return ([
'success' => false,
'notification' => helper::translate('Erreur inconnue, le module n\'est pas installé')
]);
// Supprimer le dossier temporaire
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
}
} else {
// Message de retour
@ -262,11 +266,7 @@ class plugin extends common
public function upload()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
// Installation d'un module
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
@ -291,11 +291,13 @@ class plugin extends common
*/
public function uploadItem()
{
// Action interdite
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'access' => false
'redirect' => helper::baseUrl() . 'store',
'state' => false,
'notification' => helper::translate('Action interdite')
]);
} else {
// Récupérer le module en ligne
@ -314,7 +316,7 @@ class plugin extends common
mkdir(self::FILE_DIR . 'source/modules', 0755);
}
// Sauver les données du fichiers
$this->secure_file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
// Installation directe
if (file_exists(self::FILE_DIR . 'source/modules/' . $moduleFile)) {
@ -377,11 +379,11 @@ class plugin extends common
$store[$key]['category'],
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >' . $store[$key]['title'] . '</a>',
$store[$key]['version'],
helper::dateUTF8('%d %B %Y', $store[$key]['versionDate'], self::$i18nUI),
helper::dateUTF8('%d %B %Y', $store[$key]['versionDate']),
implode(' - ', $pageInfos),
template::button('moduleExport' . $key, [
'class' => $class,
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key,
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key . '/' . $_SESSION['csrf'],
'value' => $ico,
'help' => $help
])
@ -403,7 +405,7 @@ class plugin extends common
{
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
self::$storeItem = $store[$this->getUrl(2)];
self::$storeItem['fileDate'] = helper::dateUTF8('%d %B %Y', self::$storeItem['fileDate'], self::$i18nUI);
self::$storeItem['fileDate'] = helper::dateUTF8('%d %B %Y', self::$storeItem['fileDate']);
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Module ' . self::$storeItem['title']),
@ -417,15 +419,10 @@ class plugin extends common
public function index()
{
$i18nSites = [];
// Tableau des langues rédigées
foreach (self::$languages as $key => $value) {
// tableau des langues installées
if (
is_dir(self::DATA_DIR . $key)
&& file_exists(self::DATA_DIR . $key . '/page.json')
&& file_exists(self::DATA_DIR . $key . '/module.json')
) {
if (is_dir(self::DATA_DIR . $key)) {
$i18nSites[$key] = $value;
}
}
@ -435,11 +432,10 @@ class plugin extends common
// Parcourir les langues du site traduit et recherche les modules affectés à des pages
$pagesInfos = [];
foreach ($i18nSites as $keyi18n => $valuei18n) {
// Clés moduleIds dans les pages de la langue
$pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/page.json'), true);
$pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true);
// Extraire les clés des modules
$pagesModules[$keyi18n] = array_filter(helper::arrayColumn($pages['page'], 'moduleId', 'SORT_DESC'), 'strlen');
@ -447,6 +443,7 @@ class plugin extends common
// Générer la liste des pages avec module de la langue par défaut
foreach ($pagesModules[$keyi18n] as $key => $value) {
if (!empty($value)) {
$pagesInfos[$keyi18n][$key]['pageId'] = $key;
$pagesInfos[$keyi18n][$key]['title'] = $pages['page'][$key]['title'];
$pagesInfos[$keyi18n][$key]['moduleId'] = $value;
@ -479,7 +476,7 @@ class plugin extends common
$infoModules[$key]['delete'] === true
? template::button('moduleDelete' . $key, [
'class' => 'moduleDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key,
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Supprimer le module'
])
@ -500,12 +497,12 @@ class plugin extends common
$infoModules[$key]['version'],
'',
template::button('moduleSave' . $key, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' . $key,
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' . $key . '/' . $_SESSION['csrf'],
'value' => template::ico('download-cloud'),
'help' => 'Sauvegarder le module dans le gestionnaire de fichiers'
]),
template::button('moduleDownload' . $key, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' . $key,
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' . $key . '/' . $_SESSION['csrf'],
'value' => template::ico('download'),
'help' => 'Sauvegarder et télécharger le module'
])
@ -531,19 +528,19 @@ class plugin extends common
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]['version'],
template::flag($keyi18n, '20px') . '&nbsp<a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos[$keyi18n][$keyPage]['title'] . ' (' . $keyPage . ')</a>',
template::button('dataExport' . $keyPage, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/filemanager/' . self::$siteContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage,
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/filemanager/' . self::$i18nContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],
// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('download-cloud'),
'help' => 'Sauvegarder les données du module dans le gestionnaire de fichiers'
]),
template::button('dataExport' . $keyPage, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/download/' . self::$siteContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage,
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/download/' . self::$i18nContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],
// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('download'),
'help' => 'Sauvegarder et télécharger les données du module'
]),
template::button('dataDelete' . $keyPage, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataDelete/' . self::$siteContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage,
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataDelete/' . self::$i18nContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],
// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('trash'),
'class' => 'buttonRed dataDelete',
@ -569,15 +566,18 @@ class plugin extends common
*/
public function save()
{
// Action interdite
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
// Jeton incorrect
if ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'access' => false
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => helper::translate('Action interdite')
]);
} else {
// Créer un dossier temporaire
$tmpFolder = self::TEMP_DIR . uniqid() . '/';
$tmpFolder = self::TEMP_DIR . uniqid();
if (!is_dir($tmpFolder)) {
mkdir($tmpFolder, 0755);
}
@ -587,43 +587,273 @@ class plugin extends common
// Descripteur de l'archive
$infoModule = helper::getModules();
//Nom de l'archive
$fileName = $moduleId . str_replace('.', '-', $infoModule[$moduleId]['version']) . '.zip';
$fileName = $moduleId . $infoModule[$moduleId]['version'] . '.zip';
// Régénération du descripteur du module
$this->secure_file_put_contents(self::MODULE_DIR . $moduleId . '/enum.json', $infoModule[$moduleId]);
// Régénération du module
$success = file_put_contents(self::MODULE_DIR . $moduleId . '/enum.json', json_encode($infoModule[$moduleId], JSON_UNESCAPED_UNICODE));
// Construire l'archive
$this->makeZip($tmpFolder . $fileName, self::MODULE_DIR . $moduleId);
$this->makeZip(self::TEMP_DIR . $fileName, self::MODULE_DIR . $moduleId);
switch ($action) {
case 'filemanager':
if (is_dir(self::FILE_DIR . 'source/modules') === false) {
if (!file_exists(self::FILE_DIR . 'source/modules')) {
mkdir(self::FILE_DIR . 'source/modules');
}
$success = copy($tmpFolder . $fileName, self::FILE_DIR . 'source/modules/' . $fileName);
$success = $success && copy(self::TEMP_DIR . $fileName, self::FILE_DIR . 'source/modules/' . $moduleId . '.zip');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'notification' => $success ? helper::translate('Archive copiée dans le dossier Modules du gestionnaire de fichier') : helper::translate('Erreur de copie'),
'state' => $success
]);
// Nettoyage
unlink(self::TEMP_DIR . $fileName);
$this->removeDir($tmpFolder);
break;
case 'download':
default:
// Téléchargement du ZIP
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($tmpFolder . $fileName));
readfile($tmpFolder . $fileName);
header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName));
readfile(self::TEMP_DIR . $fileName);
// Nettoyage du dossier
unlink(self::TEMP_DIR . $fileName);
exit();
}
// Nettoyage
unlink(self::TEMP_DIR . $fileName);
$this->deleteDir($tmpFolder);
}
}
/*
* Détacher un module d'une page en supprimant les données du module
* 2 : i18n id
* 3 : moduleId
* 4 : pageId
* 5 : CSRF
*/
public function dataDelete()
{
// Jeton incorrect
if ($this->getUrl(5) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => helper::translate('Action interdite')
]);
} else {
$this->setData(['page', $this->getUrl(4), 'moduleId', '']);
$this->deleteData(['module', $this->getUrl(4)]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'notification' => sprintf(helper::translate('Le module %s de la page %s a été supprimé'), $this->getUrl(3), $this->getUrl(4)),
'state' => true
]);
}
}
/*
* Export des données d'un module
* Structure de l'adresse reçue
* 2 : i18n id
* 3 : moduleId
* 4 : pageId
* 5 : CSRF
*/
public function dataExport()
{
// Jeton incorrect
if ($this->getUrl(6) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => helper::translate('Action interdite')
]);
} else {
// Créer un dossier temporaire
$tmpFolder = self::TEMP_DIR . uniqid();
if (!is_dir($tmpFolder)) {
mkdir($tmpFolder, 0755);
}
$action = $this->getUrl(2);
$lang = $this->getUrl(3);
$moduleId = $this->getUrl(4);
$pageId = $this->getUrl(5);
// DOnnèes du module de la page sélectionnée
$moduleData = $this->getData(['module', $pageId]);
// Descripteur du module
$infoModules = helper::getModules();
$infoModule = $infoModules[$moduleId];
// Copier les données et le descripteur
$success = file_put_contents($tmpFolder . '/module.json', json_encode($moduleData, JSON_UNESCAPED_UNICODE)) === false ? false : true;
$success = $success && is_int(file_put_contents($tmpFolder . '/enum.json', json_encode([$moduleId => $infoModule], JSON_UNESCAPED_UNICODE)));
// Le dossier du module s'il existe
if (is_dir(self::DATA_DIR . $moduleId . '/' . $pageId)) {
// Copier le dossier des données
$success = $success && $this->copyDir(self::DATA_DIR . '/' . $moduleId . '/' . $pageId, $tmpFolder . '/dataDirectory');
}
// Création du zip
$fileName = $lang . '-' . $moduleId . '-' . $pageId . '.zip';
$this->makeZip(self::TEMP_DIR . $fileName, $tmpFolder);
// Gestion de l'action
if ($success) {
switch ($action) {
case 'filemanager':
if (!file_exists(self::FILE_DIR . 'source/modules')) {
mkdir(self::FILE_DIR . 'source/modules');
}
if (file_exists(self::TEMP_DIR . $fileName)) {
$success = $success && copy(self::TEMP_DIR . $fileName, self::FILE_DIR . 'source/modules/data' . $moduleId . '.zip');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'notification' => $success ? helper::translate('Données copiées dans le dossier Module du gestionnaire de fichier') : helper::translate('Erreur de copie'),
'state' => $success
]);
// Nettoyage
unlink(self::TEMP_DIR . $fileName);
$this->removeDir($tmpFolder);
}
break;
case 'download':
default:
if (file_exists(self::TEMP_DIR . $fileName)) {
// Téléchargement du ZIP
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName));
readfile(self::TEMP_DIR . $fileName);
// Nettoyage du dossier
unlink(self::TEMP_DIR . $fileName);
exit();
}
}
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'notification' => helper::translate('Erreur inconnue'),
'state' => false
]);
}
}
}
/*
* Importer des données d'un module externes ou interne à module.json
*/
public function dataImport()
{
// Soumission du formulaire d'importation du module dans une page libre
if ($this->isPost()) {
// Récupérer le fichier et le décompacter
$zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true);
$pageId = $this->getInput('pluginImportPage', null, true);
$tmpFolder = uniqid();
// Extraction dans un dossier temporaire
mkdir(self::TEMP_DIR . $tmpFolder, 0755);
$zip = new ZipArchive();
if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) {
$zip->extractTo(self::TEMP_DIR . $tmpFolder);
}
// Lire le descripteur
$descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tmpFolder . '/enum.json'), true);
$moduleId = array_key_first($descripteur);
// Lecture des données du module
$moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tmpFolder . '/module.json'), true);
// Chargement des données du module importé
$this->setData(['module', $pageId, $moduleData]);
// Intégration des données du module importé dans la page
$this->setData(['page', $pageId, 'moduleId', $moduleId]);
// Copie des fichiers d'accompagnement
// Le dossier du module s'il existe
if (is_dir($tmpFolder . '/dataDirectory')) {
// Copier le dossier des données
$this->copyDir($tmpFolder . '/dataDirectory', self::DATA_DIR . '/' . $moduleId . '/' . $pageId);
}
// Supprimer le dossier temporaire
$this->removeDir(self::TEMP_DIR . $tmpFolder);
$zip->close();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => true,
'notification' => helper::translate('Données importées')
]);
}
// Bouton d'importation des données d'un module spécifique
if (count(explode('/', $this->getUrl())) === 6) {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => helper::translate('Action interdite')
]);
}
// Traitement
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => true,
'notification' => helper::translate('Données importées')
]);
}
/**
* Liste des pages sans module
* et ne sont pas des barres latérales
*/
self::$pagesList = $this->getHierarchy(null, null, null);
foreach (self::$pagesList as $page => $value) {
if (
$this->getData(['page', $page, 'block']) === 'bar' ||
//$this->getData(['page',$page,'disable']) === true ||
$this->getData(['page', $page, 'moduleId']) !== ''
) {
unset(self::$pagesList[$page]);
} else {
self::$pagesList[$page] = $page;
}
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Importer des données de module'),
'view' => 'dataImport'
]);
}
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -0,0 +1,37 @@
<?php echo template::formOpen('pluginImportForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('pluginImportBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'plugin',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('pluginImportSubmit', [
'value' => 'Appliquer'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Installer les données d\'un module'); ?>
</h4>
<div class="row">
<div class="col6">
<?php echo template::file('pluginImportFile', [
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Archive ZIP',
'type' => 2
]); ?>
</div>
<div class="col6">
<?php echo template::select('pluginImportPage', $module::$pagesList, [
'label' => 'Importer dans' . template::flag('selected', '20px')
]); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -17,3 +17,31 @@
* admin.css
*/
/* Style the tab */
.tab {
margin-top: 1.8em;
overflow: hidden;
text-align: center;
}
.tab ~ .tabContent {
margin-top: -10px;
}
.buttonTab {
display: inline-block;
transition: 0.3s;
border-radius: 10px 10px 0px 0px;
width: 200px;
margin: 0 1px;
}
.buttonTab:hover {
filter: saturate(200%);
}
.activeButton {
background-color: #00BFFF;
}

View File

@ -0,0 +1,13 @@
/**
* This file is part of Zwii.
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
function setCookie(name,value,days){var expires="";if(days){var date=new Date;date.setTime(date.getTime()+24*days*60*60*1e3),expires="; expires="+date.toUTCString()}document.cookie=name+"="+(value||"")+expires+"; path=/; samesite=lax"}function getCookie(name){for(var nameEQ=name+"=",ca=document.cookie.split(";"),i=0;i<ca.length;i++){for(var c=ca[i];" "==c.charAt(0);)c=c.substring(1,c.length);if(0==c.indexOf(nameEQ))return c.substring(nameEQ.length,c.length)}return null}function capitalizeFirstLetter(string){return string.charAt(0).toUpperCase()+string.slice(1)}$(document).ready((function(){var pluginLayout=getCookie("pluginLayout");null==pluginLayout&&(pluginLayout="module",setCookie("pluginLayout","module")),console.log(pluginLayout),$("#moduleContainer").hide(),$("#dataContainer").hide(),$("#"+pluginLayout+"Container").show(),$("#plugin"+capitalizeFirstLetter(pluginLayout)+"Button").addClass("activeButton")})),$(".moduleDelete").on("click",(function(){var _this=$(this),message_delete="<?php echo helper::translate('Confirmer la désinstallation du module'); ?>";return core.confirm(message_delete,(function(){$(location).attr("href",_this.attr("href"))}))})),$(".dataDelete").on("click",(function(){var _this=$(this),message_unlink="<?php echo helper::translate('Confirmer la dissociation du module de cette page'); ?>";return core.confirm(message_unlink,(function(){$(location).attr("href",_this.attr("href"))}))})),$("#pluginModuleButton").on("click",(function(){$("#dataContainer").hide(),$("#moduleContainer").show(),$("#pluginModuleButton").addClass("activeButton"),$("#pluginDataButton").removeClass("activeButton"),setCookie("pluginLayout","module")})),$("#pluginDataButton").on("click",(function(){$("#moduleContainer").hide(),$("#dataContainer").show(),$("#pluginModuleButton").removeClass("activeButton"),$("#pluginDataButton").addClass("activeButton"),setCookie("pluginLayout","data")}));

View File

@ -3,17 +3,17 @@
<?php echo template::button('configModulesBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(),
'value' => template::ico('home')
'value' => template::ico('left')
]); ?>
</div>
<div class="col1">
<?php /**echo template::button('pluginHelp', [
'href' => 'https://doc.zwiicms.fr/gestion-des-modules',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]);*/?>
'href' => 'https://doc.zwiicms.fr/gestion-des-modules',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]);*/ ?>
</div>
<div class="col1 offset8">
<?php echo template::button('pluginModulesStore', [
@ -30,31 +30,70 @@
]); ?>
</div>
</div>
<?php if ($module::$modulesInstalled): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Sauvegarde'); ?>
</h4>
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
<div class="tab">
<?php echo template::button('pluginModuleButton', [
'value' => 'Modules installés',
'class' => ' buttonTab'
]); ?>
<?php echo template::button('pluginDataButton', [
'value' => 'Données des modules',
'class' => 'buttonTab'
]); ?>
</div>
<div class="tabContent" id="moduleContainer">
<?php if ($module::$modulesInstalled) : ?>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Sauvegarde'); ?>
</h4>
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
</div>
</div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Aucun module installé.'); ?>
<?php endif; ?>
<?php if ($module::$modulesOrphan): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Modules orphelins'); ?>
</h4>
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
<?php else : ?>
<?php echo template::speech('Aucun module installé.'); ?>
<?php endif; ?>
<?php if ($module::$modulesOrphan) : ?>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Modules orphelins'); ?>
</h4>
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
</div>
</div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Aucun module orphelin.'); ?>
<?php endif; ?>
<?php else : ?>
<?php echo template::speech('Aucun module orphelin.'); ?>
<?php endif; ?>
</div>
<div class="tabContent displayNone" id="dataContainer">
<?php if ($module::$modulesData) : ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Modules configurés'); ?>
</h4>
<div class="row">
<div class="col1 offset11">
<?php echo template::button('configModuledataImport', [
'href' => helper::baseUrl() . 'plugin/dataImport',
'value' => template::ico('upload'),
"help" => 'Importer des données de module dans une page libre'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::table([4, 1, 4, 1, 1, 1], $module::$modulesData, ['Module', 'Version', 'Page associée', '', '', '']); ?>
</div>
</div>
</div>
</div>
</div>
<?php else : ?>
<?php echo template::speech('Aucune donnée de module.'); ?>
<?php endif; ?>
</div>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -21,7 +21,7 @@
</div>
<div class="row">
<div class="col12 textAlignCenter">
&nbsp;<?php echo helper::translate('date') . '&nbsp;' . $module::$storeItem['fileDate']; ?>
&nbsp;<?php echo helper::translate('du') . '&nbsp;' . $module::$storeItem['fileDate']; ?>
</div>
</div>
<div class="row">
@ -35,7 +35,7 @@
<div class="row">
<div class="col12 textAlignCenter">
<span>
<?php echo helper::translate('Licence'); ?>
<?php echo helper::translate('Licence :'); ?>
&nbsp;
<?php echo $module::$storeItem['fileLicense']; ?>
</span>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -9,19 +9,4 @@
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$("input, select").on("change", (function () {
var titleFont = $("#adminFontTitle").val(),
textFont = $("#adminFontText").val(),
css = "@import url('https://fonts.cdnfonts.com/css/" + titleFont + "');",
css = "@import url('https://fonts.cdnfonts.com/css/" + textFont + "');",
colors, css = "#site{background-color:" + (colors = core.colorVariants($("#adminBackgroundColor").val())).normal + ";}",
colors, colors, colors, colors;
css += "body, .row > div {font:" + $("#adminFontTextSize").val() + " '" + textFont + "', sans-serif;}", css += "body h1, h2, h3, h4, h5, h6 {font-family:'" + titleFont + "', sans-serif; color:" + $("#adminColorTitle").val() + ";}", css += "body:not(.editorWysiwyg),span .zwiico-help {color:" + $("#adminColorText").val() + ";}", css += "input[type='checkbox']:checked + label::before,.speechBubble{ background-color:" + (colors = core.colorVariants($("#adminColorButton").val())).normal + ";}", css += ".speechBubble::before {border-color:" + colors.normal + " transparent transparent transparent;}", css += ".button {background-color:" + colors.normal + ";color:" + colors.text + ";}.button:hover {background-color:" + colors.darken + ";color:" + colors.text + ";}.button:active {background-color:" + colors.veryDarken + ";color:" + colors.text + ";}", css += ".button.buttonGrey {background-color: " + (colors = core.colorVariants($("#adminColorGrey").val())).normal + ";color:" + colors.text + ";}.button.buttonGrey:hover {background-color:" + colors.darken + ";color:" + colors.text + "}.button.buttonGrey:active {background-color:" + colors.veryDarken + ";color:" + colors.text + ";}", css += ".button.buttonRed {background-color: " + (colors = core.colorVariants($("#adminColorRed").val())).normal + ";color:" + colors.text + ";}.button.buttonRed:hover {background-color:" + colors.darken + ";color:" + colors.text + "}.button.buttonRed:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}", css += ".button.buttonGreen, button[type=submit] {background-color: " + (colors = core.colorVariants($("#adminColorGreen").val())).normal + ";color: ;color:" + colors.text + "}.button.buttonGreen:hover, button[type=submit]:hover {background-color: " + colors.darken + ";color:" + colors.text + ";}.button.buttonGreen:active, button[type=submit]:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}";
var colors = core.colorVariants($("#adminBackGroundBlockColor").val());
css += ".block {border: 1px solid " + $("#adminBorderBlockColor").val() + ";}.block h4 {background-color: " + colors.normal + ";color:" + colors.text + ";}", css += "input[type=email],input[type=text],input[type=password],select:not(#bar select),textarea:not(.editorWysiwyg),.inputFile{background-color: " + colors.normal + ";color:" + colors.text + ";border: 1px solid " + $("#adminBorderBlockColor").val() + ";}", $("#themePreview").remove(), $("<style>").attr("type", "text/css").attr("id", "themePreview").text(css).appendTo("head")
})), $("#configAdminReset").on("click", (function () {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine le thème de l'administration ?", (function () {
$(location).attr("href", _this.attr("href"))
}))
}));
$("input, select").on("change",(function(){var titleFont=$("#adminFontTitle").val(),textFont=$("#adminFontText").val(),css="@import url('https://fonts.cdnfonts.com/css/"+titleFont+"');",css="@import url('https://fonts.cdnfonts.com/css/"+textFont+"');",colors,css="#site{background-color:"+(colors=core.colorVariants($("#adminBackgroundColor").val())).normal+";}",colors,colors,colors,colors;css+="body, .row > div {font:"+$("#adminFontTextSize").val()+" '"+textFont+"', sans-serif;}",css+="body h1, h2, h3, h4, h5, h6 {font-family:'"+titleFont+"', sans-serif; color:"+$("#adminColorTitle").val()+";}",css+="body:not(.editorWysiwyg),span .zwiico-help {color:"+$("#adminColorText").val()+";}",css+="input[type='checkbox']:checked + label::before,.speechBubble{ background-color:"+(colors=core.colorVariants($("#adminColorButton").val())).normal+"; color:"+$("#adminColorButtonText").val()+";}",css+=".speechBubble::before {border-color:"+colors.normal+" transparent transparent transparent;}",css+=".button {background-color:"+colors.normal+";color:"+colors.text+";}.button:hover {background-color:"+colors.darken+";color:"+colors.text+";}.button:active {background-color:"+colors.veryDarken+";color:"+colors.text+";}",css+=".button.buttonGrey {background-color: "+(colors=core.colorVariants($("#adminColorGrey").val())).normal+";color:"+colors.text+";}.button.buttonGrey:hover {background-color:"+colors.darken+";color:"+colors.text+"}.button.buttonGrey:active {background-color:"+colors.veryDarken+";color:"+colors.text+";}",css+=".button.buttonRed {background-color: "+(colors=core.colorVariants($("#adminColorRed").val())).normal+";color:"+colors.text+";}.button.buttonRed:hover {background-color:"+colors.darken+";color:"+colors.text+"}.button.buttonRed:active {background-color:"+colors.veryDarken+";color:"+colors.text+"}",css+=".button.buttonGreen, button[type=submit] {background-color: "+(colors=core.colorVariants($("#adminColorGreen").val())).normal+";color: ;color:"+colors.text+"}.button.buttonGreen:hover, button[type=submit]:hover {background-color: "+colors.darken+";color:"+colors.text+";}.button.buttonGreen:active, button[type=submit]:active {background-color:"+colors.veryDarken+";color:"+colors.text+"}";var colors=core.colorVariants($("#adminBackGroundBlockColor").val());css+=".block {border: 1px solid "+$("#adminBorderBlockColor").val()+";}.block h4 {background-color: "+colors.normal+";color:"+colors.text+";}",css+="input[type=email],input[type=text],input[type=password],select:not(#bar select),textarea:not(.editorWysiwyg),.inputFile{background-color: "+colors.normal+";color:"+colors.text+";border: 1px solid "+$("#adminBorderBlockColor").val()+";}",$("#themePreview").remove(),$("<style>").attr("type","text/css").attr("id","themePreview").text(css).appendTo("head")})),$("#configAdminReset").on("click",(function(){var _this=$(this);return core.confirm("Êtes-vous sûr de vouloir réinitialiser à son état d'origine le thème de l'administration ?",(function(){$(location).attr("href",_this.attr("href"))}))}));

View File

@ -17,7 +17,7 @@
<div class="col1 offset8">
<?php echo template::button('configAdminReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'theme/reset/admin',
'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'],
'value' => template::ico('cancel'),
'help' => 'Réinitialiser avec le thème par défaut'
]); ?>
@ -32,16 +32,10 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres'); ?>
<h4><?php echo helper::translate('Couleurs'); ?>
</h4>
<div class="row">
<div class="col3">
<?php echo template::select('adminSiteWidth', $module::$siteWidths, [
'label' => 'Largeur',
'selected' => $this->getData(['admin', 'width'])
]); ?>
</div>
<div class="col3">
<div class="col4">
<?php echo template::text('adminBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
@ -49,7 +43,7 @@
'value' => $this->getData(['admin', 'backgroundColor'])
]); ?>
</div>
<div class="col3">
<div class="col4">
<?php echo template::text('adminColorTitle', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
@ -57,7 +51,7 @@
'value' => $this->getData(['admin', 'colorTitle'])
]); ?>
</div>
<div class="col3">
<div class="col4">
<?php echo template::text('adminColorText', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
@ -83,7 +77,7 @@
'value' => $this->getData(['admin', 'borderBlockColor'])
]); ?>
</div>
<div class="col4">
<div class="col3 offset1">
<?php echo template::text('adminColorHelp', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
@ -139,7 +133,7 @@
<?php echo template::select('adminFontText', $module::$fonts['name'], [
'label' => 'Police du texte',
'selected' => $this->getData(['admin', 'fontText']),
'font' => $module::$fonts['family']
'fonts' => $module::$fonts['family']
]); ?>
</div>
<div class="col4">
@ -152,7 +146,7 @@
<?php echo template::select('adminFontTitle', $module::$fonts['name'], [
'label' => 'Police des titres',
'selected' => $this->getData(['admin', 'fontTitle']),
'font' => $module::$fonts['family']
'fonts' => $module::$fonts['family']
]); ?>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

Some files were not shown because too many files have changed in this diff Show More