ZwiiCMS/core/module/translate/translate.php

424 lines
17 KiB
PHP
Raw Normal View History

2020-11-11 19:48:07 +01:00
<?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
2021-02-17 13:49:58 +01:00
* @author Frédéric Tempez <frederic.tempez@outlook.com>
2021-12-18 10:25:33 +01:00
* @copyright Copyright (C) 2018-2022, Frédéric Tempez
2020-11-11 19:48:07 +01:00
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
class translate extends common {
public static $actions = [
2021-06-04 13:57:44 +02:00
'index' => self::GROUP_ADMIN,
'copy' => self::GROUP_ADMIN,
2022-09-26 14:54:15 +02:00
'add' => self::GROUP_ADMIN, // Ajouter une langue de contenu
'edit' => self::GROUP_ADMIN, // Editer une langue de contenu
'delete' => self::GROUP_ADMIN, // Effacer une langue de contenu
2022-09-26 16:30:40 +02:00
'i18n' => self::GROUP_VISITOR,
2020-11-11 19:48:07 +01:00
];
2020-11-26 08:59:04 +01:00
2022-09-27 11:25:05 +02:00
// Language contents
2021-06-04 13:57:44 +02:00
public static $translateOptions = [];
// Page pour la configuration dans la langue
public static $pagesList = [];
public static $orphansList = [];
2021-06-04 13:57:44 +02:00
// Liste des langues installées
public static $languagesInstalled = [];
// Liste des langues cibles
public static $languagesTarget = [];
// Activation du bouton de copie
public static $siteTranslate = true;
2022-09-27 11:25:05 +02:00
// Localisation en cours d'édition
public static $locales = [];
2021-06-04 13:57:44 +02:00
//UI
2022-09-21 09:53:50 +02:00
// Fichiers des langues de l'interface
public static $i18nFiles = [];
2021-06-04 13:57:44 +02:00
/**
* Configuration avancée des langues
*/
public function copy() {
// Soumission du formulaire
if ($this->isPost()) {
// Initialisation
$success = false;
$copyFrom = $this->getInput('translateFormCopySource');
$toCreate = $this->getInput('translateFormCopyTarget');
if ($copyFrom !== $toCreate) {
// Création du dossier
if (is_dir(self::DATA_DIR . $toCreate) === false ) { // Si le dossier est déjà créé
$success = mkdir (self::DATA_DIR . $toCreate, 0755);
2021-11-02 12:53:55 +01:00
$success = mkdir (self::DATA_DIR . $toCreate.'/content', 0755);
2021-06-04 13:57:44 +02:00
} else {
$success = true;
}
// Copier les données par défaut avec gestion des erreurs
$success = (copy (self::DATA_DIR . $copyFrom . '/locale.json', self::DATA_DIR . $toCreate . '/locale.json') === true && $success === true) ? true : false;
$success = (copy (self::DATA_DIR . $copyFrom . '/module.json', self::DATA_DIR . $toCreate . '/module.json') === true && $success === true) ? true : false;
$success = (copy (self::DATA_DIR . $copyFrom . '/page.json', self::DATA_DIR . $toCreate . '/page.json') === true && $success === true) ? true : false;
2021-11-02 12:53:55 +01:00
$success = ($this->copyDir (self::DATA_DIR . $copyFrom . '/content', self::DATA_DIR . $toCreate . '/content') === true && $success === true) ? true : false;
2021-06-04 13:57:44 +02:00
// Enregistrer la langue
if ($success) {
$this->setData(['config', 'i18n', $toCreate, 'site' ]);
2022-09-26 14:54:15 +02:00
$notification = 'Données ' . self::$languages[$copyFrom] . ' copiées vers ' . self::$languages[$toCreate];
2021-06-04 13:57:44 +02:00
} else {
$notification = "Quelque chose n\'a pas fonctionné, vérifiez les permissions.";
}
} else {
$success = false;
$notification = 'Les langues doivent être différentes.';
}
// Valeurs en sortie
$this->addOutput([
'notification' => $notification,
'title' => 'Utilitaire de copie',
'view' => 'index',
'state' => $success
]);
}
// Tableau des langues installées
2022-09-26 14:54:15 +02:00
foreach (self::$languages as $key => $value) {
2021-06-04 13:57:44 +02:00
if ($this->getData(['config','i18n', $key]) === 'site') {
self::$languagesTarget[$key] = $value;
}
}
// Langues cibles fr en plus
self::$languagesInstalled = array_merge(['fr' => 'Français (fr)'],self::$languagesTarget);
// Valeurs en sortie
$this->addOutput([
'title' => 'Utilitaire de copie',
'view' => 'copy'
]);
}
2020-11-11 19:48:07 +01:00
/**
* Configuration
*/
public function index() {
2020-11-25 08:21:52 +01:00
2020-11-11 19:48:07 +01:00
// Soumission du formulaire
if($this->isPost()) {
2021-06-18 19:50:41 +02:00
2022-09-26 14:54:15 +02:00
// Sauvegarder les langues de contenu
$this->setData(['config', 'i18n','interface', $this->getInput('translateUI')]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
// Préparation du formulaire
// -------------------------
2022-09-26 16:30:40 +02:00
// Onglet des langues de contenu
2022-09-26 14:54:15 +02:00
foreach (self::$languages as $keyi18n => $value) {
// tableau des langues installées
if (is_dir(self::DATA_DIR . $keyi18n) ) {
self::$languagesInstalled [] = [
2022-09-26 16:30:40 +02:00
$value . ' (' . $keyi18n . ')' ,
self::$i18nUI === $keyi18n ? '(langue de l\'interface)' : '',
'',
2022-09-26 14:54:15 +02:00
template::button('translateContentLanguageEdit' . $keyi18n, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $keyi18n. '/' . $_SESSION['csrf'],
'value' => template::ico('flag'),
2022-09-26 14:54:15 +02:00
'help' => 'Editer les locales'
]),
template::button('translateContentLanguageDelete' .$keyi18n, [
'class' => 'translateDelete buttonRed' . (self::$i18nUI === $keyi18n ? ' disabled' : '') ,
2022-09-26 14:54:15 +02:00
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $keyi18n . '/' . $_SESSION['csrf'],
'value' => template::ico('trash'),
'help' => 'Supprimer cette langue'
])
];
}
2022-09-26 16:30:40 +02:00
}
2022-09-26 14:54:15 +02:00
2022-09-26 16:30:40 +02:00
// Langues de l'UI disponibles
2022-09-26 14:54:15 +02:00
if (is_dir(self::I18N_DIR)) {
$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')];
}
}
2022-09-26 14:54:15 +02:00
chdir($dir);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Multilangues',
'view' => 'index'
]);
}
2021-06-18 21:10:16 +02:00
2022-09-26 14:54:15 +02:00
/***
* Ajouter une langue de contenu
2022-09-26 14:54:15 +02:00
*/
public function add() {
// Soumission du formulaire
if($this->isPost()) {
// Sauvegarder les locales
$this->setData([
'locale',
[
'homePageId' => $this->getInput('localeHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('localePage404'),
'page403' => $this->getInput('localePage403'),
'page302' => $this->getInput('localePage302'),
'legalPageId' => $this->getInput('localeLegalPageId'),
'searchPageId' => $this->getInput('localeSearchPageId'),
'searchPageLabel' => empty($this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('localeMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('localeTitle', helper::FILTER_STRING_SHORT, true),
'cookies' => [
// Les champs sont obligatoires si l'option consentement des cookies est active
'mainLabel' => $this->getInput('localeCookiesZwiiText', helper::FILTER_STRING_LONG, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'titleLabel' => $this->getInput('localeCookiesTitleText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'linkLegalLabel' => $this->getInput('localeCookiesLinkMlText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'cookiesFooterText' => $this->getInput('localeCookiesFooterText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'buttonValidLabel' =>$this->getInput('localeCookiesButtonText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN))
]
]
]);
2020-11-11 19:48:07 +01:00
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
2022-09-26 14:54:15 +02:00
// Préparation de l'affichage du formulaire
2022-09-24 18:06:32 +02:00
//-----------------------------------------
2022-09-26 14:54:15 +02:00
// Générer la liste des pages disponibles
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset(self::$pagesList[$page]);
}
}
2022-09-26 14:54:15 +02:00
self::$orphansList = $this->getData(['page']);
foreach(self::$orphansList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
unset(self::$orphansList[$page]);
2021-06-04 13:57:44 +02:00
}
}
2022-09-26 14:54:15 +02:00
// Valeurs en sortie
$this->addOutput([
'title' => 'Ajouter',
'view' => 'add'
]);
}
public function edit() {
// Jeton incorrect ou URl avec le code langue incorrecte
if ( $this->getUrl(3) !== $_SESSION['csrf']
|| !array_key_exists($this->getUrl(2), self::$languages)
) {
2022-09-27 11:25:05 +02:00
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'translate',
'state' => false,
'notification' => 'Action non autorisée'
]);
}
2022-09-26 14:54:15 +02:00
// Soumission du formulaire
if($this->isPost()) {
// Sauvegarder les locales si identique à la langue de l'UI
if ( $this->getUrl(2) === self::$i18nUI ) {
// Enregistrer les données par lecture directe du formulaire
$this->setData([
'locale',
[
'homePageId' => $this->getInput('localeHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('localePage404'),
'page403' => $this->getInput('localePage403'),
'page302' => $this->getInput('localePage302'),
'legalPageId' => $this->getInput('localeLegalPageId'),
'searchPageId' => $this->getInput('localeSearchPageId'),
'searchPageLabel' => empty($this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('localeMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('localeTitle', helper::FILTER_STRING_SHORT, true),
'cookies' => [
// Les champs sont obligatoires si l'option consentement des cookies est active
'mainLabel' => $this->getInput('localeCookiesZwiiText', helper::FILTER_STRING_LONG, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'titleLabel' => $this->getInput('localeCookiesTitleText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'linkLegalLabel' => $this->getInput('localeCookiesLinkMlText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'cookiesFooterText' => $this->getInput('localeCookiesFooterText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'buttonValidLabel' =>$this->getInput('localeCookiesButtonText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN))
]
2022-09-26 14:54:15 +02:00
]
]);
} else {
$data = ['locale' => [
'homePageId' => $this->getInput('localeHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('localePage404'),
'page403' => $this->getInput('localePage403'),
'page302' => $this->getInput('localePage302'),
'legalPageId' => $this->getInput('localeLegalPageId'),
'searchPageId' => $this->getInput('localeSearchPageId'),
'searchPageLabel' => empty($this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('localeMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('localeTitle', helper::FILTER_STRING_SHORT, true),
'cookies' => [
// Les champs sont obligatoires si l'option consentement des cookies est active
'mainLabel' => $this->getInput('localeCookiesZwiiText', helper::FILTER_STRING_LONG, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'titleLabel' => $this->getInput('localeCookiesTitleText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'linkLegalLabel' => $this->getInput('localeCookiesLinkMlText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'cookiesFooterText' => $this->getInput('localeCookiesFooterText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN)),
'buttonValidLabel' =>$this->getInput('localeCookiesButtonText', helper::FILTER_STRING_SHORT, $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN))
]
]
];
// Sauver sur le disque
file_put_contents (self::DATA_DIR . $this->getUrl(2) . '/locale.json', json_encode($data, JSON_UNESCAPED_UNICODE), LOCK_EX);
}
2022-09-26 14:54:15 +02:00
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
// Préparation de l'affichage du formulaire
//-----------------------------------------
2022-09-27 11:25:05 +02:00
// Récupération des locales de la langue sélectionnée
// Vérifier la conformité de l'URL
if ( !array_key_exists($this->getUrl(2), self::$languages)) {
2022-09-27 11:25:05 +02:00
// Bidouillage de l'URL, on sort
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'translate',
'notification' => 'URL incorrecte',
'state' => false
]);
}
//Lecture des données pour transmission au formulaire
// La locale est-elle celle de la langue de l'UI ?
if ( $this->getUrl(2) === self::$i18nUI) {
self::$locales [$this->getUrl(2)]['locale'] = $this->getData(['locale']);
} else {
// Lire les locales sans passer par les méthodes
self::$locales [$this->getUrl(2)] = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/locale.json'), true);
}
2022-09-27 11:25:05 +02:00
2022-09-21 15:09:13 +02:00
// Générer la liste des pages disponibles
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset(self::$pagesList[$page]);
}
}
self::$orphansList = $this->getData(['page']);
foreach(self::$orphansList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
unset(self::$orphansList[$page]);
}
}
2022-09-26 14:54:15 +02:00
2020-11-11 19:48:07 +01:00
// Valeurs en sortie
$this->addOutput([
2022-09-27 11:25:05 +02:00
'title' => 'Paramètres de la localisation ' . self::$languages[$this->getUrl(2)],
2022-09-26 14:54:15 +02:00
'view' => 'edit'
2020-11-11 19:48:07 +01:00
]);
2020-11-22 13:32:20 +01:00
}
2022-09-26 14:54:15 +02:00
/***
2022-09-26 16:30:40 +02:00
* Effacer une langue de contenu
2022-09-26 14:54:15 +02:00
*/
public function delete() {
// Jeton incorrect ou URl avec le code langue incorrecte
if ( $this->getUrl(3) !== $_SESSION['csrf']
|| !array_key_exists($this->getUrl(2), self::$languages) ) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'translate',
'state' => false,
'notification' => 'Action non autorisée'
]);
}
// Effacement d'une langue installée
if ( is_dir( self::DATA_DIR . $this->getUrl(2) ) === true ) {
$success = $this->removeDir( self::DATA_DIR . $this->getUrl(2));
2022-09-26 14:54:15 +02:00
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'translate',
'notification' => $success ? 'La traduction a été supprimée' : 'Une erreur s\'est produite',
'state' => $success
]);
2022-09-26 14:54:15 +02:00
}
2021-06-04 13:57:44 +02:00
/*
* Traitement du changement de langue
* Fonction utilisée par le noyau
*/
public function i18n() {
2021-06-04 13:57:44 +02:00
2021-06-18 19:50:41 +02:00
// Activation du drapeau
2021-06-04 13:57:44 +02:00
if ( $this->getInput('ZWII_I18N_' . strtoupper($this->getUrl(3))) !== $this->getUrl(2) ) {
// Nettoyer et stocker le choix de l'utilisateur
helper::deleteCookie('ZWII_I18N_SITE');
// Sélectionner
2021-06-18 19:50:41 +02:00
setcookie('ZWII_I18N_' . strtoupper($this->getUrl(3)) , $this->getUrl(2), time() + 3600, helper::baseUrl(false, false) , '', helper::isHttps(), true);
2021-06-04 13:57:44 +02:00
// Désactivation du drapeau, langue FR par défaut
} else {
setcookie('ZWII_I18N_SITE' , 'fr', time() + 3600, helper::baseUrl(false, false) , '', helper::isHttps(), true);
}
// Valeurs en sortie
2020-11-24 11:12:33 +01:00
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getData(['locale', $this->getUrl(2), 'homePageId' ])
2020-11-24 11:12:33 +01:00
]);
2020-11-22 13:32:20 +01:00
}
2020-11-11 19:48:07 +01:00
}