class Akismet_REST_API { /** * Register the REST API routes. */ public static function init() { if ( ! function_exists( 'register_rest_route' ) ) { // The REST API wasn't integrated into core until 4.4, and we support 4.0+ (for now). return false; } register_rest_route( 'akismet/v1', '/key', array( array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_key' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'set_key' ), 'args' => array( 'key' => array( 'required' => true, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'delete_key' ), ) ) ); register_rest_route( 'akismet/v1', '/settings/', array( array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_settings' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'set_boolean_settings' ), 'args' => array( 'akismet_strictness' => array( 'required' => false, 'type' => 'boolean', 'description' => __( 'If true, Akismet will automatically discard the worst spam automatically rather than putting it in the spam folder.', 'akismet' ), ), 'akismet_show_user_comments_approved' => array( 'required' => false, 'type' => 'boolean', 'description' => __( 'If true, show the number of approved comments beside each comment author in the comments list page.', 'akismet' ), ), ), ) ) ); register_rest_route( 'akismet/v1', '/stats', array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_stats' ), 'args' => array( 'interval' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_interval' ), 'description' => __( 'The time period for which to retrieve stats. Options: 60-days, 6-months, all', 'akismet' ), 'default' => 'all', ), ), ) ); register_rest_route( 'akismet/v1', '/stats/(?P[\w+])', array( 'args' => array( 'interval' => array( 'description' => __( 'The time period for which to retrieve stats. Options: 60-days, 6-months, all', 'akismet' ), 'type' => 'string', ), ), array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_stats' ), ) ) ); register_rest_route( 'akismet/v1', '/alert', array( array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_alert' ), 'args' => array( 'key' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'set_alert' ), 'args' => array( 'key' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'delete_alert' ), 'args' => array( 'key' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ) ) ); } /** * Get the current Akismet API key. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_key( $request = null ) { return rest_ensure_response( Akismet::get_api_key() ); } /** * Set the API key, if possible. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function set_key( $request ) { if ( defined( 'WPCOM_API_KEY' ) ) { return rest_ensure_response( new WP_Error( 'hardcoded_key', __( 'This site\'s API key is hardcoded and cannot be changed via the API.', 'akismet' ), array( 'status'=> 409 ) ) ); } $new_api_key = $request->get_param( 'key' ); if ( ! self::key_is_valid( $new_api_key ) ) { return rest_ensure_response( new WP_Error( 'invalid_key', __( 'The value provided is not a valid and registered API key.', 'akismet' ), array( 'status' => 400 ) ) ); } update_option( 'wordpress_api_key', $new_api_key ); return self::get_key(); } /** * Unset the API key, if possible. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function delete_key( $request ) { if ( defined( 'WPCOM_API_KEY' ) ) { return rest_ensure_response( new WP_Error( 'hardcoded_key', __( 'This site\'s API key is hardcoded and cannot be deleted.', 'akismet' ), array( 'status'=> 409 ) ) ); } delete_option( 'wordpress_api_key' ); return rest_ensure_response( true ); } /** * Get the Akismet settings. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_settings( $request = null ) { return rest_ensure_response( array( 'akismet_strictness' => ( get_option( 'akismet_strictness', '1' ) === '1' ), 'akismet_show_user_comments_approved' => ( get_option( 'akismet_show_user_comments_approved', '1' ) === '1' ), ) ); } /** * Update the Akismet settings. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function set_boolean_settings( $request ) { foreach ( array( 'akismet_strictness', 'akismet_show_user_comments_approved', ) as $setting_key ) { $setting_value = $request->get_param( $setting_key ); if ( is_null( $setting_value ) ) { // This setting was not specified. continue; } // From 4.7+, WP core will ensure that these are always boolean // values because they are registered with 'type' => 'boolean', // but we need to do this ourselves for prior versions. $setting_value = Akismet_REST_API::parse_boolean( $setting_value ); update_option( $setting_key, $setting_value ? '1' : '0' ); } return self::get_settings(); } /** * Parse a numeric or string boolean value into a boolean. * * @param mixed $value The value to convert into a boolean. * @return bool The converted value. */ public static function parse_boolean( $value ) { switch ( $value ) { case true: case 'true': case '1': case 1: return true; case false: case 'false': case '0': case 0: return false; default: return (bool) $value; } } /** * Get the Akismet stats for a given time period. * * Possible `interval` values: * - all * - 60-days * - 6-months * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_stats( $request ) { $api_key = Akismet::get_api_key(); $interval = $request->get_param( 'interval' ); $stat_totals = array(); $response = Akismet::http_post( Akismet::build_query( array( 'blog' => get_option( 'home' ), 'key' => $api_key, 'from' => $interval ) ), 'get-stats' ); if ( ! empty( $response[1] ) ) { $stat_totals[$interval] = json_decode( $response[1] ); } return rest_ensure_response( $stat_totals ); } /** * Get the current alert code and message. Alert codes are used to notify the site owner * if there's a problem, like a connection issue between their site and the Akismet API, * invalid requests being sent, etc. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_alert( $request ) { return rest_ensure_response( array( 'code' => get_option( 'akismet_alert_code' ), 'message' => get_option( 'akismet_alert_msg' ), ) ); } /** * Update the current alert code and message by triggering a call to the Akismet server. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function set_alert( $request ) { delete_option( 'akismet_alert_code' ); delete_option( 'akismet_alert_msg' ); // Make a request so the most recent alert code and message are retrieved. Akismet::verify_key( Akismet::get_api_key() ); return self::get_alert( $request ); } /** * Clear the current alert code and message. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function delete_alert( $request ) { delete_option( 'akismet_alert_code' ); delete_option( 'akismet_alert_msg' ); return self::get_alert( $request ); } private static function key_is_valid( $key ) { $response = Akismet::http_post( Akismet::build_query( array( 'key' => $key, 'blog' => get_option( 'home' ) ) ), 'verify-key' ); if ( $response[1] == 'valid' ) { return true; } return false; } public static function privileged_permission_callback() { return current_user_can( 'manage_options' ); } /** * For calls that Akismet.com makes to the site to clear outdated alert codes, use the API key for authorization. */ public static function remote_call_permission_callback( $request ) { $local_key = Akismet::get_api_key(); return $local_key && ( strtolower( $request->get_param( 'key' ) ) === strtolower( $local_key ) ); } public static function sanitize_interval( $interval, $request, $param ) { $interval = trim( $interval ); $valid_intervals = array( '60-days', '6-months', 'all', ); if ( ! in_array( $interval, $valid_intervals ) ) { $interval = 'all'; } return $interval; } public static function sanitize_key( $key, $request, $param ) { return trim( $key ); } } /** * française translation * @author Régis Guyomarch * @author Benoit Delachaux * @author Jonathan Grunder * @version 2023-04-16 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.fr = { translator : 'Régis Guyomarch <regisg@gmail.com>, Benoit Delachaux <benorde33@gmail.com>, Jonathan Grunder <jonathan.grunder@gmail.com>', language : 'française', direction : 'ltr', dateFormat : 'd/M/Y H:i', // will show like: 16/Avr/2023 12:36 fancyDateFormat : '$1 H:i', // will show like: Aujourd'hui 12:36 nonameDateFormat : 'ymd-His', // noname upload will show like: 230416-123657 messages : { /********************************** errors **********************************/ 'error' : 'Erreur', 'errUnknown' : 'Erreur inconnue.', 'errUnknownCmd' : 'Commande inconnue.', 'errJqui' : 'Mauvaise configuration de jQuery UI. Les composants Selectable, draggable et droppable doivent être inclus.', 'errNode' : 'elFinder requiert que l\'élément DOM ait été créé.', 'errURL' : 'Mauvaise configuration d\'elFinder ! L\'option URL n\'a pas été définie.', 'errAccess' : 'Accès refusé.', 'errConnect' : 'Impossible de se connecter au backend.', 'errAbort' : 'Connexion interrompue.', 'errTimeout' : 'Délai de connexion dépassé.', 'errNotFound' : 'Backend non trouvé.', 'errResponse' : 'Mauvaise réponse du backend.', 'errConf' : 'Mauvaise configuration du backend.', 'errJSON' : 'Le module PHP JSON n\'est pas installé.', 'errNoVolumes' : 'Aucun volume lisible.', 'errCmdParams' : 'Mauvais paramétrage de la commande "$1".', 'errDataNotJSON' : 'Les données ne sont pas au format JSON.', 'errDataEmpty' : 'Données inexistantes.', 'errCmdReq' : 'La requête au Backend doit comporter le nom de la commande.', 'errOpen' : 'Impossible d\'ouvrir "$1".', 'errNotFolder' : 'Cet objet n\'est pas un dossier.', 'errNotFile' : 'Cet objet n\'est pas un fichier.', 'errRead' : 'Impossible de lire "$1".', 'errWrite' : 'Impossible d\'écrire dans "$1".', 'errPerm' : 'Permission refusée.', 'errLocked' : '"$1" est verrouillé et ne peut être déplacé ou supprimé.', 'errExists' : 'Un élément nommé "$1" existe déjà.', 'errInvName' : 'Nom de fichier incorrect.', 'errInvDirname' : 'Nom de dossier incorrect.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Dossier non trouvé.', 'errFileNotFound' : 'Fichier non trouvé.', 'errTrgFolderNotFound' : 'Dossier destination "$1" non trouvé.', 'errPopup' : 'Le navigateur web a empêché l\'ouverture d\'une fenêtre "popup". Pour ouvrir le fichier, modifiez les options du navigateur web.', 'errMkdir' : 'Impossible de créer le dossier "$1".', 'errMkfile' : 'Impossible de créer le fichier "$1".', 'errRename' : 'Impossible de renommer "$1".', 'errCopyFrom' : 'Interdiction de copier des fichiers depuis le volume "$1".', 'errCopyTo' : 'Interdiction de copier des fichiers vers le volume "$1".', 'errMkOutLink' : 'Impossible de créer un lien en dehors du volume principal.', // from v2.1 added 03.10.2015 'errUpload' : 'Erreur lors de l\'envoi du fichier.', // old name - errUploadCommon 'errUploadFile' : 'Impossible d\'envoyer "$1".', // old name - errUpload 'errUploadNoFiles' : 'Aucun fichier à envoyer.', 'errUploadTotalSize' : 'Les données dépassent la taille maximale allouée.', // old name - errMaxSize 'errUploadFileSize' : 'Le fichier dépasse la taille maximale allouée.', // old name - errFileMaxSize 'errUploadMime' : 'Type de fichier non autorisé.', 'errUploadTransfer' : '"$1" erreur de transfert.', 'errUploadTemp' : 'Impossible de créer un fichier temporaire pour transférer les fichiers.', // from v2.1 added 26.09.2015 'errNotReplace' : 'L\'objet "$1" existe déjà à cet endroit et ne peut être remplacé par un objet d\'un type différent.', // new 'errReplace' : 'Impossible de remplacer "$1".', 'errSave' : 'Impossible de sauvegarder "$1".', 'errCopy' : 'Impossible de copier "$1".', 'errMove' : 'Impossible de déplacer "$1".', 'errCopyInItself' : 'Impossible de copier "$1" sur lui-même.', 'errRm' : 'Impossible de supprimer "$1".', 'errTrash' : 'Impossible de déplacer dans la corbeille', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Impossible de supprimer le(s) fichier(s) source(s).', 'errExtract' : 'Imbossible d\'extraire les fichiers à partir de "$1".', 'errArchive' : 'Impossible de créer l\'archive.', 'errArcType' : 'Type d\'archive non supporté.', 'errNoArchive' : 'Le fichier n\'est pas une archive, ou c\'est un type d\'archive non supporté.', 'errCmdNoSupport' : 'Le Backend ne prend pas en charge cette commande.', 'errReplByChild' : 'Le dossier “$1” ne peut pas être remplacé par un élément qu\'il contient.', 'errArcSymlinks' : 'Par mesure de sécurité, il est défendu d\'extraire une archive contenant des liens symboliques ou des noms de fichier non autorisés.', // edited 24.06.2012 'errArcMaxSize' : 'Les fichiers de l\'archive excèdent la taille maximale autorisée.', 'errResize' : 'Impossible de redimensionner "$1".', 'errResizeDegree' : 'Degré de rotation invalide.', // added 7.3.2013 'errResizeRotate' : 'L\'image ne peut pas être tournée.', // added 7.3.2013 'errResizeSize' : 'Dimension de l\'image non-valide.', // added 7.3.2013 'errResizeNoChange' : 'L\'image n\'est pas redimensionnable.', // added 7.3.2013 'errUsupportType' : 'Type de fichier non supporté.', 'errNotUTF8Content' : 'Le fichier "$1" n\'est pas en UTF-8, il ne peut être édité.', // added 9.11.2011 'errNetMount' : 'Impossible de monter "$1".', // added 17.04.2012 'errNetMountNoDriver' : 'Protocole non supporté.', // added 17.04.2012 'errNetMountFailed' : 'Echec du montage.', // added 17.04.2012 'errNetMountHostReq' : 'Hôte requis.', // added 18.04.2012 'errSessionExpires' : 'Votre session a expiré en raison de son inactivité.', 'errCreatingTempDir' : 'Impossible de créer le répertoire temporaire : "$1"', 'errFtpDownloadFile' : 'Impossible de télécharger le file depuis l\'accès FTP : "$1"', 'errFtpUploadFile' : 'Impossible d\'envoyer le fichier vers l\'accès FTP : "$1"', 'errFtpMkdir' : 'Impossible de créer un répertoire distant sur l\'accès FTP :"$1"', 'errArchiveExec' : 'Erreur lors de l\'archivage des fichiers : "$1"', 'errExtractExec' : 'Erreur lors de l\'extraction des fichiers : "$1"', 'errNetUnMount' : 'Impossible de démonter.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Conversion en UTF-8 impossible', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Essayez Google Chrome, si voulez envoyer le dossier.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Délai d’attente dépassé pour la recherche "$1". Le résultat de la recherche est partiel.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Réauthorisation requise.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Le nombre maximal d\'éléments pouvant être sélectionnés est $1.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Impossible de restaurer la corbeille. La destination de la restauration n\'a pu être identifiée.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Aucun éditeur n\'a été trouvé pour ce type de fichier.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Une erreur est survenue du côté serveur.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Impossible de vider le dossier "$1".', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Il y a encore $1 erreur(s).', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Vous ne pouvez créer que $1 dossier au même moment.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Créer une archive', 'cmdback' : 'Précédent', 'cmdcopy' : 'Copier', 'cmdcut' : 'Couper', 'cmddownload' : 'Télécharger', 'cmdduplicate' : 'Dupliquer', 'cmdedit' : 'Éditer le fichier', 'cmdextract' : 'Extraire les fichiers de l\'archive', 'cmdforward' : 'Suivant', 'cmdgetfile' : 'Sélectionner les fichiers', 'cmdhelp' : 'À propos de ce logiciel', 'cmdhome' : 'Accueil', 'cmdinfo' : 'Informations', 'cmdmkdir' : 'Nouveau dossier', 'cmdmkdirin' : 'Dans un nouveau dossier', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Nouveau fichier', 'cmdopen' : 'Ouvrir', 'cmdpaste' : 'Coller', 'cmdquicklook' : 'Prévisualiser', 'cmdreload' : 'Actualiser', 'cmdrename' : 'Renommer', 'cmdrm' : 'Supprimer', 'cmdtrash' : 'À la corbeille', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Restaurer', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Trouver les fichiers', 'cmdup' : 'Remonter au dossier parent', 'cmdupload' : 'Envoyer les fichiers', 'cmdview' : 'Vue', 'cmdresize' : 'Redimensionner l\'image', 'cmdsort' : 'Trier', 'cmdnetmount' : 'Monter un volume réseau', // added 18.04.2012 'cmdnetunmount': 'Démonter', // from v2.1 added 30.04.2012 'cmdplaces' : 'Vers Favoris', // added 28.12.2014 'cmdchmod' : 'Changer de mode', // from v2.1 added 20.6.2015 'cmdopendir' : 'Ouvrir un dossier', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Réinitialiser largeur colone', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Plein écran', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Déplacer', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Vider le dossier', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Annuler', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Refaire', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Préférences', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Tout sélectionner', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Tout désélectionner', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Inverser la sélection', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Ouvrir dans une nouvelle fenêtre', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Cacher (Préférence)', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Fermer', 'btnSave' : 'Enregistrer', 'btnRm' : 'Supprimer', 'btnApply' : 'Appliquer', 'btnCancel' : 'Annuler', 'btnNo' : 'Non', 'btnYes' : 'Oui', 'btnDiscard': 'Discard changes', 'btnMount' : 'Monter', // added 18.04.2012 'btnApprove': 'Aller à $1 & approuver', // from v2.1 added 26.04.2012 'btnUnmount': 'Démonter', // from v2.1 added 30.04.2012 'btnConv' : 'Convertir', // from v2.1 added 08.04.2014 'btnCwd' : 'Ici', // from v2.1 added 22.5.2015 'btnVolume' : 'Volume', // from v2.1 added 22.5.2015 'btnAll' : 'Tous', // from v2.1 added 22.5.2015 'btnMime' : 'Type MIME', // from v2.1 added 22.5.2015 'btnFileName':'Nom du fichier', // from v2.1 added 22.5.2015 'btnSaveClose': 'Sauvegarder & Fermer', // from v2.1 added 12.6.2015 'btnBackup' : 'Sauvegarde', // fromv2.1 added 28.11.2015 'btnRename' : 'Renommer', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Renommer (tous)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Préc. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Suiv. ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Sauvegarder sous', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Ouvrir le dossier', 'ntffile' : 'Ouvrir le fichier', 'ntfreload' : 'Actualiser le contenu du dossier', 'ntfmkdir' : 'Création du dossier', 'ntfmkfile' : 'Création des fichiers', 'ntfrm' : 'Supprimer les éléments', 'ntfcopy' : 'Copier les éléments', 'ntfmove' : 'Déplacer les éléments', 'ntfprepare' : 'Préparation de la copie des éléments', 'ntfrename' : 'Renommer les fichiers', 'ntfupload' : 'Envoi des fichiers', 'ntfdownload' : 'Téléchargement des fichiers', 'ntfsave' : 'Sauvegarder les fichiers', 'ntfarchive' : 'Création de l\'archive', 'ntfextract' : 'Extraction des fichiers de l\'archive', 'ntfsearch' : 'Recherche des fichiers', 'ntfresize' : 'Redimensionner les images', 'ntfsmth' : 'Fait quelque chose', 'ntfloadimg' : 'Chargement de l\'image', 'ntfnetmount' : 'Monte le volume réseau', // added 18.04.2012 'ntfnetunmount': 'Démonte le volume réseau', // from v2.1 added 30.04.2012 'ntfdim' : 'Calcule la dimension de l\'image', // added 20.05.2013 'ntfreaddir' : 'Lecture des informations du dossier', // from v2.1 added 01.07.2013 'ntfurl' : 'Récupération de l’URL du lien', // from v2.1 added 11.03.2014 'ntfchmod' : 'Changement de mode', // from v2.1 added 20.6.2015 'ntfpreupload': 'Vérification du nom du fichier envoyé', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Création d’un fichier pour le téléchargement', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Traitement de l\'information du chemin', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Traitement du fichier envoyé', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Mettre à la corbeille', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Restaurer depuis la corbeille', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Validation du dossier de destination', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Annuler l\'opération précédente', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Refaire l\'opération annulée', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Vérification du contenu', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Corbeille', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Inconnue', 'Today' : 'Aujourd\'hui', 'Yesterday' : 'Hier', 'msJan' : 'Jan', 'msFeb' : 'Fév', 'msMar' : 'Mar', 'msApr' : 'Avr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Aoû', 'msSep' : 'Sep', 'msOct' : 'Oct', 'msNov' : 'Nov', 'msDec' : 'Déc', 'January' : 'Janvier', 'February' : 'Février', 'March' : 'Mars', 'April' : 'Avril', 'May' : 'Mai', 'June' : 'Juin', 'July' : 'Juillet', 'August' : 'Août', 'September' : 'Septembre', 'October' : 'Octobre', 'November' : 'Novembre', 'December' : 'Décembre', 'Sunday' : 'Dimanche', 'Monday' : 'Lundi', 'Tuesday' : 'Mardi', 'Wednesday' : 'Mercredi', 'Thursday' : 'Jeudi', 'Friday' : 'Vendredi', 'Saturday' : 'Samedi', 'Sun' : 'Dim', 'Mon' : 'Lun', 'Tue' : 'Mar', 'Wed' : 'Mer', 'Thu' : 'Jeu', 'Fri' : 'Ven', 'Sat' : 'Sam', /******************************** sort variants ********************************/ 'sortname' : 'par nom', 'sortkind' : 'par type', 'sortsize' : 'par taille', 'sortdate' : 'par date', 'sortFoldersFirst' : 'Dossiers en premier', 'sortperm' : 'par permission', // from v2.1.13 added 13.06.2016 'sortmode' : 'par mode', // from v2.1.13 added 13.06.2016 'sortowner' : 'par propriétaire', // from v2.1.13 added 13.06.2016 'sortgroup' : 'par groupe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Egalement arborescence', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'NouveauFichier.txt', // added 10.11.2015 'untitled folder' : 'NouveauDossier', // added 10.11.2015 'Archive' : 'NouvelleArchive', // from v2.1 added 10.11.2015 'untitled file' : 'NewFile.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Fichier', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Confirmation requise', 'confirmRm' : 'Êtes-vous certain de vouloir supprimer les éléments ?
Cela ne peut être annulé !', 'confirmRepl' : 'Remplacer l\'ancien fichier par le nouveau ?', 'confirmRest' : 'Remplacer l\'élément existant par l\'élément de la corbeille ?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'L\'encodage n\'est pas UTf-8
Convertir en UTF-8 ?
Les contenus deviendront UTF-8 en sauvegardant après la conversion.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Impossible de détecter l\'encodage de ce fichier. Pour être modifié, il doit être temporairement convertit en UTF-8.
Veuillez s\'il vous plaît sélectionner un encodage pour ce fichier.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Ce fichier a été modifié.
Les données seront perdues si les changements ne sont pas sauvegardés.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Êtes-vous certain de vouloir déplacer les éléments vers la corbeille?', //from v2.1.24 added 29.4.2017 'confirmMove' : 'Etes-vous sûr de vouloir déplacer ces éléments vers "$1"?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Appliquer à tous', 'name' : 'Nom', 'size' : 'Taille', 'perms' : 'Permissions', 'modify' : 'Modifié', 'kind' : 'Type', 'read' : 'Lecture', 'write' : 'Écriture', 'noaccess' : 'Pas d\'accès', 'and' : 'et', 'unknown' : 'inconnu', 'selectall' : 'Sélectionner tous les éléments', 'selectfiles' : 'Sélectionner le(s) élément(s)', 'selectffile' : 'Sélectionner le premier élément', 'selectlfile' : 'Sélectionner le dernier élément', 'viewlist' : 'Vue par liste', 'viewicons' : 'Vue par icônes', 'viewSmall' : 'Petites icônes', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Moyennes icônes', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Grandes icônes', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Très grandes icônes', // from v2.1.39 added 22.5.2018 'places' : 'Favoris', 'calc' : 'Calculer', 'path' : 'Chemin', 'aliasfor' : 'Raccourcis pour', 'locked' : 'Verrouiller', 'dim' : 'Dimensions', 'files' : 'Fichiers', 'folders' : 'Dossiers', 'items' : 'Éléments', 'yes' : 'oui', 'no' : 'non', 'link' : 'Lien', 'searcresult' : 'Résultats de la recherche', 'selected' : 'Éléments sélectionnés', 'about' : 'À propos', 'shortcuts' : 'Raccourcis', 'help' : 'Aide', 'webfm' : 'Gestionnaire de fichier Web', 'ver' : 'Version', 'protocolver' : 'Version du protocole', 'homepage' : 'Page du projet', 'docs' : 'Documentation', 'github' : 'Forkez-nous sur Github', 'twitter' : 'Suivez nous sur Twitter', 'facebook' : 'Joignez-nous sur Facebook', 'team' : 'Équipe', 'chiefdev' : 'Développeur en chef', 'developer' : 'Développeur', 'contributor' : 'Contributeur', 'maintainer' : 'Mainteneur', 'translator' : 'Traducteur', 'icons' : 'Icônes', 'dontforget' : 'et n\'oubliez pas votre serviette', 'shortcutsof' : 'Raccourcis désactivés', 'dropFiles' : 'Déposez les fichiers ici', 'or' : 'ou', 'selectForUpload' : 'Sélectionner les fichiers à envoyer', 'moveFiles' : 'Déplacer les éléments', 'copyFiles' : 'Copier les éléments', 'restoreFiles' : 'Restaurer les éléments', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Retirer des favoris', 'aspectRatio' : 'Ratio d’affichage', 'scale' : 'Mise à l\'échelle', 'width' : 'Largeur', 'height' : 'Hauteur', 'resize' : 'Redimensionner', 'crop' : 'Recadrer', 'rotate' : 'Rotation', 'rotate-cw' : 'Rotation de 90 degrés horaire', 'rotate-ccw' : 'Rotation de 90 degrés antihoraire', 'degree' : '°', 'netMountDialogTitle' : 'Monter un volume réseau', // added 18.04.2012 'protocol' : 'Protocole', // added 18.04.2012 'host' : 'Hôte', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Utilisateur', // added 18.04.2012 'pass' : 'Mot de passe', // added 18.04.2012 'confirmUnmount' : 'Démonter $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Glissez-déposez depuis le navigateur de fichier', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Glissez-déposez les fichiers ici', // from v2.1 added 07.04.2014 'encoding' : 'Encodage', // from v2.1 added 19.12.2014 'locale' : 'Encodage régional', // from v2.1 added 19.12.2014 'searchTarget' : 'Destination: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Recherche par type MIME', // from v2.1 added 22.5.2015 'owner' : 'Propriétaire', // from v2.1 added 20.6.2015 'group' : 'Groupe', // from v2.1 added 20.6.2015 'other' : 'Autre', // from v2.1 added 20.6.2015 'execute' : 'Exécuter', // from v2.1 added 20.6.2015 'perm' : 'Permission', // from v2.1 added 20.6.2015 'mode' : 'Mode', // from v2.1 added 20.6.2015 'emptyFolder' : 'Le dossier est vide', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Le dossier est vide.\\ Glissez-déposez pour ajouter des éléments.', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Le dossier est vide.\\ Appuyez longuement pour ajouter des éléments.', // from v2.1.6 added 30.12.2015 'quality' : 'Qualité', // from v2.1.6 added 5.1.2016 'autoSync' : 'Synchronisation automatique', // from v2.1.6 added 10.1.2016 'moveUp' : 'Déplacer vers le haut', // from v2.1.6 added 18.1.2016 'getLink' : 'Obtenir le lien d’URL', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Éléments sélectionnés ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'ID du dossier', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Permettre l\'accès hors-ligne', // from v2.1.10 added 3.25.2016 'reAuth' : 'Pour se réauthentifier', // from v2.1.10 added 3.25.2016 'nowLoading' : 'En cours de chargement...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Ouvrir multiples fichiers', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Vous allez ouvrir $1 fichiers. Êtes-vous sûr de vouloir les ouvrir dans le navigateur ?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Aucun résultat trouvé avec les paramètres de recherche.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Modification d\'un fichier.', // from v2.1.13 added 6.3.2016 'hasSelected' : 'Vous avez sélectionné $1 éléments.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Vous avez $1 éléments dans le presse-papier.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Recherche incrémentale disponible uniquement pour la vue active.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Rétablir', // from v2.1.15 added 3.8.2016 'complete' : '$1 complété', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Menu contextuel', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Tourner la page', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volumes principaux', // from v2.1.16 added 16.9.2016 'reset' : 'Réinitialiser', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Couleur de fond', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Sélecteur de couleur', // from v2.1.16 added 1.10.2016 '8pxgrid' : 'Grille 8px', // from v2.1.16 added 4.10.2016 'enabled' : 'Actif', // from v2.1.16 added 4.10.2016 'disabled' : 'Inactif', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Aucun résultat trouvé.\\Appuyez sur [Entrée] pour développer la cible de recherche.', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Aucun résultat trouvé pour la recherche par première lettre.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Label texte', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 mins restantes', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Réouvrir avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Sauvegarder avec l\'encodage sélectionné', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Choisir le dossier', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Recherche par première lettre', // from v2.1.23 added 24.3.2017 'presets' : 'Présélections', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Impossible de mettre autant d\'éléments à la corbeille.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Zone de texte', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Vider le dossier "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Il n\'y a pas d\'élément dans le dossier "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Préférences', // from v2.1.26 added 28.6.2017 'language' : 'Configuration de langue', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialisation des configurations sauvegardées dans ce navigateur', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Paramètres de la barre d\'outils', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 caractère(s) restant(s).', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 ligne(s) restante(s).', // from v2.1.52 added 16.1.2020 'sum' : 'Somme', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Taille de fichier brute', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Concentrez-vous sur l\'élément de dialogue avec le survol de la souris', // from v2.1.30 added 2.11.2017 'select' : 'Sélectionner', // from v2.1.30 added 23.11.2017 'selectAction' : 'Action lors de la sélection d\'un fichier', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Ouvrir avec le dernier éditeur utilisé', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Inverser la sélection', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Êtes-vous sûr de vouloir renommer les éléments sélectionnés $1 en $2 ?
L\'action est définitive !', // from v2.1.31 added 4.12.2017 'batchRename' : 'Renommer le Batch', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nombre', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Ajouter un préfixe', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Ajouter un suffixe', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Modifier l\'extention', // from v2.1.31 added 8.12.2017 'columnPref' : 'Paramètres des colonnes (List view)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Les changements seront immédiatement appliqués à l\'archive.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Aucun changement ne sera appliqué tant que ce volume n\'a pas été démonté.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Le(s) volume(s) suivant(s) montés sur ce volume seront également démontés. Êtes-vous sûr de vouloir le démonter ?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Informations sur la sélection', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Algorithme de hachage de fichier', // from v2.1.33 added 10.3.2018 'infoItems' : 'Éléments d\'information (panneau de sélection d\'informations )', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Appuyez à nouveau pour quitter.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Barre d\'outils', // from v2.1.38 added 4.4.2018 'workspace' : 'Espace de travail', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialogue', // from v2.1.38 added 4.4.2018 'all' : 'Tout', // from v2.1.38 added 4.4.2018 'iconSize' : 'Dimensions de l\'icône (Aperçu)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Ouvrir la fenêtre d\'édition à la taille maximale', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Étant donné que la conversion par API n\'est pas disponible actuellement, veuillez effectuer la conversion sur le site Web.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Après la conversion, vous devez ajouter l\'URL de l\'élément ou un fichier téléchargé pour enregistrer le fichier converti.', //from v2.1.40 added 8.7.2018 'convertOn' : 'Convertir sur le site de $1', // from v2.1.40 added 10.7.2018 'integrations' : 'Intégrations', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Cet elFinder intègre les services externes suivants. Veuillez vérifier les conditions d\'utilisation, la politique de confidentialité, etc. avant de l\'utiliser.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Afficher les élément cachés', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Ne pas afficher les élément cachés', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Afficher/Cacher les éléments cachés', // from v2.1.41 added 24.7.2018 'makefileTypes' : 'Type de ficher autorisé avec "Nouveau fichier"', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Type du fichier de texte', // from v2.1.41 added 7.8.2018 'add' : 'Ajouter', // from v2.1.41 added 7.8.2018 'theme' : 'Thème', // from v2.1.43 added 19.10.2018 'default' : 'Par Défaut', // from v2.1.43 added 19.10.2018 'description' : 'Description', // from v2.1.43 added 19.10.2018 'website' : 'Site Web', // from v2.1.43 added 19.10.2018 'author' : 'Aauteur', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'License', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Cet élément ne peut être enregistrer. Pour éviter de perdre les modifications, vous devez exporter vers votre ordinateur.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Double-cliquez sur le fichier pour le sélectionner.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Utiliser le mode plein écran', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Inconnu', 'kindRoot' : 'Volume principal', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Dossier', 'kindSelects' : 'Sélections', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Raccourci', 'kindAliasBroken' : 'Raccourci cassé', // applications 'kindApp' : 'Application', 'kindPostscript' : 'Document Postscript', 'kindMsOffice' : 'Document Microsoft Office', 'kindMsWord' : 'Document Microsoft Word', 'kindMsExcel' : 'Document Microsoft Excel', 'kindMsPP' : 'Présentation Microsoft PowerPoint', 'kindOO' : 'Document OpenOffice', 'kindAppFlash' : 'Application Flash', 'kindPDF' : 'Format de document portable (PDF)', 'kindTorrent' : 'Fichier BitTorrent', 'kind7z' : 'Archive 7z', 'kindTAR' : 'Archive TAR', 'kindGZIP' : 'Archive GZIP', 'kindBZIP' : 'Archive BZIP', 'kindXZ' : 'Archive XZ', 'kindZIP' : 'Archive ZIP', 'kindRAR' : 'Archive RAR', 'kindJAR' : 'Fichier Java JAR', 'kindTTF' : 'Police True Type', 'kindOTF' : 'Police Open Type', 'kindRPM' : 'Package RPM', // fonts 'kindFont' : 'Police', 'kindSFNT' : 'Police font', 'kindEOT' : 'Police Embedded Open Type', 'kindWOFF' : 'Police Web Open Font Format', 'kindWOFF2' : 'Police Web Open Font Format 2', // texts 'kindText' : 'Document Text', 'kindTextPlain' : 'Texte non formaté', 'kindPHP' : 'Source PHP', 'kindCSS' : 'Feuille de style en cascade', 'kindHTML' : 'Document HTML', 'kindJS' : 'Source JavaScript', 'kindRTF' : 'Format de texte enrichi (Rich Text Format)', 'kindC' : 'Source C', 'kindCHeader' : 'Source header C', 'kindCPP' : 'Source C++', 'kindCPPHeader' : 'Source header C++', 'kindShell' : 'Shell script Unix', 'kindPython' : 'Source Python', 'kindJava' : 'Source Java', 'kindRuby' : 'Source Ruby', 'kindPerl' : 'Script Perl', 'kindSQL' : 'Source SQL', 'kindXML' : 'Document XML', 'kindAWK' : 'Source AWK', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Document Docbook XML', 'kindMarkdown' : 'Markdown text', // added 20.7.2015 // images 'kindImage' : 'Image', 'kindBMP' : 'Image BMP', 'kindJPEG' : 'Image JPEG', 'kindGIF' : 'Image GIF', 'kindPNG' : 'Image PNG', 'kindTIFF' : 'Image TIFF', 'kindTGA' : 'Image TGA', 'kindPSD' : 'Image Adobe Photoshop', 'kindXBITMAP' : 'Image X bitmap', 'kindPXM' : 'Image Pixelmator', // media 'kindAudio' : 'Son', 'kindAudioMPEG' : 'Son MPEG', 'kindAudioMPEG4' : 'Son MPEG-4', 'kindAudioMIDI' : 'Son MIDI', 'kindAudioOGG' : 'Son Ogg Vorbis', 'kindAudioWAV' : 'Son WAV', 'AudioPlaylist' : 'Liste de lecture audio', 'kindVideo' : 'Vidéo', 'kindVideoDV' : 'Vidéo DV', 'kindVideoMPEG' : 'Vidéo MPEG', 'kindVideoMPEG4' : 'Vidéo MPEG-4', 'kindVideoAVI' : 'Vidéo AVI', 'kindVideoMOV' : 'Vidéo Quick Time', 'kindVideoWM' : 'Vidéo Windows Media', 'kindVideoFlash' : 'Vidéo Flash', 'kindVideoMKV' : 'Vidéo Matroska', 'kindVideoOGG' : 'Vidéo Ogg' } }; })); /** * Common functions. * * @package Yoast\WP\Duplicate_Post * @since 2.0 */ use Yoast\WP\Duplicate_Post\Permissions_Helper; use Yoast\WP\Duplicate_Post\UI\Link_Builder; use Yoast\WP\Duplicate_Post\Utils; /** * Tests if post type is enabled to be copied. * * @param string $post_type The post type to check. * @return bool */ function duplicate_post_is_post_type_enabled( $post_type ) { $duplicate_post_types_enabled = get_option( 'duplicate_post_types_enabled', [ 'post', 'page' ] ); if ( ! is_array( $duplicate_post_types_enabled ) ) { $duplicate_post_types_enabled = [ $duplicate_post_types_enabled ]; } /** This filter is documented in src/permissions-helper.php */ $duplicate_post_types_enabled = apply_filters( 'duplicate_post_enabled_post_types', $duplicate_post_types_enabled ); return in_array( $post_type, $duplicate_post_types_enabled, true ); } /** * Template tag to retrieve/display duplicate post link for post. * * @param int $id Optional. Post ID. * @param string $context Optional, default to display. How to write the '&', defaults to '&'. * @param bool $draft Optional, default to true. * @return string */ function duplicate_post_get_clone_post_link( $id = 0, $context = 'display', $draft = true ) { $post = get_post( $id ); if ( ! $post ) { return ''; } $link_builder = new Link_Builder(); $permissions_helper = new Permissions_Helper(); if ( ! $permissions_helper->should_links_be_displayed( $post ) ) { return ''; } if ( $draft ) { return $link_builder->build_new_draft_link( $post, $context ); } else { return $link_builder->build_clone_link( $post, $context ); } } /** * Displays duplicate post link for post. * * @param string|null $link Optional. Anchor text. * @param string $before Optional. Display before edit link. * @param string $after Optional. Display after edit link. * @param int $id Optional. Post ID. */ function duplicate_post_clone_post_link( $link = null, $before = '', $after = '', $id = 0 ) { $post = get_post( $id ); if ( ! $post ) { return; } $url = duplicate_post_get_clone_post_link( $post->ID ); if ( ! $url ) { return; } if ( $link === null ) { $link = __( 'Copy to a new draft', 'duplicate-post' ); } $link = '' . esc_html( $link ) . ''; /** * Filter on the clone link HTML. * * @param string $link The full HTML tag of the link. * @param int $ID The ID of the post. * * @return string */ echo $before . apply_filters( 'duplicate_post_clone_post_link', $link, $post->ID ) . $after; // phpcs:ignore WordPress.Security.EscapeOutput } /** * Gets the original post. * * @param int|null $post Optional. Post ID or Post object. * @param string $output Optional, default is Object. Either OBJECT, ARRAY_A, or ARRAY_N. * @return mixed Post data. */ function duplicate_post_get_original( $post = null, $output = OBJECT ) { return Utils::get_original( $post, $output ); } if (!defined('ABSPATH')) die('No direct access.'); /** * Here live some stand-alone filesystem manipulation functions */ class UpdraftPlus_Filesystem_Functions { /** * If $basedirs is passed as an array, then $directorieses must be too * Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down * * @param Array|String $directorieses List of of directories, or a single one * @param Array $exclude An exclusion array of directories * @param Array|String $basedirs A list of base directories, or a single one * @param String $format Return format - 'text' or 'numeric' * @return String|Integer */ public static function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format = 'text') { $size = 0; if (is_string($directorieses)) { $basedirs = $directorieses; $directorieses = array($directorieses); } if (is_string($basedirs)) $basedirs = array($basedirs); foreach ($directorieses as $ind => $directories) { if (!is_array($directories)) $directories = array($directories); $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind]; foreach ($directories as $dir) { if (is_file($dir)) { $size += @filesize($dir);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } else { $suffix = ('' != $basedir) ? ((0 === strpos($dir, $basedir.'/')) ? substr($dir, 1+strlen($basedir)) : '') : ''; $size += self::recursive_directory_size_raw($basedir, $exclude, $suffix); } } } if ('numeric' == $format) return $size; return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size); } /** * Ensure that WP_Filesystem is instantiated and functional. Otherwise, outputs necessary HTML and dies. * * @param array $url_parameters - parameters and values to be added to the URL output * * @return void */ public static function ensure_wp_filesystem_set_up_for_restore($url_parameters = array()) { global $wp_filesystem, $updraftplus; $build_url = UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_restore'; foreach ($url_parameters as $k => $v) { $build_url .= '&'.$k.'='.$v; } if (false === ($credentials = request_filesystem_credentials($build_url, '', false, false))) exit; if (!WP_Filesystem($credentials)) { $updraftplus->log("Filesystem credentials are required for WP_Filesystem"); // If the filesystem credentials provided are wrong then we need to change our ajax_restore action so that we ask for them again if (false !== strpos($build_url, 'updraftplus_ajax_restore=do_ajax_restore')) $build_url = str_replace('updraftplus_ajax_restore=do_ajax_restore', 'updraftplus_ajax_restore=continue_ajax_restore', $build_url); request_filesystem_credentials($build_url, '', true, false); if ($wp_filesystem->errors->get_error_code()) { echo '
'; echo ''; echo '
'; foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message); echo '
'; echo '
'; exit; } } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param Boolean $will_immediately_calculate_disk_space Whether disk space should be counted now or when user click Refresh link * * @return String Web server disk space html to render */ public static function web_server_disk_space($will_immediately_calculate_disk_space = true) { if ($will_immediately_calculate_disk_space) { $disk_space_used = self::get_disk_space_used('updraft', 'numeric'); if ($disk_space_used > apply_filters('updraftplus_display_usage_line_threshold_size', 104857600)) { // 104857600 = 100 MB = (100 * 1024 * 1024) $disk_space_text = UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($disk_space_used); $refresh_link_text = __('refresh', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } else { return ''; } } else { $disk_space_text = ''; $refresh_link_text = __('calculate', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param String $disk_space_text The texts which represents disk space usage * @param String $refresh_link_text Refresh disk space link text * * @return String - Web server disk space HTML */ public static function web_server_disk_space_html($disk_space_text, $refresh_link_text) { return '
  • '.__('Web-server disk space in use by UpdraftPlus', 'updraftplus').': '.$disk_space_text.' '.$refresh_link_text.'
  • '; } /** * Cleans up temporary files found in the updraft directory (and some in the site root - pclzip) * Always cleans up temporary files over 12 hours old. * With parameters, also cleans up those. * Also cleans out old job data older than 12 hours old (immutable value) * include_cachelist also looks to match any files of cached file analysis data * * @param String $match - if specified, then a prefix to require * @param Integer $older_than - in seconds * @param Boolean $include_cachelist - include cachelist files in what can be purged */ public static function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) { global $updraftplus; // Clean out old job data if ($older_than > 10000) { global $wpdb; $table = is_multisite() ? $wpdb->sitemeta : $wpdb->options; $key_column = is_multisite() ? 'meta_key' : 'option_name'; $value_column = is_multisite() ? 'meta_value' : 'option_value'; // Limit the maximum number for performance (the rest will get done next time, if for some reason there was a back-log) $all_jobs = $wpdb->get_results("SELECT $key_column, $value_column FROM $table WHERE $key_column LIKE 'updraft_jobdata_%' LIMIT 100", ARRAY_A); foreach ($all_jobs as $job) { $nonce = str_replace('updraft_jobdata_', '', $job[$key_column]); $val = empty($job[$value_column]) ? array() : $updraftplus->unserialize($job[$value_column]); // TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014 $delete = false; if (!empty($val['next_increment_start_scheduled_for'])) { if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true; } elseif (!empty($val['backup_time_ms']) && time() > $val['backup_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_time_ms']) && time() > $val['job_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_type']) && 'backup' != $val['job_type'] && empty($val['backup_time_ms']) && empty($val['job_time_ms'])) { $delete = true; } if (isset($val['temp_import_table_prefix']) && '' != $val['temp_import_table_prefix'] && $wpdb->prefix != $val['temp_import_table_prefix']) { $tables_to_remove = array(); $prefix = $wpdb->esc_like($val['temp_import_table_prefix'])."%"; $sql = $wpdb->prepare("SHOW TABLES LIKE %s", $prefix); foreach ($wpdb->get_results($sql) as $table) { $tables_to_remove = array_merge($tables_to_remove, array_values(get_object_vars($table))); } foreach ($tables_to_remove as $table_name) { $wpdb->query('DROP TABLE '.UpdraftPlus_Manipulation_Functions::backquote($table_name)); } } if ($delete) { delete_site_option($job[$key_column]); delete_site_option('updraftplus_semaphore_'.$nonce); } } } $updraft_dir = $updraftplus->backups_dir_location(); $now_time = time(); $files_deleted = 0; $include_cachelist = defined('DOING_CRON') && DOING_CRON && doing_action('updraftplus_clean_temporary_files') ? true : $include_cachelist; if ($handle = opendir($updraft_dir)) { while (false !== ($entry = readdir($handle))) { $manifest_match = preg_match("/updraftplus-manifest\.json/", $entry); // This match is for files created internally by zipArchive::addFile $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)$/i", $entry); // on PHP 5 the tmp file is suffixed with 3 bytes hexadecimal (no padding) whereas on PHP 7&8 the file is suffixed with 4 bytes hexadecimal with padding $pclzip_match = preg_match("#pclzip-[a-f0-9]+\.(?:tmp|gz)$#i", $entry); // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern. $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry); $cachelist_match = ($include_cachelist) ? preg_match("/-cachelist-.*(?:info|\.tmp)$/i", $entry) : false; $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry); $downloader_client_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)\.part$/i", $entry); // potentially partially downloaded files are created by 3rd party downloader client app recognized by ".part" extension at the end of the backup file name (e.g. .zip.tmp.3b9r8r.part) // Temporary files from the database dump process - not needed, as is caught by the time-based catch-all // $table_match = preg_match("/{$match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry); // The gz goes in with the txt, because we *don't* want to reap the raw .txt files if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $pclzip_match || $binzip_match || $manifest_match || $browserlog_match || $downloader_client_match) && is_file($updraft_dir.'/'.$entry)) { // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old if (($match && ($ziparchive_match || $pclzip_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old temporary file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } elseif (preg_match('/^log\.[0-9a-f]+\.txt$/', $entry) && $now_time-filemtime($updraft_dir.'/'.$entry)> apply_filters('updraftplus_log_delete_age', 86400 * 40, $entry)) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old log file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } // Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both // Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around and cause issues with huge files. foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) { if ($handle = opendir($path)) { while (false !== ($entry = readdir($handle))) { // With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) { $updraftplus->log("Deleting old PclZip temporary file: $entry (from ".basename($path).")"); @unlink($path.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } } /** * Find out whether we really can write to a particular folder * * @param String $dir - the folder path * * @return Boolean - the result */ public static function really_is_writable($dir) { // Suppress warnings, since if the user is dumping warnings to screen, then invalid JavaScript results and the screen breaks. if (!@is_writable($dir)) return false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. // Found a case - GoDaddy server, Windows, PHP 5.2.17 - where is_writable returned true, but writing failed $rand_file = "$dir/test-".md5(rand().time()).".txt"; while (file_exists($rand_file)) { $rand_file = "$dir/test-".md5(rand().time()).".txt"; } $ret = @file_put_contents($rand_file, 'testing...');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. @unlink($rand_file);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. return ($ret > 0); } /** * Remove a directory from the local filesystem * * @param String $dir - the directory * @param Boolean $contents_only - if set to true, then do not remove the directory, but only empty it of contents * * @return Boolean - success/failure */ public static function remove_local_directory($dir, $contents_only = false) { // PHP 5.3+ only // foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) { // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname()); // } // return rmdir($dir); if ($handle = @opendir($dir)) {// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. while (false !== ($entry = readdir($handle))) { if ('.' !== $entry && '..' !== $entry) { if (is_dir($dir.'/'.$entry)) { self::remove_local_directory($dir.'/'.$entry, false); } else { @unlink($dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } return $contents_only ? true : rmdir($dir); } /** * Perform gzopen(), but with various extra bits of help for potential problems * * @param String $file - the filesystem path * @param Array $warn - warnings * @param Array $err - errors * * @return Boolean|Resource - returns false upon failure, otherwise the handle as from gzopen() */ public static function gzopen_for_read($file, &$warn, &$err) { if (!function_exists('gzopen') || !function_exists('gzread')) { $missing = ''; if (!function_exists('gzopen')) $missing .= 'gzopen'; if (!function_exists('gzread')) $missing .= ($missing) ? ', gzread' : 'gzread'; $err[] = sprintf(__("Your web server's PHP installation has these functions disabled: %s.", 'updraftplus'), $missing).' '.sprintf(__('Your hosting company must enable these functions before %s can work.', 'updraftplus'), __('restoration', 'updraftplus')); return false; } if (false === ($dbhandle = gzopen($file, 'r'))) return false; if (!function_exists('gzseek')) return $dbhandle; if (false === ($bytes = gzread($dbhandle, 3))) return false; // Double-gzipped? if ('H4sI' != base64_encode($bytes)) { if (0 === gzseek($dbhandle, 0)) { return $dbhandle; } else { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. return gzopen($file, 'r'); } } // Yes, it's double-gzipped $what_to_return = false; $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus'); $messkey = 'doublecompress'; $err_msg = ''; if (false === ($fnew = fopen($file.".tmp", 'w')) || !is_resource($fnew)) { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $emptimes = 0; while (!gzeof($dbhandle)) { $bytes = @gzread($dbhandle, 262144);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. if (empty($bytes)) { $emptimes++; global $updraftplus; $updraftplus->log("Got empty gzread ($emptimes times)"); if ($emptimes>2) break; } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } gzclose($dbhandle); fclose($fnew); // On some systems (all Windows?) you can't rename a gz file whilst it's gzopened if (!rename($file.".tmp", $file)) { $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { $mess .= ' '.__('The attempt to undo the double-compression succeeded.', 'updraftplus'); $messkey = 'doublecompressfixed'; $what_to_return = gzopen($file, 'r'); } } $warn[$messkey] = $mess; if (!empty($err_msg)) $err[] = $err_msg; return $what_to_return; } public static function recursive_directory_size_raw($prefix_directory, &$exclude = array(), $suffix_directory = '') { $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory); $size = 0; if (substr($directory, -1) == '/') $directory = substr($directory, 0, -1); if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1; if (file_exists($directory.'/.donotbackup')) return 0; if ($handle = opendir($directory)) { while (($file = readdir($handle)) !== false) { if ('.' != $file && '..' != $file) { $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file; if (false !== ($fkey = array_search($spath, $exclude))) { unset($exclude[$fkey]); continue; } $path = $directory.'/'.$file; if (is_file($path)) { $size += filesize($path); } elseif (is_dir($path)) { $handlesize = self::recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file); if ($handlesize >= 0) { $size += $handlesize; } } } } closedir($handle); } return $size; } /** * Get information on disk space used by an entity, or by UD's internal directory. Returns as a human-readable string. * * @param String $entity - the entity (e.g. 'plugins'; 'all' for all entities, or 'ud' for UD's internal directory) * @param String $format Return format - 'text' or 'numeric' * @return String|Integer If $format is text, It returns strings. Otherwise integer value. */ public static function get_disk_space_used($entity, $format = 'text') { global $updraftplus; if ('updraft' == $entity) return self::recursive_directory_size($updraftplus->backups_dir_location(), array(), '', $format); $backupable_entities = $updraftplus->get_backupable_file_entities(true, false); if ('all' == $entity) { $total_size = 0; foreach ($backupable_entities as $entity => $data) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); $size = self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric'); if (is_numeric($size) && $size>0) $total_size += $size; } if ('numeric' == $format) { return $total_size; } else { return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($total_size); } } elseif (!empty($backupable_entities[$entity])) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); return self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, $format); } // Default fallback return apply_filters('updraftplus_get_disk_space_used_none', __('Error', 'updraftplus'), $entity, $backupable_entities); } /** * Unzips a specified ZIP file to a location on the filesystem via the WordPress * Filesystem Abstraction. Forked from WordPress core in version 5.1-alpha-44182, * to allow us to provide feedback on progress. * * Assumes that WP_Filesystem() has already been called and set up. Does not extract * a root-level __MACOSX directory, if present. * * Attempts to increase the PHP memory limit before uncompressing. However, * the most memory required shouldn't be much larger than the archive itself. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - Full path and filename of ZIP archive. * @param String $to - Full path on the filesystem to extract archive to. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ public static function unzip_file($file, $to, $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem; if (!$wp_filesystem || !is_object($wp_filesystem)) { return new WP_Error('fs_unavailable', __('Could not access filesystem.')); } // Unzip can use a lot of memory, but not this much hopefully. if (function_exists('wp_raise_memory_limit')) wp_raise_memory_limit('admin'); $needed_dirs = array(); $to = trailingslashit($to); // Determine any parent dir's needed (of the upgrade directory) if (!$wp_filesystem->is_dir($to)) { // Only do parents if no children exist $path = preg_split('![/\\\]!', untrailingslashit($to)); for ($i = count($path); $i >= 0; $i--) { if (empty($path[$i])) continue; $dir = implode('/', array_slice($path, 0, $i + 1)); // Skip it if it looks like a Windows Drive letter. if (preg_match('!^[a-z]:$!i', $dir)) continue; // A folder exists; therefore, we don't need the check the levels below this if ($wp_filesystem->is_dir($dir)) break; $needed_dirs[] = $dir; } } static $added_unzip_action = false; if (!$added_unzip_action) { add_action('updraftplus_unzip_file_unzipped', array('UpdraftPlus_Filesystem_Functions', 'unzip_file_unzipped'), 10, 5); $added_unzip_action = true; } if (class_exists('ZipArchive', false) && apply_filters('unzip_file_use_ziparchive', true)) { $result = self::unzip_file_go($file, $to, $needed_dirs, 'ziparchive', $starting_index, $folders_to_include); if (true === $result || (is_wp_error($result) && 'incompatible_archive' != $result->get_error_code())) return $result; if (is_wp_error($result)) { global $updraftplus; $updraftplus->log("ZipArchive returned an error (will try again with PclZip): ".$result->get_error_code()); } } // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. // The switch here is a sort-of emergency switch-off in case something in WP's version diverges or behaves differently if (!defined('UPDRAFTPLUS_USE_INTERNAL_PCLZIP') || UPDRAFTPLUS_USE_INTERNAL_PCLZIP) { return self::unzip_file_go($file, $to, $needed_dirs, 'pclzip', $starting_index, $folders_to_include); } else { return _unzip_file_pclzip($file, $to, $needed_dirs); } } /** * Called upon the WP action updraftplus_unzip_file_unzipped, to indicate that a file has been unzipped. * * @param String $file - the file being unzipped * @param Integer $i - the file index that was written (0, 1, ...) * @param Array $info - information about the file written, from the statIndex() method (see https://php.net/manual/en/ziparchive.statindex.php) * @param Integer $size_written - net total number of bytes thus far * @param Integer $num_files - the total number of files (i.e. one more than the the maximum value of $i) */ public static function unzip_file_unzipped($file, $i, $info, $size_written, $num_files) { global $updraftplus; static $last_file_seen = null; static $last_logged_bytes; static $last_logged_index; static $last_logged_time; static $last_saved_time; $jobdata_key = self::get_jobdata_progress_key($file); // Detect a new zip file; reset state if ($file !== $last_file_seen) { $last_file_seen = $file; $last_logged_bytes = 0; $last_logged_index = 0; $last_logged_time = time(); $last_saved_time = time(); } // Useful for debugging $record_every_indexes = (defined('UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES') && UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES > 0) ? UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES : 1000; // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged. if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + $record_every_indexes || time() > $last_logged_time + 15) { $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); $updraftplus->log(sprintf(__('Unzip progress: %d out of %d files', 'updraftplus').' (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore'); $updraftplus->log(sprintf('Unzip progress: %d out of %d files (%s, %s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice'); do_action('updraftplus_unzip_progress_restore_info', $file, $i, $size_written, $num_files); $last_logged_bytes = $size_written; $last_logged_index = $i; $last_logged_time = time(); $last_saved_time = time(); } // Because a lot can happen in 5 seconds, we update the job data more often if (time() > $last_saved_time + 5) { // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up. $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); $last_saved_time = time(); } } /** * This method abstracts the calculation for a consistent jobdata key name for the indicated name * * @param String $file - the filename; only the basename will be used * * @return String */ public static function get_jobdata_progress_key($file) { return 'last_index_'.md5(basename($file)); } /** * Compatibility function (exists in WP 4.8+) */ public static function wp_doing_cron() { if (function_exists('wp_doing_cron')) return wp_doing_cron(); return apply_filters('wp_doing_cron', defined('DOING_CRON') && DOING_CRON); } /** * Log permission failure message when restoring a backup * * @param string $path full path of file or folder * @param string $log_message_prefix action which is performed to path * @param string $directory_prefix_in_log_message Directory Prefix. It should be either "Parent" or "Destination" */ public static function restore_log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message = 'Parent') { global $updraftplus; $log_message = $updraftplus->log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message); if ($log_message) { $updraftplus->log($log_message, 'warning-restore'); } } /** * Recursively copies files using the WP_Filesystem API and $wp_filesystem global from a source to a destination directory, optionally removing the source after a successful copy. * * @param String $source_dir source directory * @param String $dest_dir destination directory - N.B. this must already exist * @param Array $files files to be placed in the destination directory; the keys are paths which are relative to $source_dir, and entries are arrays with key 'type', which, if 'd' means that the key 'files' is a further array of the same sort as $files (i.e. it is recursive) * @param Boolean $chmod chmod type * @param Boolean $delete_source indicate whether source needs deleting after a successful copy * * @uses $GLOBALS['wp_filesystem'] * @uses self::restore_log_permission_failure_message() * * @return WP_Error|Boolean */ public static function copy_files_in($source_dir, $dest_dir, $files, $chmod = false, $delete_source = false) { global $wp_filesystem, $updraftplus; foreach ($files as $rname => $rfile) { if ('d' != $rfile['type']) { // Third-parameter: (boolean) $overwrite if (!$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, true)) { self::restore_log_permission_failure_message($dest_dir, $source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); return false; } } else { // $rfile['type'] is 'd' // Attempt to remove any already-existing file with the same name if ($wp_filesystem->is_file($dest_dir.'/'.$rname)) @$wp_filesystem->delete($dest_dir.'/'.$rname, false, 'f');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- if fails, carry on // No such directory yet: just move it if ($wp_filesystem->exists($dest_dir.'/'.$rname) && !$wp_filesystem->is_dir($dest_dir.'/'.$rname) && !$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, false)) { self::restore_log_permission_failure_message($dest_dir, 'Move '.$source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); $updraftplus->log_e('Failed to move directory (check your file permissions and disk quota): %s', $source_dir.'/'.$rname." -> ".$dest_dir.'/'.$rname); return false; } elseif (!empty($rfile['files'])) { if (!$wp_filesystem->exists($dest_dir.'/'.$rname)) $wp_filesystem->mkdir($dest_dir.'/'.$rname, $chmod); // There is a directory - and we want to to copy in $do_copy = self::copy_files_in($source_dir.'/'.$rname, $dest_dir.'/'.$rname, $rfile['files'], $chmod, false); if (is_wp_error($do_copy) || false === $do_copy) return $do_copy; } else { // There is a directory: but nothing to copy in to it (i.e. $file['files'] is empty). Just remove the directory. @$wp_filesystem->rmdir($source_dir.'/'.$rname);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the method. } } } // We are meant to leave the working directory empty. Hence, need to rmdir() once a directory is empty. But not the root of it all in case of others/wpcore. if ($delete_source || false !== strpos($source_dir, '/')) { if (!$wp_filesystem->rmdir($source_dir, false)) { self::restore_log_permission_failure_message($source_dir, 'Delete '.$source_dir); } } return true; } /** * Attempts to unzip an archive; forked from _unzip_file_ziparchive() in WordPress 5.1-alpha-44182, and modified to use the UD zip classes. * * Assumes that WP_Filesystem() has already been called and set up. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - full path and filename of ZIP archive. * @param String $to - full path on the filesystem to extract archive to. * @param Array $needed_dirs - a partial list of required folders needed to be created. * @param String $method - either 'ziparchive' or 'pclzip'. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ private static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem, $updraftplus; $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip'; if (!class_exists($class_to_use)) updraft_try_include_file('includes/class-zip.php', 'require_once'); $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use.', starting index '.$starting_index); $z = new $class_to_use; $flags = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CHECKCONS')) ? ZIPARCHIVE::CHECKCONS : 4; // This is just for crazy people with mbstring.func_overload enabled (deprecated from PHP 7.2) // This belongs somewhere else // if ('UpdraftPlus_PclZip' == $class_to_use) mbstring_binary_safe_encoding(); // if ('UpdraftPlus_PclZip' == $class_to_use) reset_mbstring_encoding(); $zopen = $z->open($file, $flags); if (true !== $zopen) { return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error)); } $uncompressed_size = 0; $num_files = $z->numFiles; if (false === $num_files) return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error)); for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.').' ('.$z->last_error.')'); } // Skip the OS X-created __MACOSX directory if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't create folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } $uncompressed_size += $info['size']; if ('/' === substr($info['name'], -1)) { // Directory. $needed_dirs[] = $to . untrailingslashit($info['name']); } elseif ('.' !== ($dirname = dirname($info['name']))) { // Path to a file. $needed_dirs[] = $to . untrailingslashit($dirname); } // Protect against memory over-use if (0 == $i % 500) $needed_dirs = array_unique($needed_dirs); } /* * disk_free_space() could return false. Assume that any falsey value is an error. * A disk that has zero free bytes has bigger problems. * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. */ if (self::wp_doing_cron()) { $available_space = function_exists('disk_free_space') ? @disk_free_space(WP_CONTENT_DIR) : false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Call is speculative if ($available_space && ($uncompressed_size * 2.1) > $available_space) { return new WP_Error('disk_full_unzip_file', __('Could not copy files.', 'updraftplus').' '.__('You may have run out of disk space.'), compact('uncompressed_size', 'available_space')); } } $needed_dirs = array_unique($needed_dirs); foreach ($needed_dirs as $dir) { // Check the parent folders of the folders all exist within the creation array. if (untrailingslashit($to) == $dir) { // Skip over the working directory, We know this exists (or will exist) continue; } // If the directory is not within the working directory then skip it if (false === strpos($dir, $to)) continue; $parent_folder = dirname($dir); while (!empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs)) { $needed_dirs[] = $parent_folder; $parent_folder = dirname($parent_folder); } } asort($needed_dirs); // Create those directories if need be: foreach ($needed_dirs as $_dir) { // Only check to see if the Dir exists upon creation failure. Less I/O this way. if (!$wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && !$wp_filesystem->is_dir($_dir)) { return new WP_Error('mkdir_failed_'.$method, __('Could not create directory.'), substr($_dir, strlen($to))); } } unset($needed_dirs); $size_written = 0; $content_cache = array(); $content_cache_highest = -1; for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.')); } // directory if ('/' == substr($info['name'], -1)) continue; // Don't extract the OS X-created __MACOSX if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't extract folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } // N.B. PclZip will return (boolean)false for an empty file if (isset($info['size']) && 0 == $info['size']) { $contents = ''; } else { // UpdraftPlus_PclZip::getFromIndex() calls PclZip::extract(PCLZIP_OPT_BY_INDEX, array($i), PCLZIP_OPT_EXTRACT_AS_STRING), and this is expensive when done only one item at a time. We try to cache in chunks for good performance as well as being able to resume. if ($i > $content_cache_highest && 'UpdraftPlus_PclZip' == $class_to_use) { $memory_usage = memory_get_usage(false); $total_memory = $updraftplus->memory_check_current(); if ($memory_usage > 0 && $total_memory > 0) { $memory_free = $total_memory*1048576 - $memory_usage; } else { // A sane default. Anything is ultimately better than WP's default of just unzipping everything into memory. $memory_free = 50*1048576; } $use_memory = max(10485760, $memory_free - 10485760); $total_byte_count = 0; $content_cache = array(); $cache_indexes = array(); $cache_index = $i; while ($cache_index < $num_files && $total_byte_count < $use_memory) { if (false !== ($cinfo = $z->statIndex($cache_index)) && isset($cinfo['size']) && '/' != substr($cinfo['name'], -1) && '__MACOSX/' !== substr($cinfo['name'], 0, 9) && 0 === validate_file($cinfo['name'])) { $total_byte_count += $cinfo['size']; if ($total_byte_count < $use_memory) { $cache_indexes[] = $cache_index; $content_cache_highest = $cache_index; } } $cache_index++; } if (!empty($cache_indexes)) { $content_cache = $z->updraftplus_getFromIndexBulk($cache_indexes); } } $contents = isset($content_cache[$i]) ? $content_cache[$i] : $z->getFromIndex($i); } if (false === $contents && ('pclzip' !== $method || 0 !== $info['size'])) { return new WP_Error('extract_failed_'.$method, __('Could not extract file from archive.').' '.$z->last_error, json_encode($info)); } if (!$wp_filesystem->put_contents($to . $info['name'], $contents, FS_CHMOD_FILE)) { return new WP_Error('copy_failed_'.$method, __('Could not copy file.'), $info['name']); } if (!empty($info['size'])) $size_written += $info['size']; do_action('updraftplus_unzip_file_unzipped', $file, $i, $info, $size_written, $num_files); } $z->close(); return true; } } /** * Contact Form * * Displays a customizable contact form */ if ( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly if ( !class_exists( 'avia_sc_contact' ) ) { class avia_sc_contact extends aviaShortcodeTemplate { /** * Create the config array for the shortcode button */ function shortcode_insert_button() { $this->config['self_closing'] = 'no'; $this->config['name'] = __('Contact Form', 'avia_framework' ); $this->config['tab'] = __('Content Elements', 'avia_framework' ); $this->config['icon'] = AviaBuilder::$path['imagesURL']."sc-contact.png"; $this->config['order'] = 43; $this->config['target'] = 'avia-target-insert'; $this->config['shortcode'] = 'av_contact'; $this->config['shortcode_nested'] = array('av_contact_field'); $this->config['tooltip'] = __('Creates a customizable contact form', 'avia_framework' ); $this->config['preview'] = "large"; $this->config['disabling_allowed'] = true; $this->config['id_name'] = 'id'; $this->config['id_show'] = 'yes'; $this->config['aria_label'] = 'yes'; $this->config['alb_desc_id'] = 'alb_description'; } function extra_assets() { //load css wp_enqueue_style( 'avia-module-contact' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/contact/contact.css' , array('avia-layout'), false ); //load js wp_enqueue_script( 'avia-module-contact' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/contact/contact.js' , array('avia-shortcodes'), false, true ); } /** * Popup Elements * * If this function is defined in a child class the element automatically gets an edit button, that, when pressed * opens a modal window that allows to edit the element properties * * @return void */ function popup_elements() { $link = '' . __( 'activated here', 'avia_framework' ) . ''; $captcha_desc = __( 'Do you want to display a Captcha field at the end of the form so users must prove they are human?', 'avia_framework' ) . '

    '; $captcha_desc .= __( 'Either by solving a simply mathematical question or by Google reCaptcha, that needs to be', 'avia_framework' ) . ' ' . $link . '. '; $captcha_desc .= __( 'In case Google reCAPTCHA is deactivated (maybe later) in theme options, Enfold captcha will be used, if you selected to use V2 then V2 will be used for this contact form (even if you selected V3 in theme options). If you selected V3 here and the score fails or you did not selected V3 in theme options then V2 will be used to check if user is a human.', 'avia_framework' ); $captcha_desc .= '

    '; $captcha_desc .= __( '(It is recommended to only activate this if you receive spam from your contact form, since an invisible spam protection is also implemented that should filter most spam messages by robots anyway)', 'avia_framework' ); $default_from = parse_url( home_url() ); $default_from = ( ! empty( $default_from['host'] ) ) ? "no-reply@{$default_from['host']}" : 'no-reply@wp-message.com'; $this->elements = apply_filters( 'avf_sc_contact_popup_elements', array( array( "type" => "tab_container", 'nodescription' => true ), array( "type" => "tab", "name" => __("Form" , 'avia_framework'), 'nodescription' => true ), array( "name" => __("Your email address", 'avia_framework' ), "desc" => __("Enter one or more Email addresses (separated by comma) where mails should be delivered to.", 'avia_framework' ) ." (".__("Default:", 'avia_framework' ) ." ". get_option('admin_email').")", "id" => "email", 'container_class' =>"avia-element-fullwidth", "std" => get_option('admin_email'), "type" => "input"), array( 'name' => __( 'Your from address', 'avia_framework' ), 'desc' => sprintf( __( 'Enter your from address for the form - if left blank it will default to user email or %s', 'avia_framework' ), $default_from ), 'id' => 'from_email', 'std' => '', 'type' => 'input' ), array( "name" => __("Form Title", 'avia_framework' ), "desc" => __("Enter a form title that is displayed above the form", 'avia_framework' ), "id" => "title", "std" => __("Send us mail", 'avia_framework' ), "type" => "input"), array( 'type' => 'template', 'template_id' => 'heading_tag', 'theme_default' => 'h3', 'context' => __CLASS__ ), array( "name" => __("Add/Edit Contact Form Elements", 'avia_framework' ), "desc" => __("Here you can add, remove and edit the form Elements of your contact form.", 'avia_framework' )."
    ". __("Available form elements are: single line Input elements, Textareas, Checkboxes and Select-Dropdown menus.", 'avia_framework' )."

    ". __("It is recommended to not delete the 'E-Mail' field if you want to use an auto responder.", 'avia_framework' ), "type" => "modal_group", "id" => "content", "modal_title" => __("Edit Form Element", 'avia_framework' ), "std" => array( array('label'=>__('Name', 'avia_framework' ), 'type'=>'text', 'check'=>'is_empty'), array('label'=>__('E-Mail', 'avia_framework' ), 'type'=>'text', 'check'=>'is_email'), array('label'=>__('Subject', 'avia_framework' ), 'type'=>'text', 'check'=>'is_empty'), array('label'=>__('Message', 'avia_framework' ), 'type'=>'textarea', 'check'=>'is_empty'), ), 'subelements' => array( array( "name" => __("Form Element Label", 'avia_framework' ), "desc" => "", "id" => "label", "std" => "", "type" => "input"), array( "name" => __("Form Element Type", 'avia_framework' ), "desc" => "", "id" => "type", "type" => "select", "std" => "text", "no_first"=>true, "subtype" => array( __('Form Element: Text Input', 'avia_framework' ) =>'text', __('Form Element: Text Area', 'avia_framework' ) =>'textarea', __('Form Element: Select Element', 'avia_framework' ) =>'select', __('Form Element: Checkbox', 'avia_framework' ) =>'checkbox', __('Form Element: Datepicker', 'avia_framework' ) =>'datepicker', __('Custom HTML: Add a Description', 'avia_framework' ) =>'html', )), array( "name" => __("Form Element Options", 'avia_framework' ) , "desc" => __("Enter any number of options that the visitor can choose from. Separate these Options with a comma.", 'avia_framework' ) ."
    ". __("Example: Option 1, Option 2, Option 3", 'avia_framework' ).""."
    ". __("Note: If you want to use a comma in the option text you have to write 2 comma.", 'avia_framework' )."" , "id" => "options", "required" => array('type','equals','select'), "std" => "", "type" => "input"), array( "name" => __("Multiple answers", 'avia_framework' ), "desc" => __("Check if you want to enable multiple answers", 'avia_framework' ) , "id" => "multi_select", "required" => array('type','equals','select'), "std" => "", "type" => "checkbox"), array( "name" => __("Preselect checkbox", 'avia_framework' ), "desc" => __("Check if you want to preselect the checkbox", 'avia_framework' ) , "id" => "av_contact_preselect", "required" => array('type','equals','checkbox'), "std" => "", "type" => "checkbox"), array( "name" => __("Add Description", 'avia_framework' ) , "id" => "content", "required" => array('type','equals','html'), "std" => "", "type" => "tiny_mce"), array( "name" => __("Form Element Validation", 'avia_framework' ), "desc" => "When selecting "Valid E-Mail address with special characters" keep in mind, that not all E-Mail systems support this feature properly.", "id" => "check", "type" => "select", "std" => "", "no_first"=>true, "required" => array('type','not','html'), "subtype" => array( __('No Validation', 'avia_framework' ) =>'', __('Is not empty', 'avia_framework' ) =>'is_empty', __('Valid E-Mail address', 'avia_framework' ) =>'is_email', __('Valid E-Mail address with special characters', 'avia_framework' ) =>'is_ext_email', __('Valid Phone Number', 'avia_framework' ) =>'is_phone', __('Valid Number', 'avia_framework' ) =>'is_number')), array( "name" => __("Form Element Width", 'avia_framework' ), "desc" => __("Change the width of your elements and let them appear beside each other instead of underneath", 'avia_framework' ) , "id" => "width", "type" => "select", "std" => "", "no_first"=>true, "required" => array('type','not','html'), "subtype" => array( "Fullwidth" =>'', "1/2" =>'element_half', "1/3" =>'element_third' , "2/3" =>'element_two_third', "1/4" => 'element_fourth', "3/4" => 'element_three_fourth')), ) ), array( "name" => __("Submit Button Label", 'avia_framework' ), "desc" => __("Enter the submit buttons label text here", 'avia_framework' ), "id" => "button", "std" => __("Submit", 'avia_framework' ), "type" => "input"), array( "name" => __("What should happen once the form gets sent?", 'avia_framework' ), "desc" => "", "id" => "on_send", "type" => "select", "std" => "", "no_first"=>true, "subtype" => array( __('Display a short message on the same page', 'avia_framework' ) =>'', __('Redirect the user to another page', 'avia_framework' ) =>'redirect', )), array( "name" => __("Message Sent label", 'avia_framework' ), "desc" => __("What should be displayed once the message is sent?", 'avia_framework' ), "id" => "sent", "required" => array('on_send','not','redirect'), "std" => __("Your message has been sent!", 'avia_framework' ), "type" => "input"), array( "name" => __("Redirect", 'avia_framework' ), "desc" => __("To which page do you want the user send to?", 'avia_framework' ), "id" => "link", "type" => "linkpicker", "fetchTMPL" => true, "std" => "", "required" => array('on_send','equals','redirect'), "subtype" => array( __('Set Manually', 'avia_framework' ) =>'manually', __('Single Entry', 'avia_framework' ) =>'single' ), "std" => ""), array( "name" => __("E-Mail Subject", 'avia_framework' ), "desc" => __("You can define a custom Email Subject for your form here. If left empty the subject will be", 'avia_framework' ).": ".__("New Message", 'avia_framework') . " (".__('sent by contact form at','avia_framework')." ".get_option('blogname').")" , "id" => "subject", "std" => "", "type" => "input" ), array( "name" => __("Autoresponder from email address", 'avia_framework' ), "desc" => __("Enter the from email address for the autoresponder.", 'avia_framework' ) . " (" .__( "Default:", 'avia_framework' ) . " " . get_option( 'admin_email' ) . ")", "id" => "autoresponder_email", "std" => get_option('admin_email'), "type" => "input" ), array( "name" => __("Autorespond Text", 'avia_framework' ), "desc" => __("Enter a message that will be sent to the users email address once he has submitted the form.", 'avia_framework' )."

    ". __("If left empty no auto-response will be sent.", 'avia_framework' ), "id" => "autorespond", "std" => "", "type" => "textarea" ), array( 'name' => __( 'Contact Form Captcha', 'avia_framework' ), 'desc' => $captcha_desc, 'id' => 'captcha', 'type' => 'select', 'std' => '', 'subtype' => array( __( 'Don\'t display Captcha', 'avia_framework' ) => '', __( 'Use Enfold Numeric Captcha', 'avia_framework' ) => 'active', __( 'Use Google reCAPTCHA V2 if activated', 'avia_framework' ) => 'recaptcha_v2', __( 'Use Google reCAPTCHA V3 if activated (fallback is V2)', 'avia_framework' ) => 'recaptcha_v3' ) ), array( 'name' => __( 'reCAPTCHA V2 theme color', 'avia_framework' ), 'desc' => __( 'Select a theme color for this contact form widget', 'avia_framework' ), 'id' => 'captcha_theme', 'type' => 'select', 'required' => array( 'captcha', 'parent_in_array', 'recaptcha_v2 recaptcha_v3' ), 'std' => 'light', 'subtype' => array( __( 'Light', 'avia_framework' ) => 'light', __( 'Dark', 'avia_framework' ) => 'dark' ) ), array( 'name' => __( 'reCAPTCHA V2 theme size', 'avia_framework' ), 'desc' => __( 'Select a size for this contact form widget', 'avia_framework' ), 'id' => 'captcha_size', 'type' => 'select', 'required' => array( 'captcha', 'parent_in_array', 'recaptcha_v2 recaptcha_v3'), 'std' => 'normal', 'subtype' => array( __( 'Normal', 'avia_framework' ) => 'normal', __( 'Compact', 'avia_framework' ) => 'compact' ) ), array( 'name' => __( 'Select score for human', 'avia_framework' ), 'id' => 'captcha_score', 'desc' => __( 'A score of 1.0 is very likely a good interaction, 0.0 is very likely a bot. Google recommends a threshold of 0.5 by default. In case we encounter a non human we ask user to verify with Version 2 chckbox.', 'avia_framework' ), 'type' => 'select', 'required' => array( 'captcha', 'equals', 'recaptcha_v3' ), 'subtype' => AviaHtmlHelper::number_array( 0, 1, 0.1, array( __( 'Default', 'avia_framework' ) => '' ) ), 'std' => '0.5' ), array( "name" => __("Hide Form Labels", 'avia_framework' ), "desc" => __("Check if you want to hide form labels above the form elements. The form will instead try to use an inline label (not supported on old browsers)", 'avia_framework' ) , "id" => "hide_labels", "std" => "", "type" => "checkbox"), array( "name" => __("Label/Send Button alignment", 'avia_framework' ), "desc" => __("Select how to align the form labels and the send button", 'avia_framework' ), "id" => "form_align", "type" => "select", "std" => "", "subtype" => array( __('Default', 'avia_framework' ) =>'', __('Centered', 'avia_framework' ) => 'centered' ), "std" => ""), array( "type" => "close_div", 'nodescription' => true ), array( "type" => "tab", "name" => __("Colors",'avia_framework' ), 'nodescription' => true ), array( "name" => __("Form Color Scheme", 'avia_framework' ), "desc" => __("Select a form color scheme here", 'avia_framework' ), "id" => "color", "type" => "select", "std" => "", "subtype" => array( __('Default', 'avia_framework' )=>'', __('Light transparent', 'avia_framework' )=>'av-custom-form-color av-light-form', __('Dark transparent', 'avia_framework' ) =>'av-custom-form-color av-dark-form'), ), array( "type" => "close_div", 'nodescription' => true ), array( 'type' => 'template', 'template_id' => 'screen_options_tab' ), array( "type" => "close_div", 'nodescription' => true ), )); } /** * Editor Sub Element - this function defines the visual appearance of an element that is displayed within a modal window and on click opens its own modal window * Works in the same way as Editor Element * @param array $params this array holds the default values for $content and $args. * @return $params the return array usually holds an innerHtml key that holds item specific markup. */ function editor_sub_element($params) { $template = $this->update_template("label", __("Element", 'avia_framework' ). ": {{label}}"); $params['innerHtml'] = ""; $params['innerHtml'] .= "
    "; $params['innerHtml'] .= "
    class_by_arguments('check' ,$params['args']).">"; $params['innerHtml'] .= "".__("Element", 'avia_framework' ). ": ".$params['args']['label'].""; $params['innerHtml'] .= " *"; $params['innerHtml'] .= "
    "; $params['innerHtml'] .= "
    "; return $params; } /** * Frontend Shortcode Handler * * @param array $atts array of attributes * @param string $content text within enclosing form of shortcode element * @param string $shortcodename the shortcode found, when == callback name * @return string $output returns the modified html string */ function shortcode_handler( $atts, $content = "", $shortcodename = "", $meta = "" ) { extract( AviaHelper::av_mobile_sizes( $atts ) ); //return $av_font_classes, $av_title_font_classes and $av_display_classes $meta = aviaShortcodeTemplate::set_frontend_developer_heading_tag( $atts, $meta ); $atts = shortcode_atts( apply_filters( 'avf_sc_contact_default_atts', array( 'email' => get_option( 'admin_email' ), 'from_email' => '', 'button' => __( "Submit", 'avia_framework' ), 'autoresponder_email' => '', 'autorespond' => '', 'captcha' => '', 'captcha_theme' => 'light', 'captcha_size' => 'normal', 'captcha_score' => '', 'subject' => '', 'on_send' => '', 'link' => '', 'sent' => __( "Your message has been sent!", 'avia_framework' ), 'title' => __( "Send us mail", 'avia_framework' ), 'color' => "", 'hide_labels' => "", 'form_align' => "" ) ), $atts, $this->config['shortcode'] ); /** * For backwards comp. only - can be removed in future versions * In this case set default value in shortcode_atts to get_option('admin_email') * * @since 4.4.2 */ if( empty( $atts['autoresponder_email'] ) ) { $atts['autoresponder_email'] = $atts['email']; } /** * For backwards comp. only - can be removed in future versions * * @since 4.6.2 */ if( empty( $atts['captcha_theme'] ) ) { $atts['captcha_theme'] = 'light'; } extract($atts); $post_id = function_exists('avia_get_the_id') ? avia_get_the_id() : get_the_ID(); $redirect = !empty($on_send) ? AviaHelper::get_url($link) : ""; if(!empty($form_align)) $meta['el_class'] .= " av-centered-form "; $default_heading = ! empty( $meta['heading_tag'] ) ? $meta['heading_tag'] : 'h3'; $args = array( 'heading' => $default_heading, 'extra_class' => $meta['heading_class'] ); $extra_args = array( $this, $atts, $content, 'title' ); /** * @since 4.5.7.2 * @return array */ $args = apply_filters( 'avf_customize_heading_settings', $args, __CLASS__, $extra_args ); $heading = ! empty( $args['heading'] ) ? $args['heading'] : $default_heading; $css = ! empty( $args['extra_class'] ) ? $args['extra_class'] : $meta['heading_class']; $form_args = array( "heading" => $title ? "<{$heading} class='{$css}'>{$title}" : "", "success" => "<{$heading} class='avia-form-success {$css}'>{$sent}", "submit" => $button, "myemail" => $email, 'myfrom' => $from_email, "action" => get_permalink($post_id), "myblogname" => get_option('blogname'), "autoresponder" => $autorespond, "autoresponder_subject" => __( 'Thank you for your Message!', 'avia_framework' ), "autoresponder_email" => $autoresponder_email, "subject" => $subject, "form_class" => $meta['el_class']." ".$color." ".$av_display_classes, "multiform" => true, //allows creation of multiple forms without id collision "label_first" => true, "redirect" => $redirect, "placeholder" => $hide_labels, "numeric_names" => true, 'el-id' => $meta['custom_el_id'], 'aria_label' => $meta['aria_label'], ); if(trim($form_args['myemail']) == '') $form_args['myemail'] = get_option('admin_email'); $content = str_replace("\,", ",", $content ); //form fields passed by the user $form_fields = $this->helper_array2form_fields(ShortcodeHelper::shortcode2array($content, 1)); //fake username field that is not visible. if the field has a value a spam bot tried to send the form $elements['avia_username'] = array('type'=>'decoy', 'label'=>'', 'check'=> 'must_empty' ); //captcha field for the user to verify that he is real $google = in_array( $captcha, array( 'recaptcha_v2', 'recaptcha_v3' ) ); if( 'active' == $captcha || ( $google && Avia_Google_reCAPTCHA()->is_loading_prohibited() ) ) { $elements['avia_age'] = array( 'type' => 'captcha', 'check' => 'captcha', 'label' => __( 'Please prove that you are human by solving the equation', 'avia_framework' ) ); } else if( $google ) { $elements['avia_age'] = array( 'type' => 'grecaptcha', 'container_class' => '', 'custom_class' => '', 'context' => 'av_contact_form', 'token_input' => 'av_recaptcha_token', 'version' => 'avia_' . $captcha, 'theme' => $captcha_theme, 'size' => $captcha_size, 'score' => $captcha_score, 'text_to_preview' => Avia_Builder()->in_text_to_preview_mode() ); } //merge all fields $form_fields = apply_filters('avia_contact_form_elements', array_merge($form_fields, $elements)); $form_fields = apply_filters('avf_sc_contact_form_elements', $form_fields, $atts ); $form_args = apply_filters('avia_contact_form_args', $form_args, $post_id); $contact_form = new avia_form($form_args); $contact_form->create_elements($form_fields); $output = $contact_form->display_form(true); return $output; } /*helper function that converts the shortcode sub array into the format necessary for the contact form*/ function helper_array2form_fields($base) { $form_fields = array(); $labels = array(); if(is_array($base)) { foreach($base as $key => $field) { $sanizited_id = trim(strtolower($field['attr']['label'])); $labels[$sanizited_id] = empty($labels[$sanizited_id]) ? 1 : $labels[$sanizited_id] + 1; if($labels[$sanizited_id] > 1) $sanizited_id = $sanizited_id . '_' . $labels[$sanizited_id]; $form_fields[$sanizited_id] = $field['attr']; if(!empty($field['content'])) $form_fields[$sanizited_id]['content'] = ShortcodeHelper::avia_apply_autop($field['content']); } } return $form_fields; } } } /** * Türkçe translation * @author I.Taskinoglu & A.Kaya * @author Abdullah ELEN * @author Osman KAYAN * @author alikayan95@gmail.com * @author Cengiz AKCAN cengiz@vobo.company * @author Ali KAYAN * @version 2025-06-26 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.tr = { translator : 'I.Taskinoglu & A.Kaya <alikaya@armsyazilim.com>, Abdullah ELEN <abdullahelen@msn.com>, Osman KAYAN <osmnkayan@gmail.com>, alikayan95@gmail.com, Cengiz AKCAN cengiz@vobo.company, Ali KAYAN <alikayan95@gmail.com>', language : 'Türkçe', direction : 'ltr', dateFormat : 'd.m.Y H:i', // will show like: 26.06.2025 09:57 fancyDateFormat : '$1 H:i', // will show like: Bugün 09:57 nonameDateFormat : 'ymd-His', // noname upload will show like: 250626-095752 messages : { /********************************** errors **********************************/ 'error' : 'Hata', 'errUnknown' : 'Bilinmeyen hata.', 'errUnknownCmd' : 'Bilinmeyen komut.', 'errJqui' : 'Geçersiz jQuery UI yapılandırması. Seçilebilir, sürükle ve bırak bileşenlerini içermelidir.', 'errNode' : 'elFinder yaratılması için DOM Element\'ine ihtiyacı vardır.', 'errURL' : 'Geçersiz elFinder yapılandırması! URL seçeneği ayarlanmamış.', 'errAccess' : 'Erişim reddedildi.', 'errConnect' : 'Sunucu-Tarafı\'na bağlanılamıyor.', 'errAbort' : 'Bağlantı iptal edildi.', 'errTimeout' : 'Bağlantı zaman aşımı.', 'errNotFound' : 'Sunucu-Tarafı bulunamadı.', 'errResponse' : 'Geçersiz Sunucu-Tarafı yanıtı.', 'errConf' : 'Geçersiz Sunucu-Tarafı yapılandırması.', 'errJSON' : 'PHP JSON modülü kurulu değil.', 'errNoVolumes' : 'Okunabilir birimler mevcut değil.', 'errCmdParams' : '"$1" komutu için geçersiz parametre.', 'errDataNotJSON' : 'Veri JSON formatında değil.', 'errDataEmpty' : 'Veri boş.', 'errCmdReq' : 'Sunucu-Tarafı isteği için komut adı gerekli.', 'errOpen' : '"$1" açılamıyor.', 'errNotFolder' : 'Nesne bir dizin değil.', 'errNotFile' : 'Nesne bir dosya değil.', 'errRead' : '"$1" okunamıyor.', 'errWrite' : '"$1" yazılamıyor.', 'errPerm' : 'İzin reddedildi.', 'errLocked' : '"$1" kilitli. Bu nedenle taşıma, yeniden adlandırma veya kaldırma yapılamıyor.', 'errExists' : '"$1" adında bir dosya zaten var.', 'errInvName' : 'Geçersiz dosya ismi.', 'errInvDirname' : 'Geçersiz dizin ismi.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Dizin bulunamadı.', 'errFileNotFound' : 'Dosya bulunamadı.', 'errTrgFolderNotFound' : 'Hedef dizin "$1" bulunamadı.', 'errPopup' : 'Tarayıcı popup penceresi açmayı engelledi. Tarayıcı ayarlarından dosya açmayı aktif hale getirin.', 'errMkdir' : 'Dizin oluşturulamıyor "$1".', 'errMkfile' : '"$1" dosyası oluşturulamıyor.', 'errRename' : '"$1" yeniden adlandırma yapılamıyor.', 'errCopyFrom' : '"$1" biriminden dosya kopyalamaya izin verilmedi.', 'errCopyTo' : '"$1" birimine dosya kopyalamaya izin verilmedi.', 'errMkOutLink' : 'Birim kökü dışında bir bağlantı oluşturulamıyor', // from v2.1 added 03.10.2015 'errUpload' : 'Dosya yükleme hatası.', // old name - errUploadCommon 'errUploadFile' : '"$1" dosyası yüklenemedi.', // old name - errUpload 'errUploadNoFiles' : 'Yüklenecek dosya bulunamadı.', 'errUploadTotalSize' : 'Veri izin verilen boyuttan büyük.', // old name - errMaxSize 'errUploadFileSize' : 'Dosya izin verilen boyuttan büyük.', // old name - errFileMaxSize 'errUploadMime' : 'Dosya türüne izin verilmiyor.', 'errUploadTransfer' : '"$1" aktarma hatası.', 'errUploadTemp' : 'Yükleme için geçici dosya yapılamıyor.', // from v2.1 added 26.09.2015 'errNotReplace' : '"$1" nesnesi bu konumda zaten var ve başka türde nesne ile değiştirilemez.', // new 'errReplace' : 'Değişiklik yapılamıyor "$1".', 'errSave' : '"$1" kaydedilemiyor.', 'errCopy' : '"$1" kopyalanamıyor.', 'errMove' : '"$1" taşınamıyor.', 'errCopyInItself' : '"$1" kendi içine kopyalanamaz.', 'errRm' : '"$1" kaldırılamıyor.', 'errTrash' : 'Çöp kutusuna taşınamıyor.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kaynak dosya(lar) kaldırılamıyor.', 'errExtract' : '"$1" kaynağından dosyalar çıkartılamıyor.', 'errArchive' : 'Arşiv oluşturulamıyor.', 'errArcType' : 'Desteklenmeyen arşiv türü.', 'errNoArchive' : 'Dosya arşiv değil veya desteklenmeyen arşiv türü.', 'errCmdNoSupport' : 'Sunucu-Tarafı bu komutu desteklemiyor.', 'errReplByChild' : '“$1” dizini, içerdiği bir öğe tarafından değiştirilemez.', 'errArcSymlinks' : 'Sembolik bağlantıları içeren arşivlerin açılması güvenlik nedeniyle reddedildi.', // edited 24.06.2012 'errArcMaxSize' : 'Arşiv dosyaları izin verilen maksimum boyutu aştı.', 'errResize' : '"$1" yeniden boyutlandırılamıyor.', 'errResizeDegree' : 'Geçersiz döndürme derecesi.', // added 7.3.2013 'errResizeRotate' : 'Resim döndürülemiyor.', // added 7.3.2013 'errResizeSize' : 'Geçersiz resim boyutu.', // added 7.3.2013 'errResizeNoChange' : 'Resim boyutu değiştirilemez.', // added 7.3.2013 'errUsupportType' : 'Desteklenmeyen dosya türü.', 'errNotUTF8Content' : 'Dosya "$1" UTF-8 olmadığından düzenlenemez.', // added 9.11.2011 'errNetMount' : '"$1" bağlanamadı.', // added 17.04.2012 'errNetMountNoDriver' : 'Desteklenmeyen protokol.', // added 17.04.2012 'errNetMountFailed' : 'Bağlama başarısız oldu.', // added 17.04.2012 'errNetMountHostReq' : 'Host gerekli.', // added 18.04.2012 'errSessionExpires' : 'Uzun süre işlem yapılmadığından oturumunuz sonlandı.', 'errCreatingTempDir' : 'Geçici dizin oluşturulamıyor: "$1"', 'errFtpDownloadFile' : 'Dosya FTP: "$1" adresinden indirilemiyor.', 'errFtpUploadFile' : 'Dosya FTP: "$1" adresine yüklenemiyor.', 'errFtpMkdir' : 'FTP: "$1" üzerinde uzak dizin oluşturulamıyor.', 'errArchiveExec' : '"$1" Dosyalarında arşivlenirken hata oluştu.', 'errExtractExec' : '"$1" Dosyaları arşivden çıkartılırken hata oluştu.', 'errNetUnMount' : 'Bağlantı kaldırılamıyor.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'UTF-8\'e dönüştürülemez.', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Dizin yükleyebilmek için daha modern bir tarayıcıya ihtiyacınız var.', // from v2.1 added 26.6.2015 'errSearchTimeout' : '"$1" aranırken zaman aşımına uğradı. Arama sonuçları kısmidir.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Yeniden yetkilendirme gerekiyor.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Maksimum seçilebilir öge sayısı $1 adettir.', // from v2.1.17 added 17.10.2016 'errRestore' : 'Çöp kutusundan geri yüklenemiyor. Geri yükleme notkası belirlenemiyor.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Bu doya türü için düzenleyici bulunamadı.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Sunucu tarafında beklenilmeyen bir hata oluştu.', // from v2.1.25 added 16.6.2017 'errEmpty' : '"$1" Dizini boşaltılamıyor.', // from v2.1.25 added 22.6.2017 'moreErrors' : '"$1" tane daha hata var.', // from v2.1.44 added 9.12.2018 'errMaxMkdirs' : 'Tek seferde en fazla 1$ dizin oluşturabilirsiniz.', // from v2.1.58 added 20.6.2021 /******************************* commands names ********************************/ 'cmdarchive' : 'Arşiv oluştur', 'cmdback' : 'Geri', 'cmdcopy' : 'Kopyala', 'cmdcut' : 'Kes', 'cmddownload' : 'İndir', 'cmdduplicate' : 'Kopyasını oluştur', 'cmdedit' : 'Dosyayı düzenle', 'cmdextract' : 'Arşivden dosyaları çıkart', 'cmdforward' : 'İleri', 'cmdgetfile' : 'Dosyaları seç', 'cmdhelp' : 'Bu yazılım hakkında', 'cmdhome' : 'Kök', 'cmdinfo' : 'Bilgi göster', 'cmdmkdir' : 'Yeni klasör', 'cmdmkdirin' : 'Yeni Klasör / aç', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Yeni dosya', 'cmdopen' : 'Aç', 'cmdpaste' : 'Yapıştır', 'cmdquicklook' : 'Önizleme', 'cmdreload' : 'Geri Yükle', 'cmdrename' : 'Yeniden Adlandır', 'cmdrm' : 'Sil', 'cmdtrash' : 'Çöpe at', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Geri yükle', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Dosyaları bul', 'cmdup' : 'Üst dizine çık', 'cmdupload' : 'Dosyaları yükle', 'cmdview' : 'Görüntüle', 'cmdresize' : 'Boyutlandır & Döndür', 'cmdsort' : 'Sırala', 'cmdnetmount' : 'Ağ birimi bağla', // added 18.04.2012 'cmdnetunmount': 'bağlantıyı kes', // from v2.1 added 30.04.2012 'cmdplaces' : 'Yerlere', // added 28.12.2014 'cmdchmod' : 'Mod değiştir', // from v2.1 added 20.6.2015 'cmdopendir' : 'Bir Dizin Aç', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Sütun genişliğini sıfırla', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Tam Ekran', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Taşı', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Dizini boşalt', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Geri al', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Yinele', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Tercihler', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Tümünü seç', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Seçimi temizle', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Diğerlerini seç', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'Yeni Sekmede aç', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Ögeyi Gizle', // from v2.1.41 added 24.7.2018 /*********************************** buttons ***********************************/ 'btnClose' : 'Kapat', 'btnSave' : 'Kaydet', 'btnRm' : 'Kaldır', 'btnApply' : 'Uygula', 'btnCancel' : 'İptal', 'btnNo' : 'Hayır', 'btnYes' : 'Evet', 'btnDiscard': 'Discard changes', 'btnMount' : 'Bağla', // added 18.04.2012 'btnApprove': 'Git $1 & onayla', // from v2.1 added 26.04.2012 'btnUnmount': 'Bağlantıyı kes', // from v2.1 added 30.04.2012 'btnConv' : 'Dönüştür', // from v2.1 added 08.04.2014 'btnCwd' : 'Buraya', // from v2.1 added 22.5.2015 'btnVolume' : 'Birim', // from v2.1 added 22.5.2015 'btnAll' : 'Hepsi', // from v2.1 added 22.5.2015 'btnMime' : 'MIME Türü', // from v2.1 added 22.5.2015 'btnFileName':'Dosya adı', // from v2.1 added 22.5.2015 'btnSaveClose': 'Kaydet & Kapat', // from v2.1 added 12.6.2015 'btnBackup' : 'Yedekle', // fromv2.1 added 28.11.2015 'btnRename' : 'Yeniden adlandır', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Yeniden adlandır(Tümü)', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Önceki ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Sonraki ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Farklı Kaydet', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Dizin Aç', 'ntffile' : 'Dosya Aç', 'ntfreload' : 'Dizin içeriğini yeniden yükle', 'ntfmkdir' : 'Dizin oluşturuluyor', 'ntfmkfile' : 'Dosyaları oluşturma', 'ntfrm' : 'Öğeleri sil', 'ntfcopy' : 'Öğeleri kopyala', 'ntfmove' : 'Öğeleri taşı', 'ntfprepare' : 'Varolan öğeler kontrol ediliyor', 'ntfrename' : 'Dosyaları yeniden adlandır', 'ntfupload' : 'Dosyalar yükleniyor', 'ntfdownload' : 'Dosyalar indiriliyor', 'ntfsave' : 'Dosyalar kaydediliyor', 'ntfarchive' : 'Arşiv oluşturuluyor', 'ntfextract' : 'Arşivden dosyalar çıkartılıyor', 'ntfsearch' : 'Dosyalar aranıyor', 'ntfresize' : 'Resimler boyutlandırılıyor', 'ntfsmth' : 'İşlem yapılıyor', 'ntfloadimg' : 'Resim yükleniyor', 'ntfnetmount' : 'Ağ birimine bağlanılıyor', // added 18.04.2012 'ntfnetunmount': 'Ağ birimi bağlantısı kesiliyor', // from v2.1 added 30.04.2012 'ntfdim' : 'Resim boyutu alınıyor', // added 20.05.2013 'ntfreaddir' : 'Dizin bilgisi okunuyor', // from v2.1 added 01.07.2013 'ntfurl' : 'Bağlantının URL\'si alınıyor', // from v2.1 added 11.03.2014 'ntfchmod' : 'Dosya modu değiştiriliyor', // from v2.1 added 20.6.2015 'ntfpreupload': 'Yüklenen dosya ismi doğrulanıyor', // from v2.1 added 31.11.2015 'ntfzipdl' : 'İndirilecek dosya oluşturuluyor', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Dosya yolu bilgileri alınıyor', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Yüklenen dosya işleniyor', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Çöp kutusuna atma', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Çöp kutusundan geri yükle', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Hedef dizin kontrol ediliyor', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Önceki işlemi geri alma', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Önceki geri almayı tekrarlama', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'İçeriği kontrol ediniz', // from v2.1.41 added 3.8.2018 /*********************************** volumes *********************************/ 'volume_Trash' : 'Çöp', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'Bilinmiyor', 'Today' : 'Bugün', 'Yesterday' : 'Dün', 'msJan' : 'Oca', 'msFeb' : 'Şub', 'msMar' : 'Mar', 'msApr' : 'Nis', 'msMay' : 'May', 'msJun' : 'Haz', 'msJul' : 'Tem', 'msAug' : 'Ağu', 'msSep' : 'Eyl', 'msOct' : 'Ekm', 'msNov' : 'Kas', 'msDec' : 'Ara', 'January' : 'Ocak', 'February' : 'Şubat', 'March' : 'Mart', 'April' : 'Nisan', 'May' : 'Mayıs', 'June' : 'Haziran', 'July' : 'Temmuz', 'August' : 'Ağustos', 'September' : 'Eylül', 'October' : 'Ekim', 'November' : 'Kasım', 'December' : 'Aralık', 'Sunday' : 'Pazar', 'Monday' : 'Pazartesi', 'Tuesday' : 'Salı', 'Wednesday' : 'Çarşamba', 'Thursday' : 'Perşembe', 'Friday' : 'Cuma', 'Saturday' : 'Cumartesi', 'Sun' : 'Paz', 'Mon' : 'Pzt', 'Tue' : 'Sal', 'Wed' : 'Çar', 'Thu' : 'Per', 'Fri' : 'Cum', 'Sat' : 'Cmt', /******************************** sort variants ********************************/ 'sortname' : 'Ada göre', 'sortkind' : 'Türe göre', 'sortsize' : 'Boyuta göre', 'sortdate' : 'Tarihe göre', 'sortFoldersFirst' : 'Önce dizinler', 'sortperm' : 'izinlere göre', // from v2.1.13 added 13.06.2016 'sortmode' : 'moduna göre', // from v2.1.13 added 13.06.2016 'sortowner' : 'sahibine göre', // from v2.1.13 added 13.06.2016 'sortgroup' : 'grubuna göre', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'Ayrıca ağaç görünümü', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'YeniDosya.txt', // added 10.11.2015 'untitled folder' : 'YeniKlasor', // added 10.11.2015 'Archive' : 'YeniArsiv', // from v2.1 added 10.11.2015 'untitled file' : 'YeniDosya.$1', // from v2.1.41 added 6.8.2018 'extentionfile' : '$1: Dosya', // from v2.1.41 added 6.8.2018 'extentiontype' : '$1: $2', // from v2.1.43 added 17.10.2018 /********************************** messages **********************************/ 'confirmReq' : 'Onay gerekli', 'confirmRm' : 'Öğeleri kaldırmak istediğinden emin misin?
    Bu işlem geri alınamaz!', 'confirmRepl' : 'Eski dosya yenisi ile değiştirilsin mi?', 'confirmRest' : 'Mevcut öge çöp kutusundaki ögeyle değiştirilsin mi?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'UTF-8 değil
    UTF-8\'e dönüştürülsün mü?
    Dönüştürme sonrası kaydedebilmek için içeriğin UTF-8 olması gerekir.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Bu dosyanın karakter kodlaması tespit edilemedi. Düzenleme için geçici olarak UTF-8\'e dönüştürülmesi gerekir.
    Lütfen bu dosyanın karakter kodlamasını seçin.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Düzenlenmiş içerik.
    Değişiklikleri kaydetmek istemiyorsanız son yapılanlar kaybolacak.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Öğeleri çöp kutusuna taşımak istediğinizden emin misiniz?', //from v2.1.24 added 29.4.2017 'confirmMove' : '"$1" değiştirmek istediğinizden emin misiniz?', //from v2.1.50 added 27.7.2019 'apllyAll' : 'Tümüne uygula', 'name' : 'İsim', 'size' : 'Boyut', 'perms' : 'Yetkiler', 'modify' : 'Değiştirildi', 'kind' : 'Tür', 'read' : 'oku', 'write' : 'yaz', 'noaccess' : 'erişim yok', 'and' : 've', 'unknown' : 'bilinmeyen', 'selectall' : 'Tüm öğeleri seç', 'selectfiles' : 'Öğe(ler)i seç', 'selectffile' : 'İlk öğeyi seç', 'selectlfile' : 'Son öğeyi seç', 'viewlist' : 'Liste görünümü', 'viewicons' : 'Simge görünümü', 'viewSmall' : 'Küçük simgeler', // from v2.1.39 added 22.5.2018 'viewMedium' : 'Orta simgleler', // from v2.1.39 added 22.5.2018 'viewLarge' : 'Büyük simgleler', // from v2.1.39 added 22.5.2018 'viewExtraLarge' : 'Çok büyük simgeler', // from v2.1.39 added 22.5.2018 'places' : 'Yerler', 'calc' : 'Hesapla', 'path' : 'Dosya Yolu', 'aliasfor' : 'Takma adı', 'locked' : 'Kilitli', 'dim' : 'Ölçüler', 'files' : 'Dosyalar', 'folders' : 'Dizinler', 'items' : 'Nesneler', 'yes' : 'evet', 'no' : 'hayır', 'link' : 'Bağlantı', 'searcresult' : 'Arama sonuçları', 'selected' : 'Seçili öğeler', 'about' : 'Hakkında', 'shortcuts' : 'Kısayollar', 'help' : 'Yardım', 'webfm' : 'Web dosyası yöneticisi', 'ver' : 'Sürüm', 'protocolver' : 'protokol sürümü', 'homepage' : 'Proje Anasayfası', 'docs' : 'Belgeler', 'github' : 'Github\'ta bizi takip edin', 'twitter' : 'Twitter\'da bizi takip edin', 'facebook' : 'Facebook\'ta bize katılın', 'team' : 'Takım', 'chiefdev' : 'geliştirici şefi', 'developer' : 'geliştirici', 'contributor' : 'iştirakçi', 'maintainer' : 'bakıcı', 'translator' : 'tercüman', 'icons' : 'Simgeler', 'dontforget' : 've havlunuzu almayı unutmayın', 'shortcutsof' : 'Kısayollar devre dışı', 'dropFiles' : 'Dosyaları buraya taşı', 'or' : 'veya', 'selectForUpload' : 'Yüklemek için dosyaları seçin', 'moveFiles' : 'Öğeleri taşı', 'copyFiles' : 'Öğeleri kopyala', 'restoreFiles' : 'Öğeleri geri yükle', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Yerlerinden sil', 'aspectRatio' : 'Görünüm oranı', 'scale' : 'Ölçeklendir', 'width' : 'Genişlik', 'height' : 'Yükseklik', 'resize' : 'Boyutlandır', 'crop' : 'Kırp', 'rotate' : 'Döndür', 'rotate-cw' : '90 derece sağa döndür', 'rotate-ccw' : '90 derece sola döndür', 'degree' : '°', 'netMountDialogTitle' : 'Bağlı (Mount) ağ birimi', // added 18.04.2012 'protocol' : 'Protokol', // added 18.04.2012 'host' : 'Host', // added 18.04.2012 'port' : 'Kapı(Port)', // added 18.04.2012 'user' : 'Kullanıcı', // added 18.04.2012 'pass' : 'Şifre', // added 18.04.2012 'confirmUnmount' : 'Bağlantı kesilsin mi $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Dosyaları tarayıcıdan yapıştır veya bırak', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Dosyaları buraya yapıştır veya bırak', // from v2.1 added 07.04.2014 'encoding' : 'Kodlama', // from v2.1 added 19.12.2014 'locale' : 'Yerel', // from v2.1 added 19.12.2014 'searchTarget' : 'Hedef: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Giriş MIME Türüne Göre Arama', // from v2.1 added 22.5.2015 'owner' : 'Sahibi', // from v2.1 added 20.6.2015 'group' : 'Grup', // from v2.1 added 20.6.2015 'other' : 'Diğer', // from v2.1 added 20.6.2015 'execute' : 'Çalıştır', // from v2.1 added 20.6.2015 'perm' : 'Yetki', // from v2.1 added 20.6.2015 'mode' : 'Mod', // from v2.1 added 20.6.2015 'emptyFolder' : 'Dizin boş', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Dizin boş\\Öğe eklemek için sürükleyin', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Dizin boş\\Öğe eklemek için basılı tutun', // from v2.1.6 added 30.12.2015 'quality' : 'Kalite', // from v2.1.6 added 5.1.2016 'autoSync' : 'Otomatik senkronizasyon', // from v2.1.6 added 10.1.2016 'moveUp' : 'Yukarı taşı', // from v2.1.6 added 18.1.2016 'getLink' : 'URL bağlantısı alın', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Seçili öğeler ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Dizin kimliği', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Çevrimdışı erişime izin ver', // from v2.1.10 added 3.25.2016 'reAuth' : 'Yeniden kimlik doğrulaması için', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Şimdi yükleniyor...', // from v2.1.12 added 4.26.2016 'openMulti' : 'Çoklu dosya aç', // from v2.1.12 added 5.14.2016 'openMultiConfirm': '$1 dosyalarını açmaya çalışıyorsunuz. Tarayıcıda açmak istediğinizden emin misiniz?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Arama hedefinde eşleşen sonuç bulunamadı.', // from v2.1.12 added 5.16.2016 'editingFile' : 'Dosya düzenleniyor.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 öğe seçtiniz.', // from v2.1.13 added 6.3.2016 'hasClipboard' : 'Panonuzda $1 öğeniz var.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Artan arama yalnızca geçerli görünümden yapılır.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Eski durumuna getir', // from v2.1.15 added 3.8.2016 'complete' : '$1 tamamlandı', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Konteks menüsü', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Sayfa çevir', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Kök birimler', // from v2.1.16 added 16.9.2016 'reset' : 'Sıfırla', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Arkaplan rengi', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Renk seçici', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Izgara', // from v2.1.16 added 4.10.2016 'enabled' : 'Etkin', // from v2.1.16 added 4.10.2016 'disabled' : 'Engelli', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Geçerli görünümde arama sonucu bulunamadı. Arama sonucunu genişletmek için \\APress [Enter] yapın', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Geçerli görünümde ilk harf arama sonuçları boş.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Metin etiketi', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 dakika kaldı', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Seçilen kodlamayla yeniden aç', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Seçilen kodlamayla kaydet', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Dizin seç', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'İlk arama sayfası', // from v2.1.23 added 24.3.2017 'presets' : 'Hazır ayarlar', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'çok fazla öge var çöp kutusuna atılamaz.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Metin alanı(TextArea)', // from v2.1.25 added 14.6.2017 'folderToEmpty' : '"$1" dizinini boşalt.', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : '"$1" dizininde öğe yok.', // from v2.1.25 added 22.6.2017 'preference' : 'Tercih', // from v2.1.26 added 28.6.2017 'language' : 'Dil ayarları', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Bu tarayıcıda kayıtlı ayarları başlat', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Araç çubuğu ayarları', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 karakter kaldı', // from v2.1.29 added 30.8.2017 'linesLeft' : '... $1 satır kaldı.', // from v2.1.52 added 16.1.2020 'sum' : 'Toplam', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Kaba dosya boyutu', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fare ile üzerine gelince diyalog öğesi odaklansın', // from v2.1.30 added 2.11.2017 'select' : 'Seç', // from v2.1.30 added 23.11.2017 'selectAction' : 'Dosya seçildiğinde işleme al', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Geçen sefer kullanılan editörle aç', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Zıt seçim', // from v2.1.30 added 25.11.2017 'renameMultiple' : '$1 seçilen öğeleri $2 gibi yeniden adlandırmak istediğinizden emin misiniz?
    Bu geri alınamaz!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Yığın adını değiştir', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Sayı', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Ön ek kele', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Son ek ekle', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Uzantıyı değiştir', // from v2.1.31 added 8.12.2017 'columnPref' : 'Sütun ayarları (Liste görünümü)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Tüm değişiklikler hemen arşive yansıtılacaktır.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Herhangi bir değişiklik, bu birimi kaldırılıncaya kadar yansıtılmayacaktır.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Bağlatıyı kesmek istediğiniz birime bağlı şu birim(ler)\'in de bağlantısı kesilecek. Bağlantıyı kesmek istediğinize emin misiniz?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Seçim Bilgisi', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Dosya imza(hash) algoritmaları', // from v2.1.33 added 10.3.2018 'infoItems' : 'öğelerin bilgisi (Seçim Bilgi Paneli)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Çıkmak için tekrar basın.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Araç Çubuğu', // from v2.1.38 added 4.4.2018 'workspace' : 'Çalışma alanı', // from v2.1.38 added 4.4.2018 'dialog' : 'Diyalog', // from v2.1.38 added 4.4.2018 'all' : 'Tümü', // from v2.1.38 added 4.4.2018 'iconSize' : 'Simge Boyutu (Simge Görünümü)', // from v2.1.39 added 7.5.2018 'editorMaximized' : 'Maksimum düzenleyici penceresini aç', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'API ile dönüşüm şu anda mevcut olmadığından, lütfen web sitesinde dönüştürün.', //from v2.1.40 added 8.7.2018 'editorConvNeedUpload' : 'Dönüştürmeden sonra, dönüştürülen dosyayı kaydetmek için öğe URL\'si veya indirilen bir dosya ile karşıya yüklemeniz gerekir.', //from v2.1.40 added 8.7.2018 'convertOn' : ' $1 site çevrildi', // from v2.1.40 added 10.7.2018 'integrations' : 'Entegrasyonlar', // from v2.1.40 added 11.7.2018 'integrationWith' : 'Bu elFinder aşağıdaki harici hizmetlere entegre edilmiştir. Lütfen kullanmadan önce kullanım koşullarını, gizlilik politikasını vb. Kontrol edin.', // from v2.1.40 added 11.7.2018 'showHidden' : 'Gizli ögeleri aç.', // from v2.1.41 added 24.7.2018 'hideHidden' : 'Gizli ögeleri kapat.', // from v2.1.41 added 24.7.2018 'toggleHidden' : 'Gizli ögeleri aç/kapat', // from v2.1.41 added 24.7.2018 'makefileTypes' : '"Yeni dosya" ile etkinleştirilecek dosya türleri', // from v2.1.41 added 7.8.2018 'typeOfTextfile' : 'Text dosyası tipi.', // from v2.1.41 added 7.8.2018 'add' : 'Ekle', // from v2.1.41 added 7.8.2018 'theme' : 'Tema', // from v2.1.43 added 19.10.2018 'default' : 'Varsayılan', // from v2.1.43 added 19.10.2018 'description' : 'Açıklama', // from v2.1.43 added 19.10.2018 'website' : 'Websayfası', // from v2.1.43 added 19.10.2018 'author' : 'Yazar', // from v2.1.43 added 19.10.2018 'email' : 'E-mail', // from v2.1.43 added 19.10.2018 'license' : 'Lisans', // from v2.1.43 added 19.10.2018 'exportToSave' : 'Bu öğe kaydedilemez. Düzenlemeleri kaybetmemek için PC\'nize aktarmanız gerekir.', // from v2.1.44 added 1.12.2018 'dblclickToSelect': 'Dosyayı seçmek için çift tıklayın.', // from v2.1.47 added 22.1.2019 'useFullscreen' : 'Tam ekran modunu kullan', // from v2.1.47 added 19.2.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Bilinmiyor', 'kindRoot' : 'Birim Kök dizini', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Dizin', 'kindSelects' : 'Seçim', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Alias (Takma ad)', 'kindAliasBroken' : 'Bozuk alias', // applications 'kindApp' : 'Uygulama', 'kindPostscript' : 'Postscript dosyası', 'kindMsOffice' : 'Microsoft Office dosyası', 'kindMsWord' : 'Microsoft Word dosyası', 'kindMsExcel' : 'Microsoft Excel dosyası', 'kindMsPP' : 'Microsoft Powerpoint sunumu', 'kindOO' : 'Open Office dosyası', 'kindAppFlash' : 'Flash uygulaması', 'kindPDF' : 'PDF', 'kindTorrent' : 'Bittorrent dosyası', 'kind7z' : '7z arşivi', 'kindTAR' : 'TAR arşivi', 'kindGZIP' : 'GZIP arşivi', 'kindBZIP' : 'BZIP arşivi', 'kindXZ' : 'XZ arşivi', 'kindZIP' : 'ZIP arşivi', 'kindRAR' : 'RAR arşivi', 'kindJAR' : 'Java JAR dosyası', 'kindTTF' : 'True Type fontu', 'kindOTF' : 'Open Type fontu', 'kindRPM' : 'RPM paketi', // fonts 'kindFont' : 'Fontu', 'kindSFNT' : 'SFNT fontu', 'kindEOT' : 'Embedded Open Type fontu', 'kindWOFF' : 'Web Open Font Format', 'kindWOFF2' : 'Web Open Font Format 2', // texts 'kindText' : 'Metin dosyası', 'kindTextPlain' : 'Düz metin', 'kindPHP' : 'PHP kodu', 'kindCSS' : 'CSS dosyası', 'kindHTML' : 'HTML dosyası', 'kindJS' : 'Javascript kodu', 'kindRTF' : 'Zengin Metin Belgesi', 'kindC' : 'C kodu', 'kindCHeader' : 'C başlık kodu', 'kindCPP' : 'C++ kodu', 'kindCPPHeader' : 'C++ başlık kodu', 'kindShell' : 'Unix shell scripti', 'kindPython' : 'Python kodu', 'kindJava' : 'Java kodu', 'kindRuby' : 'Ruby kodu', 'kindPerl' : 'Perl scripti', 'kindSQL' : 'SQL kodu', 'kindXML' : 'XML dosyası', 'kindAWK' : 'AWK kodu', 'kindCSV' : 'CSV', 'kindDOCBOOK' : 'Docbook XML dosyası', 'kindMarkdown' : 'Markdown dosyası', // added 20.7.2015 // images 'kindImage' : 'Resim', 'kindBMP' : 'BMP dosyası', 'kindJPEG' : 'JPEG dosyası', 'kindGIF' : 'GIF dosyası', 'kindPNG' : 'PNG dosyası', 'kindTIFF' : 'TIFF dosyası', 'kindTGA' : 'TGA dosyası', 'kindPSD' : 'Adobe Photoshop dosyası', 'kindXBITMAP' : 'X bitmap dosyası', 'kindPXM' : 'Pixelmator dosyası', // media 'kindAudio' : 'Ses ortamı', 'kindAudioMPEG' : 'MPEG ses', 'kindAudioMPEG4' : 'MPEG-4 ses', 'kindAudioMIDI' : 'MIDI ses', 'kindAudioOGG' : 'Ogg Vorbis ses', 'kindAudioWAV' : 'WAV ses', 'AudioPlaylist' : 'MP3 listesi', 'kindVideo' : 'Video ortamı', 'kindVideoDV' : 'DV video', 'kindVideoMPEG' : 'MPEG video', 'kindVideoMPEG4' : 'MPEG-4 video', 'kindVideoAVI' : 'AVI video', 'kindVideoMOV' : 'Quick Time video', 'kindVideoWM' : 'Windows Media video', 'kindVideoFlash' : 'Flash video', 'kindVideoMKV' : 'Matroska video', 'kindVideoOGG' : 'Ogg video' } }; })); /** * Progress Bars * * Creates some progress bars */ if ( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly if ( ! class_exists( 'avia_sc_progressbar' ) ) { class avia_sc_progressbar extends aviaShortcodeTemplate { /** * Create the config array for the shortcode button */ function shortcode_insert_button() { $this->config['self_closing'] = 'no'; $this->config['name'] = __( 'Progress Bars', 'avia_framework' ); $this->config['tab'] = __( 'Content Elements', 'avia_framework' ); $this->config['icon'] = AviaBuilder::$path['imagesURL']."sc-progressbar.png"; $this->config['order'] = 30; $this->config['target'] = 'avia-target-insert'; $this->config['shortcode'] = 'av_progress'; $this->config['shortcode_nested'] = array( 'av_progress_bar' ); $this->config['tooltip'] = __( 'Create some progress bars', 'avia_framework' ); $this->config['preview'] = true; $this->config['disabling_allowed'] = true; $this->config['id_name'] = 'id'; $this->config['id_show'] = 'yes'; $this->config['alb_desc_id'] = 'alb_description'; } function extra_assets() { //load css wp_enqueue_style( 'avia-module-progress-bar' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/progressbar/progressbar.css' , array('avia-layout'), false ); //load js wp_enqueue_script( 'avia-module-numbers' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/numbers/numbers.js' , array('avia-shortcodes'), false, true ); wp_enqueue_script( 'avia-module-progress-bar' , AviaBuilder::$path['pluginUrlRoot'].'avia-shortcodes/progressbar/progressbar.js' , array('avia-shortcodes'), false, true ); } /** * Popup Elements * * If this function is defined in a child class the element automatically gets an edit button, that, when pressed * opens a modal window that allows to edit the element properties * * @return void */ function popup_elements() { $this->elements = array( array( "type" => "tab_container", 'nodescription' => true ), array( "type" => "tab", "name" => __("Content" , 'avia_framework'), 'nodescription' => true ), array( "name" => __("Add/Edit Progress Bars", 'avia_framework' ), "desc" => __("Here you can add, remove and edit the various progress bars.", 'avia_framework' ), "type" => "modal_group", "id" => "content", "modal_title" => __("Edit Progress Bars", 'avia_framework' ), "std" => array( array('title'=>__('Skill or Task', 'avia_framework' ), 'icon'=>'43', 'progress'=>'100', 'icon_select'=>'no'), ), 'subelements' => array( array( "name" => __("Progress Bars Title", 'avia_framework' ), "desc" => __("Enter the Progress Bars title here", 'avia_framework' ) , "id" => "title", "std" => "", "type" => "input"), array( "name" => __("Progress in %", 'avia_framework' ), "desc" => __("Select a number between 0 and 100", 'avia_framework' ), "id" => "progress", "type" => "select", "std" => "100", "subtype" => AviaHtmlHelper::number_array(0,100,1, array(), '%') ), array( "name" => __("Bar Color", 'avia_framework' ), "desc" => __("Choose a color for your progress bar here", 'avia_framework' ), "id" => "color", "type" => "select", "std" => "theme-color", "subtype" => array( __('Theme Color', 'avia_framework' )=>'theme-color', __('Blue', 'avia_framework' )=>'blue', __('Red', 'avia_framework' )=>'red', __('Green', 'avia_framework' )=>'green', __('Orange', 'avia_framework' )=>'orange', __('Aqua', 'avia_framework' )=>'aqua', __('Teal', 'avia_framework' )=>'teal', __('Purple', 'avia_framework' )=>'purple', __('Pink', 'avia_framework' )=>'pink', __('Silver', 'avia_framework' )=>'silver', __('Grey', 'avia_framework' )=>'grey', __('Black', 'avia_framework' )=>'black', )), array( "name" => __("Icon", 'avia_framework' ), "desc" => __("Should an icon be displayed at the left side of the progress bar", 'avia_framework' ), "id" => "icon_select", "type" => "select", "std" => "no", "subtype" => array( __('No Icon', 'avia_framework' ) =>'no', __('Yes, display Icon', 'avia_framework' ) =>'yes')), array( "name" => __("List Item Icon",'avia_framework' ), "desc" => __("Select an icon for your list item below",'avia_framework' ), "id" => "icon", "type" => "iconfont", "required" => array('icon_select','equals','yes'), "std" => "", ), ) ), array( "name" => __("Progress Bar Coloring", 'avia_framework' ), "desc" => __("Choose the coloring of the progress bar here", 'avia_framework' ), "id" => "bar_styling", "type" => "select", "std" => "av-striped-bar", "subtype" => array( __( 'Striped', 'avia_framework' ) => 'av-striped-bar', __( 'Single Color', 'avia_framework' ) => 'av-flat-bar' ) ), array( "name" => __("Progress Bar Animation enabled?", 'avia_framework' ), "desc" => __("Choose if you want to enable the continuous animation of the progress bar", 'avia_framework' ), "id" => "bar_animation", "type" => "select", "std" => "av-animated-bar", "required" => array('bar_styling','not','av-flat-bar'), "subtype" => array( __('Enabled', 'avia_framework' ) =>'av-animated-bar', __('Disabled', 'avia_framework' ) =>'av-fixed-bar')), array( "name" => __("Progress Bar Style", 'avia_framework' ), "desc" => __("Choose the styling of the progress bar here", 'avia_framework' ), "id" => "bar_styling_secondary", "type" => "select", "std" => "", "subtype" => array( __('Rounded Big Bars', 'avia_framework' ) =>'', __('Minimal Bars', 'avia_framework' ) =>'av-small-bar')), array( "name" => __("Show Progress Bar percentage?", 'avia_framework' ), "desc" => __("Choose if you want to show the numeric percentage of the progress bar", 'avia_framework' ), "id" => "show_percentage", "type" => "select", "std" => "", "required" => array('bar_styling_secondary','equals','av-small-bar'), "subtype" => array( __('Hide', 'avia_framework' ) =>'', __('Show', 'avia_framework' ) =>'av-show-bar-percentage')), array( "name" => __("Progress Bar Height?", 'avia_framework' ), "desc" => __("Set the height of the progress bar", 'avia_framework' ), "id" => "bar_height", "type" => "select", "std" => "10", "required" => array('bar_styling_secondary','equals','av-small-bar'), "subtype" => AviaHtmlHelper::number_array(1,50,1, array(), 'px')), array( "type" => "close_div", 'nodescription' => true ), array( 'type' => 'template', 'template_id' => 'screen_options_tab' ), array( "type" => "close_div", 'nodescription' => true ) ); } /** * Editor Sub Element - this function defines the visual appearance of an element that is displayed within a modal window and on click opens its own modal window * Works in the same way as Editor Element * @param array $params this array holds the default values for $content and $args. * @return $params the return array usually holds an innerHtml key that holds item specific markup. */ function editor_sub_element($params) { $template = $this->update_template("title","{{title}}: "); $template_percent= $this->update_template("progress", "{{progress}}%"); extract(av_backend_icon($params)); // creates $font and $display_char if the icon was passed as param "icon" and the font as "font" if(empty($params['args']['icon_select'])) $params['args']['icon_select'] = "no"; $params['innerHtml'] = ""; $params['innerHtml'] .= "
    "; $params['innerHtml'] .= " class_by_arguments('icon_select' ,$params['args']).">"; $params['innerHtml'] .= " class_by_arguments('font' ,$font).">"; $params['innerHtml'] .= " ".$display_char.""; $params['innerHtml'] .= " "; $params['innerHtml'] .= " ".$params['args']['title'].": "; $params['innerHtml'] .= " ".$params['args']['progress']."%"; $params['innerHtml'] .= " "; $params['innerHtml'] .= "
    "; return $params; } /** * Returns false by default. * Override in a child class if you need to change this behaviour. * * @since 4.2.1 * @param string $shortcode * @return boolean */ public function is_nested_self_closing( $shortcode ) { if( in_array( $shortcode, $this->config['shortcode_nested'] ) ) { return true; } return false; } /** * Frontend Shortcode Handler * * @param array $atts array of attributes * @param string $content text within enclosing form of shortcode element * @param string $shortcodename the shortcode found, when == callback name * @return string $output returns the modified html string */ function shortcode_handler( $atts, $content = "", $shortcodename = "", $meta = "" ) { extract( AviaHelper::av_mobile_sizes( $atts ) ); //return $av_font_classes, $av_title_font_classes and $av_display_classes extract( shortcode_atts( array( 'position' => 'left', 'bar_styling' => 'av-striped-bar', 'bar_styling_secondary' => '', 'show_percentage' => false, 'bar_height' => false, 'bar_animation' => 'av-animated-bar' ), $atts, $this->config['shortcode'] ) ); $bars = ShortcodeHelper::shortcode2array( $content ); $extraClass = $bar_styling." ".$bar_animation." ".$bar_styling_secondary; $output = ""; $bar_style = ""; if($bar_height && $bar_styling_secondary) { $bar_style = "style='height:{$bar_height}px;'"; } if( ! empty( $bars ) ) { $output .= "
    "; $defaults = array('color' => 'theme-color', 'progress' => "100", 'title'=>"", 'icon'=>'','font'=>'', "icon_select"=>"no"); foreach($bars as $bar) { $bar['attr'] = array_merge($defaults, $bar['attr']); $display_char = av_icon($bar['attr']['icon'], $bar['attr']['font']); $output .= "
    "; if($bar['attr']['icon_select'] == "yes" || $bar['attr']['title']) { $output .="
    "; $output .="
    "; $output .="
    ".$bar['attr']['title']."
    "; $output .="
    "; } if($bar_styling_secondary != "" && $show_percentage) { $output .="
    0%
    "; } $output .= "
    "; $output .= "
    "; } $output .= "
    "; } return $output; } } } Law Office of Asaro & Associates, P.C https://asarofirm.com Tue, 10 Oct 2023 14:12:34 +0000 en-US hourly 1 https://wordpress.org/?v=7.1 https://asarofirm.com/wp-content/uploads/2020/01/Asaro-Favicon_2-36x36.png Law Office of Asaro & Associates, P.C https://asarofirm.com 32 32 Can Birth Injuries Appear Later in Life? https://asarofirm.com/blog/can-birth-injuries-appear-later-in-life/ Tue, 10 Oct 2023 14:12:32 +0000 https://asarofirm.com/?p=1634 What to Do If a Birth Injury Went Unnoticed

    Most birth injuries present themselves right away, such as broken bones or serious brain injuries that require immediate surgery. However, some injuries don’t show up for weeks, months, or even years. Sadly, this means that many parents don’t realize their baby has suffered a serious injury at the hands of negligent doctors or other healthcare providers until well after the fact. But do these parents lose the right to take legal action simply because they are unaware of their child’s injury?

    If your child suffered an injury at birth, you may have the right to seek compensation from those responsible. To learn more about your rights and legal options, contact the Bronx birth injury lawyers at Asaro & Associates. We are dedicated to helping victims of birth injuries get the justice they deserve. Call (347) 231-5459 today to arrange a free consultation.

    What Is Considered a Birth Injury?

    A birth injury is any injury that occurs before, during, or shortly after the birthing process. Examples include:

    • Broken bones
    • Traumatic brain injury
    • Spinal cord injuries
    • Brachial plexus injuries (Erb’s palsy)
    • Shoulder dystocia
    • Cerebral palsy
    • Klumpke’s palsy
    • Vision, hearing, or motor impairment
    • Hydrocephalus
    • Facial injuries

    Birth Injuries That May Have Delayed Symptoms

    Birth injuries that go undiagnosed are typically those that affect a child’s cognitive function and/or his or her mental or physical development and often involve injuries that cause damage to a baby’s brain, spinal cord, or nerves. Causes of these injuries include but are not limited to hypoxia (oxygen deprivation,) undiagnosed or untreated infections, the improper use of forceps or other birth-aiding tools, and the improper administration of medication.

    Birth Injury Claims

    While some birth injuries are not preventable, many are a direct cause of a healthcare provider’s negligent actions. In these cases, the injured victim or a family member acting on their behalf can seek damages by filing a birth injury claim against the negligent party.

    Types of damages include:

    • Past and future medical expenses
    • Rehabilitation
    • Assistive care
    • Home and vehicle modifications
    • Pain and suffering
    • Mental anguish
    • Disability
    • Disfigurement
    • Diminished quality of life
    • Wrongful death damages

    New York’s Birth Injury Statute of Limitations

    A statute of limitations sets forth the maximum amount of time a party has to file a lawsuit after an alleged offense. In the majority of personal injury cases, this time begins on the date the injury occurred. Once the statute of limitations runs out, the injured party loses their right to take legal action against the negligent party.

    But with many birth injury and medical malpractice cases, victims don’t learn of their injuries for months or even years. In these circumstances, New York allows victims to retain the right to take legal action through a modified statute of limitations. It states that an injured party must file a claim for damages within 30 months of the date of injury or from the date the injured victim became aware of their injury.

    If the injured victim is under the age of 18, they have ten years from the date they learned of their injury to file a claim and up to 30 months after they turn 18. However, most parents choose to take legal action on their child’s behalf well before the time afforded by the statute.

    Speak with a Birth Injury Lawyer in The Bronx

    Healthcare providers have a duty to prevent harm or injury to their patients by providing adequate care. When they fail to do so, they must be held accountable for their actions.

    While no amount of money can make up for your child’s injury, taking legal action and seeing that justice is served can bring peace of mind to you and your family.

    At Asaro & Associates, we understand the devastating and far-reaching effects of a serious birth injury. Birth injuries can lead to endless surgeries and costly ongoing care, taking a significant toll on victims and their families. That is why we fight so hard to secure full and fair compensation on behalf of our clients, ensuring they have the means to provide the care their children need. To determine whether you still have the right to seek compensation for your child’s birth injury, contact us online or call (347) 231-5459 to schedule a free case review.

    ]]>
    Which Borough Has The Worst Drivers? https://asarofirm.com/blog/which-borough-has-the-worst-drivers/ Fri, 25 Aug 2023 14:14:46 +0000 https://asarofirm.com/?p=1625 Hey there, city livers and Big Apple enthusiasts! If you’re a New Yorker, you’re probably familiar with the barrage of traffic and taxis that make up our urban playground. But not all boroughs are created equal when it comes to car accidents. It’s helpful to know that New York has five different boroughs, and all five have different rates of car accidents. So, which borough is the worst for car accidents?

    We should always buckle up, but be extra aware of clipping in that safety belt while you’re driving in Brooklyn because it has the most dangerous drivers– by a landslide! According to statistics from the New York Police Department, from June 2021, 10,355 car accidents were reported in New York. Of course, there could have been plenty that went unreported. Of that 10,355, 3,546 were in Brooklyn alone. Below are the numbers from that study.

    • Manhattan: 1,667
    • Bronx: 1,903
    • Brooklyn: 3,546
    • Queens: 2,744
    • Staten Island: 495

    The digits reveal that in that action-packed month of June, Brooklyn had the highest accident rate. Even though the NYPD generated these statistics in only one month in 2021, they reflect what is true on average. While it has some competition, Brooklyn remains at the top.

    Brooklyn Bravado: The Hard Numbers

    Alas, there’s more. June of 2021 was a month that saw some of the highest car accident rates in New York City. Injuries from these fender-bender accidents increased very quickly. 1,756 people were left nursing their bumps, bruises, broken bones, and shaken nerves– motorists, passengers, cyclists, and pedestrians. That is nearly 400 more injuries than its closest contender, Queens. So, if you’re cruising through Brooklyn, wear that seat belt! Here’s how the numbers shaped up for injuries in an accident for the five boroughs. 

    • Manhattan: 684
    • Bronx: 893
    • Brooklyn: 1,756
    • Queens: 1,395
    • Staten Island: 224

    Again, this time, Brooklyn has the most accidents that result in injury. Out of these accidents, injuries may have ranged from severe or minor. But no matter how small the injury, it could still warrant litigation. 

    An experienced and skilled attorney, like the personal injury attorneys at Asaro & Associates, can help you recover damages. It’s evident that many people are injured in car accidents in Brooklyn, so it’s wise to always stay alert while operating a vehicle or walking as a pedestrian in that particular borough. Even though being cautious, you may be injured by a negligent driver and require compensation. 

    Which Borough Has the Most Fatalities?

    Fatalities are the worst of the worst when it comes to car accidents. Let’s give credit where it’s due – at least Brooklyn takes a step back in this category. 

    • Manhattan: 6
    • Bronx: 6
    • Brooklyn: 5
    • Queens: 6
    • Staten Island: 0

    The other boroughs (almost all of them) hold their own in the fatality department. Staten Island gets a gold star for not having any fatalities during this time. Way to go, Staten Island!

    Why Brooklyn’s the “Daredevil” Borough

    Why does Brooklyn lead the charge with the most car accidents? The factors contributing to these automotive incidents include drivers not paying attention (a whopping 970 cases), failing to yield the right-of-way, tailgating, and treating the road like their personal playground. 

    Hiring an Experienced Attorney 

    If you’ve been caught in this chaotic mess, there’s hope. The experienced and consistently winning attorneys at Asaro & Associates, fellow New Yorkers, got your back. If you’re injured, not at fault, and feeling like a pawn in a Brooklyn bumper car game, we’ll take your call.

    Brooklyn: Beware and Take Care

    To all the Brooklyn-living New Yorkers out there, whether you’re walking, cycling, or driving – keep your heads on a swivel and your wits about you. The streets might not be paved with gold, but this city is full of surprises. Be cautious, stay alert, and ensure your fellow New Yorkers do the same.

    When the road gets bumpy, our trusted and experienced winning attorneys at Asaro & Associates will always cover your six. Give us a call at (718) 865-3192 for assistance or any legal support.

    Stay safe out there, NYC!

    ]]>
    What Types of Damages Can TBI Victims Receive? https://asarofirm.com/blog/what-types-of-damages-can-tbi-victims-receive/ Wed, 12 Jul 2023 13:54:39 +0000 https://asarofirm.com/?p=1608 Receiving Financial Recovery After a Traumatic Brain Injury

    Thousands of people suffer non-fatal traumatic brain injuries each year in New York. In some cases, those traumatic brain injuries or TBIs are caused by another person’s negligence or wrongdoing. In those instances, the TBI survivor may be entitled to compensation for their injuries.

    At Asaro & Associates, we provide dedicated advocacy for traumatic brain injury survivors. Our lawyers have secured millions of dollars on behalf of clients throughout New York. We work tirelessly to ensure that TBI survivors and their families receive the maximum compensation allowed by law. 

    If you sustained a TBI after an accident, contact our office at (718) 865-3192 to request a free consultation. 

    What Kinds of Damages Will I Receive After a TBI?

    One of the first questions you may have as a survivor of a traumatic brain injury is what kind of damages you will receive. TBIs can affect nearly every aspect of your life, making it difficult for you to take care of yourself or your family. You might be unable to work or be in extensive therapy. Without assistance, the financial burden is often too much for most people to bear. 

    In TBI cases caused by another person’s negligence or wrongdoing, you may be entitled to economic and non-economic damages. The best way to ensure that you receive the compensation you deserve is by hiring a traumatic brain injury lawyer to represent you. 

    What Are Economic Damages in a TBI Case?

    Economic damages are designed to compensate you for your out-of-pocket, injury-related losses. They are generally quantifiable and easy to calculate.

    Economic damages in a TBI case may include compensation for:

    • Current and future medical bills. Many people assume that they are only entitled to their current medical bills, but a skilled attorney can help determine what the future cost for care and treatment may be for your TBI. 
    • Lost wages. Traumatic brain injury survivors are usually entitled to financial recovery if they are unable to return to work. Lost wages can be proved through income documents such as a W2 or pay stub.
    • Property damage. If your vehicle, home, or other property was damaged in the accident that caused your TBI, you may be entitled to compensation for the cost to repair.
    • Loss of earning capacity. As with medical bills, TBI survivors are not only entitled to their current lost wages they are also able to collect damages related to a loss of future earnings if they are not able to fully return to work or have a diminished capacity.

    While calculating economic damages may seem straightforward, it is in your best interest to have your claim reviewed by an attorney as early as possible. Unrepresented injury victims often end up settling their cases for less than they are worth.

    What Are Non-Economic Damages?

    Non-economic damages in a traumatic brain injury case are harder to calculate. They are damages designed to compensate an individual for personal losses. These damages usually must be determined by an expert in the field.

    Non-economic damages in a TBI case may include compensation for:

    • Pain and suffering. TBI survivors may be entitled to compensation for their physical pain and emotional suffering.
       
    • Mental anguish. A traumatic brain injury may deeply affect a person’s mental health and well-being including causing depression, anxiety disorders, fear, and more.
    • Disability. If the brain injury left you temporarily or permanently disabled, you might be able to collect damages related to the severity of the impairment.
    • Loss of enjoyment of life. Due to the widespread impact that a TBI can have on a person, they are often entitled to compensation for loss of enjoyment of life. It is usually awarded in cases where the injured victim is unable to return to the activities or lifestyle they had before their injury.

    In limited circumstances, a TBI survivor may be entitled to punitive damages in addition to compensation for their economic and non-economic losses. Punitive damages are designed to punish the defendant for their egregious behavior.

    Contact Our Office to Speak with a TBI Lawyer Today

    Did you or a loved one sustain a TBI due to someone else’s wrongdoing? Contact our office at (718) 865-3192 to schedule a free consultation. Let us help you get the compensation you need and deserve after a brain injury. 

    ]]>
    Is a Nursing Home Liable for Resident Fights? https://asarofirm.com/blog/is-a-nursing-home-liable-for-resident-fights/ Thu, 08 Jun 2023 14:44:33 +0000 https://asarofirm.com/?p=1603 What to Do If You Are the Victim of Nursing Home Violence

    Few people expect that when they put their loved one in a nursing home or long-term care facility, they will be the victim of a violent attack. But, patient-on-patient abuse is more common than most people think. If your loved one is attacked at a nursing home, the facility might be liable for damages if they fail to provide adequate supervision or prevent foreseeable harm.

    At the Law Office of Asaro & Associates, P.C., we represent nursing home patients who have suffered an injury in a fight with another resident. Our experienced legal team will work tirelessly to ensure you receive the largest possible recovery. If you or your loved one has been injured in a resident fight at a nursing home in New York City, contact our office at (347) 231-5459 to schedule a free consultation. 

    When a Nursing Home May Be Held Liable for a Resident Fight

    Resident fights can happen at nursing home facilities, particularly if patients are left unattended or if they are not properly screened. If a nursing home fails to provide a reasonable standard of care by not properly supervising residents or by failing to isolate patients with violent tendencies, they may be held liable if someone is injured in a resident fight.

    A nursing home might face liability if a resident is injured in a fight when:

    • There was a lack of proper supervision.
    • There were red flags that a patient had violent tendencies.
    • The staff was not adequately trained.
    • There was inadequate staff on site.
    • They did not properly screen a resident to determine if they had a violent history.
    • They knew or should have known that a fight would occur and did not stop it.
    • They knew of a patient’s mental health disorder that could make them violent and did not intervene. 

    If you believe that a nursing home was negligent in the care and treatment of you or your loved one resulting in harm, you need to speak with an attorney. Depending on the situation, the nursing home facility may be liable for damages, even if the injuries were caused during a resident fight. 

    What Types of Injuries Are Common in Resident Fights?

    Resident fights at nursing homes can result in serious injury or even death. Therefore, fights must be broken up quickly or prevented, to begin with, in order to avoid a potentially life-threatening situation.

    Common injuries in nursing home resident fights include:

    • Broken bones and fractures
    • Traumatic brain injuries (TBIs)
    • Concussions
    • Sprains, strains, or muscle tears
    • Nerve damage
    • Cuts and lacerations

    It is essential for nursing home facilities to be proactive if they suspect that a resident may have a propensity for violence. Staff should be fully trained in de-escalation strategies and constantly supervise patients to ensure safety. 

    Injured in a Nursing Home Resident Fight?

    Were you or a loved one injured in a nursing home resident fight? Contact our office at (347) 231-5459 to schedule a free consultation. Let us help you hold the facility accountable for failing to put the safety of its residents as their top priority.

    ]]>
    Nursing Home Abuse vs. Neglect https://asarofirm.com/blog/nursing-home-abuse-vs-neglect/ Mon, 24 Apr 2023 14:16:27 +0000 https://asarofirm.com/?p=1588 What is the Difference?

    When you place an elder loved one in a nursing home, you expect them to receive good care. Yet, nursing home abuse and neglect are rampant in New York. Disturbingly, only an estimated 23 cases are reported to authorities. Elder abuse and neglect can take many forms, sometimes making it difficult to ascertain what happened.

    The Law Office of Asaro & Associates represents nursing home residents and their families in abuse and neglect cases. Our staff works tirelessly to help you understand your rights and get the best possible outcome if your loved one has experienced mistreatment. If you believe your loved one has been abused or neglected at a nursing home, contact our office at (347) 231-5459 for a no-obligation consultation.

    Understanding Elder Abuse vs. Neglect

    Both abuse and neglect are forms of mistreatment, yet are fundamentally different. Abuse is intentional, involving deliberate acts resulting in serious risk and can be physical or emotional.

    Neglect is either passive or active, depending on the caregiver’s intent, and is often characterized by a lack of action to fulfill caretaking tasks. It is often unintentional, especially when caretakers are overwhelmed or undertrained. However, even unintentional neglect can have serious consequences, such as when a resident receives an incorrect medication.

    What is Nursing Home Elder Abuse?

    Acts considered elder abuse in nursing homes must be intentional, according to the Centers for Disease Control (CDC). Types of elder abuse occurring in nursing homes include:

    • Physical abuse, including restraining a senior physically or chemically with medication.
    • Emotional or psychological abuse, which ranges from ignoring to intimidation or making threats.
    • Sexual abuse involving any non-consensual sexual contact.
    • Financial exploitation, such as the authorized taking, misuse or concealing of assets and property or charging for care that was not given.
    • Healthcare fraud performed by unethical medical personnel or professional care providers.

    What is Nursing Home Elder Neglect?

    Neglect occurs when the nursing home doesn’t meet its caretaking obligations to a resident. It is more common than abuse and can take many different forms. The CDC notes that 15.3% of complaints in nursing homes are for elder neglect.

    Examples of nursing home neglect are:

    • Medical neglect – failing to address or prevent medical issues like not administering medications, improper care for existing conditions like dementia or diabetes, not managing infections or bedsores.
    • Basic needs neglect – not providing food and water, or a clean and safe environment.
    • Personal hygiene neglect –  failing to give adequate assistance with bathing, hair care, brushing teeth, changing soiled clothing and linens, etc.
    • Social/emotional neglect – repeatedly ignoring the senior, preventing them from interacting with others, and frequently yelling at them.

    Consequences of Nursing Home Abuse and Neglect

    Abuse or neglect can significantly impact an elder’s physical and emotional well-being and personal hygiene. Nursing home residents can suffer consequences like anemia, dehydration, undiagnosed illnesses, weight loss or malnutrition. Sometimes, those issues can lead to death, but they can also result in declining health.

    When a nursing home resident’s hygiene needs are unmet, they may smell unpleasant, have dirty skin, and have unclean, ill-fitting or missing clothes. Emotional consequences often result in a change in behavior, including insomnia, isolation, loneliness, loss of trust, depression, anxiety, fear or suicidal thoughts and actions.

    Who is Responsible for Nursing Home Abuse and Neglect?

    The nursing home and individual staff members may be liable for abuse and neglect. Long-term care facilities have a duty to properly hire and train workers to give proper care. They also should maintain sufficient staff to provide adequate care. Lawsuits against nursing homes often result from inadequate staffing.

    Stressed and overworked employees may be unable to provide the needed quality of care. Many facilities also don’t properly screen or run background checks on their hires. Not screening potential employees for drug or alcohol abuse endangers residents as these individuals are more apt to commit abusive acts.

    Understaffing reduces the overall quality of the facility. Impossible workloads lead to overworked staff, who are more likely to make poor decisions. There is little room for error in nursing homes. According to a U.S. Public Interest Research Group report, 20% of American nursing homes are understaffed.

    Contact Our Office for a Complimentary Consultation

    Nursing homes and their employees can face criminal and civil penalties for abusing or neglecting those in their care. Always report suspected incidents to local authorities for investigation. In addition, victims and their families can file an injury lawsuit to collect possible financial compensation for their suffering. If you or a loved one have suffered at the hands of a nursing home, contact our office at (347) 231-5459 to discuss your case with our legal team.

    ]]>
    How Many Pedestrians are Injured in the Bronx Every Year? https://asarofirm.com/blog/how-many-pedestrians-are-injured-in-the-bronx-every-year/ Mon, 03 Apr 2023 14:39:14 +0000 https://asarofirm.com/?p=1576 Vision Zero Pedestrian Action Plan Has Made LIttle Difference

    Pedestrian accidents are on the rise. Even though New York City put its Vision Zero Safety Plan into place in 2015 to reduce the number of accidents occurring in the Bronx and elsewhere, these mishaps continue to occur. While a handful of successes have happened, many Bronx areas still have excessive numbers of mishaps involving severe pedestrian injuries and death.

    The Law Office of Asaro & Associates represents pedestrians who have sustained injuries in traffic accidents and other negligent acts in the Bronx. We have an experienced legal team who can help you understand your rights in a pedestrian injury case and get the compensation you deserve. If you were injured in a pedestrian accident in the Bronx, contact our office at 718-865-2452 to schedule your consultation.

    Hot Spots Where Bronx Pedestrian Accidents Commonly Occur

    About 200 pedestrians suffer severe injuries or are killed in the Bronx annually, averaging about four per week. While the rate of pedestrian accidents has improved, it has not kept up with the rate of improvement in other New York City boroughs, possibly exacerbated by the area’s expressways and high-volume arterial streets prone to crashes.

    Although traffic accidents involving pedestrians can occur anywhere, the Bronx has several areas where these mishaps tend to occur more frequently. Severe pedestrian injuries and fatalities more commonly happen in high-density neighborhoods in the northern and southwestern areas of the Bronx, including the regions of Mott Haven and Fordham.

    Approximately two-thirds of pedestrian accidents occur on Bronx arterial streets, including Grand Concourse, 3rd Avenue, and Fordham Road, all having higher volumes of vehicles and pedestrians. These areas often have more mid-block crossings resulting in pedestrian mishaps as the distances between intersections are lengthy and frequently inadequate to accommodate the number of pedestrians attempting to cross.

    Most Likely Victims and Times for Pedestrian Accidents

    Those most likely to suffer in a pedestrian accident are seniors 65 and older, accounting for 35% of victims. Second are young adults aged 18 to 29, who comprise about 18% of victims.

    These statistics could help explain the prevalence of fatal pedestrian accidents occurring in the Bronx during overnight hours. As most pedestrian accidents occur outside of traditional morning and evening rush hours, the type of jobs that Bronx residents hold could also be another significant factor.

    Pedestrians Suffer More Severe Injuries

    Pedestrians, along with bicyclists, typically suffer more severe injuries because they do not have a vehicle protecting their bodies. Severe injuries can cause death well into the future and can include:

    • Traumatic brain injuries
    • Spinal cord injuries, sometimes resulting in paralysis
    • Internal injuries
    • Facial and dental injuries
    • Skin injuries
    • Bone and joint injuries

    As with most motor vehicle accidents, those involving pedestrians usually result from the negligence of one or more drivers. Accidents involving pedestrians occur because of the following:

    • Driver distraction or inattention
    • Driving while intoxicated
    • Speeding

    Have You or a Family Member Been Injured in a Pedestrian Accident?

    You don’t have to needlessly suffer because of the negligence of others. If you or a loved one has been injured in a pedestrian accident in the Bronx, or if your family member has died due to the accident, you can file a suit seeking compensation.

    Contact our law office at 718-865-2452 to get started on your case. We have recovered millions of dollars in compensation for our clients who have suffered severe personal injuries.

    ]]>
    Avoiding Construction Accidents as a Pedestrian https://asarofirm.com/blog/avoiding-construction-accidents-as-a-pedestrian/ Wed, 08 Mar 2023 15:32:29 +0000 https://asarofirm.com/?p=1561 Construction Site Safety Tips for Pedestrians in NYC

    New York City has thousands of active construction sites. From affordable housing projects to highrise renovations, the city is filled with potentially hazardous areas. While these workplaces present a danger to their employees, they also can result in injuries or deaths to pedestrians nearby.

    At the Law Office of Asaro & Associates, we represent pedestrians who have been hurt or killed in construction accidents throughout New York City. Our experienced legal team can help you understand your rights and fight to get the results you deserve. If you were injured while walking in NYC, contact our office at +13472315459 to schedule a free consultation. 

    How Are Pedestrians Injured at Construction Sites?

    Construction sites can be extremely dangerous, particularly for pedestrians who are not in safety gear and may be unaware of any risks. From falling objects to obstructed walkways, construction sites can cause serious injury or death to passersby.

    Common causes of pedestrian injuries at construction sites:

    • Falling objects
    • Unsecured machinery, tools, or ladders
    • Slip and fall hazards
    • Obstructed walkways
    • Unsecured stairways
    • Exposed wiring
    • Malfunctioning machinery
    • Transportation incidents
    • Crane accidents
    • Unsafe scaffolding

    If you were injured while walking near a construction site, you might be entitled to compensation. It is important to contact an attorney as soon as possible as you may only have a limited amount of time to file a claim for damages. 

    How Can These Accidents Be Prevented?

    Preventing construction accidents requires diligence by the pedestrian, but also by the construction company and its employees. Unfortunately, many pedestrian injuries at construction sites are caused by another person’s negligence. 

    Tips on how pedestrians can avoid construction accidents:

    • Avoid distractions. Put away your cell phone and take out your earbuds. The more alert and aware you are the quicker you will be able to react if there is a hazard at a construction site.
    • Use designated walkways. While they may get crowded, it is always safer to use the designated pedestrian walkway than to attempt to circumvent it. The walkways are usually covered to prevent falling objects from hitting the walkers below.
    • Securing a site. Construction companies must work to keep their sites secure. Unlocked gates or a lack of barricades can result in serious harm to passersby.
    • Marking the site. Construction companies should also clearly mark the construction site and use signage to direct pedestrians to any walkways or detours.
    • Adequate training. A common reason for construction accidents is inadequate training. Companies must invest in training their employees in order to avoid serious harm.

    If you are injured in a pedestrian accident at a construction site, you need to seek medical attention immediately. Failure to receive treatment could negatively impact your case and your recovery.

    Contact Our Office to Learn More

    Were you or a loved one injured while walking near a construction site in NYC? contact our office at +13472315459 to schedule a free case consultation. There are no fees unless we win. We have recovered millions for our clients and will work hard to get you the compensation you deserve. Call now to get started. 

    ]]>
    What Is the Most Dangerous Intersection in the Bronx? https://asarofirm.com/blog/what-is-the-most-dangerous-intersection-in-the-bronx/ Mon, 26 Sep 2022 20:15:49 +0000 https://asarofirm.com/?p=1521 Locations with a High Number of Car Accidents in The Bronx

    The Bronx is home to countless congested streets and expressways. A look at recent crashes shows that some areas are more dangerous than others. Unfortunately, each year thousands of motorists are injured in traffic collisions on these streets. In addition to drivers, hundreds of pedestrians and bicyclists are also at risk for serious injury or death because of the hazardous roadways.

    At the Law Office of Asaro & Associates, P.C., we represent individuals who have been seriously injured in car accidents throughout The Bronx. Our team of dedicated lawyers can help you understand your rights, including whether you are entitled to compensation for your losses. If you were injured in a car wreck in The Bronx, contact our office at (718) 650-2135  to schedule a free consultation. 

    The Bronx Crash Statistics

    According to NYC Crash Mapper, since January 2022, there have been 4,971 total crashes resulting in over 6,000 injuries in The Bronx. A total of 45 people have died in traffic accidents, including 3 cyclists, 19 pedestrians, and 23 motorists. 

    Intersections with large numbers of traffic accidents in The Bronx:

    • Jerome Avenue and Cross Bronx Expy
    • Major Deegan Expressway and West Fordham Road
    • Bronx River Parkway and East Gun Hill Road
    • East 149 Street and Saint Ann’s Ave
    • Grand Concourse and East 149 Street
    • Cross Bronx Expy and 3rd Avenue
    • Bruckner Expy and E. Tremont Ave

    If you are driving in or around The Bronx, it is particularly important to take care at these intersections. Too often, individuals are killed or severely injured in preventable accidents. If you are injured, you should contact a car accident lawyer to help you obtain the compensation you deserve. 

    Common Contributing Factors in Car Accidents 

    As reported by NYC Crash Mapper © CHECKPEDS 2022, in the majority of accidents, the contributing factors were unspecified. However, in many cases, the crashes were the result of negligence or wrongdoing.

    Leading contributing factors in car accidents in The Bronx:

    • Driver inattention/distraction
    • Failure to yield right of way
    • Following too closely
    • Unsafe speed
    • Traffic control disregarded
    • Improper passing or lane use
    • Improper turning

    Regardless of what caused the accident, you should always consult with an attorney as soon as possible to determine your legal options.

    Get a Free Case Evaluation

    At the Law Office of Asaro & Associates, P.C., we offer free, no-obligation case consultations. We have recovered millions in verdicts and settlements on behalf of injured parties throughout The Bronx. With over a decade of collective experience, we know what it takes to get the largest recovery possible for our clients.
    Contact our firm at (718) 650-2135 to discuss your case with an attorney. You pay nothing unless we win. Get the personalized care and attention you need to get the results you deserve. We will come to you at no additional cost. Do not wait until it is too late. You only have a limited amount of time to file a claim. Call now to get started.

    ]]>
    Will My Insurance Cover Chiropractic Therapy After a Car Accident? https://asarofirm.com/blog/will-my-insurance-cover-chiropractic-therapy-after-a-car-accident/ Thu, 25 Aug 2022 16:35:00 +0000 https://asarofirm.com/?p=1518 How an Attorney Can Help You Get the Maximum Compensation for Your Injuries

    If you are seriously injured in a car accident, you may need multiple doctor appointments, rehabilitation, and other forms of treatment, such as chiropractic therapy. Unfortunately, without the help of an attorney, you may not receive the compensation you need to cover all of these injury-related expenses.

    At the Law Office of Asaro & Associates, P.C., our attorneys have over 50 years of collective experience representing individuals who have been injured in car accidents throughout the Bronx. Our knowledgeable legal team will help to get you the maximum recovery available based on the circumstances of your case. If you or a loved one were injured in a car wreck, contact our office at (718) 650-2135 to schedule a free consultation. 

    Getting Compensation for Your Chiropractic Treatments

    Depending on your injuries, you may need treatment beyond what your primary care doctor may offer. In some cases, your healthcare provider may recommend physical therapy, rehabilitation, acupuncture, or chiropractic therapy. 

    These treatments can be expensive, and without the help of a car accident attorney, you may not receive enough money through insurance to cover all of these costs. This means you may end up paying out of pocket or having to sacrifice your well-being because the treatments are unaffordable. 

    What to Do If You Are Involved in an Accident

    If you are involved in an accident with injuries, you need to get medical attention immediately. Failing to seek or continue treatment can directly impact your case. Once you are able, you should consider consulting with an attorney, particularly if you were seriously injured.

    The quicker you act, the more likely you will receive the compensation you deserve after an accident. You should not have to settle for less than your case is worth. Do not make any statements to the insurance company without first consulting an attorney, and be sure to keep detailed records about your injuries and the recommendations of your doctors. 

    Steps You Can Take to Protect Your Rights

    There are several things you can do to protect your right to compensation after a car accident. If you are injured, even if you are unsure of the severity, you should still get checked out by a medical professional. 

    After an auto accident, you need to:

    • Call 911 from the scene of the accident;
    • Take photos and videos of any damage, weather and road conditions, and your injuries;
    • Do not admit fault or make statements to the insurance company;
    • Obtain contact information for any eyewitnesses;
    • Be straightforward and honest with the police;
    • Secure your medical records and follow doctor recommendations;
    • Contact our office to speak with an attorney.

    In order to get compensation for all of your accident-related losses, you need to speak with an attorney. An attorney can help determine your legal options and provide you with the resources you need to move forward.

    Contact Our Office to Get Started

    Were you recently injured in a car accident? Do you need chiropractic therapy but are unsure if insurance will cover the expense? Contact our office today at (718) 650-2135 for a free consultation. There are no fees unless we win. Call now to get started.

    ]]>
    Top 5 Signs of Elder Abuse in Nursing Homes https://asarofirm.com/blog/top-5-signs-of-elder-abuse-in-nursing-homes/ Thu, 11 Aug 2022 19:32:00 +0000 https://asarofirm.com/?p=1515 Nursing Home Abuse and Neglect Red Flags that Should Not Be Ignored

    Nursing home abuse is widespread in New York and throughout the United States. It is important to look for any signs of abuse or neglect and report them to the authorities. In addition to criminal penalties, a nursing home or long-term care facility could also face a civil lawsuit for their wrongdoing. A civil lawsuit can help victims get the compensation they deserve and hold liable parties accountable.

    At the Law Office of Asaro & Associates, we represent individuals and their families in nursing home neglect and abuse cases. We work tirelessly to get justice for victims of elder abuse, never stopping until we receive the best possible outcome for our clients. If you suspect your loved one is being abused or neglected at a nursing home, contact our office at (718) 650-2135 for a free consultation. 

    Consider these top 5 signs of nursing home abuse and neglect:

    1. Bedsores

    Bedsores or pressure ulcers occur when blood supply is cut off to the skin. When a body is immobile, significant pressure is placed on areas of the skin. Prolonged pressure results in the blood flow being cut off and can cause the skin to die. Left untreated, bedsores may become infected.

    It is essential for bedsores to be diagnosed and treated as early as possible. The earlier a bedsore is caught, the more likely a person will make a complete recovery. Bedsores can be prevented by regularly turning and repositioning an immobile or bedridden person. If you see a bedsore developing, you need to speak with a nursing home abuse attorney as it may be a sign of neglect. 

    1. Malnutrition

    Malnutrition and dehydration are other common signs of elder abuse that should be taken seriously. If your loved one experiences sudden, unexplained weight loss or seems disoriented, they may be malnourished. 

    Nursing homes have a duty to ensure that patients receive reasonable care. Not providing enough food or depriving a patient of water is abuse. 

    1. Change in Behavior

    If your loved one begins to act aggressive, aloof, or another unusual behavior, it is a cause for concern. Sudden changes in behavior may be an indication that they are not being properly cared for in the nursing home or long-term care facility. 

    Check-in with your loved one regularly. If they are upset or fearful for any reason, plan a visit. If for any reason, you are denied visitation, you need to consult with an attorney. 

    1. Unexplained Bruises, Burns, or Injuries

    Signs of physical abuse should be reported to the police to be investigated. A nursing home patient should never have unexplained injuries. Bruises, burns, or welts may be indicative of severe mistreatment.

    1. Poor Living Conditions

    When you visit your loved one, pay attention to their living conditions. Are the linens clean? Does your loved one have good hygiene? Is the room too hot? Any signs of substandard living conditions should be investigated and reported.

    Contacting a Nursing Home Abuse Lawyer

    Are there signs of abuse or neglect at your loved one’s nursing home? Contact our office at (718) 650-2135 for a free, no-obligation consultation. Let us help you understand your rights. There are no fees unless we win. Call now to speak directly with an attorney.

    ]]>