Version Description
(2022-06-28) =
Release notes: More reports white labelling options & statistics reports
-
New activity log event IDs
- ID 2133: user taken over a post from another user.
-
New features & functionality
- A number of new activity log statistics reports such as number of newly created users, user profile changes, password changes and password resets, page views, and more.
- Added a number of new whitelabeling options in the activity log reports. Users can now add the business name, contact details, business logo and more in the reports.
- Users can now change the report title, add comments etc.
- Tags for Loggly & AWS Cloudwatch: add tags to the WordPress activity logs mirrored to your logs management system.
-
Plugin & features improvements
- Users can now specify the number of hours when configuring a timeout for idle sessions.
- Automatic plugin and theme updates are now detected and reported in the activity log (event ID: 5004).
- Improved the logic of event ID 4029 - the user triggering the password reset request is now reported as the user who did the action.
- Added the format of the generated report in the periodic reports list.
- Draft posts can also be included in reports criteria.
- The function to import / export plugin settings replaced with our own library (to be used in other plugins).
- Plugin now uses the hook 'deleted_theme' to detect deletion of installed themes.
- Removed the multisite tab from built-in notifications when installed on single site.
- Added a check so the name of a mirroring connection cannot be empty.
- Plugin now checks if there is an existing mirroring connection with the same name so not to overwrite existing ones.
- Removed redundant "Save" button from the "Delete activity log data" page.
- Improved the Integrations wizard - catered for a number of conflicts with other plugins and themes such as Divi.
- Reviewed and improved the text in the WordPress users' sessions management module.
- Reports generation errors now contain details of why reports failed instead of generic errors, helping the user identify what the issue might be.
- When deleting data about an IP address or a user from the logs, the user is now asked if they want to delete the events about the user / where the IP address is mentioned, or events generated from that user or IP address.
- Optimized the way licensing data is stored on a multisite network.
- Premium plugin advert in activity log viewer is now fixed - it does not interrupt user.
- Added a new filter to specify which long data fields should be truncated in the activity log viewer.
- "Email Notifications" section renamed to "Email & SMS Notifications".
- Reviewed and rewritten the help text in the Sessions module to advise users to terminate current sessions before restricting sessions.
- Applied a number of UI/UX tweakts to the Enable/Disable events section making it neater and easier to use.
- Post titles are now reported and linked to the post in the daily update email.
-
Bug fixes
- When user changes multiple plugin settings the plugin now is reporting all the changes and not just one.
- Fatal error reported when running certain activity log searches.
- Event ID 6310 no longer incorrectly reported with every plugin setting change.
- Fixed: activity log retention settings deleted and rewritten to database on page reloads.
- Fixed: some premium features such as the "link to view all users activity" available in the free edition.
- Fixed: New notification help text shows HTML code rather than formatted message.
- Fixed: Clicking the expand data in activity log viewer resets the view and redirects the user to top of the activity log.
- Fixed: Reports filter "Post type" was not finding events about posts with some custom post types.
- Fixed: Changes in activity log retention settings not correctly reported in event ID 6052.
- Fixed: When a user changes a post's title and content, only the title change is reported.
- Fixed: Deleting of activity log events by severity is not deleting the events.
- Fixed: Excape characters in password cause authentication with third party services to fail.
- Fixed: The setting "Cleanup expired session data" cannot be disabled.
- Fixed: Step 2 in the integrations wizard is not "scrollable" if you go back to it while configuring a connection.
- Fixed: changes in built-in email notifications are not saved in some specific scenarios.
Refer to the complete plugin changelog for more detailed information about what was new, improved and fixed in previous versions of the WP Activity Log plugin.
Download this release
Release Info
Developer | WPWhiteSecurity |
Plugin | WP Security Audit Log |
Version | 4.4.2 |
Comparing to | |
See all releases |
Code changes from version 4.4.1 to 4.4.2
- classes/AbstractSensor.php +52 -1
- classes/Adapters/MySQL/ActiveRecordAdapter.php +221 -32
- classes/Adapters/MySQL/MetaAdapter.php +19 -4
- classes/Adapters/MySQL/OccurrenceAdapter.php +5 -3
- classes/Adapters/MySQL/QueryAdapter.php +3 -1
- classes/Adapters/MySQL/TmpUserAdapter.php +2 -0
- classes/Alert.php +2 -5
- classes/AlertFormatter.php +64 -14
- classes/AlertManager.php +95 -83
- classes/AuditLogGridView.php +1 -1
- classes/AuditLogListView.php +3 -3
- classes/Autoloader.php +0 -97
- classes/Connector/AbstractConnector.php +0 -6
- classes/Connector/ConnectorFactory.php +47 -21
- classes/Connector/MySQLDB.php +10 -14
- classes/Entities/class-abstract-entity.php +249 -0
- classes/Entities/class-metadata-entity.php +56 -0
- classes/Entities/class-occurrences-entity.php +92 -0
- classes/Entities/class-options-entity.php +88 -0
- classes/Helpers/Options.php +9 -2
- classes/Helpers/class-classes-helper.php +171 -0
- classes/Helpers/class-php-helper.php +54 -0
- classes/Helpers/class-validator.php +106 -0
- classes/Helpers/class-wp-helper.php +408 -0
- classes/Loggers/Database.php +10 -9
- classes/MainWpApi.php +7 -3
- classes/Migration/class-abstract-migration.php +259 -0
- classes/Migration/class-metadata-migration-440.php +231 -0
- classes/Migration/class-migration.php +496 -0
- classes/SensorManager.php +35 -24
- classes/Sensors/Content.php +195 -138
- classes/Sensors/Database.php +5 -0
- classes/Sensors/Files.php +8 -0
- classes/Sensors/LogInOut.php +11 -11
- classes/Sensors/MetaData.php +2 -15
- classes/Sensors/PluginsThemes.php +105 -38
- classes/Sensors/UserProfile.php +27 -26
- classes/Settings.php +70 -40
- classes/Uninstall.php +3 -3
- classes/Upgrade/MetadataMigration.php +0 -208
- classes/Upgrade/{Upgrade_43000_to_44400.php → Upgrade_43000_To_44400.php} +2 -0
- classes/Utilities/Emailer.php +4 -4
- classes/Utilities/FileSystemUtils.php +5 -2
- classes/ViewManager.php +2 -2
- classes/Views/AuditLog.php +1 -54
- classes/Views/Help.php +13 -3
- classes/Views/Settings.php +27 -12
- classes/Views/SetupWizard.php +2 -1
- classes/Views/ToggleAlerts.php +37 -3
- classes/Views/addons/html-view.php +23 -22
- css/dist/wsal-wizard.css +1 -1
- css/src/simple-lightbox.css +231 -0
- css/src/simple-lightbox.min.css +7 -0
- defaults.php +15 -1
- js/auditlog.js +2 -1
- js/common.js +9 -0
- js/dist/wsal-wizard.js +7 -1
- js/settings.js +6 -1
- js/src/jquery-steps/build/jquery.steps.js +2054 -0
- js/src/jquery-steps/build/jquery.steps.min.js +6 -0
- js/src/jquery-steps/demo/css/jquery.steps.css +382 -0
- js/src/jquery-steps/demo/css/main.css +300 -0
- js/src/jquery-steps/demo/css/normalize.css +533 -0
- js/src/jquery-validation/LICENSE.md +22 -0
- js/src/jquery-validation/README.md +99 -0
- js/src/jquery-validation/changelog.md +776 -0
- js/src/jquery-validation/dist/jquery.validate.js +1657 -0
- js/src/jquery-validation/dist/jquery.validate.min.js +4 -0
- js/src/jquery-validation/package.json +91 -0
- js/src/simple-lightbox.jquery.js +1662 -0
- js/src/simple-lightbox.jquery.min.js +1 -0
- languages/wp-security-audit-log-de_DE.po +2178 -0
- languages/wp-security-audit-log-es_ES.po +2917 -0
- languages/wp-security-audit-log-fr_FR.po +2803 -0
- languages/wp-security-audit-log-it_IT.mo +0 -0
- languages/wp-security-audit-log-it_IT.po +6537 -0
classes/AbstractSensor.php
CHANGED
@@ -30,6 +30,22 @@ abstract class WSAL_AbstractSensor {
|
|
30 |
*/
|
31 |
protected $plugin;
|
32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
/**
|
34 |
* Method: Constructor.
|
35 |
*
|
@@ -45,7 +61,7 @@ abstract class WSAL_AbstractSensor {
|
|
45 |
* @return boolean
|
46 |
*/
|
47 |
protected function is_multisite() {
|
48 |
-
return
|
49 |
}
|
50 |
|
51 |
/**
|
@@ -112,4 +128,39 @@ abstract class WSAL_AbstractSensor {
|
|
112 |
* @deprecated 4.4.1 Replaced by function hook_events.
|
113 |
*/
|
114 |
public function HookEvents() {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
}
|
30 |
*/
|
31 |
protected $plugin;
|
32 |
|
33 |
+
/**
|
34 |
+
* Amount of seconds to check back for the given alert occurrence.
|
35 |
+
*
|
36 |
+
* @var integer
|
37 |
+
*
|
38 |
+
* @since 4.4.2
|
39 |
+
*/
|
40 |
+
protected static $seconds_to_check_back = 5;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Holds a cached value if the checked alerts which were recently fired.
|
44 |
+
*
|
45 |
+
* @var array
|
46 |
+
*/
|
47 |
+
private static $cached_alert_checks = array();
|
48 |
+
|
49 |
/**
|
50 |
* Method: Constructor.
|
51 |
*
|
61 |
* @return boolean
|
62 |
*/
|
63 |
protected function is_multisite() {
|
64 |
+
return WpSecurityAuditLog::is_multisite();
|
65 |
}
|
66 |
|
67 |
/**
|
128 |
* @deprecated 4.4.1 Replaced by function hook_events.
|
129 |
*/
|
130 |
public function HookEvents() {}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Check if the alert was triggered recently.
|
134 |
+
*
|
135 |
+
* Checks last 5 events if they occurred less than self::$seconds_to_check_back seconds ago.
|
136 |
+
*
|
137 |
+
* @param integer|array $alert_id - Alert code.
|
138 |
+
* @return boolean
|
139 |
+
*/
|
140 |
+
protected function was_triggered_recently( $alert_id ) {
|
141 |
+
// if we have already checked this don't check again.
|
142 |
+
if ( isset( self::$cached_alert_checks ) && array_key_exists( $alert_id, self::$cached_alert_checks ) && self::$cached_alert_checks[ $alert_id ] ) {
|
143 |
+
return true;
|
144 |
+
}
|
145 |
+
$query = new WSAL_Models_OccurrenceQuery();
|
146 |
+
$query->add_order_by( 'created_on', true );
|
147 |
+
$query->set_limit( 5 );
|
148 |
+
$last_occurrences = $query->get_adapter()->execute_query( $query );
|
149 |
+
$known_to_trigger = false;
|
150 |
+
foreach ( $last_occurrences as $last_occurrence ) {
|
151 |
+
if ( $known_to_trigger ) {
|
152 |
+
break;
|
153 |
+
}
|
154 |
+
if ( ! empty( $last_occurrence ) && ( $last_occurrence->created_on + self::$seconds_to_check_back ) > time() ) {
|
155 |
+
if ( ! is_array( $alert_id ) && $last_occurrence->alert_id === $alert_id ) {
|
156 |
+
$known_to_trigger = true;
|
157 |
+
} elseif ( is_array( $alert_id ) && in_array( $last_occurrence[0]->alert_id, $alert_id, true ) ) {
|
158 |
+
$known_to_trigger = true;
|
159 |
+
}
|
160 |
+
}
|
161 |
+
}
|
162 |
+
// once we know the answer to this don't check again to avoid queries.
|
163 |
+
self::$cached_alert_checks[ $alert_id ] = $known_to_trigger;
|
164 |
+
return $known_to_trigger;
|
165 |
+
}
|
166 |
}
|
classes/Adapters/MySQL/ActiveRecordAdapter.php
CHANGED
@@ -7,11 +7,18 @@
|
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
|
|
|
|
10 |
// Exit if accessed directly.
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
13 |
}
|
14 |
|
|
|
|
|
|
|
|
|
|
|
15 |
/**
|
16 |
* MySQL database ActiveRecord class.
|
17 |
*
|
@@ -22,12 +29,12 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
22 |
*
|
23 |
* @package wsal
|
24 |
*/
|
25 |
-
class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInterface {
|
26 |
|
27 |
/**
|
28 |
* DB Connection
|
29 |
*
|
30 |
-
* @var
|
31 |
*/
|
32 |
protected $connection;
|
33 |
|
@@ -79,32 +86,42 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
79 |
}
|
80 |
|
81 |
switch ( $statistics_report_type ) {
|
82 |
-
case WSAL_Rep_Common::DIFFERENT_IP:
|
83 |
array_push( $grouping, 'users' );
|
84 |
array_push( $grouping, 'ips' );
|
85 |
break;
|
86 |
-
case WSAL_Rep_Common::ALL_IPS:
|
87 |
array_push( $grouping, 'ips' );
|
88 |
break;
|
89 |
-
case WSAL_Rep_Common::LOGIN_ALL:
|
90 |
-
case WSAL_Rep_Common::LOGIN_BY_USER:
|
91 |
-
case WSAL_Rep_Common::LOGIN_BY_ROLE:
|
92 |
-
case WSAL_Rep_Common::PUBLISHED_ALL:
|
93 |
-
case WSAL_Rep_Common::PUBLISHED_BY_USER:
|
94 |
-
case WSAL_Rep_Common::PUBLISHED_BY_ROLE:
|
95 |
-
case WSAL_Rep_Common::ALL_USERS:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
array_push( $grouping, 'users' );
|
|
|
97 |
break;
|
98 |
|
99 |
-
case WSAL_Rep_Common::VIEWS_ALL:
|
100 |
array_push( $grouping, 'posts' );
|
101 |
break;
|
102 |
|
103 |
-
case WSAL_Rep_Common::VIEWS_BY_USER:
|
104 |
-
case WSAL_Rep_Common::VIEWS_BY_ROLE:
|
105 |
array_push( $grouping, 'users' );
|
106 |
array_push( $grouping, 'posts' );
|
107 |
break;
|
|
|
108 |
}
|
109 |
}
|
110 |
|
@@ -198,7 +215,7 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
198 |
* {@inheritDoc}
|
199 |
*/
|
200 |
public function get_model() {
|
201 |
-
return new WSAL_Models_Query();
|
202 |
}
|
203 |
|
204 |
/**
|
@@ -323,7 +340,7 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
323 |
}
|
324 |
|
325 |
if ( is_array( $copy->$key ) || is_object( $copy->$key ) ) {
|
326 |
-
$data[ $key ] = WSAL_Helpers_DataHelper::json_encode( $val );
|
327 |
} else {
|
328 |
$data[ $key ] = $val;
|
329 |
}
|
@@ -336,8 +353,19 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
336 |
unset( $format[ $id_index ] );
|
337 |
}
|
338 |
|
|
|
|
|
339 |
$result = $_wpdb->replace( $this->get_table(), $data, $format );
|
340 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
341 |
if ( false !== $result && $_wpdb->insert_id ) {
|
342 |
$copy->set_id( $_wpdb->insert_id );
|
343 |
}
|
@@ -372,7 +400,19 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
372 |
$_wpdb = $this->connection;
|
373 |
$result = array();
|
374 |
$sql = $_wpdb->prepare( 'SELECT * FROM ' . $this->get_table() . ' WHERE ' . $cond, $args );
|
375 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
376 |
$result[] = $this->get_model()->load_data( $data );
|
377 |
}
|
378 |
|
@@ -418,7 +458,21 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
418 |
$sql = ( ! is_array( $args ) || ! count( $args ) ) // Do we really need to prepare() or not?
|
419 |
? ( $cond )
|
420 |
: $_wpdb->prepare( $cond, $args );
|
421 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
422 |
$result[] = $this->get_model()->load_data( $data );
|
423 |
}
|
424 |
|
@@ -444,7 +498,18 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
444 |
$_wpdb = $this->connection;
|
445 |
$sql = $_wpdb->prepare( 'SELECT COUNT(*) FROM ' . $this->get_table() . ' WHERE ' . $cond, $args );
|
446 |
|
447 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
448 |
}
|
449 |
|
450 |
/**
|
@@ -492,12 +557,30 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
492 |
// Figure out the grouping statement and the columns' selection.
|
493 |
$grouping = self::get_grouping( $statistics_report_type, $grouping_period );
|
494 |
|
|
|
|
|
|
|
|
|
495 |
// Build the SQL query and runs it.
|
496 |
-
$query = $this->build_reporting_query( $report_args, false, $grouping, $next_date, $limit );
|
497 |
|
498 |
// Statistical reports expect data as array, regular reports use objects.
|
499 |
$result_format = is_null( $statistics_report_type ) ? OBJECT : ARRAY_A;
|
500 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
501 |
|
502 |
if ( ! empty( $results ) ) {
|
503 |
$last_item = end( $results );
|
@@ -523,13 +606,15 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
523 |
* time period only.
|
524 |
* @param int $next_date (Optional) Created on >.
|
525 |
* @param int $limit (Optional) Limit.
|
|
|
526 |
*
|
527 |
* @return string
|
528 |
*/
|
529 |
-
private function build_reporting_query( $report_args, $count_only, $grouping = null, $next_date = null, $limit = 0 ) {
|
530 |
$occurrence = new WSAL_Adapters_MySQL_Occurrence( $this->connection );
|
531 |
$table_occ = $occurrence->get_table();
|
532 |
|
|
|
533 |
if ( $count_only ) {
|
534 |
$select_fields = array( 'COUNT(1) as count' );
|
535 |
$group_by = array( 'occ.id' );
|
@@ -559,13 +644,27 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
559 |
array_push( $group_by, 'site_id' );
|
560 |
break;
|
561 |
case 'users':
|
562 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
563 |
array_push( $group_by, 'user' );
|
564 |
break;
|
565 |
case 'posts':
|
566 |
array_push( $select_fields, 'post_id' );
|
567 |
array_push( $group_by, 'post_id' );
|
568 |
break;
|
|
|
|
|
|
|
|
|
569 |
case 'day':
|
570 |
array_push( $select_fields, 'DATE_FORMAT( FROM_UNIXTIME( occ.created_on ), "%Y-%m-%d" ) AS period' );
|
571 |
array_push( $group_by, 'period' );
|
@@ -585,8 +684,13 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
585 |
}
|
586 |
|
587 |
$sql = 'SELECT ' . implode( ',', $select_fields ) . ' FROM ' . $table_occ . ' AS occ ';
|
|
|
|
|
|
|
|
|
588 |
|
589 |
$sql .= $this->build_where_statement( $report_args );
|
|
|
590 |
if ( ! empty( $next_date ) ) {
|
591 |
$sql .= ' AND occ.created_on < ' . $next_date;
|
592 |
}
|
@@ -661,27 +765,27 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
661 |
$_post_ids = null;
|
662 |
$post_ids_negate_expression = '';
|
663 |
if ( $report_args->post__in ) {
|
664 |
-
$_post_ids = $this->
|
665 |
} elseif ( $report_args->post__not_in ) {
|
666 |
-
$_post_ids = $this->
|
667 |
$post_ids_negate_expression = 'NOT';
|
668 |
}
|
669 |
|
670 |
$_post_types = null;
|
671 |
$post_types_negate_expression = '';
|
672 |
if ( $report_args->post_type__in ) {
|
673 |
-
$_post_types = $this->
|
674 |
} elseif ( $report_args->post_type__not_in ) {
|
675 |
-
$_post_types = $this->
|
676 |
$post_types_negate_expression = 'NOT';
|
677 |
}
|
678 |
|
679 |
$_post_statuses = null;
|
680 |
$post_statuses_negate_expression = '';
|
681 |
if ( $report_args->post_status__in ) {
|
682 |
-
$_post_statuses = $this->
|
683 |
} elseif ( $report_args->post_status__not_in ) {
|
684 |
-
$_post_statuses = $this->
|
685 |
$post_statuses_negate_expression = 'NOT';
|
686 |
}
|
687 |
|
@@ -714,13 +818,13 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
714 |
|
715 |
$_start_timestamp = null;
|
716 |
if ( $report_args->start_date ) {
|
717 |
-
$start_datetime = DateTime::createFromFormat( 'Y-m-d H:i:s', $report_args->start_date . ' 00:00:00' );
|
718 |
$_start_timestamp = $start_datetime->format( 'U' );
|
719 |
}
|
720 |
|
721 |
$_end_timestamp = null;
|
722 |
if ( $report_args->end_date ) {
|
723 |
-
$end_datetime = DateTime::createFromFormat( 'Y-m-d H:i:s', $report_args->end_date . ' 23:59:59' );
|
724 |
$_end_timestamp = $end_datetime->format( 'U' );
|
725 |
}
|
726 |
|
@@ -898,6 +1002,10 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
898 |
array_push( $group_by_columns, 'client_ip' );
|
899 |
}
|
900 |
|
|
|
|
|
|
|
|
|
901 |
$select_fields = $group_by_columns;
|
902 |
foreach ( $grouping as $grouping_item ) {
|
903 |
switch ( $grouping_item ) {
|
@@ -968,7 +1076,7 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
968 |
// If transient does not exist, then run SQL query.
|
969 |
if ( ! $wsal_db_table_status ) {
|
970 |
$wsal_db_table_status = strtolower( $_wpdb->get_var( $sql ) ) === strtolower( $this->get_table() );
|
971 |
-
set_transient( $wsal_table_transient, $wsal_db_table_status, DAY_IN_SECONDS );
|
972 |
}
|
973 |
|
974 |
return $wsal_db_table_status;
|
@@ -1018,4 +1126,85 @@ class WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_ActiveRecordInte
|
|
1018 |
public function update_query( $table, $data, $where ) {
|
1019 |
return $this->connection->update( $table, $data, $where );
|
1020 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1021 |
}
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
10 |
+
namespace WSAL\Adapter;
|
11 |
+
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
|
18 |
+
/**
|
19 |
+
* TODO: move this code to its proper place - in the occurrences entity class and get rid of everything here
|
20 |
+
*/
|
21 |
+
|
22 |
/**
|
23 |
* MySQL database ActiveRecord class.
|
24 |
*
|
29 |
*
|
30 |
* @package wsal
|
31 |
*/
|
32 |
+
class WSAL_Adapters_MySQL_ActiveRecord implements \WSAL_Adapters_ActiveRecordInterface {
|
33 |
|
34 |
/**
|
35 |
* DB Connection
|
36 |
*
|
37 |
+
* @var object
|
38 |
*/
|
39 |
protected $connection;
|
40 |
|
86 |
}
|
87 |
|
88 |
switch ( $statistics_report_type ) {
|
89 |
+
case \WSAL_Rep_Common::DIFFERENT_IP:
|
90 |
array_push( $grouping, 'users' );
|
91 |
array_push( $grouping, 'ips' );
|
92 |
break;
|
93 |
+
case \WSAL_Rep_Common::ALL_IPS:
|
94 |
array_push( $grouping, 'ips' );
|
95 |
break;
|
96 |
+
case \WSAL_Rep_Common::LOGIN_ALL:
|
97 |
+
case \WSAL_Rep_Common::LOGIN_BY_USER:
|
98 |
+
case \WSAL_Rep_Common::LOGIN_BY_ROLE:
|
99 |
+
case \WSAL_Rep_Common::PUBLISHED_ALL:
|
100 |
+
case \WSAL_Rep_Common::PUBLISHED_BY_USER:
|
101 |
+
case \WSAL_Rep_Common::PUBLISHED_BY_ROLE:
|
102 |
+
case \WSAL_Rep_Common::ALL_USERS:
|
103 |
+
case \WSAL_Rep_Common::VIEWS_BY_POST:
|
104 |
+
case \WSAL_Rep_Common::PROFILE_CHANGES_ALL:
|
105 |
+
case \WSAL_Rep_Common::PROFILE_CHANGES_BY_USER:
|
106 |
+
case \WSAL_Rep_Common::PROFILE_CHANGES_BY_ROLE:
|
107 |
+
array_push( $grouping, 'users' );
|
108 |
+
break;
|
109 |
+
|
110 |
+
case \WSAL_Rep_Common::PASSWORD_CHANGES:
|
111 |
array_push( $grouping, 'users' );
|
112 |
+
array_push( $grouping, 'events' );
|
113 |
break;
|
114 |
|
115 |
+
case \WSAL_Rep_Common::VIEWS_ALL:
|
116 |
array_push( $grouping, 'posts' );
|
117 |
break;
|
118 |
|
119 |
+
case \WSAL_Rep_Common::VIEWS_BY_USER:
|
120 |
+
case \WSAL_Rep_Common::VIEWS_BY_ROLE:
|
121 |
array_push( $grouping, 'users' );
|
122 |
array_push( $grouping, 'posts' );
|
123 |
break;
|
124 |
+
|
125 |
}
|
126 |
}
|
127 |
|
215 |
* {@inheritDoc}
|
216 |
*/
|
217 |
public function get_model() {
|
218 |
+
return new \WSAL_Models_Query();
|
219 |
}
|
220 |
|
221 |
/**
|
340 |
}
|
341 |
|
342 |
if ( is_array( $copy->$key ) || is_object( $copy->$key ) ) {
|
343 |
+
$data[ $key ] = \WSAL_Helpers_DataHelper::json_encode( $val );
|
344 |
} else {
|
345 |
$data[ $key ] = $val;
|
346 |
}
|
353 |
unset( $format[ $id_index ] );
|
354 |
}
|
355 |
|
356 |
+
$_wpdb->suppress_errors( true );
|
357 |
+
|
358 |
$result = $_wpdb->replace( $this->get_table(), $data, $format );
|
359 |
|
360 |
+
if ( '' !== $_wpdb->last_error ) {
|
361 |
+
if ( 1146 === \WSAL\Entities\Occurrences_Entity::get_last_sql_error( $_wpdb ) ) {
|
362 |
+
if ( \WSAL\Entities\Occurrences_Entity::create_table() ) {
|
363 |
+
$result = $_wpdb->replace( $this->get_table(), $data, $format );
|
364 |
+
}
|
365 |
+
}
|
366 |
+
}
|
367 |
+
$_wpdb->suppress_errors( false );
|
368 |
+
|
369 |
if ( false !== $result && $_wpdb->insert_id ) {
|
370 |
$copy->set_id( $_wpdb->insert_id );
|
371 |
}
|
400 |
$_wpdb = $this->connection;
|
401 |
$result = array();
|
402 |
$sql = $_wpdb->prepare( 'SELECT * FROM ' . $this->get_table() . ' WHERE ' . $cond, $args );
|
403 |
+
|
404 |
+
$_wpdb->suppress_errors( true );
|
405 |
+
$results = $_wpdb->get_results( $sql, ARRAY_A );
|
406 |
+
|
407 |
+
if ( '' !== $_wpdb->last_error ) {
|
408 |
+
if ( 1146 === \WSAL\Entities\Metadata_Entity::get_last_sql_error( $_wpdb ) ) {
|
409 |
+
if ( \WSAL\Entities\Metadata_Entity::create_table() ) {
|
410 |
+
$results = $_wpdb->get_results( $sql, ARRAY_A );
|
411 |
+
}
|
412 |
+
}
|
413 |
+
}
|
414 |
+
$_wpdb->suppress_errors( false );
|
415 |
+
foreach ( $results as $data ) {
|
416 |
$result[] = $this->get_model()->load_data( $data );
|
417 |
}
|
418 |
|
458 |
$sql = ( ! is_array( $args ) || ! count( $args ) ) // Do we really need to prepare() or not?
|
459 |
? ( $cond )
|
460 |
: $_wpdb->prepare( $cond, $args );
|
461 |
+
|
462 |
+
$_wpdb->suppress_errors( true );
|
463 |
+
|
464 |
+
$data_collected = $_wpdb->get_results( $sql, ARRAY_A );
|
465 |
+
|
466 |
+
if ( '' !== $_wpdb->last_error ) {
|
467 |
+
if ( 1146 === \WSAL\Entities\Occurrences_Entity::get_last_sql_error( $_wpdb ) ) {
|
468 |
+
if ( \WSAL\Entities\Occurrences_Entity::create_table() ) {
|
469 |
+
$data_collected = $_wpdb->get_results( $sql, ARRAY_A );
|
470 |
+
}
|
471 |
+
}
|
472 |
+
}
|
473 |
+
$_wpdb->suppress_errors( false );
|
474 |
+
|
475 |
+
foreach ( $data_collected as $data ) {
|
476 |
$result[] = $this->get_model()->load_data( $data );
|
477 |
}
|
478 |
|
498 |
$_wpdb = $this->connection;
|
499 |
$sql = $_wpdb->prepare( 'SELECT COUNT(*) FROM ' . $this->get_table() . ' WHERE ' . $cond, $args );
|
500 |
|
501 |
+
$_wpdb->suppress_errors( true );
|
502 |
+
$count = (int) $_wpdb->get_var( $sql );
|
503 |
+
if ( '' !== $_wpdb->last_error ) {
|
504 |
+
if ( 1146 === \WSAL\Entities\Occurrences_Entity::get_last_sql_error( $_wpdb ) ) {
|
505 |
+
if ( \WSAL\Entities\Occurrences_Entity::create_table() ) {
|
506 |
+
$count = (int) $_wpdb->get_var( $sql );
|
507 |
+
}
|
508 |
+
}
|
509 |
+
}
|
510 |
+
$_wpdb->suppress_errors( false );
|
511 |
+
|
512 |
+
return $count;
|
513 |
}
|
514 |
|
515 |
/**
|
557 |
// Figure out the grouping statement and the columns' selection.
|
558 |
$grouping = self::get_grouping( $statistics_report_type, $grouping_period );
|
559 |
|
560 |
+
// The user grouping based on an additional meta field is only applicable to the password changes' statistical
|
561 |
+
// report at the moment.
|
562 |
+
$use_meta_field_for_user_grouping = \WSAL_Rep_Common::PASSWORD_CHANGES === $statistics_report_type;
|
563 |
+
|
564 |
// Build the SQL query and runs it.
|
565 |
+
$query = $this->build_reporting_query( $report_args, false, $grouping, $next_date, $limit, $use_meta_field_for_user_grouping, $statistics_report_type );
|
566 |
|
567 |
// Statistical reports expect data as array, regular reports use objects.
|
568 |
$result_format = is_null( $statistics_report_type ) ? OBJECT : ARRAY_A;
|
569 |
+
|
570 |
+
// Perform additional query needed for new role counts.
|
571 |
+
if ( \WSAL_Rep_Common::NEW_USERS === $statistics_report_type ) {
|
572 |
+
$occurrences = $this->additional_new_user_query( $grouping, $next_date, $limit, $result_format );
|
573 |
+
}
|
574 |
+
|
575 |
+
$results = $this->connection->get_results( $query, $result_format );
|
576 |
+
|
577 |
+
// Append role counts to results.
|
578 |
+
if ( \WSAL_Rep_Common::NEW_USERS === $statistics_report_type && isset( $occurrences ) && ! empty( $occurrences ) ) {
|
579 |
+
foreach ( $results as $result_key => $result_value ) {
|
580 |
+
$role_counts = $occurrences[ $result_value['period'] ]['roles_counts'];
|
581 |
+
$results[ $result_key ]['role_counts'] = $role_counts;
|
582 |
+
}
|
583 |
+
}
|
584 |
|
585 |
if ( ! empty( $results ) ) {
|
586 |
$last_item = end( $results );
|
606 |
* time period only.
|
607 |
* @param int $next_date (Optional) Created on >.
|
608 |
* @param int $limit (Optional) Limit.
|
609 |
+
* @param int $statistics_report_type Statistics report type.
|
610 |
*
|
611 |
* @return string
|
612 |
*/
|
613 |
+
private function build_reporting_query( $report_args, $count_only, $grouping = null, $next_date = null, $limit = 0, $use_meta_field_for_user_grouping = false, $statistics_report_type = null ) {
|
614 |
$occurrence = new WSAL_Adapters_MySQL_Occurrence( $this->connection );
|
615 |
$table_occ = $occurrence->get_table();
|
616 |
|
617 |
+
$join_meta_table_for_user_grouping = false;
|
618 |
if ( $count_only ) {
|
619 |
$select_fields = array( 'COUNT(1) as count' );
|
620 |
$group_by = array( 'occ.id' );
|
644 |
array_push( $group_by, 'site_id' );
|
645 |
break;
|
646 |
case 'users':
|
647 |
+
if ( $use_meta_field_for_user_grouping ) {
|
648 |
+
array_push( $select_fields, 'COALESCE( m.value, occ.user_id, occ.username ) as user' );
|
649 |
+
$join_meta_table_for_user_grouping = true;
|
650 |
+
} else {
|
651 |
+
array_push( $select_fields, 'COALESCE( occ.user_id, occ.username ) as user' );
|
652 |
+
}
|
653 |
+
|
654 |
+
if ( in_array( $statistics_report_type, range( 70, 72 ), true ) ) {
|
655 |
+
array_push( $select_fields, 'GROUP_CONCAT(occ.alert_id) as events' );
|
656 |
+
}
|
657 |
+
|
658 |
array_push( $group_by, 'user' );
|
659 |
break;
|
660 |
case 'posts':
|
661 |
array_push( $select_fields, 'post_id' );
|
662 |
array_push( $group_by, 'post_id' );
|
663 |
break;
|
664 |
+
case 'events':
|
665 |
+
array_push( $select_fields, 'alert_id' );
|
666 |
+
array_push( $group_by, 'alert_id' );
|
667 |
+
break;
|
668 |
case 'day':
|
669 |
array_push( $select_fields, 'DATE_FORMAT( FROM_UNIXTIME( occ.created_on ), "%Y-%m-%d" ) AS period' );
|
670 |
array_push( $group_by, 'period' );
|
684 |
}
|
685 |
|
686 |
$sql = 'SELECT ' . implode( ',', $select_fields ) . ' FROM ' . $table_occ . ' AS occ ';
|
687 |
+
if ( $join_meta_table_for_user_grouping ) {
|
688 |
+
$meta = new WSAL_Adapters_MySQL_Meta( $this->connection );
|
689 |
+
$sql .= ' LEFT JOIN ' . $meta->get_table() . ' AS m ON ( m.occurrence_id = occ.id AND m.name = "TargetUserId" ) ';
|
690 |
+
}
|
691 |
|
692 |
$sql .= $this->build_where_statement( $report_args );
|
693 |
+
|
694 |
if ( ! empty( $next_date ) ) {
|
695 |
$sql .= ' AND occ.created_on < ' . $next_date;
|
696 |
}
|
765 |
$_post_ids = null;
|
766 |
$post_ids_negate_expression = '';
|
767 |
if ( $report_args->post__in ) {
|
768 |
+
$_post_ids = $this->format_array_for_query( $report_args->post__in );
|
769 |
} elseif ( $report_args->post__not_in ) {
|
770 |
+
$_post_ids = $this->format_array_for_query( $report_args->post__not_in );
|
771 |
$post_ids_negate_expression = 'NOT';
|
772 |
}
|
773 |
|
774 |
$_post_types = null;
|
775 |
$post_types_negate_expression = '';
|
776 |
if ( $report_args->post_type__in ) {
|
777 |
+
$_post_types = $this->format_array_for_query( $report_args->post_type__in );
|
778 |
} elseif ( $report_args->post_type__not_in ) {
|
779 |
+
$_post_types = $this->format_array_for_query( $report_args->post_type__not_in );
|
780 |
$post_types_negate_expression = 'NOT';
|
781 |
}
|
782 |
|
783 |
$_post_statuses = null;
|
784 |
$post_statuses_negate_expression = '';
|
785 |
if ( $report_args->post_status__in ) {
|
786 |
+
$_post_statuses = $this->format_array_for_query( $report_args->post_status__in );
|
787 |
} elseif ( $report_args->post_status__not_in ) {
|
788 |
+
$_post_statuses = $this->format_array_for_query( $report_args->post_status__not_in );
|
789 |
$post_statuses_negate_expression = 'NOT';
|
790 |
}
|
791 |
|
818 |
|
819 |
$_start_timestamp = null;
|
820 |
if ( $report_args->start_date ) {
|
821 |
+
$start_datetime = \DateTime::createFromFormat( 'Y-m-d H:i:s', $report_args->start_date . ' 00:00:00' );
|
822 |
$_start_timestamp = $start_datetime->format( 'U' );
|
823 |
}
|
824 |
|
825 |
$_end_timestamp = null;
|
826 |
if ( $report_args->end_date ) {
|
827 |
+
$end_datetime = \DateTime::createFromFormat( 'Y-m-d H:i:s', $report_args->end_date . ' 23:59:59' );
|
828 |
$_end_timestamp = $end_datetime->format( 'U' );
|
829 |
}
|
830 |
|
1002 |
array_push( $group_by_columns, 'client_ip' );
|
1003 |
}
|
1004 |
|
1005 |
+
if ( in_array( 'events', $grouping, true ) ) {
|
1006 |
+
array_push( $group_by_columns, 'alert_id' );
|
1007 |
+
}
|
1008 |
+
|
1009 |
$select_fields = $group_by_columns;
|
1010 |
foreach ( $grouping as $grouping_item ) {
|
1011 |
switch ( $grouping_item ) {
|
1076 |
// If transient does not exist, then run SQL query.
|
1077 |
if ( ! $wsal_db_table_status ) {
|
1078 |
$wsal_db_table_status = strtolower( $_wpdb->get_var( $sql ) ) === strtolower( $this->get_table() );
|
1079 |
+
\WpSecurityAuditLog::set_transient( $wsal_table_transient, $wsal_db_table_status, DAY_IN_SECONDS );
|
1080 |
}
|
1081 |
|
1082 |
return $wsal_db_table_status;
|
1126 |
public function update_query( $table, $data, $where ) {
|
1127 |
return $this->connection->update( $table, $data, $where );
|
1128 |
}
|
1129 |
+
|
1130 |
+
/**
|
1131 |
+
* Determine the roles for newly created users, which is then appended to the report result.
|
1132 |
+
*
|
1133 |
+
* @param array $grouping Period to use for data grouping.
|
1134 |
+
* @param int $next_date Created on >.
|
1135 |
+
* @param int $limit Limit.
|
1136 |
+
* @param string $result_format Required format.
|
1137 |
+
* @return array
|
1138 |
+
*/
|
1139 |
+
private function additional_new_user_query( $grouping, $next_date, $limit, $result_format ) {
|
1140 |
+
$occurrence = new WSAL_Adapters_MySQL_Occurrence( $this->connection );
|
1141 |
+
$meta = new WSAL_Adapters_MySQL_Meta( $this->connection );
|
1142 |
+
$table_occ = $occurrence->get_table();
|
1143 |
+
$table_meta = $meta->get_table();
|
1144 |
+
$occurrences = array();
|
1145 |
+
$select_fields = array(
|
1146 |
+
'site_id',
|
1147 |
+
'id',
|
1148 |
+
);
|
1149 |
+
$group_by_columns = array(
|
1150 |
+
'site_id',
|
1151 |
+
);
|
1152 |
+
foreach ( $grouping as $grouping_item ) {
|
1153 |
+
switch ( $grouping_item ) {
|
1154 |
+
case 'day':
|
1155 |
+
array_push( $select_fields, 'DATE_FORMAT( FROM_UNIXTIME( created_on ), "%Y-%m-%d" ) AS period' );
|
1156 |
+
array_unshift( $group_by_columns, 'period' );
|
1157 |
+
break;
|
1158 |
+
case 'week':
|
1159 |
+
array_push( $select_fields, 'DATE_FORMAT( FROM_UNIXTIME( created_on ), "%Y-%u" ) AS period' );
|
1160 |
+
array_unshift( $group_by_columns, 'period' );
|
1161 |
+
break;
|
1162 |
+
case 'month':
|
1163 |
+
array_push( $select_fields, 'DATE_FORMAT( FROM_UNIXTIME( created_on ), "%Y-%m" ) AS period' );
|
1164 |
+
array_unshift( $group_by_columns, 'period' );
|
1165 |
+
break;
|
1166 |
+
}
|
1167 |
+
}
|
1168 |
+
|
1169 |
+
$user_query = 'SELECT ' . implode( ',', $select_fields ) . ' FROM ' . $table_occ . ' AS occ WHERE find_in_set( occ.alert_id, "4000,4001" ) > 0 ';
|
1170 |
+
$occurrence_query = 'SELECT occ.id FROM ' . $table_occ . ' AS occ WHERE find_in_set( occ.alert_id, "4000,4001" ) > 0 ';
|
1171 |
+
|
1172 |
+
if ( ! empty( $next_date ) ) {
|
1173 |
+
$user_query .= ' AND ' . $table_occ . '.created_on < ' . $next_date;
|
1174 |
+
}
|
1175 |
+
|
1176 |
+
$user_query .= ' ORDER BY created_on DESC ';
|
1177 |
+
|
1178 |
+
if ( ! empty( $limit ) ) {
|
1179 |
+
$user_query .= " LIMIT {$limit}";
|
1180 |
+
}
|
1181 |
+
|
1182 |
+
// Get occurences so we can reference the data.
|
1183 |
+
$user_results = $this->connection->get_results( $user_query, $result_format );
|
1184 |
+
|
1185 |
+
// Get a list of registered roles for columns.
|
1186 |
+
$known_roles = get_editable_roles();
|
1187 |
+
|
1188 |
+
// Strip any values, these will be replaced below.
|
1189 |
+
$known_roles_array = array_fill_keys( array_keys( $known_roles ), ' ' );
|
1190 |
+
|
1191 |
+
foreach ( $user_results as $key => $item ) {
|
1192 |
+
$occurrences[ $item['period'] ]['roles_arr'] = empty( $occurrences[ $item['period'] ]['roles_arr'] ) ? array() : $occurrences[ $item['period'] ]['roles_arr'];
|
1193 |
+
$lookup_id = $item['id'];
|
1194 |
+
// Locate role from possible meta tables rows.
|
1195 |
+
$roles = $this->connection->get_results( 'SELECT value FROM ' . $table_meta . ' metatable WHERE occurrence_id ="' . $lookup_id . '" AND ( name = "NewUserData" OR name = "NewUserID" )', ARRAY_A );
|
1196 |
+
$roles_obj = isset( $roles[0]['value'] ) ? maybe_unserialize( $roles[0]['value'] ) : false;
|
1197 |
+
if ( isset( $roles_obj->Roles ) ) {
|
1198 |
+
$item['roles'] = $roles_obj->Roles;
|
1199 |
+
} else {
|
1200 |
+
$user = get_userdata( intval( $roles_obj ) );
|
1201 |
+
$item['roles'] = $user->roles[0];
|
1202 |
+
}
|
1203 |
+
array_push( $occurrences[ $item['period'] ]['roles_arr'], $item['roles'] );
|
1204 |
+
$occurrences[ $item['period'] ][ $key ] = $item;
|
1205 |
+
$occurrences[ $item['period'] ]['roles_counts'] = array_merge( $known_roles_array, array_count_values( $occurrences[ $item['period'] ]['roles_arr'] ) );
|
1206 |
+
}
|
1207 |
+
|
1208 |
+
return $occurrences;
|
1209 |
+
}
|
1210 |
}
|
classes/Adapters/MySQL/MetaAdapter.php
CHANGED
@@ -7,6 +7,8 @@
|
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
|
|
|
|
10 |
// Exit if accessed directly.
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
@@ -20,7 +22,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
20 |
*
|
21 |
* @package wsal
|
22 |
*/
|
23 |
-
class WSAL_Adapters_MySQL_Meta extends WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_MetaInterface {
|
24 |
|
25 |
/**
|
26 |
* Contains the table name.
|
@@ -77,7 +79,7 @@ class WSAL_Adapters_MySQL_Meta extends WSAL_Adapters_MySQL_ActiveRecord implemen
|
|
77 |
* @return WSAL_Models_Meta
|
78 |
*/
|
79 |
public function get_model() {
|
80 |
-
$result = new WSAL_Models_Meta();
|
81 |
$result->set_adapter( $this );
|
82 |
|
83 |
return $result;
|
@@ -95,6 +97,12 @@ class WSAL_Adapters_MySQL_Meta extends WSAL_Adapters_MySQL_ActiveRecord implemen
|
|
95 |
|
96 |
/**
|
97 |
* {@inheritDoc}
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
*/
|
99 |
public function delete_by_occurrence_ids( $occurrence_ids ) {
|
100 |
if ( ! empty( $occurrence_ids ) ) {
|
@@ -106,12 +114,19 @@ class WSAL_Adapters_MySQL_Meta extends WSAL_Adapters_MySQL_ActiveRecord implemen
|
|
106 |
|
107 |
/**
|
108 |
* {@inheritDoc}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
*/
|
110 |
public function load_by_name_and_occurrence_id( $meta_name, $occurrence_id ) {
|
111 |
// Make sure to grab the migrated meta fields from the occurrence table.
|
112 |
-
if ( in_array( $meta_name, array_keys( WSAL_Models_Occurrence::$migrated_meta ), true ) ) {
|
113 |
$occurrence = new WSAL_Adapters_MySQL_Occurrence( $this->get_connection() );
|
114 |
-
$column_name = WSAL_Models_Occurrence::$migrated_meta[ $meta_name ];
|
115 |
|
116 |
return $occurrence->$column_name;
|
117 |
}
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
10 |
+
namespace WSAL\Adapter;
|
11 |
+
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
22 |
*
|
23 |
* @package wsal
|
24 |
*/
|
25 |
+
class WSAL_Adapters_MySQL_Meta extends WSAL_Adapters_MySQL_ActiveRecord implements \WSAL_Adapters_MetaInterface {
|
26 |
|
27 |
/**
|
28 |
* Contains the table name.
|
79 |
* @return WSAL_Models_Meta
|
80 |
*/
|
81 |
public function get_model() {
|
82 |
+
$result = new \WSAL_Models_Meta();
|
83 |
$result->set_adapter( $this );
|
84 |
|
85 |
return $result;
|
97 |
|
98 |
/**
|
99 |
* {@inheritDoc}
|
100 |
+
*
|
101 |
+
* @param array $occurrence_ids - The ids of the occurrences.
|
102 |
+
*
|
103 |
+
* @return void
|
104 |
+
*
|
105 |
+
* @since 4.4.2
|
106 |
*/
|
107 |
public function delete_by_occurrence_ids( $occurrence_ids ) {
|
108 |
if ( ! empty( $occurrence_ids ) ) {
|
114 |
|
115 |
/**
|
116 |
* {@inheritDoc}
|
117 |
+
*
|
118 |
+
* @param string $meta_name - Meta name.
|
119 |
+
* @param int $occurrence_id - Occurrence ID.
|
120 |
+
*
|
121 |
+
* @return array
|
122 |
+
*
|
123 |
+
* @since 4.4.2
|
124 |
*/
|
125 |
public function load_by_name_and_occurrence_id( $meta_name, $occurrence_id ) {
|
126 |
// Make sure to grab the migrated meta fields from the occurrence table.
|
127 |
+
if ( in_array( $meta_name, array_keys( \WSAL_Models_Occurrence::$migrated_meta ), true ) ) {
|
128 |
$occurrence = new WSAL_Adapters_MySQL_Occurrence( $this->get_connection() );
|
129 |
+
$column_name = \WSAL_Models_Occurrence::$migrated_meta[ $meta_name ];
|
130 |
|
131 |
return $occurrence->$column_name;
|
132 |
}
|
classes/Adapters/MySQL/OccurrenceAdapter.php
CHANGED
@@ -7,6 +7,8 @@
|
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
|
|
|
|
10 |
// Exit if accessed directly.
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
@@ -19,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
19 |
*
|
20 |
* @package wsal
|
21 |
*/
|
22 |
-
class WSAL_Adapters_MySQL_Occurrence extends WSAL_Adapters_MySQL_ActiveRecord implements WSAL_Adapters_OccurrenceInterface {
|
23 |
|
24 |
/**
|
25 |
* Contains the table name
|
@@ -173,7 +175,7 @@ class WSAL_Adapters_MySQL_Occurrence extends WSAL_Adapters_MySQL_ActiveRecord im
|
|
173 |
* @return WSAL_Models_Occurrence
|
174 |
*/
|
175 |
public function get_model() {
|
176 |
-
$result = new WSAL_Models_Occurrence();
|
177 |
$result->set_adapter( $this );
|
178 |
|
179 |
return $result;
|
@@ -290,7 +292,7 @@ class WSAL_Adapters_MySQL_Occurrence extends WSAL_Adapters_MySQL_ActiveRecord im
|
|
290 |
function ( $value ) {
|
291 |
return '"' . $value . '"';
|
292 |
},
|
293 |
-
array_keys( WSAL_Models_Occurrence::$migrated_meta )
|
294 |
);
|
295 |
|
296 |
return $this->load_multi_query(
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
10 |
+
namespace WSAL\Adapter;
|
11 |
+
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
21 |
*
|
22 |
* @package wsal
|
23 |
*/
|
24 |
+
class WSAL_Adapters_MySQL_Occurrence extends WSAL_Adapters_MySQL_ActiveRecord implements \WSAL_Adapters_OccurrenceInterface {
|
25 |
|
26 |
/**
|
27 |
* Contains the table name
|
175 |
* @return WSAL_Models_Occurrence
|
176 |
*/
|
177 |
public function get_model() {
|
178 |
+
$result = new \WSAL_Models_Occurrence();
|
179 |
$result->set_adapter( $this );
|
180 |
|
181 |
return $result;
|
292 |
function ( $value ) {
|
293 |
return '"' . $value . '"';
|
294 |
},
|
295 |
+
array_keys( \WSAL_Models_Occurrence::$migrated_meta )
|
296 |
);
|
297 |
|
298 |
return $this->load_multi_query(
|
classes/Adapters/MySQL/QueryAdapter.php
CHANGED
@@ -7,6 +7,8 @@
|
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
|
|
|
|
10 |
// Exit if accessed directly.
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
@@ -21,7 +23,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
21 |
* @package wsal
|
22 |
* @subpackage adapters
|
23 |
*/
|
24 |
-
class WSAL_Adapters_MySQL_Query implements WSAL_Adapters_QueryInterface {
|
25 |
|
26 |
/**
|
27 |
* DB Connection
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
10 |
+
namespace WSAL\Adapter;
|
11 |
+
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
23 |
* @package wsal
|
24 |
* @subpackage adapters
|
25 |
*/
|
26 |
+
class WSAL_Adapters_MySQL_Query implements \WSAL_Adapters_QueryInterface {
|
27 |
|
28 |
/**
|
29 |
* DB Connection
|
classes/Adapters/MySQL/TmpUserAdapter.php
CHANGED
@@ -7,6 +7,8 @@
|
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
|
|
|
|
10 |
// Exit if accessed directly.
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
10 |
+
namespace WSAL\Adapter;
|
11 |
+
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
classes/Alert.php
CHANGED
@@ -175,9 +175,6 @@ final class WSAL_Alert {
|
|
175 |
// Handle complex expressions.
|
176 |
$message_parts[ $i ] = $this->get_meta_expression_value( substr( $token, 1, - 1 ), $meta_data );
|
177 |
$message_parts[ $i ] = $formatter->format_meta_expression( $token, $message_parts[ $i ], $occurrence_id );
|
178 |
-
if ( ! empty( $message_parts[ $i ] ) ) {
|
179 |
-
$message_parts[ $i ] = $formatter->wrap_in_hightlight_markup( $message_parts[ $i ] );
|
180 |
-
}
|
181 |
}
|
182 |
}
|
183 |
|
@@ -265,7 +262,7 @@ final class WSAL_Alert {
|
|
265 |
$meta_result_parts = array();
|
266 |
foreach ( $metadata_as_array as $meta_label => $meta_expression ) {
|
267 |
if ( ! empty( $meta_expression ) ) {
|
268 |
-
array_push( $meta_result_parts, $meta_label . ': ' . $
|
269 |
}
|
270 |
}
|
271 |
|
@@ -384,7 +381,7 @@ final class WSAL_Alert {
|
|
384 |
if ( ! WSAL_Utilities_RequestUtils::is_valid_url( $link_url ) ) {
|
385 |
|
386 |
$meta_expression = $this->get_meta_expression_value( $link_url, $meta_data );
|
387 |
-
$meta_expression = $formatter->format_meta_expression( $link_url, $meta_expression, $occurrence_id, $meta_data );
|
388 |
if ( ! empty( $meta_expression ) ) {
|
389 |
if ( WSAL_Utilities_RequestUtils::is_valid_url( $meta_expression ) ) {
|
390 |
|
175 |
// Handle complex expressions.
|
176 |
$message_parts[ $i ] = $this->get_meta_expression_value( substr( $token, 1, - 1 ), $meta_data );
|
177 |
$message_parts[ $i ] = $formatter->format_meta_expression( $token, $message_parts[ $i ], $occurrence_id );
|
|
|
|
|
|
|
178 |
}
|
179 |
}
|
180 |
|
262 |
$meta_result_parts = array();
|
263 |
foreach ( $metadata_as_array as $meta_label => $meta_expression ) {
|
264 |
if ( ! empty( $meta_expression ) ) {
|
265 |
+
array_push( $meta_result_parts, $meta_label . ': ' . $meta_expression );
|
266 |
}
|
267 |
}
|
268 |
|
381 |
if ( ! WSAL_Utilities_RequestUtils::is_valid_url( $link_url ) ) {
|
382 |
|
383 |
$meta_expression = $this->get_meta_expression_value( $link_url, $meta_data );
|
384 |
+
$meta_expression = $formatter->format_meta_expression( $link_url, $meta_expression, $occurrence_id, $meta_data, false );
|
385 |
if ( ! empty( $meta_expression ) ) {
|
386 |
if ( WSAL_Utilities_RequestUtils::is_valid_url( $meta_expression ) ) {
|
387 |
|
classes/AlertFormatter.php
CHANGED
@@ -13,6 +13,8 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
13 |
exit;
|
14 |
}
|
15 |
|
|
|
|
|
16 |
/**
|
17 |
* WSAL_AlertFormatter class.
|
18 |
*
|
@@ -48,6 +50,8 @@ final class WSAL_AlertFormatter {
|
|
48 |
public function __construct( $plugin, $configuration ) {
|
49 |
$this->plugin = $plugin;
|
50 |
$this->configuration = $configuration;
|
|
|
|
|
51 |
}
|
52 |
|
53 |
/**
|
@@ -82,7 +86,10 @@ final class WSAL_AlertFormatter {
|
|
82 |
*
|
83 |
* @since 4.2.1
|
84 |
*/
|
85 |
-
public function format_meta_expression( $expression, $value, $occurrence_id = null, $metadata = array() ) {
|
|
|
|
|
|
|
86 |
switch ( true ) {
|
87 |
case '%Message%' === $expression:
|
88 |
return esc_html( $value );
|
@@ -93,17 +100,16 @@ final class WSAL_AlertFormatter {
|
|
93 |
$label = __( 'Exclude custom field from the monitoring', 'wp-security-audit-log' );
|
94 |
$result = "<a href=\"#\" data-object-type='{$metadata['Object']}' data-disable-custom-nonce='" . wp_create_nonce( 'disable-custom-nonce' . $value ) . "' onclick=\"return WsalDisableCustom(this, '" . $value . "');\"> {$label}</a>";
|
95 |
|
96 |
-
return $this->wrap_in_hightlight_markup( $result );
|
97 |
}
|
98 |
|
99 |
return '';
|
100 |
|
101 |
case in_array( $expression, array( '%path%', '%old_path%', '%FilePath%' ), true ):
|
102 |
// Concatenate directory and file paths.
|
103 |
-
$
|
104 |
-
|
105 |
-
$result
|
106 |
-
$result .= "<a href=\"#\" data-shortened-text='{$value}'>" . $this->configuration->get_ellipses_sequence() . "</a>"; // phpcs:ignore
|
107 |
|
108 |
return $result;
|
109 |
}
|
@@ -112,9 +118,9 @@ final class WSAL_AlertFormatter {
|
|
112 |
|
113 |
case in_array( $expression, array( '%MetaValue%', '%MetaValueOld%', '%MetaValueNew%' ), true ):
|
114 |
// Trim the meta value to the maximum length and append configured ellipses sequence.
|
115 |
-
$result =
|
116 |
|
117 |
-
return $this->wrap_in_hightlight_markup(
|
118 |
|
119 |
case '%ClientIP%' === $expression:
|
120 |
case '%IPAddress%' === $expression:
|
@@ -180,7 +186,7 @@ final class WSAL_AlertFormatter {
|
|
180 |
if ( $this->configuration->is_js_in_links_allowed() ) {
|
181 |
$result = '<a href="javascript:;" onclick="download_failed_login_log( this )" data-download-nonce="' . esc_attr( wp_create_nonce( 'wsal-download-failed-logins' ) ) . '" title="' . esc_html__( 'Download the log file.', 'wp-security-audit-log' ) . '">' . esc_html__( 'Download the log file.', 'wp-security-audit-log' ) . '</a>';
|
182 |
|
183 |
-
return $this->wrap_in_hightlight_markup( $result );
|
184 |
}
|
185 |
|
186 |
return '';
|
@@ -188,15 +194,15 @@ final class WSAL_AlertFormatter {
|
|
188 |
case in_array( $expression, array( '%PostStatus%', '%ProductStatus%' ), true ):
|
189 |
$result = ( ! empty( $value ) && 'publish' === $value ) ? __( 'published', 'wp-security-audit-log' ) : $value;
|
190 |
|
191 |
-
return $this->wrap_in_hightlight_markup(
|
192 |
|
193 |
case '%multisite_text%' === $expression:
|
194 |
-
if (
|
195 |
$site_info = get_blog_details( $value, true );
|
196 |
if ( $site_info ) {
|
197 |
$site_url = $site_info->siteurl;
|
198 |
|
199 |
-
return ' on site ' . $this->
|
200 |
}
|
201 |
}
|
202 |
|
@@ -246,20 +252,64 @@ final class WSAL_AlertFormatter {
|
|
246 |
*
|
247 |
* @since 4.3.0
|
248 |
*/
|
|
|
|
|
|
|
|
|
|
|
249 |
return apply_filters( 'wsal_format_custom_meta', $result, $expression, $this, $occurrence_id );
|
250 |
}
|
251 |
}
|
252 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
253 |
/**
|
254 |
* Wraps given value in highlight markup.
|
255 |
*
|
256 |
* For example meta values displayed as <strong>{meta value}</strong> in the WP admin UI.
|
257 |
*
|
258 |
* @param string $value Value.
|
|
|
259 |
*
|
260 |
* @return string
|
261 |
*/
|
262 |
-
public function wrap_in_hightlight_markup( $value ) {
|
|
|
|
|
|
|
|
|
263 |
return $this->configuration->get_highlight_start_tag() . $value . $this->configuration->get_highlight_end_tag();
|
264 |
}
|
265 |
|
@@ -323,7 +373,7 @@ final class WSAL_AlertFormatter {
|
|
323 |
$processed_url = $this->process_url( $url );
|
324 |
$result = $this->build_link_markup( $processed_url, $label, $title, $target );
|
325 |
|
326 |
-
return $this->wrap_in_hightlight_markup( $result );
|
327 |
}
|
328 |
|
329 |
/**
|
13 |
exit;
|
14 |
}
|
15 |
|
16 |
+
use WSAL\Adapter\WSAL_Adapters_MySQL_Meta;
|
17 |
+
|
18 |
/**
|
19 |
* WSAL_AlertFormatter class.
|
20 |
*
|
50 |
public function __construct( $plugin, $configuration ) {
|
51 |
$this->plugin = $plugin;
|
52 |
$this->configuration = $configuration;
|
53 |
+
|
54 |
+
add_filter( 'wsal_truncate_alert_value', array( __CLASS__, 'data_truncate' ), 10, 4 );
|
55 |
}
|
56 |
|
57 |
/**
|
86 |
*
|
87 |
* @since 4.2.1
|
88 |
*/
|
89 |
+
public function format_meta_expression( $expression, $value, $occurrence_id = null, $metadata = array(), $wrap = true ) {
|
90 |
+
|
91 |
+
$value = apply_filters( 'wsal_truncate_alert_value', $value, $expression, $this->configuration->get_max_meta_value_length(), $this->configuration->get_ellipses_sequence() );
|
92 |
+
|
93 |
switch ( true ) {
|
94 |
case '%Message%' === $expression:
|
95 |
return esc_html( $value );
|
100 |
$label = __( 'Exclude custom field from the monitoring', 'wp-security-audit-log' );
|
101 |
$result = "<a href=\"#\" data-object-type='{$metadata['Object']}' data-disable-custom-nonce='" . wp_create_nonce( 'disable-custom-nonce' . $value ) . "' onclick=\"return WsalDisableCustom(this, '" . $value . "');\"> {$label}</a>";
|
102 |
|
103 |
+
return $this->wrap_in_hightlight_markup( $result, true );
|
104 |
}
|
105 |
|
106 |
return '';
|
107 |
|
108 |
case in_array( $expression, array( '%path%', '%old_path%', '%FilePath%' ), true ):
|
109 |
// Concatenate directory and file paths.
|
110 |
+
if ( $this->configuration->is_js_in_links_allowed() ) {
|
111 |
+
$result = '<strong><span>' . $value . '</span>'; // phpcs:ignore
|
112 |
+
$result .= "<a href=\"#\" data-shortened-text='{$value}'>" . $this->configuration->get_ellipses_sequence() . "</a></strong>"; // phpcs:ignore
|
|
|
113 |
|
114 |
return $result;
|
115 |
}
|
118 |
|
119 |
case in_array( $expression, array( '%MetaValue%', '%MetaValueOld%', '%MetaValueNew%' ), true ):
|
120 |
// Trim the meta value to the maximum length and append configured ellipses sequence.
|
121 |
+
$result = $value;
|
122 |
|
123 |
+
return $this->wrap_in_hightlight_markup( $result );
|
124 |
|
125 |
case '%ClientIP%' === $expression:
|
126 |
case '%IPAddress%' === $expression:
|
186 |
if ( $this->configuration->is_js_in_links_allowed() ) {
|
187 |
$result = '<a href="javascript:;" onclick="download_failed_login_log( this )" data-download-nonce="' . esc_attr( wp_create_nonce( 'wsal-download-failed-logins' ) ) . '" title="' . esc_html__( 'Download the log file.', 'wp-security-audit-log' ) . '">' . esc_html__( 'Download the log file.', 'wp-security-audit-log' ) . '</a>';
|
188 |
|
189 |
+
return $this->wrap_in_hightlight_markup( $result, true );
|
190 |
}
|
191 |
|
192 |
return '';
|
194 |
case in_array( $expression, array( '%PostStatus%', '%ProductStatus%' ), true ):
|
195 |
$result = ( ! empty( $value ) && 'publish' === $value ) ? __( 'published', 'wp-security-audit-log' ) : $value;
|
196 |
|
197 |
+
return $this->wrap_in_hightlight_markup( $result );
|
198 |
|
199 |
case '%multisite_text%' === $expression:
|
200 |
+
if ( WpSecurityAuditLog::is_multisite() && $value ) {
|
201 |
$site_info = get_blog_details( $value, true );
|
202 |
if ( $site_info ) {
|
203 |
$site_url = $site_info->siteurl;
|
204 |
|
205 |
+
return ' on site ' . $this->format_link( $expression, $site_info->blogname, $site_url );
|
206 |
}
|
207 |
}
|
208 |
|
252 |
*
|
253 |
* @since 4.3.0
|
254 |
*/
|
255 |
+
// Ensure result is wrapped as expected
|
256 |
+
if ( $wrap ) {
|
257 |
+
$result = $this->wrap_in_hightlight_markup( $result );
|
258 |
+
}
|
259 |
+
|
260 |
return apply_filters( 'wsal_format_custom_meta', $result, $expression, $this, $occurrence_id );
|
261 |
}
|
262 |
}
|
263 |
|
264 |
+
/**
|
265 |
+
* Truncates the data to a specific number of characters.
|
266 |
+
*
|
267 |
+
* @param mixed $value - The value to be truncated.
|
268 |
+
* @param string $expression - The expression for that value.
|
269 |
+
* @param integer $length - Number of characters to truncate to.
|
270 |
+
* @param string $ellipses_sequence - The sequence of ellipses suffix.
|
271 |
+
*
|
272 |
+
* @return string|mixed
|
273 |
+
*
|
274 |
+
* @since 4.4.2
|
275 |
+
*/
|
276 |
+
public static function data_truncate( $value, $expression, $length = 50, $ellipses_sequence = '...' ) {
|
277 |
+
|
278 |
+
switch ( $expression ) {
|
279 |
+
case '%path%':
|
280 |
+
case '%old_path%':
|
281 |
+
case '%FilePath%':
|
282 |
+
if ( mb_strlen( $value ) > $length ) {
|
283 |
+
$value = mb_substr( $value, 0, $length ); // phpcs:ignore
|
284 |
+
}
|
285 |
+
break;
|
286 |
+
case '%MetaValue%':
|
287 |
+
case '%MetaValueOld%':
|
288 |
+
case '%MetaValueNew%':
|
289 |
+
$value = mb_strlen( $value ) > $length ? ( mb_substr( $value, 0, $length ) . $ellipses_sequence() ) : $value;
|
290 |
+
break;
|
291 |
+
default:
|
292 |
+
break;
|
293 |
+
}
|
294 |
+
|
295 |
+
return $value;
|
296 |
+
}
|
297 |
+
|
298 |
/**
|
299 |
* Wraps given value in highlight markup.
|
300 |
*
|
301 |
* For example meta values displayed as <strong>{meta value}</strong> in the WP admin UI.
|
302 |
*
|
303 |
* @param string $value Value.
|
304 |
+
* @param bool $no_esc - Do we need to escape the html in the message.
|
305 |
*
|
306 |
* @return string
|
307 |
*/
|
308 |
+
public function wrap_in_hightlight_markup( $value, $no_esc = false ) {
|
309 |
+
if ( ! $no_esc ) {
|
310 |
+
$value = esc_html( $value );
|
311 |
+
}
|
312 |
+
|
313 |
return $this->configuration->get_highlight_start_tag() . $value . $this->configuration->get_highlight_end_tag();
|
314 |
}
|
315 |
|
373 |
$processed_url = $this->process_url( $url );
|
374 |
$result = $this->build_link_markup( $processed_url, $label, $title, $target );
|
375 |
|
376 |
+
return $this->wrap_in_hightlight_markup( $result, true );
|
377 |
}
|
378 |
|
379 |
/**
|
classes/AlertManager.php
CHANGED
@@ -22,6 +22,17 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
22 |
*/
|
23 |
final class WSAL_AlertManager {
|
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
/**
|
26 |
* Array of alerts (WSAL_Alert).
|
27 |
*
|
@@ -50,7 +61,7 @@ final class WSAL_AlertManager {
|
|
50 |
*
|
51 |
* @var WpSecurityAuditLog
|
52 |
*/
|
53 |
-
protected $plugin;
|
54 |
|
55 |
/**
|
56 |
* Contains a list of alerts to trigger.
|
@@ -80,7 +91,16 @@ final class WSAL_AlertManager {
|
|
80 |
*
|
81 |
* @var string[]
|
82 |
*/
|
83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
|
85 |
/**
|
86 |
* Date format.
|
@@ -103,11 +123,14 @@ final class WSAL_AlertManager {
|
|
103 |
* @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
|
104 |
*/
|
105 |
public function __construct( WpSecurityAuditLog $plugin ) {
|
106 |
-
|
107 |
-
|
108 |
-
|
|
|
|
|
109 |
}
|
110 |
|
|
|
111 |
add_action( 'shutdown', array( $this, 'commit_pipeline' ), 8 );
|
112 |
|
113 |
/**
|
@@ -121,52 +144,40 @@ final class WSAL_AlertManager {
|
|
121 |
*/
|
122 |
$this->deprecated_events = apply_filters( 'wsal_deprecated_event_ids', array( 2004, 2005, 2006, 2007, 2009, 2013, 2015, 2018, 2020, 2022, 2026, 2028, 2059, 2060, 2061, 2064, 2066, 2069, 2075, 2087, 2102, 2103, 2113, 2114, 2115, 2116, 2117, 2118, 5020, 5026, 2107, 2003, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2056, 2057, 2058, 2063, 2067, 2068, 2070, 2072, 2076, 2088, 2104, 2105, 5021, 5027, 2108 ) );
|
123 |
|
124 |
-
|
125 |
-
|
126 |
-
*
|
127 |
-
* Ignored custom post types filter.
|
128 |
-
*
|
129 |
-
* @param array $ignored_cpts - Array of custom post types.
|
130 |
-
*
|
131 |
-
* @since 3.3.1
|
132 |
-
*/
|
133 |
-
$this->ignored_cpts = apply_filters(
|
134 |
-
'wsal_ignored_custom_post_types',
|
135 |
-
array_unique(
|
136 |
-
array_merge(
|
137 |
-
$this->get_disabled_post_types(),
|
138 |
-
array(
|
139 |
-
'attachment', // Attachment CPT.
|
140 |
-
'revision', // Revision CPT.
|
141 |
-
'nav_menu_item', // Nav menu item CPT.
|
142 |
-
'customize_changeset', // Customize changeset CPT.
|
143 |
-
'custom_css', // Custom CSS CPT.
|
144 |
-
)
|
145 |
-
)
|
146 |
-
)
|
147 |
-
);
|
148 |
-
|
149 |
-
$this->date_format = $this->plugin->settings()->get_date_format();
|
150 |
-
$this->sanitized_date_format = $this->plugin->settings()->get_date_format( true );
|
151 |
}
|
152 |
|
153 |
/**
|
154 |
-
*
|
|
|
155 |
*
|
156 |
-
* @
|
157 |
-
*/
|
158 |
-
public function add_logger_from_file( $file ) {
|
159 |
-
$file = basename( $file, '.php' );
|
160 |
-
$this->add_logger_from_class( WSAL_CLASS_PREFIX . 'Loggers_' . $file );
|
161 |
-
}
|
162 |
-
|
163 |
-
/**
|
164 |
-
* Add new logger given class name.
|
165 |
*
|
166 |
-
* @
|
167 |
*/
|
168 |
-
public function
|
169 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
}
|
171 |
|
172 |
/**
|
@@ -215,7 +226,7 @@ final class WSAL_AlertManager {
|
|
215 |
$data['CurrentUserRoles'] = $roles;
|
216 |
} else {
|
217 |
// not a switched user so get the current user roles.
|
218 |
-
$roles =
|
219 |
}
|
220 |
if ( empty( $roles ) && ! empty( $data['CurrentUserRoles'] ) ) {
|
221 |
$roles = $data['CurrentUserRoles'];
|
@@ -303,7 +314,7 @@ final class WSAL_AlertManager {
|
|
303 |
$data['CurrentUserRoles'] = $roles;
|
304 |
} else {
|
305 |
$username = wp_get_current_user()->user_login;
|
306 |
-
$roles =
|
307 |
}
|
308 |
|
309 |
// Check if IP is disabled.
|
@@ -353,13 +364,13 @@ final class WSAL_AlertManager {
|
|
353 |
$this->log( $type, $data );
|
354 |
} elseif ( $_retry ) {
|
355 |
// This is the last attempt at loading alerts from default file.
|
356 |
-
|
357 |
return $this->commit_item( $type, $data, $cond, false );
|
358 |
} else {
|
359 |
// In general this shouldn't happen, but it could, so we handle it here.
|
360 |
/* translators: Event ID */
|
361 |
$error_message = sprintf( esc_html__( 'Event with code %d has not be registered.', 'wp-security-audit-log' ), $type );
|
362 |
-
|
363 |
}
|
364 |
}
|
365 |
}
|
@@ -389,7 +400,7 @@ final class WSAL_AlertManager {
|
|
389 |
foreach ( $this->pipeline as $item ) {
|
390 |
if ( $item['type'] == $type ) { // phpcs:ignore
|
391 |
$number_found++;
|
392 |
-
if ($count == 1 || $number_found == $count) { // phpcs:ignore
|
393 |
return true;
|
394 |
}
|
395 |
}
|
@@ -443,7 +454,7 @@ final class WSAL_AlertManager {
|
|
443 |
add_action( 'admin_notices', array( $this, 'duplicate_event_notice' ) );
|
444 |
/* Translators: Event ID */
|
445 |
$error_message = sprintf( esc_html__( 'Event %s already registered with WP Activity Log.', 'wp-security-audit-log' ), $code );
|
446 |
-
|
447 |
|
448 |
return;
|
449 |
}
|
@@ -505,7 +516,7 @@ final class WSAL_AlertManager {
|
|
505 |
* @return boolean True if enabled, false otherwise.
|
506 |
*/
|
507 |
public function is_enabled( $type ) {
|
508 |
-
$disabled_events =
|
509 |
return ! in_array( $type, $disabled_events, true );
|
510 |
}
|
511 |
|
@@ -527,13 +538,13 @@ final class WSAL_AlertManager {
|
|
527 |
*/
|
528 |
protected function log( $event_id, $event_data = array() ) {
|
529 |
if ( ! isset( $event_data['ClientIP'] ) ) {
|
530 |
-
$client_ip =
|
531 |
if ( ! empty( $client_ip ) ) {
|
532 |
$event_data['ClientIP'] = $client_ip;
|
533 |
}
|
534 |
}
|
535 |
-
if ( ! isset( $event_data['OtherIPs'] ) &&
|
536 |
-
$other_ips =
|
537 |
if ( ! empty( $other_ips ) ) {
|
538 |
$event_data['OtherIPs'] = $other_ips;
|
539 |
}
|
@@ -549,7 +560,7 @@ final class WSAL_AlertManager {
|
|
549 |
}
|
550 |
}
|
551 |
if ( ! isset( $event_data['CurrentUserRoles'] ) && function_exists( 'is_user_logged_in' ) && is_user_logged_in() ) {
|
552 |
-
$current_user_roles =
|
553 |
if ( ! empty( $current_user_roles ) ) {
|
554 |
$event_data['CurrentUserRoles'] = $current_user_roles;
|
555 |
}
|
@@ -568,7 +579,7 @@ final class WSAL_AlertManager {
|
|
568 |
// Get event severity.
|
569 |
$alert_obj = $this->get_alert( $event_id );
|
570 |
$alert_code = $alert_obj ? $alert_obj->severity : 0;
|
571 |
-
$severity =
|
572 |
|
573 |
/**
|
574 |
* Events Severity.
|
@@ -621,7 +632,7 @@ final class WSAL_AlertManager {
|
|
621 |
}
|
622 |
|
623 |
// Append further details if in multisite.
|
624 |
-
if (
|
625 |
$event_data['SiteID'] = get_current_blog_id();
|
626 |
$event_data['SiteURL'] = get_site_url( $event_data['SiteID'] );
|
627 |
}
|
@@ -653,6 +664,7 @@ final class WSAL_AlertManager {
|
|
653 |
foreach ( $this->loggers as $logger ) {
|
654 |
$logger->log( $event_id, $event_data );
|
655 |
}
|
|
|
656 |
}
|
657 |
|
658 |
/**
|
@@ -760,10 +772,10 @@ final class WSAL_AlertManager {
|
|
760 |
/**
|
761 |
* Method: Returns an array of disabled users.
|
762 |
*
|
763 |
-
* @return array
|
764 |
*/
|
765 |
public function get_disabled_users() {
|
766 |
-
return
|
767 |
}
|
768 |
|
769 |
/**
|
@@ -788,7 +800,7 @@ final class WSAL_AlertManager {
|
|
788 |
* @return array
|
789 |
*/
|
790 |
public function get_disabled_roles() {
|
791 |
-
return
|
792 |
}
|
793 |
|
794 |
/**
|
@@ -799,17 +811,22 @@ final class WSAL_AlertManager {
|
|
799 |
* @since 2.6.7
|
800 |
*/
|
801 |
public function is_disabled_post_type( $post_type ) {
|
802 |
-
|
|
|
803 |
}
|
804 |
|
805 |
/**
|
806 |
* Method: Return array of disabled post types.
|
807 |
*
|
808 |
* @return array
|
|
|
809 |
* @since 2.6.7
|
810 |
*/
|
811 |
-
public function get_disabled_post_types() {
|
812 |
-
|
|
|
|
|
|
|
813 |
}
|
814 |
|
815 |
/**
|
@@ -819,16 +836,16 @@ final class WSAL_AlertManager {
|
|
819 |
*/
|
820 |
private function is_ip_address_disabled() {
|
821 |
$is_disabled = false;
|
822 |
-
$ip =
|
823 |
-
$excluded_ips =
|
824 |
|
825 |
if ( ! empty( $excluded_ips ) ) {
|
826 |
foreach ( $excluded_ips as $excluded_ip ) {
|
827 |
if ( false !== strpos( $excluded_ip, '-' ) ) {
|
828 |
-
$ip_range =
|
829 |
$ip_range = $ip_range->lower . '-' . $ip_range->upper;
|
830 |
|
831 |
-
if (
|
832 |
$is_disabled = true;
|
833 |
break;
|
834 |
}
|
@@ -916,7 +933,7 @@ final class WSAL_AlertManager {
|
|
916 |
}
|
917 |
|
918 |
// Get site id.
|
919 |
-
$site_id = (int)
|
920 |
if ( $site_id ) {
|
921 |
$occ_query->add_condition( 'site_id = %d ', $site_id );
|
922 |
}
|
@@ -942,17 +959,12 @@ final class WSAL_AlertManager {
|
|
942 |
public function get_admin_bar_event( $from_db = false ) {
|
943 |
// Get event from transient.
|
944 |
$event_transient = 'wsal_admin_bar_event';
|
945 |
-
|
946 |
-
// Check for multisite.
|
947 |
-
$get_fn = $this->plugin->is_multisite() ? 'get_site_transient' : 'get_transient';
|
948 |
-
$set_fn = $this->plugin->is_multisite() ? 'set_site_transient' : 'set_transient';
|
949 |
-
|
950 |
-
$admin_bar_event = $get_fn( $event_transient );
|
951 |
if ( false === $admin_bar_event || false !== $from_db ) {
|
952 |
$event = $this->get_latest_events( 1 );
|
953 |
|
954 |
if ( $event ) {
|
955 |
-
|
956 |
$admin_bar_event = $event[0];
|
957 |
}
|
958 |
}
|
@@ -1041,7 +1053,7 @@ final class WSAL_AlertManager {
|
|
1041 |
* NOTE: along with this depreciation the filter `wsal_event_object_text`
|
1042 |
* is being removed, use `wsal_event_objects` filter instead.
|
1043 |
*
|
1044 |
-
*
|
1045 |
* plugins have had a chance to adjust to using the get_event_objects_data()
|
1046 |
* function directly.
|
1047 |
*
|
@@ -1049,7 +1061,7 @@ final class WSAL_AlertManager {
|
|
1049 |
* @return string
|
1050 |
*/
|
1051 |
public function get_display_object_text( $object ) {
|
1052 |
-
return get_event_objects_data( $object );
|
1053 |
}
|
1054 |
|
1055 |
/**
|
@@ -1125,7 +1137,7 @@ final class WSAL_AlertManager {
|
|
1125 |
* NOTE: along with this depreciation the filter `wsal_event_type_text` is
|
1126 |
* being removed, use `wsal_event_type_data` filter instead.
|
1127 |
*
|
1128 |
-
*
|
1129 |
* plugins have had a chance to adjust to using the get_event_type_data()
|
1130 |
* function directly.
|
1131 |
*
|
@@ -1134,7 +1146,7 @@ final class WSAL_AlertManager {
|
|
1134 |
*/
|
1135 |
public function get_display_event_type_text( $event_type ) {
|
1136 |
// Try to get string from the companion data method.
|
1137 |
-
return get_event_type_data( $event_type );
|
1138 |
}
|
1139 |
|
1140 |
/**
|
@@ -1319,9 +1331,9 @@ final class WSAL_AlertManager {
|
|
1319 |
'value' => 0,
|
1320 |
'description' => __( 'Unknown error code.', 'wp-security-audit-log' ),
|
1321 |
);
|
1322 |
-
$const =
|
1323 |
|
1324 |
-
$blog_info = self::get_blog_info(
|
1325 |
|
1326 |
// Get the alert message - properly.
|
1327 |
$occurrence->id = $entry_id;
|
@@ -1386,7 +1398,7 @@ final class WSAL_AlertManager {
|
|
1386 |
*/
|
1387 |
public static function get_blog_info( $plugin, $site_id ) {
|
1388 |
// Blog details.
|
1389 |
-
if (
|
1390 |
$blog_info = get_blog_details( $site_id, true );
|
1391 |
$blog_name = esc_html__( 'Unknown Site', 'wp-security-audit-log' );
|
1392 |
$blog_url = '';
|
22 |
*/
|
23 |
final class WSAL_AlertManager {
|
24 |
|
25 |
+
/**
|
26 |
+
* Holds list of the ignored \WP_Post types.
|
27 |
+
*/
|
28 |
+
const IGNORED_POST_TYPES = array(
|
29 |
+
'attachment', // Attachment CPT.
|
30 |
+
'revision', // Revision CPT.
|
31 |
+
'nav_menu_item', // Nav menu item CPT.
|
32 |
+
'customize_changeset', // Customize changeset CPT.
|
33 |
+
'custom_css', // Custom CSS CPT.
|
34 |
+
);
|
35 |
+
|
36 |
/**
|
37 |
* Array of alerts (WSAL_Alert).
|
38 |
*
|
61 |
*
|
62 |
* @var WpSecurityAuditLog
|
63 |
*/
|
64 |
+
protected static $plugin;
|
65 |
|
66 |
/**
|
67 |
* Contains a list of alerts to trigger.
|
91 |
*
|
92 |
* @var string[]
|
93 |
*/
|
94 |
+
private static $ignored_cpts = array();
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Disabled post types array.
|
98 |
+
*
|
99 |
+
* @var array
|
100 |
+
*
|
101 |
+
* @since 4.4.2
|
102 |
+
*/
|
103 |
+
private static $disabled_post_types = array();
|
104 |
|
105 |
/**
|
106 |
* Date format.
|
123 |
* @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
|
124 |
*/
|
125 |
public function __construct( WpSecurityAuditLog $plugin ) {
|
126 |
+
self::$plugin = $plugin;
|
127 |
+
$loggers_list = \WSAL\Helpers\Classes_Helper::get_classes_by_namespace( '\WSAL\Loggers' );
|
128 |
+
|
129 |
+
foreach ( $loggers_list as $class_name ) {
|
130 |
+
$this->add_logger_instance( new $class_name( self::$plugin ) );
|
131 |
}
|
132 |
|
133 |
+
// phpcs:disable
|
134 |
add_action( 'shutdown', array( $this, 'commit_pipeline' ), 8 );
|
135 |
|
136 |
/**
|
144 |
*/
|
145 |
$this->deprecated_events = apply_filters( 'wsal_deprecated_event_ids', array( 2004, 2005, 2006, 2007, 2009, 2013, 2015, 2018, 2020, 2022, 2026, 2028, 2059, 2060, 2061, 2064, 2066, 2069, 2075, 2087, 2102, 2103, 2113, 2114, 2115, 2116, 2117, 2118, 5020, 5026, 2107, 2003, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2056, 2057, 2058, 2063, 2067, 2068, 2070, 2072, 2076, 2088, 2104, 2105, 5021, 5027, 2108 ) );
|
146 |
|
147 |
+
$this->date_format = self::$plugin->settings()->get_date_format();
|
148 |
+
$this->sanitized_date_format = self::$plugin->settings()->get_date_format( true );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
}
|
150 |
|
151 |
/**
|
152 |
+
* Returns all the ignored post types - post types are \WP_Post types
|
153 |
+
* Note: There is a difference between ignored types and disabled types.
|
154 |
*
|
155 |
+
* @return array
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
*
|
157 |
+
* @since 4.4.2
|
158 |
*/
|
159 |
+
public static function get_ignored_post_types(): array {
|
160 |
+
if ( empty( self::$ignored_cpts ) ) {
|
161 |
+
/**
|
162 |
+
* Filter: `wsal_ignored_custom_post_types`
|
163 |
+
*
|
164 |
+
* Ignored custom post types filter.
|
165 |
+
*
|
166 |
+
* @param array $ignored_cpts - Array of custom post types.
|
167 |
+
*
|
168 |
+
* @since 3.3.1
|
169 |
+
*/
|
170 |
+
self::$ignored_cpts = apply_filters(
|
171 |
+
'wsal_ignored_custom_post_types',
|
172 |
+
array_unique(
|
173 |
+
array_merge(
|
174 |
+
self::get_disabled_post_types(),
|
175 |
+
self::IGNORED_POST_TYPES
|
176 |
+
)
|
177 |
+
)
|
178 |
+
);
|
179 |
+
}
|
180 |
+
return self::$ignored_cpts;
|
181 |
}
|
182 |
|
183 |
/**
|
226 |
$data['CurrentUserRoles'] = $roles;
|
227 |
} else {
|
228 |
// not a switched user so get the current user roles.
|
229 |
+
$roles = self::$plugin->settings()->get_current_user_roles();
|
230 |
}
|
231 |
if ( empty( $roles ) && ! empty( $data['CurrentUserRoles'] ) ) {
|
232 |
$roles = $data['CurrentUserRoles'];
|
314 |
$data['CurrentUserRoles'] = $roles;
|
315 |
} else {
|
316 |
$username = wp_get_current_user()->user_login;
|
317 |
+
$roles = self::$plugin->settings()->get_current_user_roles();
|
318 |
}
|
319 |
|
320 |
// Check if IP is disabled.
|
364 |
$this->log( $type, $data );
|
365 |
} elseif ( $_retry ) {
|
366 |
// This is the last attempt at loading alerts from default file.
|
367 |
+
self::$plugin->load_defaults();
|
368 |
return $this->commit_item( $type, $data, $cond, false );
|
369 |
} else {
|
370 |
// In general this shouldn't happen, but it could, so we handle it here.
|
371 |
/* translators: Event ID */
|
372 |
$error_message = sprintf( esc_html__( 'Event with code %d has not be registered.', 'wp-security-audit-log' ), $type );
|
373 |
+
self::$plugin->wsal_log( $error_message );
|
374 |
}
|
375 |
}
|
376 |
}
|
400 |
foreach ( $this->pipeline as $item ) {
|
401 |
if ( $item['type'] == $type ) { // phpcs:ignore
|
402 |
$number_found++;
|
403 |
+
if ( $count == 1 || $number_found == $count ) { // phpcs:ignore
|
404 |
return true;
|
405 |
}
|
406 |
}
|
454 |
add_action( 'admin_notices', array( $this, 'duplicate_event_notice' ) );
|
455 |
/* Translators: Event ID */
|
456 |
$error_message = sprintf( esc_html__( 'Event %s already registered with WP Activity Log.', 'wp-security-audit-log' ), $code );
|
457 |
+
self::$plugin->wsal_log( $error_message );
|
458 |
|
459 |
return;
|
460 |
}
|
516 |
* @return boolean True if enabled, false otherwise.
|
517 |
*/
|
518 |
public function is_enabled( $type ) {
|
519 |
+
$disabled_events = self::$plugin->settings()->get_disabled_alerts();
|
520 |
return ! in_array( $type, $disabled_events, true );
|
521 |
}
|
522 |
|
538 |
*/
|
539 |
protected function log( $event_id, $event_data = array() ) {
|
540 |
if ( ! isset( $event_data['ClientIP'] ) ) {
|
541 |
+
$client_ip = self::$plugin->settings()->get_main_client_ip();
|
542 |
if ( ! empty( $client_ip ) ) {
|
543 |
$event_data['ClientIP'] = $client_ip;
|
544 |
}
|
545 |
}
|
546 |
+
if ( ! isset( $event_data['OtherIPs'] ) && self::$plugin->settings()->is_main_ip_from_proxy() ) {
|
547 |
+
$other_ips = self::$plugin->settings()->get_client_ips();
|
548 |
if ( ! empty( $other_ips ) ) {
|
549 |
$event_data['OtherIPs'] = $other_ips;
|
550 |
}
|
560 |
}
|
561 |
}
|
562 |
if ( ! isset( $event_data['CurrentUserRoles'] ) && function_exists( 'is_user_logged_in' ) && is_user_logged_in() ) {
|
563 |
+
$current_user_roles = self::$plugin->settings()->get_current_user_roles();
|
564 |
if ( ! empty( $current_user_roles ) ) {
|
565 |
$event_data['CurrentUserRoles'] = $current_user_roles;
|
566 |
}
|
579 |
// Get event severity.
|
580 |
$alert_obj = $this->get_alert( $event_id );
|
581 |
$alert_code = $alert_obj ? $alert_obj->severity : 0;
|
582 |
+
$severity = self::$plugin->constants->get_constant_by( 'value', $alert_code );
|
583 |
|
584 |
/**
|
585 |
* Events Severity.
|
632 |
}
|
633 |
|
634 |
// Append further details if in multisite.
|
635 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
636 |
$event_data['SiteID'] = get_current_blog_id();
|
637 |
$event_data['SiteURL'] = get_site_url( $event_data['SiteID'] );
|
638 |
}
|
664 |
foreach ( $this->loggers as $logger ) {
|
665 |
$logger->log( $event_id, $event_data );
|
666 |
}
|
667 |
+
// phpcs:disable
|
668 |
}
|
669 |
|
670 |
/**
|
772 |
/**
|
773 |
* Method: Returns an array of disabled users.
|
774 |
*
|
775 |
+
* @return array
|
776 |
*/
|
777 |
public function get_disabled_users() {
|
778 |
+
return self::$plugin->settings()->get_excluded_monitoring_users();
|
779 |
}
|
780 |
|
781 |
/**
|
800 |
* @return array
|
801 |
*/
|
802 |
public function get_disabled_roles() {
|
803 |
+
return self::$plugin->settings()->get_excluded_monitoring_roles();
|
804 |
}
|
805 |
|
806 |
/**
|
811 |
* @since 2.6.7
|
812 |
*/
|
813 |
public function is_disabled_post_type( $post_type ) {
|
814 |
+
$all_post_types = array_merge( self::get_disabled_post_types(), $this->get_ignored_post_types() );
|
815 |
+
return in_array( $post_type, $all_post_types, true );
|
816 |
}
|
817 |
|
818 |
/**
|
819 |
* Method: Return array of disabled post types.
|
820 |
*
|
821 |
* @return array
|
822 |
+
*
|
823 |
* @since 2.6.7
|
824 |
*/
|
825 |
+
public static function get_disabled_post_types(): array {
|
826 |
+
if ( empty( self::$disabled_post_types ) ) {
|
827 |
+
self::$disabled_post_types = self::$plugin->settings()->get_excluded_post_types();
|
828 |
+
}
|
829 |
+
return self::$disabled_post_types;
|
830 |
}
|
831 |
|
832 |
/**
|
836 |
*/
|
837 |
private function is_ip_address_disabled() {
|
838 |
$is_disabled = false;
|
839 |
+
$ip = self::$plugin->settings()->get_main_client_ip();
|
840 |
+
$excluded_ips = self::$plugin->settings()->get_excluded_monitoring_ip();
|
841 |
|
842 |
if ( ! empty( $excluded_ips ) ) {
|
843 |
foreach ( $excluded_ips as $excluded_ip ) {
|
844 |
if ( false !== strpos( $excluded_ip, '-' ) ) {
|
845 |
+
$ip_range = self::$plugin->settings()->get_ipv4_by_range( $excluded_ip );
|
846 |
$ip_range = $ip_range->lower . '-' . $ip_range->upper;
|
847 |
|
848 |
+
if ( self::$plugin->settings()->check_ipv4_in_range( $ip, $ip_range ) ) {
|
849 |
$is_disabled = true;
|
850 |
break;
|
851 |
}
|
933 |
}
|
934 |
|
935 |
// Get site id.
|
936 |
+
$site_id = (int) self::$plugin->settings()->get_view_site_id();
|
937 |
if ( $site_id ) {
|
938 |
$occ_query->add_condition( 'site_id = %d ', $site_id );
|
939 |
}
|
959 |
public function get_admin_bar_event( $from_db = false ) {
|
960 |
// Get event from transient.
|
961 |
$event_transient = 'wsal_admin_bar_event';
|
962 |
+
$admin_bar_event = WpSecurityAuditLog::get_transient( $event_transient );
|
|
|
|
|
|
|
|
|
|
|
963 |
if ( false === $admin_bar_event || false !== $from_db ) {
|
964 |
$event = $this->get_latest_events( 1 );
|
965 |
|
966 |
if ( $event ) {
|
967 |
+
WpSecurityAuditLog::set_transient( $event_transient, $event[0], 30 * MINUTE_IN_SECONDS );
|
968 |
$admin_bar_event = $event[0];
|
969 |
}
|
970 |
}
|
1053 |
* NOTE: along with this depreciation the filter `wsal_event_object_text`
|
1054 |
* is being removed, use `wsal_event_objects` filter instead.
|
1055 |
*
|
1056 |
+
* TODO: this is to be removed shortly after version 4.0.3 - after other
|
1057 |
* plugins have had a chance to adjust to using the get_event_objects_data()
|
1058 |
* function directly.
|
1059 |
*
|
1061 |
* @return string
|
1062 |
*/
|
1063 |
public function get_display_object_text( $object ) {
|
1064 |
+
return $this->get_event_objects_data( $object );
|
1065 |
}
|
1066 |
|
1067 |
/**
|
1137 |
* NOTE: along with this depreciation the filter `wsal_event_type_text` is
|
1138 |
* being removed, use `wsal_event_type_data` filter instead.
|
1139 |
*
|
1140 |
+
* TODO: this is to be removed shortly after version 4.0.3 - after other
|
1141 |
* plugins have had a chance to adjust to using the get_event_type_data()
|
1142 |
* function directly.
|
1143 |
*
|
1146 |
*/
|
1147 |
public function get_display_event_type_text( $event_type ) {
|
1148 |
// Try to get string from the companion data method.
|
1149 |
+
return $this->get_event_type_data( $event_type );
|
1150 |
}
|
1151 |
|
1152 |
/**
|
1331 |
'value' => 0,
|
1332 |
'description' => __( 'Unknown error code.', 'wp-security-audit-log' ),
|
1333 |
);
|
1334 |
+
$const = self::$plugin->constants->get_constant_by( 'value', $code, $const );
|
1335 |
|
1336 |
+
$blog_info = self::get_blog_info( self::$plugin, $site_id );
|
1337 |
|
1338 |
// Get the alert message - properly.
|
1339 |
$occurrence->id = $entry_id;
|
1398 |
*/
|
1399 |
public static function get_blog_info( $plugin, $site_id ) {
|
1400 |
// Blog details.
|
1401 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
1402 |
$blog_info = get_blog_details( $site_id, true );
|
1403 |
$blog_name = esc_html__( 'Unknown Site', 'wp-security-audit-log' );
|
1404 |
$blog_url = '';
|
classes/AuditLogGridView.php
CHANGED
@@ -561,7 +561,7 @@ class WSAL_AuditLogGridView extends WP_List_Table {
|
|
561 |
* @return bool
|
562 |
*/
|
563 |
protected function is_multisite() {
|
564 |
-
return
|
565 |
}
|
566 |
|
567 |
/**
|
561 |
* @return bool
|
562 |
*/
|
563 |
protected function is_multisite() {
|
564 |
+
return WpSecurityAuditLog::is_multisite();
|
565 |
}
|
566 |
|
567 |
/**
|
classes/AuditLogListView.php
CHANGED
@@ -510,9 +510,9 @@ class WSAL_AuditLogListView extends WP_List_Table {
|
|
510 |
return '<a class="more-info thickbox" data-tooltip="' . $tooltip . '" title="' . __( 'Alert Data Inspector', 'wp-security-audit-log' ) . '"'
|
511 |
. ' href="' . $url . '&TB_iframe=true&width=600&height=550">…</a>';
|
512 |
case 'object':
|
513 |
-
return isset( $this->item_meta[ $item->get_id() ]['Object'] ) ? $this->plugin->alerts->get_event_objects_data( $this->item_meta[ $item->get_id() ]['Object'] ) : '';
|
514 |
case 'event_type':
|
515 |
-
return isset( $this->item_meta[ $item->get_id() ]['EventType'] ) ? $this->plugin->alerts->get_event_type_data( $this->item_meta[ $item->get_id() ]['EventType'] ) : '';
|
516 |
default:
|
517 |
return isset( $item->$column_name )
|
518 |
? esc_html( $item->$column_name )
|
@@ -550,7 +550,7 @@ class WSAL_AuditLogListView extends WP_List_Table {
|
|
550 |
* @return bool
|
551 |
*/
|
552 |
protected function is_multisite() {
|
553 |
-
return
|
554 |
}
|
555 |
|
556 |
/**
|
510 |
return '<a class="more-info thickbox" data-tooltip="' . $tooltip . '" title="' . __( 'Alert Data Inspector', 'wp-security-audit-log' ) . '"'
|
511 |
. ' href="' . $url . '&TB_iframe=true&width=600&height=550">…</a>';
|
512 |
case 'object':
|
513 |
+
return ( isset( $this->item_meta[ $item->get_id() ]['Object'] ) && ! empty( $this->item_meta[ $item->get_id() ]['Object'] ) ) ? $this->plugin->alerts->get_event_objects_data( $this->item_meta[ $item->get_id() ]['Object'] ) : '';
|
514 |
case 'event_type':
|
515 |
+
return ( isset( $this->item_meta[ $item->get_id() ]['EventType'] ) && !empty( $this->item_meta[ $item->get_id() ]['EventType'] ) ) ? $this->plugin->alerts->get_event_type_data( $this->item_meta[ $item->get_id() ]['EventType'] ) : '';
|
516 |
default:
|
517 |
return isset( $item->$column_name )
|
518 |
? esc_html( $item->$column_name )
|
550 |
* @return bool
|
551 |
*/
|
552 |
protected function is_multisite() {
|
553 |
+
return WpSecurityAuditLog::is_multisite();
|
554 |
}
|
555 |
|
556 |
/**
|
classes/Autoloader.php
DELETED
@@ -1,97 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Autoloader class.
|
4 |
-
*
|
5 |
-
* @package wsal
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Classes Auto Loader.
|
10 |
-
*
|
11 |
-
* @package wsal
|
12 |
-
*/
|
13 |
-
class WSAL_Autoloader {
|
14 |
-
|
15 |
-
/**
|
16 |
-
* Instance of WpSecurityAuditLog.
|
17 |
-
*
|
18 |
-
* @var object
|
19 |
-
*/
|
20 |
-
protected $plugin;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Paths to load.
|
24 |
-
*
|
25 |
-
* @var array
|
26 |
-
*/
|
27 |
-
protected $paths = array();
|
28 |
-
|
29 |
-
/**
|
30 |
-
* Method: Constructor.
|
31 |
-
*
|
32 |
-
* @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
|
33 |
-
*/
|
34 |
-
public function __construct( WpSecurityAuditLog $plugin ) {
|
35 |
-
$this->plugin = $plugin;
|
36 |
-
|
37 |
-
// Register autoloader.
|
38 |
-
spl_autoload_register( array( $this, 'load_class' ) );
|
39 |
-
}
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Method: Register class.
|
43 |
-
*
|
44 |
-
* @param string $prefix - Prefix of the class.
|
45 |
-
* @param string $path - Path of the file.
|
46 |
-
*/
|
47 |
-
public function register( $prefix, $path ) {
|
48 |
-
if ( ! isset( $this->paths[ $prefix ] ) ) {
|
49 |
-
$this->paths[ $prefix ] = array();
|
50 |
-
}
|
51 |
-
$this->paths[ $prefix ][] = rtrim( str_replace( '\\', '/', $path ), '/' ) . '/';
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* This is the class autoloader. You should not call this directly.
|
56 |
-
*
|
57 |
-
* @param string $class - Class name.
|
58 |
-
* @return boolean - True if class is found and loaded, false otherwise.
|
59 |
-
*/
|
60 |
-
public function load_class( $class ) {
|
61 |
-
foreach ( $this->paths as $prefix => $paths ) {
|
62 |
-
foreach ( $paths as $path ) {
|
63 |
-
if ( strstr( $class, $prefix ) !== false ) {
|
64 |
-
$file = $path . str_replace( '_', DIRECTORY_SEPARATOR, substr( $class, strlen( $prefix ) ) ) . '.php';
|
65 |
-
if ( file_exists( $file ) ) {
|
66 |
-
require_once $file;
|
67 |
-
return class_exists( $class, false ) || interface_exists( $class, false );
|
68 |
-
}
|
69 |
-
}
|
70 |
-
}
|
71 |
-
}
|
72 |
-
return false;
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Returns the class name of a particular file that contains the class.
|
77 |
-
*
|
78 |
-
* @param string $file File name.
|
79 |
-
* @return string|false Class name or false on error.
|
80 |
-
*/
|
81 |
-
public function get_class_file_class_name( $file ) {
|
82 |
-
$file = str_replace( '\\', '/', $file ); // Win/DOS hotfix.
|
83 |
-
|
84 |
-
foreach ( $this->paths as $prefix => $paths ) {
|
85 |
-
foreach ( $paths as $path ) {
|
86 |
-
if ( strstr( $file, $path ) !== false ) {
|
87 |
-
return str_replace(
|
88 |
-
array( $path, '/' ),
|
89 |
-
array( $prefix, '_' ),
|
90 |
-
substr( $file, 0, -4 ) // Remove '.php'.
|
91 |
-
);
|
92 |
-
}
|
93 |
-
}
|
94 |
-
}
|
95 |
-
return false;
|
96 |
-
}
|
97 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
classes/Connector/AbstractConnector.php
CHANGED
@@ -53,12 +53,6 @@ abstract class WSAL_Connector_AbstractConnector {
|
|
53 |
$this->adapters_base_path = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'Adapters' . DIRECTORY_SEPARATOR;
|
54 |
if ( ! empty( $adapters_dir_name ) ) {
|
55 |
$this->adapters_dir_name = $adapters_dir_name;
|
56 |
-
$adapters_directory = $this->get_adapters_directory();
|
57 |
-
require_once $adapters_directory . DIRECTORY_SEPARATOR . 'ActiveRecordAdapter.php';
|
58 |
-
require_once $adapters_directory . DIRECTORY_SEPARATOR . 'MetaAdapter.php';
|
59 |
-
require_once $adapters_directory . DIRECTORY_SEPARATOR . 'OccurrenceAdapter.php';
|
60 |
-
require_once $adapters_directory . DIRECTORY_SEPARATOR . 'QueryAdapter.php';
|
61 |
-
require_once $adapters_directory . DIRECTORY_SEPARATOR . 'TmpUserAdapter.php';
|
62 |
do_action( 'wsal_require_additional_adapters' );
|
63 |
}
|
64 |
}
|
53 |
$this->adapters_base_path = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'Adapters' . DIRECTORY_SEPARATOR;
|
54 |
if ( ! empty( $adapters_dir_name ) ) {
|
55 |
$this->adapters_dir_name = $adapters_dir_name;
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
do_action( 'wsal_require_additional_adapters' );
|
57 |
}
|
58 |
}
|
classes/Connector/ConnectorFactory.php
CHANGED
@@ -7,6 +7,8 @@
|
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
|
|
|
|
10 |
// Exit if accessed directly.
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
exit;
|
@@ -36,6 +38,15 @@ abstract class WSAL_Connector_ConnectorFactory {
|
|
36 |
*/
|
37 |
private static $connectors = array();
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
/**
|
40 |
* Occurrence is installed.
|
41 |
*
|
@@ -125,31 +136,46 @@ abstract class WSAL_Connector_ConnectorFactory {
|
|
125 |
* @throws Freemius_Exception
|
126 |
*/
|
127 |
public static function get_config() {
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
if ( function_exists( 'wsal_freemius' ) && ! apply_filters( 'wsal_disable_freemius_sdk', false ) ) {
|
132 |
-
$is_not_paying = wsal_freemius()->is_not_paying();
|
133 |
-
} else {
|
134 |
-
$is_not_paying = ! WpSecurityAuditLog::is_premium_freemius();
|
135 |
-
}
|
136 |
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
if ( ! self::$is_installed ) {
|
141 |
-
self::$is_installed = $connector->is_installed();
|
142 |
-
$connector->install_all();
|
143 |
}
|
144 |
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
}
|
|
|
|
|
151 |
|
152 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
153 |
}
|
154 |
|
155 |
/**
|
@@ -160,7 +186,7 @@ abstract class WSAL_Connector_ConnectorFactory {
|
|
160 |
* @return array|null
|
161 |
* @since 4.4.0
|
162 |
*/
|
163 |
-
|
164 |
/*
|
165 |
* Reused code from the external DB module.
|
166 |
*
|
7 |
* @package wsal
|
8 |
*/
|
9 |
|
10 |
+
use WPMailSMTP\Vendor\Psr\Log\NullLogger;
|
11 |
+
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
38 |
*/
|
39 |
private static $connectors = array();
|
40 |
|
41 |
+
/**
|
42 |
+
* Holds the configuration of the connection (if there is one)
|
43 |
+
*
|
44 |
+
* @var boolean
|
45 |
+
*
|
46 |
+
* @since 4.4.2
|
47 |
+
*/
|
48 |
+
private static $connection = false;
|
49 |
+
|
50 |
/**
|
51 |
* Occurrence is installed.
|
52 |
*
|
136 |
* @throws Freemius_Exception
|
137 |
*/
|
138 |
public static function get_config() {
|
139 |
+
if ( false === self::$connection ) {
|
140 |
+
$plugin = WpSecurityAuditLog::get_instance();
|
141 |
+
$connection_name = $plugin->get_global_setting( 'adapter-connection' );
|
|
|
|
|
|
|
|
|
|
|
142 |
|
143 |
+
if ( empty( $connection_name ) ) {
|
144 |
+
self::$connection = null;
|
|
|
|
|
|
|
|
|
145 |
}
|
146 |
|
147 |
+
/**
|
148 |
+
* this code is commented out because it is producing errors when license expires. Please do not remove it for now as it is may become part of separate method.
|
149 |
+
*/
|
150 |
+
// if ( function_exists( 'wsal_freemius' ) && ! apply_filters( 'wsal_disable_freemius_sdk', false ) ) {
|
151 |
+
// $is_not_paying = wsal_freemius()->is_not_paying();
|
152 |
+
// } else {
|
153 |
+
// $is_not_paying = ! WpSecurityAuditLog::is_premium_freemius();
|
154 |
+
// }
|
155 |
+
|
156 |
+
// if ( $connection_name && $is_not_paying ) {
|
157 |
+
// $connector = new WSAL_Connector_MySQLDB();
|
158 |
+
|
159 |
+
// if ( ! self::$is_installed ) {
|
160 |
+
// self::$is_installed = $connector->is_installed();
|
161 |
+
// $connector->install_all();
|
162 |
+
// }
|
163 |
+
// }
|
164 |
+
|
165 |
+
self::$connection = self::load_connection_config( $connection_name );
|
166 |
}
|
167 |
+
return self::$connection;
|
168 |
+
}
|
169 |
|
170 |
+
/**
|
171 |
+
* As this is static class, we need to destroy the connection sometimes.
|
172 |
+
*
|
173 |
+
* @return void
|
174 |
+
*
|
175 |
+
* @since 4.4.2
|
176 |
+
*/
|
177 |
+
public static function destroy_connection() {
|
178 |
+
self::$connection = false;
|
179 |
}
|
180 |
|
181 |
/**
|
186 |
* @return array|null
|
187 |
* @since 4.4.0
|
188 |
*/
|
189 |
+
public static function load_connection_config( $connection_name ) {
|
190 |
/*
|
191 |
* Reused code from the external DB module.
|
192 |
*
|
classes/Connector/MySQLDB.php
CHANGED
@@ -13,6 +13,9 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
13 |
exit;
|
14 |
}
|
15 |
|
|
|
|
|
|
|
16 |
/**
|
17 |
* MySQL Connector Class
|
18 |
* It uses wpdb WordPress DB Class
|
@@ -200,7 +203,7 @@ class WSAL_Connector_MySQLDB extends WSAL_Connector_AbstractConnector implements
|
|
200 |
* @return string
|
201 |
*/
|
202 |
protected function get_adapter_class_name( $class_name ) {
|
203 |
-
return 'WSAL_Adapters_MySQL_' . $class_name;
|
204 |
}
|
205 |
|
206 |
/**
|
@@ -218,12 +221,9 @@ class WSAL_Connector_MySQLDB extends WSAL_Connector_AbstractConnector implements
|
|
218 |
* {@inheritDoc}
|
219 |
*/
|
220 |
public function install_all( $is_external_database = false ) {
|
221 |
-
$adapter_list =
|
222 |
-
|
223 |
-
foreach ( $adapter_list as $
|
224 |
-
$file_path = explode( DIRECTORY_SEPARATOR, $file );
|
225 |
-
$file_name = $file_path[ count( $file_path ) - 1 ];
|
226 |
-
$class_name = $this->get_adapter_class_name( str_replace( 'Adapter.php', '', $file_name ) );
|
227 |
$this->install_single( $class_name, $is_external_database );
|
228 |
}
|
229 |
}
|
@@ -237,17 +237,13 @@ class WSAL_Connector_MySQLDB extends WSAL_Connector_AbstractConnector implements
|
|
237 |
}
|
238 |
|
239 |
$class = new $class_name( $this->get_connection() );
|
240 |
-
if ( $is_external_database && $class instanceof WSAL_Adapters_MySQL_Session ) {
|
241 |
-
// Sessions table should only ever exist only in local database.
|
242 |
-
return;
|
243 |
-
}
|
244 |
|
245 |
-
if ( ! $is_external_database && $class instanceof WSAL_Adapters_MySQL_TmpUser ) {
|
246 |
// Exclude the tmp_users table for local database.
|
247 |
return;
|
248 |
}
|
249 |
|
250 |
-
if ( is_subclass_of( $class, 'WSAL_Adapters_MySQL_ActiveRecord' ) ) {
|
251 |
$class->install();
|
252 |
}
|
253 |
}
|
@@ -262,7 +258,7 @@ class WSAL_Connector_MySQLDB extends WSAL_Connector_AbstractConnector implements
|
|
262 |
$class_name = $this->get_adapter_class_name( str_replace( 'Adapter.php', '', $file_name ) );
|
263 |
|
264 |
$class = new $class_name( $this->get_connection() );
|
265 |
-
if ( is_subclass_of( $class, 'WSAL_Adapters_MySQL_ActiveRecord' ) ) {
|
266 |
$class->uninstall();
|
267 |
}
|
268 |
}
|
13 |
exit;
|
14 |
}
|
15 |
|
16 |
+
use WSAL\Adapter\WSAL_Adapters_MySQL_Occurrence;
|
17 |
+
use WSAL\Adapter\WSAL_Adapters_MySQL_Meta;
|
18 |
+
|
19 |
/**
|
20 |
* MySQL Connector Class
|
21 |
* It uses wpdb WordPress DB Class
|
203 |
* @return string
|
204 |
*/
|
205 |
protected function get_adapter_class_name( $class_name ) {
|
206 |
+
return 'WSAL\Adapter\WSAL_Adapters_MySQL_' . $class_name;
|
207 |
}
|
208 |
|
209 |
/**
|
221 |
* {@inheritDoc}
|
222 |
*/
|
223 |
public function install_all( $is_external_database = false ) {
|
224 |
+
$adapter_list = \WSAL\Helpers\Classes_Helper::get_classes_by_namespace( '\WSAL\Adapter' );
|
225 |
+
|
226 |
+
foreach ( $adapter_list as $class_name ) {
|
|
|
|
|
|
|
227 |
$this->install_single( $class_name, $is_external_database );
|
228 |
}
|
229 |
}
|
237 |
}
|
238 |
|
239 |
$class = new $class_name( $this->get_connection() );
|
|
|
|
|
|
|
|
|
240 |
|
241 |
+
if ( ! $is_external_database && $class instanceof \WSAL\Adapter\WSAL_Adapters_MySQL_TmpUser ) {
|
242 |
// Exclude the tmp_users table for local database.
|
243 |
return;
|
244 |
}
|
245 |
|
246 |
+
if ( is_subclass_of( $class, 'WSAL\Adapter\WSAL_Adapters_MySQL_ActiveRecord' ) ) {
|
247 |
$class->install();
|
248 |
}
|
249 |
}
|
258 |
$class_name = $this->get_adapter_class_name( str_replace( 'Adapter.php', '', $file_name ) );
|
259 |
|
260 |
$class = new $class_name( $this->get_connection() );
|
261 |
+
if ( is_subclass_of( $class, 'WSAL\Adapter\WSAL_Adapters_MySQL_ActiveRecord' ) ) {
|
262 |
$class->uninstall();
|
263 |
}
|
264 |
}
|
classes/Entities/class-abstract-entity.php
ADDED
@@ -0,0 +1,249 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Entity: Abstract.
|
4 |
+
*
|
5 |
+
* @package wsal
|
6 |
+
*/
|
7 |
+
|
8 |
+
declare(strict_types=1);
|
9 |
+
|
10 |
+
namespace WSAL\Entities;
|
11 |
+
|
12 |
+
// Exit if accessed directly.
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
if ( ! class_exists( '\WSAL\Entities\Abstract_Entity' ) ) {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Responsible for the common entity operations.
|
21 |
+
*/
|
22 |
+
abstract class Abstract_Entity {
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Contains the table name.
|
26 |
+
*
|
27 |
+
* @var string
|
28 |
+
*/
|
29 |
+
private static $table = '';
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Holds the DB connection (for caching purposes)
|
33 |
+
*
|
34 |
+
* @var [type]
|
35 |
+
*
|
36 |
+
* @since 4.4.2
|
37 |
+
*/
|
38 |
+
private static $connection = null;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Returns the the table name
|
42 |
+
*
|
43 |
+
* @return string
|
44 |
+
*
|
45 |
+
* @since 4.4.2
|
46 |
+
*/
|
47 |
+
public static function get_table_name(): string {
|
48 |
+
return self::get_connection()->prefix . static::$table;
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Returns the current connection (used by the plugin)
|
53 |
+
*
|
54 |
+
* @return \WPDB @see \WSAL_Connector_MySQLDB
|
55 |
+
*
|
56 |
+
* @since 4.4.2
|
57 |
+
*/
|
58 |
+
public static function get_connection() {
|
59 |
+
if ( null === self::$connection ) {
|
60 |
+
if ( self::is_external_db() ) {
|
61 |
+
// Get DB connector.
|
62 |
+
$db_config = \WSAL_Connector_ConnectorFactory::get_config(); // Get DB connector configuration.
|
63 |
+
|
64 |
+
// Get connector for DB.
|
65 |
+
$custom_mysql = \WSAL_Connector_ConnectorFactory::get_connector( $db_config );
|
66 |
+
} else {
|
67 |
+
$custom_mysql = \WSAL_Connector_ConnectorFactory::get_default_connector();
|
68 |
+
}
|
69 |
+
self::$connection = $custom_mysql->get_connection();
|
70 |
+
}
|
71 |
+
return self::$connection;
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Sets connection to the given value.
|
76 |
+
*
|
77 |
+
* @param \WPDB $connection - The connection to set to @see \WSAL_Connector_MySQLDB .
|
78 |
+
*
|
79 |
+
* @return void
|
80 |
+
*
|
81 |
+
* @since 4.4.2
|
82 |
+
*/
|
83 |
+
public static function set_connection( $connection ) {
|
84 |
+
self::$connection = $connection;
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* As this is static class, we need to destroy the connection sometimes.
|
89 |
+
*
|
90 |
+
* @return void
|
91 |
+
*
|
92 |
+
* @since 4.4.2
|
93 |
+
*/
|
94 |
+
public static function destroy_connection() {
|
95 |
+
self::$connection = null;
|
96 |
+
// Destroy factory connection as well.
|
97 |
+
\WSAL_Connector_ConnectorFactory::destroy_connection();
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Checks if the table needs to be recreated / created
|
102 |
+
*
|
103 |
+
* @param string $table_name - The name of the table to check for.
|
104 |
+
* @param string $create_ddl - The create table syntax.
|
105 |
+
*
|
106 |
+
* @return bool
|
107 |
+
*
|
108 |
+
* @since 4.4.2
|
109 |
+
*/
|
110 |
+
public static function maybe_create_table( string $table_name, string $create_ddl ): bool {
|
111 |
+
foreach ( self::get_connection()->get_col( 'SHOW TABLES', 0 ) as $table ) {
|
112 |
+
if ( $table === $table_name ) {
|
113 |
+
return true;
|
114 |
+
}
|
115 |
+
}
|
116 |
+
// Didn't find it, so try to create it.
|
117 |
+
self::get_connection()->query( $create_ddl );
|
118 |
+
|
119 |
+
// We cannot directly tell that whether this succeeded!
|
120 |
+
foreach ( self::get_connection()->get_col( 'SHOW TABLES', 0 ) as $table ) {
|
121 |
+
if ( $table === $table_name ) {
|
122 |
+
return true;
|
123 |
+
}
|
124 |
+
}
|
125 |
+
return false;
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Checks if external database is in use.
|
130 |
+
*
|
131 |
+
* @return boolean
|
132 |
+
*
|
133 |
+
* @since 4.4.2
|
134 |
+
*/
|
135 |
+
public static function is_external_db(): bool {
|
136 |
+
$db_config = \WSAL_Connector_ConnectorFactory::get_config();
|
137 |
+
|
138 |
+
return is_array( $db_config ) && ! empty( $db_config );
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Checks for given column existence using custom connection.
|
143 |
+
*
|
144 |
+
* @param string $table_name - The name of the table.
|
145 |
+
* @param string $col_name - The name of the column.
|
146 |
+
* @param string $col_type - Type of the column.
|
147 |
+
* @param boolean|null $is_null - Is it null.
|
148 |
+
* @param mixed $key - Is it key.
|
149 |
+
* @param mixed $default - The default value of the column.
|
150 |
+
* @param mixed $extra - Extra parameters.
|
151 |
+
*
|
152 |
+
* @return boolean - True if the column exists and all given parameters are the same, false otherwise.
|
153 |
+
*
|
154 |
+
* @since 4.4.2
|
155 |
+
*/
|
156 |
+
public static function check_column(
|
157 |
+
string $table_name,
|
158 |
+
string $col_name,
|
159 |
+
string $col_type,
|
160 |
+
bool $is_null = null,
|
161 |
+
$key = null,
|
162 |
+
$default = null,
|
163 |
+
$extra = null ): bool {
|
164 |
+
|
165 |
+
$diffs = 0;
|
166 |
+
$results = self::get_connection()->get_results( "DESC $table_name" );
|
167 |
+
|
168 |
+
foreach ( $results as $row ) {
|
169 |
+
|
170 |
+
if ( $row->Field === $col_name ) { // phpcs:ignore
|
171 |
+
|
172 |
+
// Got our column, check the params.
|
173 |
+
if ( ( null !== $col_type ) && ( strtolower( str_replace( ' ', '', $row->Type ) ) !== strtolower( str_replace( ' ', '', $col_type ) ) ) ) { // phpcs:ignore
|
174 |
+
++$diffs;
|
175 |
+
}
|
176 |
+
if ( ( null !== $is_null ) && ( $row->Null !== $is_null ) ) { // phpcs:ignore
|
177 |
+
++$diffs;
|
178 |
+
}
|
179 |
+
if ( ( null !== $key ) && ( $row->Key !== $key ) ) { // phpcs:ignore
|
180 |
+
++$diffs;
|
181 |
+
}
|
182 |
+
if ( ( null !== $default ) && ( $row->Default !== $default ) ) { // phpcs:ignore
|
183 |
+
++$diffs;
|
184 |
+
}
|
185 |
+
if ( ( null !== $extra ) && ( $row->Extra !== $extra ) ) { // phpcs:ignore
|
186 |
+
++$diffs;
|
187 |
+
}
|
188 |
+
|
189 |
+
if ( $diffs > 0 ) {
|
190 |
+
return false;
|
191 |
+
}
|
192 |
+
|
193 |
+
return true;
|
194 |
+
} // End if found our column.
|
195 |
+
}
|
196 |
+
|
197 |
+
return false;
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Checks and returns last mysql error
|
202 |
+
*
|
203 |
+
* @param \WPDB $_wpdb - The Mysql resource class.
|
204 |
+
*
|
205 |
+
* @return integer
|
206 |
+
*
|
207 |
+
* @since 4.4.2
|
208 |
+
*/
|
209 |
+
public static function get_last_sql_error( $_wpdb ): int {
|
210 |
+
$code = 0;
|
211 |
+
if ( $_wpdb->dbh instanceof \mysqli ) {
|
212 |
+
$code = \mysqli_errno( $_wpdb->dbh ); // phpcs:ignore
|
213 |
+
}
|
214 |
+
|
215 |
+
if ( is_resource( $_wpdb->dbh ) ) {
|
216 |
+
// Please do not report this code as a PHP 7 incompatibility. Observe the surrounding logic.
|
217 |
+
// phpcs:ignore
|
218 |
+
$code = mysql_errno( $_wpdb->dbh );
|
219 |
+
}
|
220 |
+
return $code;
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Drop the table from the DB.
|
225 |
+
*/
|
226 |
+
public static function drop_table() {
|
227 |
+
$table_name = self::get_table_name();
|
228 |
+
self::get_connection()->query( 'DROP TABLE IF EXISTS ' . $table_name ); // phpcs:ignore
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Checks if give table exists
|
233 |
+
*
|
234 |
+
* @param string $table_name - The table to check for.
|
235 |
+
*
|
236 |
+
* @return boolean
|
237 |
+
*
|
238 |
+
* @since 4.4.2
|
239 |
+
*/
|
240 |
+
public static function check_table_exists( string $table_name ): bool {
|
241 |
+
foreach ( self::get_connection()->get_col( 'SHOW TABLES', 0 ) as $table ) {
|
242 |
+
if ( $table === $table_name ) {
|
243 |
+
return true;
|
244 |
+
}
|
245 |
+
}
|
246 |
+
return false;
|
247 |
+
}
|
248 |
+
}
|
249 |
+
}
|
classes/Entities/class-metadata-entity.php
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Entity: Metadata.
|
4 |
+
*
|
5 |
+
* User Sessions class.
|
6 |
+
*
|
7 |
+
* @package wsal
|
8 |
+
*/
|
9 |
+
|
10 |
+
declare(strict_types=1);
|
11 |
+
|
12 |
+
namespace WSAL\Entities;
|
13 |
+
|
14 |
+
// Exit if accessed directly.
|
15 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
if ( ! class_exists( '\WSAL\Entities\Metadata_Entity' ) ) {
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Responsible for the events metadata.
|
23 |
+
*/
|
24 |
+
class Metadata_Entity extends Abstract_Entity {
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Contains the table name.
|
28 |
+
*
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
protected static $table = 'wsal_metadata';
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Creates table functionality
|
35 |
+
*
|
36 |
+
* @return bool
|
37 |
+
*
|
38 |
+
* @since 4.4.2
|
39 |
+
*/
|
40 |
+
public static function create_table(): bool {
|
41 |
+
$table_name = self::get_table_name();
|
42 |
+
$wp_entity_sql = '
|
43 |
+
CREATE TABLE `' . $table_name . '` (
|
44 |
+
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
45 |
+
`occurrence_id` bigint(20) NOT NULL,
|
46 |
+
`name` varchar(100) NOT NULL,
|
47 |
+
`value` longtext NOT NULL,
|
48 |
+
PRIMARY KEY (`id`),
|
49 |
+
KEY `occurrence_name` (`occurrence_id`,`name`)
|
50 |
+
)
|
51 |
+
' . self::get_connection()->get_charset_collate() . ';';
|
52 |
+
|
53 |
+
return self::maybe_create_table( $table_name, $wp_entity_sql );
|
54 |
+
}
|
55 |
+
}
|
56 |
+
}
|
classes/Entities/class-occurrences-entity.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Entity: Occurrences.
|
4 |
+
*
|
5 |
+
* User Sessions class.
|
6 |
+
*
|
7 |
+
* @package wsal
|
8 |
+
*/
|
9 |
+
|
10 |
+
declare(strict_types=1);
|
11 |
+
|
12 |
+
namespace WSAL\Entities;
|
13 |
+
|
14 |
+
// Exit if accessed directly.
|
15 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
if ( ! class_exists( '\WSAL\Entities\Occurrences_Entity' ) ) {
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Responsible for the events occurrences.
|
23 |
+
*/
|
24 |
+
class Occurrences_Entity extends Abstract_Entity {
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Contains the table name.
|
28 |
+
*
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
protected static $table = 'wsal_occurrences';
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Builds an upgrade query for the occurrence table.
|
35 |
+
*
|
36 |
+
* @return string
|
37 |
+
*/
|
38 |
+
public static function get_upgrade_query() {
|
39 |
+
return 'ALTER TABLE `' . self::get_table_name() . '`'
|
40 |
+
. ' DROP COLUMN is_read, '
|
41 |
+
. ' DROP COLUMN is_migrated, '
|
42 |
+
. " ADD client_ip VARCHAR(255) NOT NULL DEFAULT '',"
|
43 |
+
. ' ADD severity BIGINT NOT NULL DEFAULT 0,'
|
44 |
+
. " ADD object VARCHAR(255) NOT NULL DEFAULT '',"
|
45 |
+
. " ADD event_type VARCHAR(255) NOT NULL DEFAULT '',"
|
46 |
+
. " ADD user_agent VARCHAR(255) NOT NULL DEFAULT '',"
|
47 |
+
. " ADD user_roles VARCHAR(255) NOT NULL DEFAULT '',"
|
48 |
+
. ' ADD username VARCHAR(255) NULL,'
|
49 |
+
. ' ADD user_id BIGINT NULL ,'
|
50 |
+
. " ADD session_id VARCHAR(255) NOT NULL DEFAULT '',"
|
51 |
+
. " ADD post_status VARCHAR(255) NOT NULL DEFAULT '',"
|
52 |
+
. " ADD post_type VARCHAR(255) NOT NULL DEFAULT '',"
|
53 |
+
. ' ADD post_id BIGINT NOT NULL DEFAULT 0;';
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Creates table functionality
|
58 |
+
*
|
59 |
+
* @return bool
|
60 |
+
*
|
61 |
+
* @since 4.4.2
|
62 |
+
*/
|
63 |
+
public static function create_table(): bool {
|
64 |
+
$table_name = self::get_table_name();
|
65 |
+
$wp_entity_sql = '
|
66 |
+
CREATE TABLE `' . $table_name . '` (
|
67 |
+
`id` bigint NOT NULL AUTO_INCREMENT,
|
68 |
+
`site_id` bigint NOT NULL,
|
69 |
+
`alert_id` bigint NOT NULL,
|
70 |
+
`created_on` double NOT NULL,
|
71 |
+
`client_ip` varchar(255) NOT NULL,
|
72 |
+
`severity` varchar(255) NOT NULL,
|
73 |
+
`object` varchar(255) NOT NULL,
|
74 |
+
`event_type` varchar(255) NOT NULL,
|
75 |
+
`user_agent` varchar(255) NOT NULL,
|
76 |
+
`user_roles` varchar(255) NOT NULL,
|
77 |
+
`username` varchar(255) DEFAULT NULL,
|
78 |
+
`user_id` bigint DEFAULT NULL,
|
79 |
+
`session_id` varchar(255) NOT NULL,
|
80 |
+
`post_status` varchar(255) NOT NULL,
|
81 |
+
`post_type` varchar(255) NOT NULL,
|
82 |
+
`post_id` bigint NOT NULL,
|
83 |
+
PRIMARY KEY (`id`),
|
84 |
+
KEY `site_alert_created` (`site_id`,`alert_id`,`created_on`),
|
85 |
+
KEY `created_on` (`created_on`)
|
86 |
+
)
|
87 |
+
' . self::get_connection()->get_charset_collate() . ';';
|
88 |
+
|
89 |
+
return self::maybe_create_table( $table_name, $wp_entity_sql );
|
90 |
+
}
|
91 |
+
}
|
92 |
+
}
|
classes/Entities/class-options-entity.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Entity: Options.
|
4 |
+
*
|
5 |
+
* User Options table.
|
6 |
+
*
|
7 |
+
* Important: This table is no longer in use, and will be removed if it is presented.
|
8 |
+
* That code is for migration purposes only.
|
9 |
+
* At some point it was dropped, but in order to keep backwards compatibility, its content needs to be transferred to the main options table.
|
10 |
+
*
|
11 |
+
* @package wsal
|
12 |
+
*/
|
13 |
+
|
14 |
+
declare(strict_types=1);
|
15 |
+
|
16 |
+
namespace WSAL\Entities;
|
17 |
+
|
18 |
+
use \WSAL\Helpers\WP_Helper;
|
19 |
+
|
20 |
+
// Exit if accessed directly.
|
21 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
22 |
+
exit;
|
23 |
+
}
|
24 |
+
|
25 |
+
if ( ! class_exists( '\WSAL\Entities\Options_Entity' ) ) {
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Responsible for the options (legacy).
|
29 |
+
*/
|
30 |
+
class Options_Entity extends Abstract_Entity {
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Contains the table name.
|
34 |
+
*
|
35 |
+
* @var string
|
36 |
+
*/
|
37 |
+
protected static $table = 'wsal_options';
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Transfers all the options from the legacy options table to the global WP options.
|
41 |
+
*
|
42 |
+
* @return void
|
43 |
+
*
|
44 |
+
* @since 4.4.2
|
45 |
+
*/
|
46 |
+
public static function transfer_options() {
|
47 |
+
global $wpdb;
|
48 |
+
|
49 |
+
$results = $wpdb->get_results( 'SELECT * FROM ' . self::get_table_name(), ARRAY_A ); // phpcs:ignore
|
50 |
+
|
51 |
+
foreach ( $results as $data ) {
|
52 |
+
$option_name = $data['option_name'];
|
53 |
+
$option_name = \str_replace( 'wsal-', 'wsal_', $option_name );
|
54 |
+
$option_exists = WP_Helper::get_global_option( $option_name, false );
|
55 |
+
if ( false === $option_exists ) {
|
56 |
+
|
57 |
+
WP_Helper::set_global_option( $option_name, \maybe_unserialize( $data['option_value'] ) );
|
58 |
+
}
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Drop the table from the DB.
|
64 |
+
* The method from the abstract class is not used because that table must be in the local database, so we just need to user WP_DB
|
65 |
+
*/
|
66 |
+
public static function drop_table() {
|
67 |
+
global $wpdb;
|
68 |
+
|
69 |
+
$table_name = self::get_table_name();
|
70 |
+
|
71 |
+
$wpdb->query( 'DROP TABLE IF EXISTS ' . $table_name ); // phpcs:ignore
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Returns the the table name
|
76 |
+
* The method from the abstract class is not used because that table must be in the local database, so we just need to user WP_DB
|
77 |
+
*
|
78 |
+
* @return string
|
79 |
+
*
|
80 |
+
* @since 4.4.2
|
81 |
+
*/
|
82 |
+
public static function get_table_name(): string {
|
83 |
+
global $wpdb;
|
84 |
+
|
85 |
+
return $wpdb->prefix . static::$table;
|
86 |
+
}
|
87 |
+
}
|
88 |
+
}
|
classes/Helpers/Options.php
CHANGED
@@ -222,12 +222,19 @@ class Options {
|
|
222 |
switch_to_blog( get_main_network_id() );
|
223 |
}
|
224 |
|
|
|
|
|
|
|
|
|
|
|
|
|
225 |
if ( false === $autoload ) {
|
226 |
delete_option( $option_name );
|
|
|
|
|
|
|
227 |
}
|
228 |
|
229 |
-
$result = \update_option( $option_name, $value, $autoload );
|
230 |
-
|
231 |
if ( is_multisite() ) {
|
232 |
restore_current_blog();
|
233 |
}
|
222 |
switch_to_blog( get_main_network_id() );
|
223 |
}
|
224 |
|
225 |
+
/**
|
226 |
+
* The reason for this code is that issue:
|
227 |
+
* https://github.com/wpwhitesecurity/wp-security-audit-log-premium/issues/1322
|
228 |
+
*
|
229 |
+
* TODO: Make sure that is taking care of and remove that altogether.
|
230 |
+
*/
|
231 |
if ( false === $autoload ) {
|
232 |
delete_option( $option_name );
|
233 |
+
$result = \add_option( $option_name, $value, '', $autoload );
|
234 |
+
} else {
|
235 |
+
$result = \update_option( $option_name, $value, $autoload );
|
236 |
}
|
237 |
|
|
|
|
|
238 |
if ( is_multisite() ) {
|
239 |
restore_current_blog();
|
240 |
}
|
classes/Helpers/class-classes-helper.php
ADDED
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Class: Classes Loader Helper.
|
4 |
+
*
|
5 |
+
* Helper class used for extraction / loading classes.
|
6 |
+
*
|
7 |
+
* @package wsal
|
8 |
+
*/
|
9 |
+
|
10 |
+
declare(strict_types=1);
|
11 |
+
|
12 |
+
namespace WSAL\Helpers;
|
13 |
+
|
14 |
+
// Exit if accessed directly.
|
15 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
if ( ! class_exists( '\WSAL\Helpers\Classes_Helper' ) ) {
|
20 |
+
/**
|
21 |
+
* Responsible for the proper class loading
|
22 |
+
*/
|
23 |
+
class Classes_Helper {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Holds the classmap array for more info check @see autoload_classmap.php from the auto generated Composer file
|
27 |
+
*
|
28 |
+
* @var array
|
29 |
+
*
|
30 |
+
* @since 4.4.2
|
31 |
+
*/
|
32 |
+
private static $class_map = array();
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Caches and returns the classmap structure of the plugin.
|
36 |
+
*
|
37 |
+
* @return array
|
38 |
+
*
|
39 |
+
* @since 4.4.2
|
40 |
+
*/
|
41 |
+
public static function get_class_map(): array {
|
42 |
+
if ( empty( self::$class_map ) ) {
|
43 |
+
self::$class_map = require WSAL_BASE_DIR . 'vendor/composer/autoload_classmap.php';
|
44 |
+
}
|
45 |
+
|
46 |
+
return self::$class_map;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Returns the class by its filename. Checks if it exists and returns it as string. Returns false otherwise
|
51 |
+
*
|
52 |
+
* @param string $file - The filename of the class to check.
|
53 |
+
*
|
54 |
+
* @return string|false
|
55 |
+
*
|
56 |
+
* @since 4.4.2
|
57 |
+
*/
|
58 |
+
public static function get_class_by_filename( string $file ) {
|
59 |
+
if ( in_array( $file, self::get_class_map(), true ) ) {
|
60 |
+
$class = array_search( $file, self::get_class_map(), true );
|
61 |
+
|
62 |
+
if ( class_exists( $class ) ) {
|
63 |
+
return $class;
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
return false;
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Extracts subclasses of the given class, optionally abstract classes could be included as well.
|
72 |
+
*
|
73 |
+
* @param string $current_class - The calling class.
|
74 |
+
* @param string $base_class - The class which subclasses should be extracted.
|
75 |
+
* @param boolean $exclude_abstracts - Should we exclude abstract classes.
|
76 |
+
*
|
77 |
+
* @return array
|
78 |
+
*
|
79 |
+
* @since 4.4.2
|
80 |
+
*/
|
81 |
+
public static function get_subclasses_of_class( string $current_class, string $base_class, bool $exclude_abstracts = true ): array {
|
82 |
+
|
83 |
+
$matching_classes = array();
|
84 |
+
foreach ( array_keys( self::get_class_map() ) as $class_name ) {
|
85 |
+
if ( $current_class !== $class_name && is_subclass_of( $class_name, $base_class ) ) {
|
86 |
+
if ( $exclude_abstracts && ( false !== strpos( $class_name, 'Abstract' ) ) ) {
|
87 |
+
continue;
|
88 |
+
}
|
89 |
+
$matching_classes[ $class_name ] = $class_name;
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
return $matching_classes;
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Returns all the classes which are part of the given namespace
|
98 |
+
*
|
99 |
+
* @param string $namespace - The namespace to search for.
|
100 |
+
*
|
101 |
+
* @return array
|
102 |
+
*
|
103 |
+
* @since 4.4.2
|
104 |
+
*/
|
105 |
+
public static function get_classes_by_namespace( string $namespace ) {
|
106 |
+
if ( 0 === strpos( $namespace, '\\' ) ) {
|
107 |
+
$namespace = ltrim( $namespace, '\\' );
|
108 |
+
}
|
109 |
+
|
110 |
+
$namespace = rtrim( $namespace, '\\' );
|
111 |
+
|
112 |
+
$term_upper = strtoupper( $namespace );
|
113 |
+
return array_filter(
|
114 |
+
array_keys( self::get_class_map() ),
|
115 |
+
function( $class ) use ( $term_upper ) {
|
116 |
+
$class_name = strtoupper( $class );
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Find class name, by finding the lass occurrence of the \
|
120 |
+
* if it is false (from the strrchr) then class does not belong to any namespace currently.
|
121 |
+
*/
|
122 |
+
$esc_position = strrchr( $class_name, '\\' );
|
123 |
+
|
124 |
+
if ( false !== $esc_position ) {
|
125 |
+
|
126 |
+
$class_name_no_ns = substr( $esc_position, 1 );
|
127 |
+
|
128 |
+
} else {
|
129 |
+
return false;
|
130 |
+
}
|
131 |
+
|
132 |
+
if ( $class_name_no_ns &&
|
133 |
+
$term_upper . '\\' . $class_name_no_ns === $class_name &&
|
134 |
+
false === strpos( $class_name, strtoupper( 'Abstract' ) ) &&
|
135 |
+
false === strpos( $class_name, strtoupper( 'Interface' ) )
|
136 |
+
) {
|
137 |
+
return $class;
|
138 |
+
}
|
139 |
+
return false;
|
140 |
+
}
|
141 |
+
);
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Search for classes by given term
|
146 |
+
*
|
147 |
+
* @param string $term - The term to search for.
|
148 |
+
*
|
149 |
+
* @return array
|
150 |
+
*
|
151 |
+
* @since 4.4.2
|
152 |
+
*/
|
153 |
+
public static function get_classes_with_term( $term ) {
|
154 |
+
$term_upper = strtoupper( $term );
|
155 |
+
return array_filter(
|
156 |
+
self::get_class_map(),
|
157 |
+
function( $class ) use ( $term_upper ) {
|
158 |
+
$class_name = strtoupper( $class );
|
159 |
+
if (
|
160 |
+
false !== strpos( $class_name, $term_upper ) &&
|
161 |
+
false === strpos( $class_name, strtoupper( 'Abstract' ) ) &&
|
162 |
+
false === strpos( $class_name, strtoupper( 'Interface' ) )
|
163 |
+
) {
|
164 |
+
return $class;
|
165 |
+
}
|
166 |
+
return false;
|
167 |
+
}
|
168 |
+
);
|
169 |
+
}
|
170 |
+
}
|
171 |
+
}
|
classes/Helpers/class-php-helper.php
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Class: Helper responsible about multiple steps usually used as a batch.
|
4 |
+
*
|
5 |
+
* Helper class used for validating data.
|
6 |
+
*
|
7 |
+
* @package wsal
|
8 |
+
*/
|
9 |
+
|
10 |
+
declare(strict_types=1);
|
11 |
+
|
12 |
+
namespace WSAL\Helpers;
|
13 |
+
|
14 |
+
// Exit if accessed directly.
|
15 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
if ( ! class_exists( '\WSAL\Helpers\PHP_Helper' ) ) {
|
20 |
+
/**
|
21 |
+
* Responsible for data validation
|
22 |
+
*/
|
23 |
+
class PHP_Helper {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Use this method if you need to split string by comma, remove spaces (leading and trailing), remove empty elements from the array and.
|
27 |
+
*
|
28 |
+
* @param string $string - The string to split.
|
29 |
+
*
|
30 |
+
* @return array
|
31 |
+
*
|
32 |
+
* @since 4.4.2
|
33 |
+
*/
|
34 |
+
public static function string_to_array( string $string ): array {
|
35 |
+
if ( empty( $string ) ) {
|
36 |
+
return array();
|
37 |
+
}
|
38 |
+
|
39 |
+
$split_string = explode( ',', $string );
|
40 |
+
|
41 |
+
// Remove the whitespaces.
|
42 |
+
$split_string = array_map( 'trim', $split_string );
|
43 |
+
|
44 |
+
// Removes empty elements.
|
45 |
+
$split_string = array_filter( $split_string );
|
46 |
+
|
47 |
+
if ( ! is_array( $split_string ) ) {
|
48 |
+
return array();
|
49 |
+
}
|
50 |
+
|
51 |
+
return $split_string;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
}
|
classes/Helpers/class-validator.php
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Class: Validator Helper.
|
4 |
+
*
|
5 |
+
* Helper class used for validating data.
|
6 |
+
*
|
7 |
+
* @package wsal
|
8 |
+
*/
|
9 |
+
|
10 |
+
declare(strict_types=1);
|
11 |
+
|
12 |
+
namespace WSAL\Helpers;
|
13 |
+
|
14 |
+
// Exit if accessed directly.
|
15 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
if ( ! class_exists( '\WSAL\Helpers\Validator' ) ) {
|
20 |
+
/**
|
21 |
+
* Responsible for data validation
|
22 |
+
*/
|
23 |
+
class Validator {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Validates mirror tags against rule sets
|
27 |
+
* Note: no short-returns here as this could be used to collect all the problems for give tag
|
28 |
+
*
|
29 |
+
* @param string $string - The string to validate.
|
30 |
+
*
|
31 |
+
* @return boolean - true - tag is valid, false - tag is not valid.
|
32 |
+
*
|
33 |
+
* @since 4.4.2
|
34 |
+
*/
|
35 |
+
public static function validate_mirror_tag( string $string ): bool {
|
36 |
+
|
37 |
+
$valid = true;
|
38 |
+
|
39 |
+
if ( ! self::starts_alpha_numeric( $string ) ) {
|
40 |
+
$valid = false;
|
41 |
+
}
|
42 |
+
|
43 |
+
if ( ! self::is_string_less_or_equal( $string, 64 ) ) {
|
44 |
+
$valid = false;
|
45 |
+
}
|
46 |
+
|
47 |
+
if ( ! self::is_string_contains_only( $string ) ) {
|
48 |
+
$valid = false;
|
49 |
+
}
|
50 |
+
|
51 |
+
return $valid;
|
52 |
+
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Checks if given string starts with a letter or number.
|
57 |
+
*
|
58 |
+
* @param string $string - The string to check.
|
59 |
+
*
|
60 |
+
* @return boolean
|
61 |
+
*
|
62 |
+
* @since 4.4.2
|
63 |
+
*/
|
64 |
+
private static function starts_alpha_numeric( string $string ): bool {
|
65 |
+
if ( preg_match( '/^[a-zA-Z0-9]/', $string ) ) {
|
66 |
+
return true;
|
67 |
+
}
|
68 |
+
|
69 |
+
return false;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Checks if string has less or equal number of characters.
|
74 |
+
*
|
75 |
+
* @param string $string - The string to check.
|
76 |
+
* @param integer $size - The size of the string to check for.
|
77 |
+
*
|
78 |
+
* @return boolean
|
79 |
+
*
|
80 |
+
* @since 4.4.2
|
81 |
+
*/
|
82 |
+
private static function is_string_less_or_equal( string $string, int $size ): bool {
|
83 |
+
if ( strlen( $string ) <= $size ) {
|
84 |
+
return true;
|
85 |
+
}
|
86 |
+
|
87 |
+
return false;
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Check if string contains only specific characters
|
92 |
+
*
|
93 |
+
* @param string $string - The string to check.
|
94 |
+
*
|
95 |
+
* @return boolean
|
96 |
+
*
|
97 |
+
* @since 4.4.2
|
98 |
+
*/
|
99 |
+
private static function is_string_contains_only( string $string ): bool {
|
100 |
+
if ( preg_match( '/[a-z\d_-]*/i', $string ) ) {
|
101 |
+
return true;
|
102 |
+
}
|
103 |
+
return false;
|
104 |
+
}
|
105 |
+
}
|
106 |
+
}
|
classes/Helpers/class-wp-helper.php
ADDED
@@ -0,0 +1,408 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Responsible for the WP core functionalities
|
4 |
+
*
|
5 |
+
* @package wsal
|
6 |
+
* @subpackage helpers
|
7 |
+
* @since 4.4.2
|
8 |
+
* @copyright 2022 WP White Security
|
9 |
+
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
10 |
+
* @link https://wordpress.org/plugins/wp-2fa/
|
11 |
+
*/
|
12 |
+
|
13 |
+
namespace WSAL\Helpers;
|
14 |
+
|
15 |
+
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
|
16 |
+
|
17 |
+
/**
|
18 |
+
* WP helper class
|
19 |
+
*/
|
20 |
+
if ( ! class_exists( '\WSAL\Helpers\WP_Helper' ) ) {
|
21 |
+
|
22 |
+
/**
|
23 |
+
* All the WP functionality must go trough this class
|
24 |
+
*
|
25 |
+
* @since 4.4.2
|
26 |
+
*/
|
27 |
+
class WP_Helper {
|
28 |
+
|
29 |
+
const SETTINGS_PREFIX = 'wsal_';
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Hold the user roles as array - Human readable is used for key of the array, and the internal role name is the value.
|
33 |
+
*
|
34 |
+
* @var array
|
35 |
+
*
|
36 |
+
* @since 4.4.2
|
37 |
+
*/
|
38 |
+
private static $user_roles = array();
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Hold the user roles as array - Internal role name is used for key of the array, and the human readable format is the value.
|
42 |
+
*
|
43 |
+
* @var array
|
44 |
+
*
|
45 |
+
* @since 4.4.2
|
46 |
+
*/
|
47 |
+
private static $user_roles_wp = array();
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Keeps the value of the multisite install of the WP
|
51 |
+
*
|
52 |
+
* @var bool
|
53 |
+
*
|
54 |
+
* @since 4.4.2
|
55 |
+
*/
|
56 |
+
private static $is_multisite = null;
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Holds array with all the sites in multisite WP installation
|
60 |
+
*
|
61 |
+
* @var array
|
62 |
+
*/
|
63 |
+
private static $sites = array();
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Checks if specific role exists
|
67 |
+
*
|
68 |
+
* @param string $role - The name of the role to check.
|
69 |
+
*
|
70 |
+
* @return boolean
|
71 |
+
*
|
72 |
+
* @since 4.4.2
|
73 |
+
*/
|
74 |
+
public static function is_role_exists( string $role ): bool {
|
75 |
+
self::set_roles();
|
76 |
+
|
77 |
+
if ( in_array( $role, self::$user_roles, true ) ) {
|
78 |
+
return true;
|
79 |
+
}
|
80 |
+
|
81 |
+
return false;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Returns the currently available WP roles - the Human readable format is the key
|
86 |
+
*
|
87 |
+
* @return array
|
88 |
+
*
|
89 |
+
* @since 4.4.2
|
90 |
+
*/
|
91 |
+
public static function get_roles() {
|
92 |
+
self::set_roles();
|
93 |
+
|
94 |
+
return self::$user_roles;
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Returns the currently available WP roles
|
99 |
+
*
|
100 |
+
* @return array
|
101 |
+
*
|
102 |
+
* @since 4.4.2
|
103 |
+
*/
|
104 |
+
public static function get_roles_wp() {
|
105 |
+
if ( empty( self::$user_roles_wp ) ) {
|
106 |
+
self::set_roles();
|
107 |
+
self::$user_roles_wp = array_flip( self::$user_roles );
|
108 |
+
}
|
109 |
+
|
110 |
+
return self::$user_roles_wp;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Check is this is a multisite setup.
|
115 |
+
*
|
116 |
+
* @return boolean
|
117 |
+
*
|
118 |
+
* @since 4.4.2
|
119 |
+
*/
|
120 |
+
public static function is_multisite() {
|
121 |
+
if ( null === self::$is_multisite ) {
|
122 |
+
self::$is_multisite = function_exists( 'is_multisite' ) && is_multisite();
|
123 |
+
}
|
124 |
+
return self::$is_multisite;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Returns an option by given name
|
129 |
+
*
|
130 |
+
* @param string $setting_name - The name of the option.
|
131 |
+
* @param mixed $default_value - The default value if there is no one stored.
|
132 |
+
*
|
133 |
+
* @return mixed
|
134 |
+
*
|
135 |
+
* @since 4.4.2
|
136 |
+
*/
|
137 |
+
public static function get_option( $setting_name, $default_value = false ) {
|
138 |
+
$prefixed_name = self::prefix_name( $setting_name );
|
139 |
+
return \get_option( $prefixed_name, $default_value );
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Just an alias for update_option
|
144 |
+
*
|
145 |
+
* @param string $setting_name - The name of the option.
|
146 |
+
* @param mixed $new_value - The value to be stored.
|
147 |
+
* @param boolean $autoload - Should that option be autoloaded or not? No effect on network wide options.
|
148 |
+
*
|
149 |
+
* @return mixed
|
150 |
+
*
|
151 |
+
* @since 4.4.2
|
152 |
+
*/
|
153 |
+
public static function set_option( $setting_name, $new_value, $autoload = false ) {
|
154 |
+
return self::update_option( $setting_name, $new_value, $autoload );
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Updates an option by a given name with a given value
|
159 |
+
*
|
160 |
+
* @param string $setting_name - The name of the setting to update.
|
161 |
+
* @param mixed $new_value - The value to be stored.
|
162 |
+
* @param boolean $autoload - Should that option be autoloaded or not? No effect on network wide options.
|
163 |
+
*
|
164 |
+
* @return mixed
|
165 |
+
*
|
166 |
+
* @since 4.4.2
|
167 |
+
*/
|
168 |
+
public static function update_option( $setting_name, $new_value, $autoload = false ) {
|
169 |
+
$prefixed_name = self::prefix_name( $setting_name );
|
170 |
+
return \update_option( $prefixed_name, $new_value, $autoload );
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Deletes an option by a given name form the global settings
|
175 |
+
*
|
176 |
+
* @param string $setting_name - The name of the option to delete.
|
177 |
+
*
|
178 |
+
* @return mixed
|
179 |
+
*
|
180 |
+
* @since 4.4.2
|
181 |
+
*/
|
182 |
+
public static function delete_option( $setting_name ) {
|
183 |
+
$prefixed_name = self::prefix_name( $setting_name );
|
184 |
+
return \delete_option( $prefixed_name );
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* Deletes a plugin option from the WP options table.
|
189 |
+
*
|
190 |
+
* Handled option name with and without the prefix for backwards compatibility.
|
191 |
+
*
|
192 |
+
* @since 4.0.2
|
193 |
+
* @param string $option_name Name of the option to delete.
|
194 |
+
* @return bool
|
195 |
+
*/
|
196 |
+
public static function delete_global_option( $option_name = '' ) {
|
197 |
+
$prefixed_name = self::prefix_name( $option_name );
|
198 |
+
|
199 |
+
if ( self::is_multisite() ) {
|
200 |
+
\switch_to_blog( \get_main_network_id() );
|
201 |
+
}
|
202 |
+
|
203 |
+
$result = \delete_option( $prefixed_name );
|
204 |
+
|
205 |
+
if ( is_multisite() ) {
|
206 |
+
\restore_current_blog();
|
207 |
+
}
|
208 |
+
|
209 |
+
return $result;
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Just an alias for update_global_option
|
214 |
+
*
|
215 |
+
* @param string $setting_name - The name of the option.
|
216 |
+
* @param mixed $new_value - The value to be stored.
|
217 |
+
* @param boolean $autoload - Should that option be autoloaded or not? No effect on network wide options.
|
218 |
+
*
|
219 |
+
* @return mixed
|
220 |
+
*
|
221 |
+
* @since 4.4.2
|
222 |
+
*/
|
223 |
+
public static function set_global_option( $setting_name, $new_value, $autoload = false ) {
|
224 |
+
return self::update_global_option( $setting_name, $new_value, $autoload );
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* Internal function used to set the value of an option. Any necessary prefixes are already contained in the option
|
229 |
+
* name.
|
230 |
+
*
|
231 |
+
* @param string $option_name Option name we want to save a value for including necessary plugin prefix.
|
232 |
+
* @param mixed $value A value to store under the option name.
|
233 |
+
* @param bool $autoload Whether to autoload this option.
|
234 |
+
*
|
235 |
+
* @return bool Whether the option was updated.
|
236 |
+
* @since 4.1.3
|
237 |
+
*/
|
238 |
+
public static function update_global_option( $option_name = '', $value = null, $autoload = false ) {
|
239 |
+
// bail early if no option name or value was passed.
|
240 |
+
if ( empty( $option_name ) || null === $value ) {
|
241 |
+
return;
|
242 |
+
}
|
243 |
+
|
244 |
+
$prefixed_name = self::prefix_name( $option_name );
|
245 |
+
|
246 |
+
if ( is_multisite() ) {
|
247 |
+
\switch_to_blog( \get_main_network_id() );
|
248 |
+
}
|
249 |
+
|
250 |
+
$result = \update_option( $prefixed_name, $value, $autoload );
|
251 |
+
|
252 |
+
if ( \is_multisite() ) {
|
253 |
+
\restore_current_blog();
|
254 |
+
}
|
255 |
+
|
256 |
+
return $result;
|
257 |
+
}
|
258 |
+
|
259 |
+
/**
|
260 |
+
* Internal function used to get the value of an option. Any necessary prefixes are already contained in the option
|
261 |
+
* name.
|
262 |
+
*
|
263 |
+
* @param string $option_name Option name we want to get a value for including necessary plugin prefix.
|
264 |
+
* @param mixed $default a default value to use when one doesn't exist.
|
265 |
+
*
|
266 |
+
* @return mixed
|
267 |
+
* @since 4.1.3
|
268 |
+
*/
|
269 |
+
public static function get_global_option( $option_name = '', $default = null ) {
|
270 |
+
// bail early if no option name was requested.
|
271 |
+
if ( empty( $option_name ) || ! is_string( $option_name ) ) {
|
272 |
+
return;
|
273 |
+
}
|
274 |
+
|
275 |
+
if ( is_multisite() ) {
|
276 |
+
switch_to_blog( get_main_network_id() );
|
277 |
+
}
|
278 |
+
|
279 |
+
$prefixed_name = self::prefix_name( $option_name );
|
280 |
+
|
281 |
+
$result = \get_option( $prefixed_name, $default );
|
282 |
+
|
283 |
+
if ( is_multisite() ) {
|
284 |
+
restore_current_blog();
|
285 |
+
}
|
286 |
+
|
287 |
+
return maybe_unserialize( $result );
|
288 |
+
}
|
289 |
+
|
290 |
+
|
291 |
+
/**
|
292 |
+
* Removes event from the cron by given name
|
293 |
+
*
|
294 |
+
* @param string $event_name -The name of the event.
|
295 |
+
*
|
296 |
+
* @return void
|
297 |
+
*
|
298 |
+
* @since 4.4.2
|
299 |
+
*/
|
300 |
+
public static function un_schedule_event( string $event_name ) {
|
301 |
+
$schedule_time = wp_next_scheduled( $event_name );
|
302 |
+
if ( $schedule_time ) {
|
303 |
+
wp_unschedule_event( $schedule_time, $event_name, array() );
|
304 |
+
}
|
305 |
+
}
|
306 |
+
|
307 |
+
/**
|
308 |
+
* Collects all the sites from multisite WP installation
|
309 |
+
*
|
310 |
+
* @return array
|
311 |
+
*/
|
312 |
+
public static function get_multi_sites(): array {
|
313 |
+
if ( self::is_multisite() ) {
|
314 |
+
if ( empty( self::$sites ) ) {
|
315 |
+
|
316 |
+
self::$sites = \get_sites();
|
317 |
+
}
|
318 |
+
|
319 |
+
return self::$sites;
|
320 |
+
}
|
321 |
+
|
322 |
+
return array();
|
323 |
+
}
|
324 |
+
|
325 |
+
/**
|
326 |
+
* Deletes a transient. If this is a multisite, the network transient is deleted.
|
327 |
+
*
|
328 |
+
* @param string $transient Transient name. Expected to not be SQL-escaped.
|
329 |
+
*
|
330 |
+
* @return bool True if the transient was deleted, false otherwise.
|
331 |
+
*
|
332 |
+
* @since 4.4.2
|
333 |
+
*/
|
334 |
+
public static function delete_transient( $transient ) {
|
335 |
+
return self::is_multisite() ? delete_site_transient( $transient ) : delete_transient( $transient );
|
336 |
+
}
|
337 |
+
|
338 |
+
/**
|
339 |
+
* Check wsal options from wp_options table and determines if plugin is installed.
|
340 |
+
*/
|
341 |
+
public static function is_plugin_installed(): bool {
|
342 |
+
global $wpdb;
|
343 |
+
$plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%wsal_%'" ); // phpcs:ignore
|
344 |
+
|
345 |
+
if ( ! empty( $plugin_options ) ) {
|
346 |
+
return true;
|
347 |
+
}
|
348 |
+
|
349 |
+
return false;
|
350 |
+
}
|
351 |
+
|
352 |
+
/**
|
353 |
+
* Gets all active plugins in current WordPress installation.
|
354 |
+
*
|
355 |
+
* @return array
|
356 |
+
*
|
357 |
+
* @since 4.4.2
|
358 |
+
*/
|
359 |
+
public static function get_active_plugins(): array {
|
360 |
+
$active_plugins = array();
|
361 |
+
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
|
362 |
+
$active_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) );
|
363 |
+
} else {
|
364 |
+
$active_plugins = get_option( 'active_plugins' );
|
365 |
+
}
|
366 |
+
|
367 |
+
return $active_plugins;
|
368 |
+
}
|
369 |
+
|
370 |
+
/**
|
371 |
+
* Sets the internal variable with all the existing WP roles
|
372 |
+
*
|
373 |
+
* @return void
|
374 |
+
*
|
375 |
+
* @since 4.4.2
|
376 |
+
*/
|
377 |
+
private static function set_roles() {
|
378 |
+
if ( empty( self::$user_roles ) ) {
|
379 |
+
global $wp_roles;
|
380 |
+
|
381 |
+
if ( null === $wp_roles ) {
|
382 |
+
wp_roles();
|
383 |
+
}
|
384 |
+
|
385 |
+
self::$user_roles = array_flip( $wp_roles->get_names() );
|
386 |
+
}
|
387 |
+
}
|
388 |
+
|
389 |
+
/**
|
390 |
+
* Adds settings name prefix if it needs to be added.
|
391 |
+
*
|
392 |
+
* @param string $name - The name of the setting.
|
393 |
+
*
|
394 |
+
* @return string
|
395 |
+
*
|
396 |
+
* @since 4.4.2
|
397 |
+
*/
|
398 |
+
private static function prefix_name( string $name ): string {
|
399 |
+
|
400 |
+
if ( false === strpos( $name, self::SETTINGS_PREFIX ) ) {
|
401 |
+
|
402 |
+
$name = self::SETTINGS_PREFIX . $name;
|
403 |
+
}
|
404 |
+
|
405 |
+
return $name;
|
406 |
+
}
|
407 |
+
}
|
408 |
+
}
|
classes/Loggers/Database.php
CHANGED
@@ -9,11 +9,12 @@
|
|
9 |
* @subpackage loggers
|
10 |
*/
|
11 |
|
|
|
|
|
12 |
// Exit if accessed directly.
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
exit;
|
15 |
}
|
16 |
-
|
17 |
/**
|
18 |
* Loggers Class.
|
19 |
*
|
@@ -22,15 +23,15 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
22 |
* @package wsal
|
23 |
* @subpackage loggers
|
24 |
*/
|
25 |
-
class WSAL_Loggers_Database extends WSAL_AbstractLogger {
|
26 |
|
27 |
/**
|
28 |
* Method: Constructor.
|
29 |
*
|
30 |
-
* @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
|
31 |
* @since 1.0.0
|
32 |
*/
|
33 |
-
public function __construct( WpSecurityAuditLog $plugin ) {
|
34 |
parent::__construct( $plugin );
|
35 |
$plugin->add_cleanup_hook( array( $this, 'clean_up' ) );
|
36 |
}
|
@@ -42,7 +43,7 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
|
|
42 |
* @return boolean
|
43 |
*/
|
44 |
public function is_external() {
|
45 |
-
$db_config = WSAL_Connector_ConnectorFactory::get_config();
|
46 |
|
47 |
return is_array( $db_config ) && ! empty( $db_config );
|
48 |
}
|
@@ -64,7 +65,7 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
|
|
64 |
}
|
65 |
|
66 |
// Create new occurrence.
|
67 |
-
$occ = new WSAL_Models_Occurrence();
|
68 |
$occ->created_on = $this->get_correct_timestamp( $data, $date );
|
69 |
$occ->alert_id = $type;
|
70 |
$occ->site_id = ! is_null( $site_id ) ? $site_id : ( function_exists( 'get_current_blog_id' ) ? get_current_blog_id() : 0 );
|
@@ -73,7 +74,7 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
|
|
73 |
unset( $data['Timestamp'] );
|
74 |
|
75 |
// Get DB connector.
|
76 |
-
$db_config = WSAL_Connector_ConnectorFactory::get_config(); // Get DB connector configuration.
|
77 |
|
78 |
// Get connector for DB.
|
79 |
$connector = $this->plugin->get_connector( $db_config );
|
@@ -120,7 +121,7 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
|
|
120 |
}
|
121 |
|
122 |
|
123 |
-
$occ = new WSAL_Models_Occurrence();
|
124 |
$cnt_items = $occ->count();
|
125 |
|
126 |
// Check if there is something to delete.
|
@@ -131,7 +132,7 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
|
|
131 |
$max_stamp = $now - ( strtotime( $max_sdate ) - $now );
|
132 |
$max_items = (int) max( ( $cnt_items - $max_count ) + 1, 0 );
|
133 |
|
134 |
-
$query = new WSAL_Models_OccurrenceQuery();
|
135 |
$query->add_order_by( 'created_on', false );
|
136 |
// TO DO: Fixing data.
|
137 |
if ( $is_date_e ) {
|
9 |
* @subpackage loggers
|
10 |
*/
|
11 |
|
12 |
+
namespace WSAL\Loggers;
|
13 |
+
|
14 |
// Exit if accessed directly.
|
15 |
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
exit;
|
17 |
}
|
|
|
18 |
/**
|
19 |
* Loggers Class.
|
20 |
*
|
23 |
* @package wsal
|
24 |
* @subpackage loggers
|
25 |
*/
|
26 |
+
class WSAL_Loggers_Database extends \WSAL_AbstractLogger {
|
27 |
|
28 |
/**
|
29 |
* Method: Constructor.
|
30 |
*
|
31 |
+
* @param \WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
|
32 |
* @since 1.0.0
|
33 |
*/
|
34 |
+
public function __construct( \WpSecurityAuditLog $plugin ) {
|
35 |
parent::__construct( $plugin );
|
36 |
$plugin->add_cleanup_hook( array( $this, 'clean_up' ) );
|
37 |
}
|
43 |
* @return boolean
|
44 |
*/
|
45 |
public function is_external() {
|
46 |
+
$db_config = \WSAL_Connector_ConnectorFactory::get_config();
|
47 |
|
48 |
return is_array( $db_config ) && ! empty( $db_config );
|
49 |
}
|
65 |
}
|
66 |
|
67 |
// Create new occurrence.
|
68 |
+
$occ = new \WSAL_Models_Occurrence();
|
69 |
$occ->created_on = $this->get_correct_timestamp( $data, $date );
|
70 |
$occ->alert_id = $type;
|
71 |
$occ->site_id = ! is_null( $site_id ) ? $site_id : ( function_exists( 'get_current_blog_id' ) ? get_current_blog_id() : 0 );
|
74 |
unset( $data['Timestamp'] );
|
75 |
|
76 |
// Get DB connector.
|
77 |
+
$db_config = \WSAL_Connector_ConnectorFactory::get_config(); // Get DB connector configuration.
|
78 |
|
79 |
// Get connector for DB.
|
80 |
$connector = $this->plugin->get_connector( $db_config );
|
121 |
}
|
122 |
|
123 |
|
124 |
+
$occ = new \WSAL_Models_Occurrence();
|
125 |
$cnt_items = $occ->count();
|
126 |
|
127 |
// Check if there is something to delete.
|
132 |
$max_stamp = $now - ( strtotime( $max_sdate ) - $now );
|
133 |
$max_items = (int) max( ( $cnt_items - $max_count ) + 1, 0 );
|
134 |
|
135 |
+
$query = new \WSAL_Models_OccurrenceQuery();
|
136 |
$query->add_order_by( 'created_on', false );
|
137 |
// TO DO: Fixing data.
|
138 |
if ( $is_date_e ) {
|
classes/MainWpApi.php
CHANGED
@@ -12,6 +12,8 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
12 |
exit;
|
13 |
}
|
14 |
|
|
|
|
|
15 |
/**
|
16 |
* Handler for MainWP API endpoints.
|
17 |
*
|
@@ -232,11 +234,13 @@ class WSAL_MainWpApi {
|
|
232 |
|
233 |
// Change the existing settings.
|
234 |
if ( array_key_exists( 'pruning_enabled', $settings_to_enforce ) ) {
|
235 |
-
$
|
|
|
236 |
if ( array_key_exists( 'pruning_date', $settings_to_enforce ) && array_key_exists( 'pruning_unit', $settings_to_enforce ) ) {
|
237 |
-
$
|
238 |
-
$
|
239 |
}
|
|
|
240 |
}
|
241 |
|
242 |
if ( array_key_exists( 'disabled_events', $settings_to_enforce ) ) {
|
12 |
exit;
|
13 |
}
|
14 |
|
15 |
+
use WSAL\Adapter\WSAL_Adapters_MySQL_Occurrence;
|
16 |
+
use WSAL\Adapter\WSAL_Adapters_MySQL_Meta;
|
17 |
/**
|
18 |
* Handler for MainWP API endpoints.
|
19 |
*
|
234 |
|
235 |
// Change the existing settings.
|
236 |
if ( array_key_exists( 'pruning_enabled', $settings_to_enforce ) ) {
|
237 |
+
$pruning_date = '';
|
238 |
+
$pruning_unit = '';
|
239 |
if ( array_key_exists( 'pruning_date', $settings_to_enforce ) && array_key_exists( 'pruning_unit', $settings_to_enforce ) ) {
|
240 |
+
$pruning_date = $settings_to_enforce['pruning_date'] . ' ' . $settings_to_enforce['pruning_unit'];
|
241 |
+
$pruning_unit = $settings_to_enforce['pruning_unit'];
|
242 |
}
|
243 |
+
$this->plugin->settings()->set_pruning_date_settings( $settings_to_enforce['pruning_enabled'], $pruning_date, $pruning_unit );
|
244 |
}
|
245 |
|
246 |
if ( array_key_exists( 'disabled_events', $settings_to_enforce ) ) {
|
classes/Migration/class-abstract-migration.php
ADDED
@@ -0,0 +1,259 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Abstract migration class.
|
4 |
+
*
|
5 |
+
* @package wsal
|
6 |
+
* @subpackage utils
|
7 |
+
* @copyright 2022 WP White Security
|
8 |
+
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
9 |
+
* @link https://wordpress.org/plugins/wp-2fa/
|
10 |
+
*/
|
11 |
+
|
12 |
+
namespace WSAL\Utils;
|
13 |
+
|
14 |
+
use \WSAL\Helpers\WP_Helper;
|
15 |
+
|
16 |
+
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Abstract AMigration class
|
20 |
+
*/
|
21 |
+
if ( ! class_exists( '\WSAL\Utils\Abstract_Migration' ) ) {
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Utility class to ease the migration process.
|
25 |
+
*
|
26 |
+
* Every migration must go in its own method
|
27 |
+
* The naming convention is migrateUpTo_XXX where XXX is the number of the version,
|
28 |
+
* format is numbers only.
|
29 |
+
* Example: migration for version upto 1.4 must be in migrateUpTo_14 method
|
30 |
+
*
|
31 |
+
* The numbers in the names of the methods must have exact numbers count as in the selected
|
32 |
+
* version in use, even if there are silent numbers for some of the major versions as 1, 2, 3 etc. (the .0.0 is skipped / silent)
|
33 |
+
* Example:
|
34 |
+
* - if X.X.X is selected for version number, then for version 1.1 method must have "...migrateUpTo_110..." in its name
|
35 |
+
* - if X.X is selected for version number, then for version 1, method must have "...migrateUpTo_10..." in its name
|
36 |
+
*
|
37 |
+
* Note: you can add prefix to the migration method, if that is necessary, but "migrateUpTo_" is a must -
|
38 |
+
* the name must contain that @see getAllMigrationMethodsAsNumbers of that class.
|
39 |
+
* For version extraction the number following the last '_' will be used
|
40 |
+
* TODO: the mandatory part of the method name can be a setting in the class, but is that a good idea?
|
41 |
+
*
|
42 |
+
* Note: order of the methods is not preserved - version numbers will be used for ordering
|
43 |
+
*
|
44 |
+
* @package WP2FA\Utils
|
45 |
+
* @since 1.6
|
46 |
+
*/
|
47 |
+
class Abstract_Migration {
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Extracted version from the DB (WP option)
|
51 |
+
*
|
52 |
+
* @var string
|
53 |
+
*/
|
54 |
+
protected static $stored_version = '';
|
55 |
+
|
56 |
+
/**
|
57 |
+
* The name of the option from which we should extract version
|
58 |
+
* Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
|
59 |
+
* Note: only numbers will be processed
|
60 |
+
*
|
61 |
+
* @var string
|
62 |
+
*/
|
63 |
+
protected static $version_option_name = '';
|
64 |
+
|
65 |
+
/**
|
66 |
+
* The constant name where the plugin version is stored
|
67 |
+
* Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
|
68 |
+
* Note: only numbers will be processed
|
69 |
+
*
|
70 |
+
* @var string
|
71 |
+
*
|
72 |
+
* @since 4.4.2
|
73 |
+
*/
|
74 |
+
protected static $const_name_of_plugin_version = '';
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Used for adding proper pads for the missing numbers
|
78 |
+
* Version number format used here depends on selection for how many numbers will be used for representing version
|
79 |
+
*
|
80 |
+
* For X.X use 2;
|
81 |
+
* For X.X.X use 3;
|
82 |
+
* For X.X.X.X use 4;
|
83 |
+
*
|
84 |
+
* etc.
|
85 |
+
*
|
86 |
+
* Example: if selected version format is X.X.X that means that 3 digits are used for versioning.
|
87 |
+
* And current version is stored as 2 (no suffix 0.0) that means that it will be normalized as 200.
|
88 |
+
*
|
89 |
+
* @var integer
|
90 |
+
*/
|
91 |
+
protected static $pad_length = 4;
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Collects all the migration methods which needs to be executed in order and executes them
|
95 |
+
*
|
96 |
+
* @return void
|
97 |
+
*/
|
98 |
+
public static function migrate() {
|
99 |
+
|
100 |
+
if ( class_exists( '\WSAL\Migration\Metadata_Migration_440' ) && ! empty( WP_Helper::get_global_option( \WSAL\Migration\Metadata_Migration_440::OPTION_NAME_MIGRATION_INFO, array() ) ) ) {
|
101 |
+
|
102 |
+
new \WSAL\Migration\Metadata_Migration_440( 'external' );
|
103 |
+
new \WSAL\Migration\Metadata_Migration_440( 'archive' );
|
104 |
+
|
105 |
+
add_action( 'all_admin_notices', array( '\WSAL\Migration\Metadata_Migration_440', 'maybe_display_progress_admin_notice' ) );
|
106 |
+
}
|
107 |
+
|
108 |
+
// Check if that process is not started already.
|
109 |
+
$migration_started = WP_Helper::get_global_option( 'migration-started', false );
|
110 |
+
|
111 |
+
if ( version_compare( static::get_stored_version(), \constant( static::$const_name_of_plugin_version ), '<' ) ) {
|
112 |
+
|
113 |
+
$stored_version_as_number = static::normalize_version( static::get_stored_version() );
|
114 |
+
$target_version_as_number = static::normalize_version( \constant( static::$const_name_of_plugin_version ) );
|
115 |
+
|
116 |
+
if ( '0000' === $stored_version_as_number && ! WP_Helper::is_plugin_installed() ) {
|
117 |
+
// That is first install of the plugin, store the version and leave.
|
118 |
+
self::store_updated_version();
|
119 |
+
} else {
|
120 |
+
|
121 |
+
if ( false === $migration_started ) {
|
122 |
+
WP_Helper::set_global_option( 'migration-started', true );
|
123 |
+
try {
|
124 |
+
// set transient for the updating status - would that help ?!?
|
125 |
+
$method_as_version_numbers = static::get_all_migration_methods_as_numbers();
|
126 |
+
|
127 |
+
$migrate_methods = array_filter(
|
128 |
+
$method_as_version_numbers,
|
129 |
+
function( $method, $key ) use ( &$stored_version_as_number, &$target_version_as_number ) {
|
130 |
+
|
131 |
+
if ( ( ( (int) $target_version_as_number ) / 1000 ) > ( ( (int) $stored_version_as_number ) / 1000 ) ) {
|
132 |
+
return ( in_array( $key, range( $stored_version_as_number, $target_version_as_number ), true ) );
|
133 |
+
}
|
134 |
+
|
135 |
+
return false;
|
136 |
+
},
|
137 |
+
ARRAY_FILTER_USE_BOTH
|
138 |
+
);
|
139 |
+
|
140 |
+
if ( ! empty( $migrate_methods ) ) {
|
141 |
+
\ksort( $migrate_methods );
|
142 |
+
foreach ( $migrate_methods as $method ) {
|
143 |
+
static::{$method}();
|
144 |
+
}
|
145 |
+
}
|
146 |
+
|
147 |
+
self::store_updated_version();
|
148 |
+
} finally {
|
149 |
+
\WSAL\Helpers\WP_Helper::delete_global_option( 'migration-started' );
|
150 |
+
}
|
151 |
+
}
|
152 |
+
}
|
153 |
+
}
|
154 |
+
|
155 |
+
/**
|
156 |
+
* Downgrading the plugin? Set the version number.
|
157 |
+
* Leave the rest as is.
|
158 |
+
*
|
159 |
+
* @return void
|
160 |
+
*
|
161 |
+
* @since 4.4.2
|
162 |
+
*/
|
163 |
+
if ( false === $migration_started && version_compare( static::get_stored_version(), \constant( static::$const_name_of_plugin_version ), '>' ) ) {
|
164 |
+
self::store_updated_version();
|
165 |
+
}
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Removes redundant notices
|
170 |
+
*
|
171 |
+
* @param string $notice - Notice to be removed.
|
172 |
+
*
|
173 |
+
* @return void
|
174 |
+
*
|
175 |
+
* @since 4.4.2
|
176 |
+
*/
|
177 |
+
public static function remove_notice( string $notice ) {
|
178 |
+
|
179 |
+
global $wpdb;
|
180 |
+
$wpdb->query(
|
181 |
+
$wpdb->prepare(
|
182 |
+
"DELETE FROM {$wpdb->usermeta} WHERE meta_key = '%s';", // phpcs:ignore
|
183 |
+
$notice
|
184 |
+
)
|
185 |
+
);
|
186 |
+
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Extracts currently stored version from the DB
|
191 |
+
*
|
192 |
+
* @return string
|
193 |
+
*/
|
194 |
+
private static function get_stored_version() {
|
195 |
+
|
196 |
+
if ( '' === trim( static::$stored_version ) ) {
|
197 |
+
static::$stored_version = WP_Helper::get_option( static::$version_option_name, '0.0.0' );
|
198 |
+
}
|
199 |
+
|
200 |
+
return static::$stored_version;
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Stores the version to which we migrated
|
205 |
+
*
|
206 |
+
* @return void
|
207 |
+
*/
|
208 |
+
private static function store_updated_version() {
|
209 |
+
WP_Helper::update_global_option( static::$version_option_name, \constant( static::$const_name_of_plugin_version ) );
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Normalized the version numbers to numbers
|
214 |
+
*
|
215 |
+
* Version format is expected to be as follows:
|
216 |
+
* X.X.X
|
217 |
+
*
|
218 |
+
* All non numeric values will be removed from the version string
|
219 |
+
*
|
220 |
+
* Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
|
221 |
+
* Note: only numbers will be processed
|
222 |
+
*
|
223 |
+
* @param string $version - The version string we have to use.
|
224 |
+
*
|
225 |
+
* @return int
|
226 |
+
*/
|
227 |
+
private static function normalize_version( string $version ): string {
|
228 |
+
$version_as_number = (int) filter_var( $version, FILTER_SANITIZE_NUMBER_INT );
|
229 |
+
|
230 |
+
if ( self::$pad_length > strlen( $version_as_number ) ) {
|
231 |
+
$version_as_number = str_pad( $version_as_number, static::$pad_length, '0', STR_PAD_RIGHT );
|
232 |
+
}
|
233 |
+
|
234 |
+
return $version_as_number;
|
235 |
+
}
|
236 |
+
|
237 |
+
/**
|
238 |
+
* Collects all the migration methods from the class and stores them in the array
|
239 |
+
* Array is in following format:
|
240 |
+
* key - number of the version
|
241 |
+
* value - name of the method
|
242 |
+
*
|
243 |
+
* @return array
|
244 |
+
*/
|
245 |
+
private static function get_all_migration_methods_as_numbers() {
|
246 |
+
$class_methods = \get_class_methods( get_called_class() );
|
247 |
+
|
248 |
+
$method_as_version_numbers = array();
|
249 |
+
foreach ( $class_methods as $method ) {
|
250 |
+
if ( false !== \strpos( $method, 'migrate_up_to_' ) ) {
|
251 |
+
$ver = \substr( $method, \strrpos( $method, '_' ) + 1, \strlen( $method ) );
|
252 |
+
$method_as_version_numbers[ $ver ] = $method;
|
253 |
+
}
|
254 |
+
}
|
255 |
+
|
256 |
+
return $method_as_version_numbers;
|
257 |
+
}
|
258 |
+
}
|
259 |
+
}
|
classes/Migration/class-metadata-migration-440.php
ADDED
@@ -0,0 +1,231 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Metadata migration class.
|
4 |
+
*
|
5 |
+
* @package wsal
|
6 |
+
* @subpackage upgrade
|
7 |
+
* @since 4.4.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace WSAL\Migration;
|
11 |
+
|
12 |
+
// Exit if accessed directly.
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
use \WSAL_Vendor\WP_Background_Process;
|
18 |
+
use \WSAL\Helpers\WP_Helper;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Migration class
|
22 |
+
*/
|
23 |
+
if ( ! class_exists( '\WSAL\Migration\Metadata_Migration_440' ) ) {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Background process for handling the migration of selected metadata from the meta table to the occurrences table. This
|
27 |
+
* was part of database schema changes introduced in version 4.4.0.
|
28 |
+
*
|
29 |
+
* It handles metadata migration for 1 connection defined as part of the process information. This can be either "local"
|
30 |
+
* to work with the local WP database or a name of connection defined by the Integrations extension.
|
31 |
+
*
|
32 |
+
* @package wsal
|
33 |
+
* @subpackage upgrade
|
34 |
+
* @since 4.4.0
|
35 |
+
*/
|
36 |
+
class Metadata_Migration_440 extends WP_Background_Process {
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Name of the option holding the information about ongoing metadata migration.
|
40 |
+
*
|
41 |
+
* Note: the wsal_ prefix is automatically added by plugin's settings handling functions.
|
42 |
+
*
|
43 |
+
* @var string
|
44 |
+
*/
|
45 |
+
const OPTION_NAME_MIGRATION_INFO = 'meta_data_migration_info_440';
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Action
|
49 |
+
*
|
50 |
+
* @var string
|
51 |
+
*/
|
52 |
+
protected $action = 'wsal_meta_data_migration_440_';
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Default constructor - override the action variable accordingly.
|
56 |
+
*
|
57 |
+
* @param string $action - The name of the action.
|
58 |
+
*
|
59 |
+
* @since 4.4.2
|
60 |
+
*/
|
61 |
+
public function __construct( string $action ) {
|
62 |
+
$this->action .= $action;
|
63 |
+
|
64 |
+
parent::__construct();
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Displays an admin notice if a metadata migration is in progress.
|
69 |
+
*/
|
70 |
+
public static function maybe_display_progress_admin_notice() {
|
71 |
+
if ( ! is_user_logged_in() ) {
|
72 |
+
// Don't show to anonymous users (obviously).
|
73 |
+
return;
|
74 |
+
}
|
75 |
+
|
76 |
+
$existing_info = WP_Helper::get_global_option( self::OPTION_NAME_MIGRATION_INFO, array() );
|
77 |
+
if ( empty( $existing_info ) ) {
|
78 |
+
return;
|
79 |
+
}
|
80 |
+
|
81 |
+
$current_user = get_userdata( get_current_user_id() );
|
82 |
+
if ( false === $current_user ) {
|
83 |
+
// Bail if there is a problem retrieving the current user.
|
84 |
+
return;
|
85 |
+
}
|
86 |
+
|
87 |
+
$is_admin = in_array( 'administrator', $current_user->roles, true ) || ( function_exists( 'is_super_admin' ) && is_super_admin( $current_user->ID ) );
|
88 |
+
if ( ! $is_admin ) {
|
89 |
+
// Don't show to admin users.
|
90 |
+
return;
|
91 |
+
}
|
92 |
+
?>
|
93 |
+
<div class="notice notice-info">
|
94 |
+
<div class="notice-content-wrapper">
|
95 |
+
<p>
|
96 |
+
<strong><?php esc_html_e( 'Activity log database update in progress.', 'wp-security-audit-log' ); ?></strong>
|
97 |
+
<br />
|
98 |
+
<?php
|
99 |
+
echo \__( '<strong>UPGRADE notice: </strong> WP Activity Log is updating the database tables where the activity log is stored. The duration of this process varies depending on the size of the activity log. The upgrade is running in the background and won\'t affect your website. For more information please refer to this <a href="https://wpactivitylog.com/support/kb/upgrade-database-process-442/" target="_blank">knowledge base entry</a>.', 'wp-security-audit-log' );
|
100 |
+
?>
|
101 |
+
</p>
|
102 |
+
</div>
|
103 |
+
</div>
|
104 |
+
<?php
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* {@inheritDoc}
|
109 |
+
*
|
110 |
+
* @param array{start_time: int, processed_events_count: int, batch_size: int, connection: string} $item Migration process item.
|
111 |
+
*/
|
112 |
+
protected function task( $item ) {
|
113 |
+
// Migrate metadata for the next batch of events.
|
114 |
+
$items_migrated = $this->process_next_batch( $item['connection'], $item['batch_size'] );
|
115 |
+
if ( 0 === $items_migrated ) {
|
116 |
+
// All metadata has been migrated.
|
117 |
+
try {
|
118 |
+
// Delete the migration job info to indicate that the migration is done.
|
119 |
+
self::remove_migration_info( $item['connection'] );
|
120 |
+
|
121 |
+
} catch ( \Exception $exception ) {
|
122 |
+
$this->handle_error( $exception );
|
123 |
+
}
|
124 |
+
|
125 |
+
return false;
|
126 |
+
}
|
127 |
+
|
128 |
+
// Update and save the migration info.
|
129 |
+
$item['processed_events_count'] += $items_migrated;
|
130 |
+
self::store_migration_info( $item );
|
131 |
+
|
132 |
+
return $item;
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Processes next batch of events that need to be migrated.
|
137 |
+
*
|
138 |
+
* @param string $connection Connection name.
|
139 |
+
* @param int $batch_size Batch size.
|
140 |
+
*
|
141 |
+
* @return int
|
142 |
+
*/
|
143 |
+
private function process_next_batch( $connection, $batch_size ) {
|
144 |
+
$plugin = \WpSecurityAuditLog::get_instance();
|
145 |
+
if ( 'local' !== $connection && ! is_null( $plugin->external_db_util ) ) {
|
146 |
+
$connection = $plugin->external_db_util->get_connection( $connection );
|
147 |
+
if ( false === $connection ) {
|
148 |
+
return 0;
|
149 |
+
}
|
150 |
+
}
|
151 |
+
|
152 |
+
$connector = $plugin->get_connector( $connection, false );
|
153 |
+
/** WSAL_Adapters_MySQL_Occurrence $occurrence_adapter */
|
154 |
+
$occurrence_adapter = $connector->get_adapter( 'Occurrence' );
|
155 |
+
|
156 |
+
$occurrences_to_migrate = $occurrence_adapter->get_all_with_meta_to_migrate( $batch_size );
|
157 |
+
if ( ! empty( $occurrences_to_migrate ) ) {
|
158 |
+
$migrated_meta_keys = array_keys( \WSAL_Models_Occurrence::$migrated_meta );
|
159 |
+
$lowercase_migrated_meta_keys = array_map( 'strtolower', $migrated_meta_keys );
|
160 |
+
foreach ( $occurrences_to_migrate as $occurrence ) {
|
161 |
+
$all_metadata = $occurrence_adapter->get_multi_meta( $occurrence );
|
162 |
+
if ( ! empty( $all_metadata ) ) {
|
163 |
+
foreach ( $all_metadata as $meta_model ) {
|
164 |
+
$meta_key = $meta_model->name;
|
165 |
+
$lowercase_meta_key = strtolower( $meta_key );
|
166 |
+
|
167 |
+
// We use lowercase meta keys to make sure we handle even legacy meta keys correctly, for
|
168 |
+
// example "username" was changed to "Username" at some point.
|
169 |
+
if ( in_array( $lowercase_meta_key, $lowercase_migrated_meta_keys ) ) { // phpcs:ignore
|
170 |
+
// This will store the meta in the occ table if it belongs there.
|
171 |
+
$is_empty_string = is_string( $meta_model->value ) && 0 === strlen( $meta_model->value );
|
172 |
+
if ( ! $is_empty_string && in_array( $meta_key, $migrated_meta_keys, true ) ) {
|
173 |
+
// The meta is set in the occurrence object on if it is an exact match, otherwise we
|
174 |
+
// would end up writing and deleting the same meta key endlessly.
|
175 |
+
$occurrence->set_meta_value( $meta_key, $meta_model->value );
|
176 |
+
}
|
177 |
+
|
178 |
+
$meta_model->delete();
|
179 |
+
}
|
180 |
+
}
|
181 |
+
|
182 |
+
$occurrence->save();
|
183 |
+
}
|
184 |
+
}
|
185 |
+
}
|
186 |
+
|
187 |
+
return count( $occurrences_to_migrate );
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Removes migration info for a particular connection.
|
192 |
+
*
|
193 |
+
* @param string $connection_name Connection name.
|
194 |
+
*/
|
195 |
+
public static function remove_migration_info( $connection_name ) {
|
196 |
+
$existing_info = WP_Helper::get_global_option( self::OPTION_NAME_MIGRATION_INFO, array() );
|
197 |
+
|
198 |
+
if ( array_key_exists( $connection_name, $existing_info ) ) {
|
199 |
+
unset( $existing_info[ $connection_name ] );
|
200 |
+
}
|
201 |
+
|
202 |
+
if ( empty( $existing_info ) ) {
|
203 |
+
WP_Helper::delete_global_option( self::OPTION_NAME_MIGRATION_INFO );
|
204 |
+
} else {
|
205 |
+
WP_Helper::set_global_option( self::OPTION_NAME_MIGRATION_INFO, $existing_info );
|
206 |
+
}
|
207 |
+
}
|
208 |
+
|
209 |
+
/**
|
210 |
+
* Handles an error.
|
211 |
+
*
|
212 |
+
* @param Exception $exception Error to handle.
|
213 |
+
*/
|
214 |
+
private function handle_error( $exception ) {
|
215 |
+
// @todo handle migration error
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Stores or updates migration info for one particular connection.
|
220 |
+
*
|
221 |
+
* @param array{start_time: int, processed_events_count: int, batch_size: int, connection: string} $info Migration info data.
|
222 |
+
*/
|
223 |
+
public static function store_migration_info( $info ) {
|
224 |
+
$existing_info = WP_Helper::get_global_option( self::OPTION_NAME_MIGRATION_INFO, array() );
|
225 |
+
$connection_name = $info['connection'];
|
226 |
+
|
227 |
+
$existing_info[ $connection_name ] = $info;
|
228 |
+
WP_Helper::set_global_option( self::OPTION_NAME_MIGRATION_INFO, $existing_info );
|
229 |
+
}
|
230 |
+
}
|
231 |
+
}
|
classes/Migration/class-migration.php
ADDED
@@ -0,0 +1,496 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Abstract migration class.
|
4 |
+
*
|
5 |
+
* @package wsal
|
6 |
+
* @subpackage utils
|
7 |
+
* @copyright 2022 WP White Security
|
8 |
+
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
9 |
+
* @link https://wordpress.org/plugins/wp-2fa/
|
10 |
+
*/
|
11 |
+
|
12 |
+
namespace WSAL\Utils;
|
13 |
+
|
14 |
+
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
|
15 |
+
|
16 |
+
use \WSAL\Helpers\WP_Helper;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Migration class
|
20 |
+
*/
|
21 |
+
if ( ! class_exists( '\WSAL\Utils\Migration' ) ) {
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Put all you migration methods here
|
25 |
+
*
|
26 |
+
* @package WSAL\Utils
|
27 |
+
* @since 1.6
|
28 |
+
*/
|
29 |
+
class Migration extends Abstract_Migration {
|
30 |
+
|
31 |
+
/**
|
32 |
+
* The name of the option from which we should extract version
|
33 |
+
* Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
|
34 |
+
* Note: only numbers will be processed
|
35 |
+
*
|
36 |
+
* @var string
|
37 |
+
*
|
38 |
+
* @since 4.4.2
|
39 |
+
*/
|
40 |
+
protected static $version_option_name = WSAL_PREFIX . 'plugin_version';
|
41 |
+
|
42 |
+
/**
|
43 |
+
* The constant name where the plugin version is stored
|
44 |
+
* Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
|
45 |
+
* Note: only numbers will be processed
|
46 |
+
*
|
47 |
+
* @var string
|
48 |
+
*
|
49 |
+
* @since 4.4.2
|
50 |
+
*/
|
51 |
+
protected static $const_name_of_plugin_version = 'WSAL_VERSION';
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Migration for version upto 4.4.2
|
55 |
+
*
|
56 |
+
* Note: The migration methods need to be in line with the @see WSAL\Utils\Abstract_Migration::$pad_length
|
57 |
+
*
|
58 |
+
* @return void
|
59 |
+
*/
|
60 |
+
protected static function migrate_up_to_4420() {
|
61 |
+
// If the legacy table exists, lets extract the options and remove it.
|
62 |
+
if ( \WSAL\Entities\Options_Entity::check_table_exists( \WSAL\Entities\Options_Entity::get_table_name() ) ) {
|
63 |
+
\WSAL\Entities\Options_Entity::transfer_options();
|
64 |
+
\WSAL\Entities\Options_Entity::drop_table();
|
65 |
+
// That will reread the connection, as from the import above that might be changed to external.
|
66 |
+
\WSAL\Entities\Options_Entity::destroy_connection();
|
67 |
+
}
|
68 |
+
|
69 |
+
$disabled_alerts = WP_Helper::get_global_option( 'disabled-alerts', false );
|
70 |
+
|
71 |
+
$wsal = \WpSecurityAuditLog::get_instance();
|
72 |
+
|
73 |
+
$always_disabled_alerts = implode( ',', $wsal->settings()->always_disabled_alerts );
|
74 |
+
|
75 |
+
/**
|
76 |
+
* That is split only for clarity
|
77 |
+
*/
|
78 |
+
if ( false === $disabled_alerts ) {
|
79 |
+
WP_Helper::set_global_option( 'disabled-alerts', $always_disabled_alerts );
|
80 |
+
} elseif ( $disabled_alerts !== $always_disabled_alerts ) {
|
81 |
+
WP_Helper::update_global_option( 'disabled-alerts', $always_disabled_alerts );
|
82 |
+
}
|
83 |
+
|
84 |
+
self::remove_notice( 'wsal-notice-wsal-privacy-notice-3.2' );
|
85 |
+
|
86 |
+
WP_Helper::delete_transient( 'wsal-is-advert-dismissed' );
|
87 |
+
|
88 |
+
/**
|
89 |
+
* MainWP Child Stealth Mode Update
|
90 |
+
*
|
91 |
+
* This update only needs to run if the stealth mode option
|
92 |
+
* does not exist on free version.
|
93 |
+
*
|
94 |
+
* @since 3.2.3.3
|
95 |
+
*/
|
96 |
+
if ( ! $wsal->get_global_boolean_setting( 'mwp-child-stealth-mode', false ) ) {
|
97 |
+
$wsal->settings()->set_mainwp_child_stealth_mode();
|
98 |
+
}
|
99 |
+
|
100 |
+
WP_Helper::delete_global_option( WSAL_PREFIX . 'addon_available_notice_dismissed' );
|
101 |
+
|
102 |
+
// Removes old file scanning options.
|
103 |
+
global $wpdb;
|
104 |
+
$plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wsal_local_files_%'" ); // phpcs:ignore
|
105 |
+
if ( ! empty( $plugin_options ) ) {
|
106 |
+
foreach ( $plugin_options as $option ) {
|
107 |
+
WP_Helper::delete_global_option( $option->option_name );
|
108 |
+
}
|
109 |
+
}
|
110 |
+
|
111 |
+
// Remove 'system' entry from the front-end events array as it was removed along with 404 tracking.
|
112 |
+
$frontend_events = \WSAL_Settings::get_frontend_events();
|
113 |
+
if ( array_key_exists( 'system', $frontend_events ) ) {
|
114 |
+
unset( $frontend_events['system'] );
|
115 |
+
\WSAL_Settings::set_frontend_events( $frontend_events );
|
116 |
+
}
|
117 |
+
|
118 |
+
// Remove all settings related to 404 tracking.
|
119 |
+
$not_found_page_related_settings = array(
|
120 |
+
WSAL_PREFIX . 'log-404',
|
121 |
+
WSAL_PREFIX . 'purge-404-log',
|
122 |
+
WSAL_PREFIX . 'log-404-referrer',
|
123 |
+
WSAL_PREFIX . 'log-visitor-404',
|
124 |
+
WSAL_PREFIX . 'purge-visitor-404-log',
|
125 |
+
WSAL_PREFIX . 'log-visitor-404-referrer',
|
126 |
+
WSAL_PREFIX . 'excluded-urls',
|
127 |
+
);
|
128 |
+
foreach ( $not_found_page_related_settings as $setting_name ) {
|
129 |
+
WP_Helper::delete_global_option( $setting_name );
|
130 |
+
}
|
131 |
+
|
132 |
+
// Remove cron job for purging 404 logs.
|
133 |
+
WP_Helper::un_schedule_event( 'wsal_log_files_pruning' );
|
134 |
+
|
135 |
+
// Delete custom logging dir path from the settings.
|
136 |
+
WP_Helper::delete_global_option( 'custom-logging-dir' );
|
137 |
+
|
138 |
+
// Delete dev options from the settings.
|
139 |
+
WP_Helper::delete_global_option( 'dev-options' );
|
140 |
+
|
141 |
+
if ( class_exists( '\WSAL_Extension_Manager' ) ) {
|
142 |
+
\WSAL_Extension_Manager::include_extension( 'external-db' );
|
143 |
+
|
144 |
+
// Delete cron jobs related to mirror scheduling.
|
145 |
+
|
146 |
+
// This was previously a constant in WSAL_Ext_Plugin, but we removed it in version 4.3.
|
147 |
+
$scheduled_hook_mirroring = 'wsal_run_mirroring';
|
148 |
+
|
149 |
+
$mirrors = \WSAL_Ext_Common::get_config_options_for_group( 'mirror-' );
|
150 |
+
if ( ! empty( $mirrors ) ) {
|
151 |
+
foreach ( $mirrors as $mirror ) {
|
152 |
+
// Check if mirror details are valid.
|
153 |
+
if ( ! empty( $mirror ) ) {
|
154 |
+
$mirror_args = array( $mirror['name'] );
|
155 |
+
if ( wp_next_scheduled( $scheduled_hook_mirroring, $mirror_args ) ) {
|
156 |
+
wp_clear_scheduled_hook( $scheduled_hook_mirroring, $mirror_args );
|
157 |
+
}
|
158 |
+
}
|
159 |
+
}
|
160 |
+
}
|
161 |
+
|
162 |
+
if ( wp_next_scheduled( $scheduled_hook_mirroring ) ) {
|
163 |
+
wp_clear_scheduled_hook( $scheduled_hook_mirroring );
|
164 |
+
}
|
165 |
+
}
|
166 |
+
|
167 |
+
// Remove nonessential settings related to mysql adapters.
|
168 |
+
$mysql_related_settings = array(
|
169 |
+
WSAL_PREFIX . 'adapter-type',
|
170 |
+
WSAL_PREFIX . 'adapter-user',
|
171 |
+
WSAL_PREFIX . 'adapter-password',
|
172 |
+
WSAL_PREFIX . 'adapter-name',
|
173 |
+
WSAL_PREFIX . 'adapter-hostname',
|
174 |
+
WSAL_PREFIX . 'adapter-url-base-prefix',
|
175 |
+
WSAL_PREFIX . 'adapter-base-prefix',
|
176 |
+
WSAL_PREFIX . 'adapter-ssl',
|
177 |
+
WSAL_PREFIX . 'adapter-client-certificate',
|
178 |
+
WSAL_PREFIX . 'adapter-ssl-ca',
|
179 |
+
WSAL_PREFIX . 'adapter-ssl-cert',
|
180 |
+
WSAL_PREFIX . 'adapter-ssl-key',
|
181 |
+
WSAL_PREFIX . 'archive-type',
|
182 |
+
WSAL_PREFIX . 'archive-user',
|
183 |
+
WSAL_PREFIX . 'archive-password',
|
184 |
+
WSAL_PREFIX . 'archive-name',
|
185 |
+
WSAL_PREFIX . 'archive-hostname',
|
186 |
+
WSAL_PREFIX . 'archive-url-base-prefix',
|
187 |
+
WSAL_PREFIX . 'archive-base-prefix',
|
188 |
+
WSAL_PREFIX . 'archive-ssl',
|
189 |
+
WSAL_PREFIX . 'archive-client-certificate',
|
190 |
+
WSAL_PREFIX . 'archive-ssl-ca',
|
191 |
+
WSAL_PREFIX . 'archive-ssl-cert',
|
192 |
+
WSAL_PREFIX . 'archive-ssl-key',
|
193 |
+
);
|
194 |
+
|
195 |
+
foreach ( $mysql_related_settings as $setting_name ) {
|
196 |
+
WP_Helper::delete_global_option( $setting_name );
|
197 |
+
}
|
198 |
+
|
199 |
+
// Remove options related to the external db buffer.
|
200 |
+
WP_Helper::delete_global_option( 'adapter-use-buffer' );
|
201 |
+
WP_Helper::delete_global_option( 'temp_alerts' );
|
202 |
+
|
203 |
+
// Remove cron job for flushing the buffered events.
|
204 |
+
if ( wp_next_scheduled( 'wsal_log_events_ext_db' ) ) {
|
205 |
+
wp_clear_scheduled_hook( 'wsal_log_events_ext_db' );
|
206 |
+
}
|
207 |
+
|
208 |
+
// If AWS SDK is not available and an AWS CLoudWatch connection is present, let's create
|
209 |
+
// a notice to nudge the user.
|
210 |
+
if ( ! class_exists( '\Aws\CloudWatchLogs\CloudWatchLogsClient' ) && ( ! defined( 'WSAL_LOAD_AWS_SDK' ) || ! WSAL_LOAD_AWS_SDK ) ) {
|
211 |
+
|
212 |
+
if ( class_exists( '\WSAL_Ext_Mirrors_AWSCloudWatchConnection' ) ) {
|
213 |
+
|
214 |
+
if ( ! is_null( $wsal->external_db_util ) ) {
|
215 |
+
$connections = $wsal->external_db_util->get_all_connections();
|
216 |
+
if ( ! empty( $connections ) ) {
|
217 |
+
foreach ( $connections as $connection ) {
|
218 |
+
if ( \WSAL_Ext_Mirrors_AWSCloudWatchConnection::get_type() === $connection['type'] ) {
|
219 |
+
$wsal->set_global_boolean_setting( 'show-aws-sdk-config-nudge-4_3_2', true );
|
220 |
+
break;
|
221 |
+
}
|
222 |
+
}
|
223 |
+
}
|
224 |
+
}
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
// Remove options from autoloading.
|
229 |
+
$remove_from_autoload = array(
|
230 |
+
'wsal_adapter-connection',
|
231 |
+
'wsal_admin-bar-notif-updates',
|
232 |
+
'wsal_admin-blocking-plugins-support',
|
233 |
+
'wsal_bbpress_addon_available_notice_dismissed',
|
234 |
+
'wsal_connection-asd',
|
235 |
+
'wsal_connection-aws',
|
236 |
+
'wsal_connection-digital_ocean',
|
237 |
+
'wsal_connection-freemysqlhosting',
|
238 |
+
'wsal_connection-local_mysql_aaa',
|
239 |
+
'wsal_connection-local_mysql_eee',
|
240 |
+
'wsal_connection-local_mysql_xyz',
|
241 |
+
'wsal_connection-testik',
|
242 |
+
'wsal_custom-post-types',
|
243 |
+
'wsal_daily-summary-email',
|
244 |
+
'wsal_db_version',
|
245 |
+
'wsal_delete-data',
|
246 |
+
'wsal_disable-admin-bar-notif',
|
247 |
+
'wsal_disable-daily-summary',
|
248 |
+
'wsal_disable-widgets',
|
249 |
+
'wsal_disabled-alerts',
|
250 |
+
'wsal_dismissed-privacy-notice',
|
251 |
+
'wsal_display-name',
|
252 |
+
'wsal_events-nav-type',
|
253 |
+
'wsal_from-email',
|
254 |
+
'wsal_frontend-events',
|
255 |
+
'wsal_generated_reports',
|
256 |
+
'wsal_gravityforms_addon_available_notice_dismissed',
|
257 |
+
'wsal_hide-plugin',
|
258 |
+
'wsal_installed_plugin_addon_available',
|
259 |
+
'wsal_log-failed-login-limit',
|
260 |
+
'wsal_log-visitor-failed-login-limit',
|
261 |
+
'wsal_login_page_notification',
|
262 |
+
'wsal_login_page_notification_text',
|
263 |
+
'wsal_mirror-aws',
|
264 |
+
'wsal_mwp-child-stealth-mode',
|
265 |
+
'wsal_notification-35727674910782585943',
|
266 |
+
'wsal_notification-built-in-10',
|
267 |
+
'wsal_notification-built-in-37',
|
268 |
+
'wsal_notification-built-in-9',
|
269 |
+
'wsal_periodic-report-all',
|
270 |
+
'wsal_periodic-report-always-empty',
|
271 |
+
'wsal_periodic-report-bbb',
|
272 |
+
'wsal_periodic-reports-empty-emails-enabled',
|
273 |
+
'wsal_plugin-viewers',
|
274 |
+
'wsal_pruning-date',
|
275 |
+
'wsal_pruning-date-e',
|
276 |
+
'wsal_pruning-unit',
|
277 |
+
'wsal_reports-user-autocomplete',
|
278 |
+
'wsal_restrict-log-viewer',
|
279 |
+
'wsal_restrict-plugin-settings',
|
280 |
+
'wsal_setup-modal-dismissed',
|
281 |
+
'wsal_twilio-account-sid',
|
282 |
+
'wsal_twilio-auth-token',
|
283 |
+
'wsal_twilio-number',
|
284 |
+
'wsal_use-email',
|
285 |
+
'wsal_use-proxy-ip',
|
286 |
+
'wsal_version',
|
287 |
+
'wsal_woocommerce_addon_available_notice_dismissed',
|
288 |
+
'wsal_wp-seo_addon_available_notice_dismissed',
|
289 |
+
'wsal_wpforms_addon_available_notice_dismissed',
|
290 |
+
);
|
291 |
+
|
292 |
+
foreach ( $remove_from_autoload as $option ) {
|
293 |
+
$option_value = WP_Helper::get_global_option( $option, null );
|
294 |
+
|
295 |
+
if ( null !== $option_value ) {
|
296 |
+
WP_Helper::delete_global_option( $option );
|
297 |
+
WP_Helper::set_global_option( $option, $option_value, false );
|
298 |
+
}
|
299 |
+
}
|
300 |
+
|
301 |
+
// Set options to autoloading.
|
302 |
+
$add_to_autoload = array(
|
303 |
+
'wsal_adapter-connection',
|
304 |
+
'wsal_admin-bar-notif-updates',
|
305 |
+
'wsal_db_version',
|
306 |
+
'wsal_disable-admin-bar-notif',
|
307 |
+
'wsal_frontend-events',
|
308 |
+
'wsal_plugin-viewers',
|
309 |
+
'wsal_restrict-log-viewer',
|
310 |
+
'wsal_restrict-plugin-settings',
|
311 |
+
'wsal_setup-modal-dismissed',
|
312 |
+
'wsal_version',
|
313 |
+
);
|
314 |
+
|
315 |
+
foreach ( $add_to_autoload as $option ) {
|
316 |
+
$option_value = WP_Helper::get_global_option( $option, null );
|
317 |
+
if ( null !== $option_value ) {
|
318 |
+
WP_Helper::delete_global_option( $option );
|
319 |
+
WP_Helper::set_global_option( $option, $option_value, true );
|
320 |
+
}
|
321 |
+
}
|
322 |
+
|
323 |
+
// Change the name of the option storing excluded post meta fields.
|
324 |
+
$excluded_custom_fields = WP_Helper::get_global_option( 'excluded-custom', null );
|
325 |
+
if ( ! is_null( $excluded_custom_fields ) ) {
|
326 |
+
WP_Helper::set_global_option( 'excluded-post-meta', $excluded_custom_fields );
|
327 |
+
WP_Helper::delete_global_option( 'excluded-custom' );
|
328 |
+
}
|
329 |
+
|
330 |
+
$not_found_page_related_settings = array(
|
331 |
+
'wsal_scan-in-progress',
|
332 |
+
'wsal_last-scanned',
|
333 |
+
'wsal_is_initial_scan_0',
|
334 |
+
'wsal_is_initial_scan_1',
|
335 |
+
'wsal_is_initial_scan_2',
|
336 |
+
'wsal_is_initial_scan_3',
|
337 |
+
'wsal_is_initial_scan_4',
|
338 |
+
'wsal_is_initial_scan_5',
|
339 |
+
'wsal_is_initial_scan_6',
|
340 |
+
'wsal_last_scan_start',
|
341 |
+
'wsal_scanned_dirs',
|
342 |
+
);
|
343 |
+
foreach ( $not_found_page_related_settings as $setting_name ) {
|
344 |
+
WP_Helper::delete_global_option( $setting_name );
|
345 |
+
}
|
346 |
+
|
347 |
+
WP_Helper::delete_global_option( 'reports-user-autocomplete' );
|
348 |
+
|
349 |
+
// External DB settings.
|
350 |
+
if ( ! is_null( $wsal->external_db_util ) ) {
|
351 |
+
foreach ( array( 'archive-connection', 'adapter-connection' ) as $connection_option_name ) {
|
352 |
+
$connection_name = WP_Helper::get_global_option( $connection_option_name, null );
|
353 |
+
if ( ! is_null( $connection_name ) ) {
|
354 |
+
$db_connection = $wsal->external_db_util->get_connection( $connection_name );
|
355 |
+
if ( is_array( $db_connection ) && empty( $db_connection['hostname'] ) && empty( $db_connection['db_name'] ) ) {
|
356 |
+
if ( 'adapter-connection' === $connection_option_name ) {
|
357 |
+
$wsal->external_db_util->remove_external_storage_config();
|
358 |
+
} elseif ( 'archive-connection' === $connection_option_name ) {
|
359 |
+
$wsal->external_db_util->remove_archiving_config();
|
360 |
+
WP_Helper::delete_global_option( 'archiving-e' );
|
361 |
+
WP_Helper::delete_global_option( 'archiving-last-created' );
|
362 |
+
}
|
363 |
+
|
364 |
+
// Function WSAL_Ext_Common::delete_connection is not used on purpose because it would try to
|
365 |
+
// trigger an event which would result in error while doing this clean-up.
|
366 |
+
WP_Helper::delete_global_option( WSAL_CONN_PREFIX . $connection_name );
|
367 |
+
}
|
368 |
+
}
|
369 |
+
}
|
370 |
+
}
|
371 |
+
|
372 |
+
// Extension manager will be available only if the license is already active.
|
373 |
+
if ( class_exists( '\WSAL_Extension_Manager' ) ) {
|
374 |
+
if ( ! \WSAL_Extension_Manager::is_messaging_available() || ! \WSAL_Extension_Manager::is_mirroring_available() ) {
|
375 |
+
// Check if SMS notifications or any external mirrors are setup + force plugin to show a notice.
|
376 |
+
$mirrors_in_use = false;
|
377 |
+
if ( ! is_null( $wsal->external_db_util ) ) {
|
378 |
+
$mirrors = $wsal->external_db_util->get_all_mirrors();
|
379 |
+
$mirrors_in_use = ! empty( $mirrors );
|
380 |
+
}
|
381 |
+
|
382 |
+
$notifications_in_use = false;
|
383 |
+
if ( ! $mirrors_in_use && ! is_null( $wsal->notifications_util ) ) {
|
384 |
+
$notifications = $wsal->notifications_util->get_notifications();
|
385 |
+
if ( ! empty( $notifications ) ) {
|
386 |
+
foreach ( $notifications as $notification ) {
|
387 |
+
$item = maybe_unserialize( $notification->option_value );
|
388 |
+
if ( strlen( $item->phone ) > 0 ) {
|
389 |
+
$notifications_in_use = true;
|
390 |
+
break;
|
391 |
+
}
|
392 |
+
}
|
393 |
+
}
|
394 |
+
}
|
395 |
+
|
396 |
+
if ( $notifications_in_use || $mirrors_in_use ) {
|
397 |
+
$wsal->set_global_boolean_setting( 'show-helper-plugin-needed-nudge', true, false );
|
398 |
+
}
|
399 |
+
}
|
400 |
+
}
|
401 |
+
|
402 |
+
/**
|
403 |
+
* User session table should be always in the local database.
|
404 |
+
*
|
405 |
+
* Premium or not does not matter. User can had premium but in time of the upgrade, their license could be expired,
|
406 |
+
* that does not mean that they will never switch back to the premium version.
|
407 |
+
*/
|
408 |
+
$table_exists = \WSAL\Entities\Occurrences_Entity::check_table_exists( $wpdb->prefix . 'wsal_sessions' );
|
409 |
+
if ( $table_exists ) {
|
410 |
+
$column_exists = \WSAL\Entities\Occurrences_Entity::check_column(
|
411 |
+
$wpdb->prefix . 'wsal_sessions',
|
412 |
+
'session_token',
|
413 |
+
'varchar( 255 )'
|
414 |
+
);
|
415 |
+
|
416 |
+
if ( ! $column_exists ) {
|
417 |
+
$alter_query = 'ALTER TABLE `wp_wsal_sessions` CHANGE `session_token` `session_token` VARCHAR(128)
|
418 |
+
NOT NULL;';
|
419 |
+
|
420 |
+
$wpdb->query( $alter_query ); // phpcs:ignore
|
421 |
+
}
|
422 |
+
}
|
423 |
+
|
424 |
+
// If one of the new columns exists there is no need to alter the table.
|
425 |
+
$column_exists = \WSAL\Entities\Occurrences_Entity::check_column(
|
426 |
+
\WSAL\Entities\Occurrences_Entity::get_table_name(),
|
427 |
+
'client_ip',
|
428 |
+
'varchar( 255 )'
|
429 |
+
);
|
430 |
+
|
431 |
+
if ( ! $column_exists ) {
|
432 |
+
$upgrade_sql = \WSAL\Entities\Occurrences_Entity::get_upgrade_query();
|
433 |
+
\WSAL\Entities\Occurrences_Entity::get_connection()->query( $upgrade_sql );
|
434 |
+
|
435 |
+
$connection = WP_Helper::get_global_option( 'adapter-connection' );
|
436 |
+
if ( empty( $connection ) ) {
|
437 |
+
$connection = 'local';
|
438 |
+
}
|
439 |
+
|
440 |
+
// Create a background job to migrate the metadata.
|
441 |
+
$job_info = array(
|
442 |
+
'start_time' => current_time( 'timestamp' ), // phpcs:ignore
|
443 |
+
'processed_events_count' => 0,
|
444 |
+
'batch_size' => 50,
|
445 |
+
'connection' => $connection,
|
446 |
+
);
|
447 |
+
|
448 |
+
// Store the initial info to the db.
|
449 |
+
\WSAL\Migration\Metadata_Migration_440::store_migration_info( $job_info );
|
450 |
+
|
451 |
+
// Create and dispatch the background process itself.
|
452 |
+
$bg_process = new \WSAL\Migration\Metadata_Migration_440( 'external' );
|
453 |
+
$bg_process->push_to_queue( $job_info );
|
454 |
+
$bg_process->save();
|
455 |
+
$bg_process->dispatch();
|
456 |
+
}
|
457 |
+
// Archive is in use.
|
458 |
+
$connection = WP_Helper::get_global_option( 'archive-connection' );
|
459 |
+
if ( ! empty( $connection ) ) {
|
460 |
+
$connection_config = \WSAL_Connector_ConnectorFactory::load_connection_config( $connection );
|
461 |
+
|
462 |
+
\WSAL\Entities\Occurrences_Entity::set_connection(
|
463 |
+
( new \WSAL_Connector_MySQLDB( $connection_config ) )->get_connection()
|
464 |
+
);
|
465 |
+
|
466 |
+
// If one of the new columns exists there is no need to alter the table.
|
467 |
+
$column_exists = \WSAL\Entities\Occurrences_Entity::check_column(
|
468 |
+
\WSAL\Entities\Occurrences_Entity::get_table_name(),
|
469 |
+
'client_ip',
|
470 |
+
'varchar( 255 )'
|
471 |
+
);
|
472 |
+
if ( ! $column_exists ) {
|
473 |
+
$upgrade_sql = \WSAL\Entities\Occurrences_Entity::get_upgrade_query();
|
474 |
+
\WSAL\Entities\Occurrences_Entity::get_connection()->query( $upgrade_sql );
|
475 |
+
|
476 |
+
// Create a background job to migrate the metadata.
|
477 |
+
$job_info = array(
|
478 |
+
'start_time' => current_time( 'timestamp' ), // phpcs:ignore
|
479 |
+
'processed_events_count' => 0,
|
480 |
+
'batch_size' => 50,
|
481 |
+
'connection' => $connection,
|
482 |
+
);
|
483 |
+
|
484 |
+
// Store the initial info to the db.
|
485 |
+
\WSAL\Migration\Metadata_Migration_440::store_migration_info( $job_info );
|
486 |
+
|
487 |
+
// Create and dispatch the background process itself.
|
488 |
+
$bg_process = new \WSAL\Migration\Metadata_Migration_440( 'archive' );
|
489 |
+
$bg_process->push_to_queue( $job_info );
|
490 |
+
$bg_process->save();
|
491 |
+
$bg_process->dispatch();
|
492 |
+
}
|
493 |
+
}
|
494 |
+
}
|
495 |
+
}
|
496 |
+
}
|
classes/SensorManager.php
CHANGED
@@ -13,6 +13,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
13 |
exit;
|
14 |
}
|
15 |
|
|
|
16 |
/**
|
17 |
* Sensor Manager.
|
18 |
*
|
@@ -30,19 +31,28 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
30 |
protected $sensors = array();
|
31 |
|
32 |
/**
|
33 |
-
*
|
|
|
|
|
|
|
|
|
34 |
*/
|
35 |
public function __construct( WpSecurityAuditLog $plugin ) {
|
36 |
parent::__construct( $plugin );
|
37 |
|
38 |
// Check sensors before loading for optimization.
|
39 |
add_filter( 'wsal_before_sensor_load', array( $this, 'check_sensor_before_load' ), 10, 2 );
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
42 |
}
|
43 |
|
44 |
-
|
45 |
* Get an array of directories to loop through to add custom sensors.
|
|
|
|
|
46 |
*
|
47 |
* Passed through a filter so other plugins or code can add own custom
|
48 |
* sensor class files by adding the containing directory to this array.
|
@@ -65,7 +75,7 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
65 |
continue;
|
66 |
}
|
67 |
|
68 |
-
|
69 |
* @since 3.5.1 Allow loading classes where names match the
|
70 |
* filename 1:1. Prior to version 3.5.1 sensors were always
|
71 |
* assumed to be defined WITH `WSAL_Sensors_` prefix in the
|
@@ -79,22 +89,6 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
79 |
}
|
80 |
}
|
81 |
|
82 |
-
/**
|
83 |
-
* {@inheritDoc}
|
84 |
-
*/
|
85 |
-
public function hook_events() {
|
86 |
-
foreach ( $this->sensors as $sensor ) {
|
87 |
-
$sensor->hook_events();
|
88 |
-
}
|
89 |
-
}
|
90 |
-
|
91 |
-
/**
|
92 |
-
* Method: Get the sensors.
|
93 |
-
*/
|
94 |
-
public function get_sensors() {
|
95 |
-
return $this->sensors;
|
96 |
-
}
|
97 |
-
|
98 |
/**
|
99 |
* Add new sensor from file inside autoloader path.
|
100 |
*
|
@@ -126,6 +120,23 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
126 |
$this->add_instance( new $class( $this->plugin ) );
|
127 |
}
|
128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
/**
|
130 |
* Add newly created sensor to list.
|
131 |
*
|
@@ -144,7 +155,7 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
144 |
*/
|
145 |
public function check_sensor_before_load( $load_sensor, $filepath ) {
|
146 |
global $pagenow;
|
147 |
-
if ( !
|
148 |
$admin_page = $pagenow;
|
149 |
} else {
|
150 |
/**
|
@@ -197,7 +208,7 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
197 |
}
|
198 |
|
199 |
$default_public_sensors = array( 'Register', 'LogInOut' );
|
200 |
-
if (
|
201 |
// Multisite sign-up is happening on front-end.
|
202 |
array_push( $default_public_sensors, 'MultisiteSignUp' );
|
203 |
}
|
@@ -257,7 +268,7 @@ final class WSAL_SensorManager extends WSAL_AbstractSensor {
|
|
257 |
|
258 |
case 'Multisite':
|
259 |
// If site is not multisite then don't load it.
|
260 |
-
if ( !
|
261 |
$load_sensor = false;
|
262 |
}
|
263 |
break;
|
13 |
exit;
|
14 |
}
|
15 |
|
16 |
+
use \WSAL\Helpers\Classes_Helper;
|
17 |
/**
|
18 |
* Sensor Manager.
|
19 |
*
|
31 |
protected $sensors = array();
|
32 |
|
33 |
/**
|
34 |
+
* Extends the default constructor.
|
35 |
+
*
|
36 |
+
* @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
|
37 |
+
*
|
38 |
+
* @since 4.4.2
|
39 |
*/
|
40 |
public function __construct( WpSecurityAuditLog $plugin ) {
|
41 |
parent::__construct( $plugin );
|
42 |
|
43 |
// Check sensors before loading for optimization.
|
44 |
add_filter( 'wsal_before_sensor_load', array( $this, 'check_sensor_before_load' ), 10, 2 );
|
45 |
+
|
46 |
+
$class_map = Classes_Helper::get_subclasses_of_class( __CLASS__, 'WSAL_AbstractSensor' );
|
47 |
+
|
48 |
+
foreach ( $class_map as $class_name ) {
|
49 |
+
$this->add_instance( new $class_name( $this->plugin ) );
|
50 |
}
|
51 |
|
52 |
+
/**
|
53 |
* Get an array of directories to loop through to add custom sensors.
|
54 |
+
*
|
55 |
+
* TODO: remove all that logic as it is wrongly written
|
56 |
*
|
57 |
* Passed through a filter so other plugins or code can add own custom
|
58 |
* sensor class files by adding the containing directory to this array.
|
75 |
continue;
|
76 |
}
|
77 |
|
78 |
+
/**
|
79 |
* @since 3.5.1 Allow loading classes where names match the
|
80 |
* filename 1:1. Prior to version 3.5.1 sensors were always
|
81 |
* assumed to be defined WITH `WSAL_Sensors_` prefix in the
|
89 |
}
|
90 |
}
|
91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
/**
|
93 |
* Add new sensor from file inside autoloader path.
|
94 |
*
|
120 |
$this->add_instance( new $class( $this->plugin ) );
|
121 |
}
|
122 |
|
123 |
+
|
124 |
+
/**
|
125 |
+
* {@inheritDoc}
|
126 |
+
*/
|
127 |
+
public function hook_events() {
|
128 |
+
foreach ( $this->sensors as $sensor ) {
|
129 |
+
$sensor->hook_events();
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Method: Get the sensors.
|
135 |
+
*/
|
136 |
+
public function get_sensors() {
|
137 |
+
return $this->sensors;
|
138 |
+
}
|
139 |
+
|
140 |
/**
|
141 |
* Add newly created sensor to list.
|
142 |
*
|
155 |
*/
|
156 |
public function check_sensor_before_load( $load_sensor, $filepath ) {
|
157 |
global $pagenow;
|
158 |
+
if ( ! WpSecurityAuditLog::is_multisite() ) {
|
159 |
$admin_page = $pagenow;
|
160 |
} else {
|
161 |
/**
|
208 |
}
|
209 |
|
210 |
$default_public_sensors = array( 'Register', 'LogInOut' );
|
211 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
212 |
// Multisite sign-up is happening on front-end.
|
213 |
array_push( $default_public_sensors, 'MultisiteSignUp' );
|
214 |
}
|
268 |
|
269 |
case 'Multisite':
|
270 |
// If site is not multisite then don't load it.
|
271 |
+
if ( ! WpSecurityAuditLog::is_multisite() ) {
|
272 |
$load_sensor = false;
|
273 |
}
|
274 |
break;
|
classes/Sensors/Content.php
CHANGED
@@ -26,6 +26,11 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
26 |
*/
|
27 |
class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
28 |
|
|
|
|
|
|
|
|
|
|
|
29 |
/**
|
30 |
* Old post.
|
31 |
*
|
@@ -82,6 +87,15 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
82 |
*/
|
83 |
protected $old_meta = null;
|
84 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
/**
|
86 |
* {@inheritDoc}
|
87 |
*/
|
@@ -104,6 +118,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
104 |
add_filter( 'wp_update_term_data', array( $this, 'event_update_term_data' ), 10, 4 );
|
105 |
add_filter( 'add_post_metadata', array( $this, 'check_added_meta' ), 10, 5 );
|
106 |
add_filter( 'delete_post_metadata', array( $this, 'check_deleted_meta' ), 10, 5 );
|
|
|
107 |
add_action( 'updated_post_meta', array( $this, 'check_changed_meta' ), 10, 4 );
|
108 |
|
109 |
// Check if MainWP Child Plugin exists.
|
@@ -112,6 +127,31 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
112 |
}
|
113 |
}
|
114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
/**
|
116 |
* Get Post Data.
|
117 |
*
|
@@ -149,11 +189,6 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
149 |
return;
|
150 |
}
|
151 |
|
152 |
-
// Ignore updates from ignored custom post types.
|
153 |
-
if ( in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true ) ) {
|
154 |
-
return;
|
155 |
-
}
|
156 |
-
|
157 |
// Ignorable states.
|
158 |
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
159 |
// Check post creation event.
|
@@ -282,31 +317,28 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
282 |
// Exclude CPTs from external plugins.
|
283 |
$post = get_post( $post_id );
|
284 |
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
return;
|
291 |
-
}
|
292 |
|
293 |
-
|
294 |
-
|
295 |
-
// Check if this was initiated by a plugin.
|
296 |
-
$request_params = WSAL_Utilities_RequestUtils::get_filtered_request_data();
|
297 |
-
if ( empty( $request_params['action'] ) && isset( $request_params['page'] ) ) {
|
298 |
-
$event = 5025;
|
299 |
-
$event_data = array(
|
300 |
-
'PostID' => $post->ID,
|
301 |
-
'PostType' => $post->post_type,
|
302 |
-
'PostTitle' => $post->post_title,
|
303 |
-
'PostStatus' => $post->post_status,
|
304 |
-
'Username' => 'Plugins',
|
305 |
-
);
|
306 |
-
}
|
307 |
|
308 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
309 |
}
|
|
|
|
|
310 |
}
|
311 |
|
312 |
/**
|
@@ -315,23 +347,21 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
315 |
* @param integer $post_id - Post ID.
|
316 |
*/
|
317 |
public function event_post_trashed( $post_id ) {
|
318 |
-
$post
|
319 |
-
|
320 |
-
$editor_link = $this->get_editor_link( $post );
|
321 |
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
}
|
335 |
}
|
336 |
|
337 |
/**
|
@@ -340,24 +370,22 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
340 |
* @param integer $post_id - Post ID.
|
341 |
*/
|
342 |
public function event_post_untrashed( $post_id ) {
|
343 |
-
$post
|
344 |
-
|
345 |
-
$editor_link = $this->get_editor_link( $post );
|
346 |
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
}
|
361 |
}
|
362 |
|
363 |
/**
|
@@ -368,23 +396,21 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
368 |
public function event_publish_future( $post_id ) {
|
369 |
$post = get_post( $post_id );
|
370 |
|
371 |
-
|
372 |
-
$editor_link = $this->get_editor_link( $post );
|
373 |
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
}
|
388 |
}
|
389 |
|
390 |
/**
|
@@ -450,11 +476,11 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
450 |
}
|
451 |
|
452 |
if ( ! empty( $post->post_title ) ) {
|
453 |
-
$edit_link =
|
454 |
$post_data = $this->get_post_event_data( $post ); // Get event post data.
|
455 |
|
456 |
// Update post URL based on current actual path.
|
457 |
-
if (
|
458 |
// For multisite using subfolders, remove the subfolder.
|
459 |
$subdir_path = parse_url( home_url(), PHP_URL_PATH ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url
|
460 |
$escaped = str_replace( '/', '\/', preg_quote( $subdir_path ) ); // phpcs:ignore WordPress.PHP.PregQuoteDelimiter.Missing
|
@@ -671,9 +697,9 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
671 |
* @param int $post_id Post ID.
|
672 |
* @param string $meta_key Meta key.
|
673 |
* @param mixed $meta_value Meta value.
|
674 |
-
* @param mixed $default_result Default result.
|
675 |
*
|
676 |
-
* @return
|
677 |
*
|
678 |
* @since 4.4.0
|
679 |
*/
|
@@ -755,7 +781,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
755 |
$old_tmpl = ( $this->old_tmpl && 'page' !== basename( $this->old_tmpl, '.php' ) ) ? ucwords( str_replace( array( '-', '_' ), ' ', basename( $this->old_tmpl, '.php' ) ) ) : __( 'Default template', 'wp-security-audit-log' );
|
756 |
$new_tmpl = ( $meta_value ) ? ucwords( str_replace( array( '-', '_' ), ' ', basename( $meta_value ) ) ) : __( 'Default', 'wp-security-audit-log' );
|
757 |
if ( $old_tmpl !== $new_tmpl ) {
|
758 |
-
$editor_link =
|
759 |
$this->plugin->alerts->trigger_event(
|
760 |
2048,
|
761 |
array(
|
@@ -772,6 +798,69 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
772 |
}
|
773 |
}
|
774 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
775 |
/**
|
776 |
* Check Post Featured Image Update.
|
777 |
*
|
@@ -798,7 +887,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
798 |
$new_image = is_array( $new_featured_image ) && array_key_exists( 'file', $new_featured_image ) ? $new_featured_image['file'] : __( 'No image', 'wp-security-audit-log' );
|
799 |
|
800 |
$post = get_post( $post_id );
|
801 |
-
$editor_link =
|
802 |
$this->plugin->alerts->trigger_event(
|
803 |
2130,
|
804 |
array(
|
@@ -923,7 +1012,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
923 |
break;
|
924 |
}
|
925 |
if ( $event ) {
|
926 |
-
$editor_link =
|
927 |
$event_data = $this->get_post_event_data( $new_post ); // Post event data.
|
928 |
|
929 |
// Set editor link in the event data.
|
@@ -961,17 +1050,18 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
961 |
/**
|
962 |
* Get editor link.
|
963 |
*
|
964 |
-
* @param
|
965 |
*
|
966 |
* @return array $editor_link - Name and value link.
|
967 |
*/
|
968 |
-
private function get_editor_link( $
|
969 |
$name = 'EditorLinkPost';
|
970 |
-
$value = get_edit_post_link( $
|
971 |
$editor_link = array(
|
972 |
'name' => $name,
|
973 |
'value' => $value,
|
974 |
);
|
|
|
975 |
return $editor_link;
|
976 |
}
|
977 |
|
@@ -1004,7 +1094,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1004 |
*/
|
1005 |
protected function check_author_change( $oldpost, $newpost ) {
|
1006 |
if ( $oldpost->post_author !== $newpost->post_author ) {
|
1007 |
-
$editor_link =
|
1008 |
$old_author = get_userdata( $oldpost->post_author );
|
1009 |
$old_author = ( is_object( $old_author ) ) ? $old_author->user_login : 'N/A';
|
1010 |
$new_author = get_userdata( $newpost->post_author );
|
@@ -1053,7 +1143,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1053 |
}
|
1054 |
|
1055 |
if ( $event ) {
|
1056 |
-
$editor_link =
|
1057 |
$event_data = $this->get_post_event_data( $newpost ); // Post event data.
|
1058 |
|
1059 |
// Set editor link in the event data.
|
@@ -1084,7 +1174,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1084 |
*/
|
1085 |
protected function check_parent_change( $oldpost, $newpost ) {
|
1086 |
if ( $oldpost->post_parent !== $newpost->post_parent && 'page' === $newpost->post_type ) {
|
1087 |
-
$editor_link =
|
1088 |
$this->plugin->alerts->trigger_event(
|
1089 |
2047,
|
1090 |
array(
|
@@ -1118,7 +1208,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1118 |
}
|
1119 |
|
1120 |
if ( $old_link !== $new_link ) {
|
1121 |
-
$editor_link =
|
1122 |
$this->plugin->alerts->trigger_event(
|
1123 |
2017,
|
1124 |
array(
|
@@ -1166,7 +1256,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1166 |
}
|
1167 |
|
1168 |
if ( $old_visibility && $new_visibility && ( $old_visibility !== $new_visibility ) ) {
|
1169 |
-
$editor_link =
|
1170 |
$this->plugin->alerts->trigger_event(
|
1171 |
2025,
|
1172 |
array(
|
@@ -1207,7 +1297,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1207 |
}
|
1208 |
|
1209 |
if ( $from !== $to ) {
|
1210 |
-
$editor_link =
|
1211 |
$this->plugin->alerts->trigger_event(
|
1212 |
2027,
|
1213 |
array(
|
@@ -1235,7 +1325,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1235 |
*/
|
1236 |
private function check_comments_pings( $oldpost, $newpost ) {
|
1237 |
$result = 0;
|
1238 |
-
$editor_link =
|
1239 |
|
1240 |
// Comments.
|
1241 |
if ( $oldpost->comment_status !== $newpost->comment_status ) {
|
@@ -1288,7 +1378,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1288 |
$new_cats = implode( ', ', (array) $new_cats );
|
1289 |
|
1290 |
if ( $old_cats !== $new_cats && 'page' !== $post->post_type ) {
|
1291 |
-
$editor_link =
|
1292 |
$alert_data = array(
|
1293 |
'PostID' => $post->ID,
|
1294 |
'PostType' => $post->post_type,
|
@@ -1314,7 +1404,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1314 |
* @since 4.1.5
|
1315 |
*/
|
1316 |
private function report_tags_change_event( $event_code, $post, $tags_changed ) {
|
1317 |
-
$editor_link =
|
1318 |
$post_status = ( 'publish' === $post->post_status ) ? 'published' : $post->post_status;
|
1319 |
$this->plugin->alerts->trigger_event(
|
1320 |
$event_code,
|
@@ -1373,9 +1463,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1373 |
* @return int|void
|
1374 |
*/
|
1375 |
public function check_modification_change( $post_id, $oldpost, $newpost, $modified ) {
|
1376 |
-
|
1377 |
-
return;
|
1378 |
-
}
|
1379 |
|
1380 |
$content_changed = $oldpost->post_content !== $newpost->post_content;
|
1381 |
|
@@ -1411,7 +1499,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1411 |
}
|
1412 |
|
1413 |
$event_data = $this->get_post_event_data( $oldpost );
|
1414 |
-
$editor_link =
|
1415 |
$event_data[ $editor_link['name'] ] = $editor_link['value'];
|
1416 |
$event_data['RevisionLink'] = $this->get_post_revision( $post_id, $oldpost );
|
1417 |
|
@@ -1457,7 +1545,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1457 |
$post_events = array_keys( $this->plugin->alerts->get_alerts_by_sub_category( 'Content' ) );
|
1458 |
|
1459 |
foreach ( $post_events as $event ) {
|
1460 |
-
if ( $manager->will_or_has_triggered( $event ) ||
|
1461 |
return false;
|
1462 |
}
|
1463 |
}
|
@@ -1473,7 +1561,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1473 |
*/
|
1474 |
private function check_title_change( $oldpost, $newpost ) {
|
1475 |
if ( $oldpost->post_title !== $newpost->post_title ) {
|
1476 |
-
$editor_link =
|
1477 |
$this->plugin->alerts->trigger_event(
|
1478 |
2086,
|
1479 |
array(
|
@@ -1532,7 +1620,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1532 |
return;
|
1533 |
}
|
1534 |
|
1535 |
-
$editor_link =
|
1536 |
$event_data = $this->get_post_event_data( $post ); // Event data.
|
1537 |
|
1538 |
$event_data[ $editor_link['name'] ] = $editor_link['value'];
|
@@ -1586,7 +1674,7 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1586 |
if ( ! empty( $post->post_title ) ) {
|
1587 |
$event = 2100;
|
1588 |
if ( ! $this->was_triggered( $event ) ) {
|
1589 |
-
$editor_link =
|
1590 |
$this->plugin->alerts->trigger_event(
|
1591 |
$event,
|
1592 |
array(
|
@@ -1679,41 +1767,10 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
|
1679 |
public function plugin_not_created_post( $manager ) {
|
1680 |
$triggered = $manager->will_or_has_triggered( 5019 );
|
1681 |
// inverting value here to account for the double NOT in _CommitItem().
|
1682 |
-
|
1683 |
-
|
1684 |
-
|
1685 |
-
/**
|
1686 |
-
* Check if the alert was triggered recently.
|
1687 |
-
*
|
1688 |
-
* Checks last 5 events if they occurred less than 20 seconds ago.
|
1689 |
-
*
|
1690 |
-
* @param integer|array $alert_id - Alert code.
|
1691 |
-
* @return boolean
|
1692 |
-
*/
|
1693 |
-
private function was_triggered_recently( $alert_id ) {
|
1694 |
-
// if we have already checked this don't check again.
|
1695 |
-
if ( isset( $this->cached_alert_checks ) && array_key_exists( $alert_id, $this->cached_alert_checks ) && $this->cached_alert_checks[ $alert_id ] ) {
|
1696 |
-
return true;
|
1697 |
}
|
1698 |
-
|
1699 |
-
$query->add_order_by( 'created_on', true );
|
1700 |
-
$query->set_limit( 5 );
|
1701 |
-
$last_occurrences = $query->get_adapter()->execute_query( $query );
|
1702 |
-
$known_to_trigger = false;
|
1703 |
-
foreach ( $last_occurrences as $last_occurrence ) {
|
1704 |
-
if ( $known_to_trigger ) {
|
1705 |
-
break;
|
1706 |
-
}
|
1707 |
-
if ( ! empty( $last_occurrence ) && ( $last_occurrence->created_on + 5 ) > time() ) {
|
1708 |
-
if ( ! is_array( $alert_id ) && $last_occurrence->alert_id === $alert_id ) {
|
1709 |
-
$known_to_trigger = true;
|
1710 |
-
} elseif ( is_array( $alert_id ) && in_array( $last_occurrence[0]->alert_id, $alert_id, true ) ) {
|
1711 |
-
$known_to_trigger = true;
|
1712 |
-
}
|
1713 |
-
}
|
1714 |
-
}
|
1715 |
-
// once we know the answer to this don't check again to avoid queries.
|
1716 |
-
$this->cached_alert_checks[ $alert_id ] = $known_to_trigger;
|
1717 |
-
return $known_to_trigger;
|
1718 |
}
|
1719 |
}
|
26 |
*/
|
27 |
class WSAL_Sensors_Content extends WSAL_AbstractSensor {
|
28 |
|
29 |
+
/**
|
30 |
+
* Holds the name of the meta used to setting the lock status of the post
|
31 |
+
*/
|
32 |
+
const LOCK_META_NAME = '_edit_lock';
|
33 |
+
|
34 |
/**
|
35 |
* Old post.
|
36 |
*
|
87 |
*/
|
88 |
protected $old_meta = null;
|
89 |
|
90 |
+
/**
|
91 |
+
* Holds the static plugin reference to the plugin
|
92 |
+
*
|
93 |
+
* @var WpSecurityAuditLog
|
94 |
+
*
|
95 |
+
* @since 4.4.2
|
96 |
+
*/
|
97 |
+
private static $wsal_plugin = null;
|
98 |
+
|
99 |
/**
|
100 |
* {@inheritDoc}
|
101 |
*/
|
118 |
add_filter( 'wp_update_term_data', array( $this, 'event_update_term_data' ), 10, 4 );
|
119 |
add_filter( 'add_post_metadata', array( $this, 'check_added_meta' ), 10, 5 );
|
120 |
add_filter( 'delete_post_metadata', array( $this, 'check_deleted_meta' ), 10, 5 );
|
121 |
+
add_action( 'update_post_meta', array( __CLASS__, 'before_changing_meta' ), 10, 4 );
|
122 |
add_action( 'updated_post_meta', array( $this, 'check_changed_meta' ), 10, 4 );
|
123 |
|
124 |
// Check if MainWP Child Plugin exists.
|
127 |
}
|
128 |
}
|
129 |
|
130 |
+
/**
|
131 |
+
* Extends the default constructor in order to be able to create static plugin property.
|
132 |
+
*
|
133 |
+
* @param WpSecurityAuditLog $plugin - The plugin instance.
|
134 |
+
*
|
135 |
+
* @since 4.4.2
|
136 |
+
*/
|
137 |
+
public function __construct( WpSecurityAuditLog $plugin ) {
|
138 |
+
parent::__construct( $plugin );
|
139 |
+
self::init( $plugin );
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Responsible for initiating the static parts of the class.
|
144 |
+
*
|
145 |
+
* @param WpSecurityAuditLog $plugin - The plugin instance.
|
146 |
+
*
|
147 |
+
* @return void
|
148 |
+
*
|
149 |
+
* @since 4.4.2
|
150 |
+
*/
|
151 |
+
public static function init( WpSecurityAuditLog $plugin ) {
|
152 |
+
self::$wsal_plugin = $plugin;
|
153 |
+
}
|
154 |
+
|
155 |
/**
|
156 |
* Get Post Data.
|
157 |
*
|
189 |
return;
|
190 |
}
|
191 |
|
|
|
|
|
|
|
|
|
|
|
192 |
// Ignorable states.
|
193 |
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
194 |
// Check post creation event.
|
317 |
// Exclude CPTs from external plugins.
|
318 |
$post = get_post( $post_id );
|
319 |
|
320 |
+
$event = 2008;
|
321 |
+
// Check WordPress backend operations.
|
322 |
+
if ( $this->check_auto_draft( $event, $post->post_title ) ) {
|
323 |
+
return;
|
324 |
+
}
|
|
|
|
|
325 |
|
326 |
+
$event_data = $this->get_post_event_data( $post ); // Get event data.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
327 |
|
328 |
+
// Check if this was initiated by a plugin.
|
329 |
+
$request_params = WSAL_Utilities_RequestUtils::get_filtered_request_data();
|
330 |
+
if ( empty( $request_params['action'] ) && isset( $request_params['page'] ) ) {
|
331 |
+
$event = 5025;
|
332 |
+
$event_data = array(
|
333 |
+
'PostID' => $post->ID,
|
334 |
+
'PostType' => $post->post_type,
|
335 |
+
'PostTitle' => $post->post_title,
|
336 |
+
'PostStatus' => $post->post_status,
|
337 |
+
'Username' => 'Plugins',
|
338 |
+
);
|
339 |
}
|
340 |
+
|
341 |
+
$this->plugin->alerts->trigger_event( $event, $event_data ); // Log event.
|
342 |
}
|
343 |
|
344 |
/**
|
347 |
* @param integer $post_id - Post ID.
|
348 |
*/
|
349 |
public function event_post_trashed( $post_id ) {
|
350 |
+
$post = get_post( $post_id );
|
351 |
+
$editor_link = self::get_editor_link( $post_id );
|
|
|
352 |
|
353 |
+
$this->plugin->alerts->trigger_event(
|
354 |
+
2012,
|
355 |
+
array(
|
356 |
+
'PostID' => $post->ID,
|
357 |
+
'PostType' => $post->post_type,
|
358 |
+
'PostTitle' => $post->post_title,
|
359 |
+
'PostStatus' => $post->post_status,
|
360 |
+
'PostDate' => $post->post_date,
|
361 |
+
'PostUrl' => get_permalink( $post->ID ),
|
362 |
+
$editor_link['name'] => $editor_link['value'],
|
363 |
+
)
|
364 |
+
);
|
|
|
365 |
}
|
366 |
|
367 |
/**
|
370 |
* @param integer $post_id - Post ID.
|
371 |
*/
|
372 |
public function event_post_untrashed( $post_id ) {
|
373 |
+
$post = get_post( $post_id );
|
374 |
+
$editor_link = self::get_editor_link( $post_id );
|
|
|
375 |
|
376 |
+
$this->plugin->alerts->trigger_event(
|
377 |
+
2014,
|
378 |
+
array(
|
379 |
+
'PostID' => $post->ID,
|
380 |
+
'PostType' => $post->post_type,
|
381 |
+
'PostTitle' => $post->post_title,
|
382 |
+
'PostStatus' => $post->post_status,
|
383 |
+
'PostDate' => $post->post_date,
|
384 |
+
'PostUrl' => get_permalink( $post->ID ),
|
385 |
+
$editor_link['name'] => $editor_link['value'],
|
386 |
+
)
|
387 |
+
);
|
388 |
+
remove_action( 'save_post', array( $this, 'post_changed' ), 10, 3 );
|
|
|
389 |
}
|
390 |
|
391 |
/**
|
396 |
public function event_publish_future( $post_id ) {
|
397 |
$post = get_post( $post_id );
|
398 |
|
399 |
+
$editor_link = self::get_editor_link( $post_id );
|
|
|
400 |
|
401 |
+
$this->plugin->alerts->trigger_event(
|
402 |
+
2001,
|
403 |
+
array(
|
404 |
+
'PostID' => $post->ID,
|
405 |
+
'PostType' => $post->post_type,
|
406 |
+
'PostTitle' => $post->post_title,
|
407 |
+
'PostStatus' => $post->post_status,
|
408 |
+
'PostDate' => $post->post_date,
|
409 |
+
'PostUrl' => get_permalink( $post->ID ),
|
410 |
+
$editor_link['name'] => $editor_link['value'],
|
411 |
+
)
|
412 |
+
);
|
413 |
+
remove_action( 'save_post', array( $this, 'post_changed' ), 10, 3 );
|
|
|
414 |
}
|
415 |
|
416 |
/**
|
476 |
}
|
477 |
|
478 |
if ( ! empty( $post->post_title ) ) {
|
479 |
+
$edit_link = self::get_editor_link( $post->ID ); // Get editor link.
|
480 |
$post_data = $this->get_post_event_data( $post ); // Get event post data.
|
481 |
|
482 |
// Update post URL based on current actual path.
|
483 |
+
if ( WpSecurityAuditLog::is_multisite() && ! is_subdomain_install() ) {
|
484 |
// For multisite using subfolders, remove the subfolder.
|
485 |
$subdir_path = parse_url( home_url(), PHP_URL_PATH ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url
|
486 |
$escaped = str_replace( '/', '\/', preg_quote( $subdir_path ) ); // phpcs:ignore WordPress.PHP.PregQuoteDelimiter.Missing
|
697 |
* @param int $post_id Post ID.
|
698 |
* @param string $meta_key Meta key.
|
699 |
* @param mixed $meta_value Meta value.
|
700 |
+
* @param mixed $default_result Default result. The name is misleading - it holds the meta ID value.
|
701 |
*
|
702 |
+
* @return int - The meta ID.
|
703 |
*
|
704 |
* @since 4.4.0
|
705 |
*/
|
781 |
$old_tmpl = ( $this->old_tmpl && 'page' !== basename( $this->old_tmpl, '.php' ) ) ? ucwords( str_replace( array( '-', '_' ), ' ', basename( $this->old_tmpl, '.php' ) ) ) : __( 'Default template', 'wp-security-audit-log' );
|
782 |
$new_tmpl = ( $meta_value ) ? ucwords( str_replace( array( '-', '_' ), ' ', basename( $meta_value ) ) ) : __( 'Default', 'wp-security-audit-log' );
|
783 |
if ( $old_tmpl !== $new_tmpl ) {
|
784 |
+
$editor_link = self::get_editor_link( $post_id );
|
785 |
$this->plugin->alerts->trigger_event(
|
786 |
2048,
|
787 |
array(
|
798 |
}
|
799 |
}
|
800 |
|
801 |
+
|
802 |
+
/**
|
803 |
+
* Fires immediately before updating a post's metadata.
|
804 |
+
*
|
805 |
+
* @since 4.4.2
|
806 |
+
*
|
807 |
+
* @param int $meta_id ID of metadata entry to update.
|
808 |
+
* @param int $object_id Post ID.
|
809 |
+
* @param string $meta_key Metadata key.
|
810 |
+
* @param mixed $meta_value Metadata value. This will be a PHP-serialized string representation of the value
|
811 |
+
* if the value is an array, an object, or itself a PHP-serialized string.
|
812 |
+
*/
|
813 |
+
public static function before_changing_meta( $meta_id, $object_id, $meta_key, $meta_value ) {
|
814 |
+
if ( self::LOCK_META_NAME === $meta_key ) {
|
815 |
+
self::fire_lock_change( $object_id, $meta_value );
|
816 |
+
}
|
817 |
+
}
|
818 |
+
|
819 |
+
/**
|
820 |
+
* Fires lock owner changing.
|
821 |
+
*
|
822 |
+
* @param integer $post_id - The ID of the post.
|
823 |
+
* @param string $meta_value - The meta value - that is in format "1649934679:2"
|
824 |
+
* where the "1649934679" is the timestamp of the locking
|
825 |
+
* and "2" is the ID of the \WP_User which currently editing the post.
|
826 |
+
*
|
827 |
+
* @return void
|
828 |
+
*
|
829 |
+
* @since 4.4.2
|
830 |
+
*/
|
831 |
+
public static function fire_lock_change( int $post_id, string $meta_value ) {
|
832 |
+
|
833 |
+
if ( $meta_value ) {
|
834 |
+
$user_id = \wp_check_post_lock( $post_id ); // The id of the user currently editing the post.
|
835 |
+
|
836 |
+
/**
|
837 |
+
* The post is currently edited by someone - proceed with extracting the new user editor
|
838 |
+
*/
|
839 |
+
if ( $user_id ) {
|
840 |
+
$lock = explode( ':', $meta_value );
|
841 |
+
$new_user_id = $lock[1];
|
842 |
+
|
843 |
+
if ( $new_user_id ) {
|
844 |
+
if ( $new_editor_user = get_userdata( $new_user_id ) ) { //phpcs:ignore
|
845 |
+
$post = get_post( $post_id );
|
846 |
+
$editor_link = self::get_editor_link( $post_id );
|
847 |
+
self::$wsal_plugin->alerts->trigger_event(
|
848 |
+
2133,
|
849 |
+
array(
|
850 |
+
'PostID' => $post->ID,
|
851 |
+
'PostType' => $post->post_type,
|
852 |
+
'PostTitle' => $post->post_title,
|
853 |
+
'PostStatus' => $post->post_status,
|
854 |
+
$editor_link['name'] => $editor_link['value'],
|
855 |
+
'user' => get_userdata( $user_id )->display_name,
|
856 |
+
)
|
857 |
+
);
|
858 |
+
}
|
859 |
+
}
|
860 |
+
}
|
861 |
+
}
|
862 |
+
}
|
863 |
+
|
864 |
/**
|
865 |
* Check Post Featured Image Update.
|
866 |
*
|
887 |
$new_image = is_array( $new_featured_image ) && array_key_exists( 'file', $new_featured_image ) ? $new_featured_image['file'] : __( 'No image', 'wp-security-audit-log' );
|
888 |
|
889 |
$post = get_post( $post_id );
|
890 |
+
$editor_link = self::get_editor_link( $post_id );
|
891 |
$this->plugin->alerts->trigger_event(
|
892 |
2130,
|
893 |
array(
|
1012 |
break;
|
1013 |
}
|
1014 |
if ( $event ) {
|
1015 |
+
$editor_link = self::get_editor_link( $new_post->ID ); // Editor link.
|
1016 |
$event_data = $this->get_post_event_data( $new_post ); // Post event data.
|
1017 |
|
1018 |
// Set editor link in the event data.
|
1050 |
/**
|
1051 |
* Get editor link.
|
1052 |
*
|
1053 |
+
* @param int $post_id - The \WP_Post post ID.
|
1054 |
*
|
1055 |
* @return array $editor_link - Name and value link.
|
1056 |
*/
|
1057 |
+
private static function get_editor_link( $post_id ): array {
|
1058 |
$name = 'EditorLinkPost';
|
1059 |
+
$value = get_edit_post_link( $post_id );
|
1060 |
$editor_link = array(
|
1061 |
'name' => $name,
|
1062 |
'value' => $value,
|
1063 |
);
|
1064 |
+
|
1065 |
return $editor_link;
|
1066 |
}
|
1067 |
|
1094 |
*/
|
1095 |
protected function check_author_change( $oldpost, $newpost ) {
|
1096 |
if ( $oldpost->post_author !== $newpost->post_author ) {
|
1097 |
+
$editor_link = self::get_editor_link( $oldpost->ID );
|
1098 |
$old_author = get_userdata( $oldpost->post_author );
|
1099 |
$old_author = ( is_object( $old_author ) ) ? $old_author->user_login : 'N/A';
|
1100 |
$new_author = get_userdata( $newpost->post_author );
|
1143 |
}
|
1144 |
|
1145 |
if ( $event ) {
|
1146 |
+
$editor_link = self::get_editor_link( $newpost->ID ); // Editor link.
|
1147 |
$event_data = $this->get_post_event_data( $newpost ); // Post event data.
|
1148 |
|
1149 |
// Set editor link in the event data.
|
1174 |
*/
|
1175 |
protected function check_parent_change( $oldpost, $newpost ) {
|
1176 |
if ( $oldpost->post_parent !== $newpost->post_parent && 'page' === $newpost->post_type ) {
|
1177 |
+
$editor_link = self::get_editor_link( $oldpost->ID );
|
1178 |
$this->plugin->alerts->trigger_event(
|
1179 |
2047,
|
1180 |
array(
|
1208 |
}
|
1209 |
|
1210 |
if ( $old_link !== $new_link ) {
|
1211 |
+
$editor_link = self::get_editor_link( $post->ID );
|
1212 |
$this->plugin->alerts->trigger_event(
|
1213 |
2017,
|
1214 |
array(
|
1256 |
}
|
1257 |
|
1258 |
if ( $old_visibility && $new_visibility && ( $old_visibility !== $new_visibility ) ) {
|
1259 |
+
$editor_link = self::get_editor_link( $oldpost->ID );
|
1260 |
$this->plugin->alerts->trigger_event(
|
1261 |
2025,
|
1262 |
array(
|
1297 |
}
|
1298 |
|
1299 |
if ( $from !== $to ) {
|
1300 |
+
$editor_link = self::get_editor_link( $oldpost->ID );
|
1301 |
$this->plugin->alerts->trigger_event(
|
1302 |
2027,
|
1303 |
array(
|
1325 |
*/
|
1326 |
private function check_comments_pings( $oldpost, $newpost ) {
|
1327 |
$result = 0;
|
1328 |
+
$editor_link = self::get_editor_link( $newpost->ID );
|
1329 |
|
1330 |
// Comments.
|
1331 |
if ( $oldpost->comment_status !== $newpost->comment_status ) {
|
1378 |
$new_cats = implode( ', ', (array) $new_cats );
|
1379 |
|
1380 |
if ( $old_cats !== $new_cats && 'page' !== $post->post_type ) {
|
1381 |
+
$editor_link = self::get_editor_link( $post->ID );
|
1382 |
$alert_data = array(
|
1383 |
'PostID' => $post->ID,
|
1384 |
'PostType' => $post->post_type,
|
1404 |
* @since 4.1.5
|
1405 |
*/
|
1406 |
private function report_tags_change_event( $event_code, $post, $tags_changed ) {
|
1407 |
+
$editor_link = self::get_editor_link( $post->ID );
|
1408 |
$post_status = ( 'publish' === $post->post_status ) ? 'published' : $post->post_status;
|
1409 |
$this->plugin->alerts->trigger_event(
|
1410 |
$event_code,
|
1463 |
* @return int|void
|
1464 |
*/
|
1465 |
public function check_modification_change( $post_id, $oldpost, $newpost, $modified ) {
|
1466 |
+
$this->check_title_change( $oldpost, $newpost );
|
|
|
|
|
1467 |
|
1468 |
$content_changed = $oldpost->post_content !== $newpost->post_content;
|
1469 |
|
1499 |
}
|
1500 |
|
1501 |
$event_data = $this->get_post_event_data( $oldpost );
|
1502 |
+
$editor_link = self::get_editor_link( $oldpost->ID );
|
1503 |
$event_data[ $editor_link['name'] ] = $editor_link['value'];
|
1504 |
$event_data['RevisionLink'] = $this->get_post_revision( $post_id, $oldpost );
|
1505 |
|
1545 |
$post_events = array_keys( $this->plugin->alerts->get_alerts_by_sub_category( 'Content' ) );
|
1546 |
|
1547 |
foreach ( $post_events as $event ) {
|
1548 |
+
if ( $manager->will_or_has_triggered( $event ) || self::was_triggered_recently( $event ) ) {
|
1549 |
return false;
|
1550 |
}
|
1551 |
}
|
1561 |
*/
|
1562 |
private function check_title_change( $oldpost, $newpost ) {
|
1563 |
if ( $oldpost->post_title !== $newpost->post_title ) {
|
1564 |
+
$editor_link = self::get_editor_link( $oldpost->ID );
|
1565 |
$this->plugin->alerts->trigger_event(
|
1566 |
2086,
|
1567 |
array(
|
1620 |
return;
|
1621 |
}
|
1622 |
|
1623 |
+
$editor_link = self::get_editor_link( $post_id ); // Editor link.
|
1624 |
$event_data = $this->get_post_event_data( $post ); // Event data.
|
1625 |
|
1626 |
$event_data[ $editor_link['name'] ] = $editor_link['value'];
|
1674 |
if ( ! empty( $post->post_title ) ) {
|
1675 |
$event = 2100;
|
1676 |
if ( ! $this->was_triggered( $event ) ) {
|
1677 |
+
$editor_link = self::get_editor_link( $post->ID );
|
1678 |
$this->plugin->alerts->trigger_event(
|
1679 |
$event,
|
1680 |
array(
|
1767 |
public function plugin_not_created_post( $manager ) {
|
1768 |
$triggered = $manager->will_or_has_triggered( 5019 );
|
1769 |
// inverting value here to account for the double NOT in _CommitItem().
|
1770 |
+
// Ensure no event for a WC coupon.
|
1771 |
+
if ( $manager->WillOrHasTriggered( 9063 ) ) {
|
1772 |
+
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1773 |
}
|
1774 |
+
return ! $triggered;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1775 |
}
|
1776 |
}
|
classes/Sensors/Database.php
CHANGED
@@ -407,13 +407,18 @@ class WSAL_Sensors_Database extends WSAL_AbstractSensor {
|
|
407 |
try {
|
408 |
global $wpdb;
|
409 |
|
|
|
|
|
410 |
// Output buffering is here to prevent from error log messages that would be fired if the table didn't exist.
|
411 |
ob_start();
|
412 |
$db_result = $wpdb->query( "SELECT COUNT(1) FROM {$table_name};" ); // phpcs:ignore
|
413 |
ob_clean();
|
414 |
|
|
|
|
|
415 |
return ( 1 === $db_result );
|
416 |
} catch ( Exception $e ) {
|
|
|
417 |
return false;
|
418 |
}
|
419 |
}
|
407 |
try {
|
408 |
global $wpdb;
|
409 |
|
410 |
+
$wpdb->suppress_errors( true );
|
411 |
+
|
412 |
// Output buffering is here to prevent from error log messages that would be fired if the table didn't exist.
|
413 |
ob_start();
|
414 |
$db_result = $wpdb->query( "SELECT COUNT(1) FROM {$table_name};" ); // phpcs:ignore
|
415 |
ob_clean();
|
416 |
|
417 |
+
$wpdb->suppress_errors( false );
|
418 |
+
|
419 |
return ( 1 === $db_result );
|
420 |
} catch ( Exception $e ) {
|
421 |
+
$wpdb->suppress_errors( false );
|
422 |
return false;
|
423 |
}
|
424 |
}
|
classes/Sensors/Files.php
CHANGED
@@ -78,6 +78,14 @@ class WSAL_Sensors_Files extends WSAL_AbstractSensor {
|
|
78 |
return;
|
79 |
}
|
80 |
$file = get_attached_file( $attachment_id );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
$this->plugin->alerts->trigger_event(
|
82 |
2011,
|
83 |
array(
|
78 |
return;
|
79 |
}
|
80 |
$file = get_attached_file( $attachment_id );
|
81 |
+
|
82 |
+
if ( false !== strpos( $file, 'wp-security-audit-log' ) ) {
|
83 |
+
/**
|
84 |
+
* This fires when our plugin is get updated - unfortunately that most probably makes calls to the old version of the plugin and that new plugin we have no idea what changes it could have, on the other hand that call is made from the old version / memory, so most probably there are code changes which could lead to PHP errors. Lets silence this if it comes to our plugin
|
85 |
+
*/
|
86 |
+
return;
|
87 |
+
}
|
88 |
+
|
89 |
$this->plugin->alerts->trigger_event(
|
90 |
2011,
|
91 |
array(
|
classes/Sensors/LogInOut.php
CHANGED
@@ -268,25 +268,25 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
|
|
268 |
/**
|
269 |
* Check failure limit.
|
270 |
*
|
271 |
-
* @param string $ip
|
272 |
* @param integer $site_id - Blog ID.
|
273 |
-
* @param WP_User $user
|
|
|
274 |
* @return boolean - Passed limit true|false.
|
275 |
*/
|
276 |
protected function is_past_login_failure_limit( $ip, $site_id, $user ) {
|
277 |
-
$get_fn = $this->is_multisite() ? 'get_site_transient' : 'get_transient';
|
278 |
if ( $user ) {
|
279 |
if ( -1 === (int) $this->get_login_failure_log_limit() ) {
|
280 |
return false;
|
281 |
} else {
|
282 |
-
$data_known =
|
283 |
return ( false !== $data_known ) && isset( $data_known[ $site_id . ':' . $user->ID . ':' . $ip ] ) && ( $data_known[ $site_id . ':' . $user->ID . ':' . $ip ] >= $this->get_login_failure_log_limit() );
|
284 |
}
|
285 |
} else {
|
286 |
if ( -1 === (int) $this->get_visitor_login_failure_log_limit() ) {
|
287 |
return false;
|
288 |
} else {
|
289 |
-
$data_unknown =
|
290 |
return ( false !== $data_unknown ) && isset( $data_unknown[ $site_id . ':' . $ip ] ) && ( $data_unknown[ $site_id . ':' . $ip ] >= $this->get_visitor_login_failure_log_limit() );
|
291 |
}
|
292 |
}
|
@@ -300,10 +300,8 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
|
|
300 |
* @param WP_User $user - User object.
|
301 |
*/
|
302 |
protected function increment_login_failure( $ip, $site_id, $user ) {
|
303 |
-
$get_fn = $this->is_multisite() ? 'get_site_transient' : 'get_transient';
|
304 |
-
$set_fn = $this->is_multisite() ? 'set_site_transient' : 'set_transient';
|
305 |
if ( $user ) {
|
306 |
-
$data_known =
|
307 |
if ( ! $data_known ) {
|
308 |
$data_known = array();
|
309 |
}
|
@@ -311,9 +309,9 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
|
|
311 |
$data_known[ $site_id . ':' . $user->ID . ':' . $ip ] = 1;
|
312 |
}
|
313 |
$data_known[ $site_id . ':' . $user->ID . ':' . $ip ]++;
|
314 |
-
|
315 |
} else {
|
316 |
-
$data_unknown =
|
317 |
if ( ! $data_unknown ) {
|
318 |
$data_unknown = array();
|
319 |
}
|
@@ -321,7 +319,7 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
|
|
321 |
$data_unknown[ $site_id . ':' . $ip ] = 1;
|
322 |
}
|
323 |
$data_unknown[ $site_id . ':' . $ip ]++;
|
324 |
-
|
325 |
}
|
326 |
}
|
327 |
|
@@ -551,6 +549,8 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
|
|
551 |
array(
|
552 |
'Username' => $user->user_login,
|
553 |
'CurrentUserRoles' => $user_roles,
|
|
|
|
|
554 |
),
|
555 |
true
|
556 |
);
|
268 |
/**
|
269 |
* Check failure limit.
|
270 |
*
|
271 |
+
* @param string $ip - IP address.
|
272 |
* @param integer $site_id - Blog ID.
|
273 |
+
* @param WP_User $user - User object.
|
274 |
+
*
|
275 |
* @return boolean - Passed limit true|false.
|
276 |
*/
|
277 |
protected function is_past_login_failure_limit( $ip, $site_id, $user ) {
|
|
|
278 |
if ( $user ) {
|
279 |
if ( -1 === (int) $this->get_login_failure_log_limit() ) {
|
280 |
return false;
|
281 |
} else {
|
282 |
+
$data_known = WpSecurityAuditLog::get_transient( self::TRANSIENT_FAILEDLOGINS );
|
283 |
return ( false !== $data_known ) && isset( $data_known[ $site_id . ':' . $user->ID . ':' . $ip ] ) && ( $data_known[ $site_id . ':' . $user->ID . ':' . $ip ] >= $this->get_login_failure_log_limit() );
|
284 |
}
|
285 |
} else {
|
286 |
if ( -1 === (int) $this->get_visitor_login_failure_log_limit() ) {
|
287 |
return false;
|
288 |
} else {
|
289 |
+
$data_unknown = WpSecurityAuditLog::get_transient( self::TRANSIENT_FAILEDLOGINS_UNKNOWN );
|
290 |
return ( false !== $data_unknown ) && isset( $data_unknown[ $site_id . ':' . $ip ] ) && ( $data_unknown[ $site_id . ':' . $ip ] >= $this->get_visitor_login_failure_log_limit() );
|
291 |
}
|
292 |
}
|
300 |
* @param WP_User $user - User object.
|
301 |
*/
|
302 |
protected function increment_login_failure( $ip, $site_id, $user ) {
|
|
|
|
|
303 |
if ( $user ) {
|
304 |
+
$data_known = WpSecurityAuditLog::get_transient( self::TRANSIENT_FAILEDLOGINS );
|
305 |
if ( ! $data_known ) {
|
306 |
$data_known = array();
|
307 |
}
|
309 |
$data_known[ $site_id . ':' . $user->ID . ':' . $ip ] = 1;
|
310 |
}
|
311 |
$data_known[ $site_id . ':' . $user->ID . ':' . $ip ]++;
|
312 |
+
WpSecurityAuditLog::set_transient( self::TRANSIENT_FAILEDLOGINS, $data_known, $this->get_login_failure_expiration() );
|
313 |
} else {
|
314 |
+
$data_unknown = WpSecurityAuditLog::get_transient( self::TRANSIENT_FAILEDLOGINS_UNKNOWN );
|
315 |
if ( ! $data_unknown ) {
|
316 |
$data_unknown = array();
|
317 |
}
|
319 |
$data_unknown[ $site_id . ':' . $ip ] = 1;
|
320 |
}
|
321 |
$data_unknown[ $site_id . ':' . $ip ]++;
|
322 |
+
WpSecurityAuditLog::set_transient( self::TRANSIENT_FAILEDLOGINS_UNKNOWN, $data_unknown, $this->get_login_failure_expiration() );
|
323 |
}
|
324 |
}
|
325 |
|
549 |
array(
|
550 |
'Username' => $user->user_login,
|
551 |
'CurrentUserRoles' => $user_roles,
|
552 |
+
// Current user ID must be set explicitly as the user is not logged in when this happens.
|
553 |
+
'CurrentUserID' => $user->ID,
|
554 |
),
|
555 |
true
|
556 |
);
|
classes/Sensors/MetaData.php
CHANGED
@@ -83,17 +83,9 @@ class WSAL_Sensors_MetaData extends WSAL_AbstractMetaDataSensor {
|
|
83 |
}
|
84 |
|
85 |
// Remove WC coupons from ignored array.
|
86 |
-
$key = array_search( 'shop_coupon', $this->plugin->alerts
|
87 |
if ( false !== $key ) {
|
88 |
-
unset( $this->plugin->alerts
|
89 |
-
}
|
90 |
-
|
91 |
-
// Ignore post types we are not interested in.
|
92 |
-
$ignored_cpts = $this->plugin->alerts->ignored_cpts;
|
93 |
-
|
94 |
-
// Ignore updates from ignored custom post types.
|
95 |
-
if ( in_array( $post->post_type, $ignored_cpts, true ) ) {
|
96 |
-
return;
|
97 |
}
|
98 |
|
99 |
/**
|
@@ -304,11 +296,6 @@ class WSAL_Sensors_MetaData extends WSAL_AbstractMetaDataSensor {
|
|
304 |
*/
|
305 |
$log_meta_event = apply_filters( 'wsal_before_post_meta_delete_event', true, $meta_key, $meta_value, $post, $meta_id );
|
306 |
|
307 |
-
// Ignore updates from ignored custom post types.
|
308 |
-
if ( in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true ) ) {
|
309 |
-
return;
|
310 |
-
}
|
311 |
-
|
312 |
// If not allowed to log meta event then skip it.
|
313 |
if ( ! $log_meta_event ) {
|
314 |
continue;
|
83 |
}
|
84 |
|
85 |
// Remove WC coupons from ignored array.
|
86 |
+
$key = array_search( 'shop_coupon', $this->plugin->alerts::get_ignored_post_types() ); // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
|
87 |
if ( false !== $key ) {
|
88 |
+
unset( $this->plugin->alerts::get_ignored_post_types()[ $key ] );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
}
|
90 |
|
91 |
/**
|
296 |
*/
|
297 |
$log_meta_event = apply_filters( 'wsal_before_post_meta_delete_event', true, $meta_key, $meta_value, $post, $meta_id );
|
298 |
|
|
|
|
|
|
|
|
|
|
|
299 |
// If not allowed to log meta event then skip it.
|
300 |
if ( ! $log_meta_event ) {
|
301 |
continue;
|
classes/Sensors/PluginsThemes.php
CHANGED
@@ -4,8 +4,9 @@
|
|
4 |
*
|
5 |
* Plugins & Themes sensor file.
|
6 |
*
|
7 |
-
* @since
|
8 |
-
* @package
|
|
|
9 |
*/
|
10 |
|
11 |
// Exit if accessed directly.
|
@@ -58,6 +59,69 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
|
|
58 |
}
|
59 |
add_action( 'switch_theme', array( $this, 'event_theme_activated' ) );
|
60 |
add_action( 'upgrader_overwrote_package', array( $this, 'OnPackageOverwrite' ), 10, 3 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
}
|
62 |
|
63 |
/**
|
@@ -102,8 +166,35 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
|
|
102 |
|
103 |
// Install plugin.
|
104 |
if ( in_array( $action, array( 'install-plugin', 'upload-plugin', 'run_addon_install' ), true ) && current_user_can( 'install_plugins' ) ) {
|
105 |
-
$plugin =
|
106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
$this->log_error(
|
108 |
'Expected exactly one new plugin but found ' . count( $plugin ),
|
109 |
array(
|
@@ -391,25 +482,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
|
|
391 |
);
|
392 |
}
|
393 |
}
|
394 |
-
|
395 |
-
// Uninstall theme.
|
396 |
-
if ( in_array( $action, array( 'delete-theme' ), true ) && current_user_can( 'install_themes' ) ) {
|
397 |
-
foreach ( $this->get_removed_themes() as $theme ) {
|
398 |
-
$this->plugin->alerts->trigger_event(
|
399 |
-
5007,
|
400 |
-
array(
|
401 |
-
'Theme' => (object) array(
|
402 |
-
'Name' => $theme->Name,
|
403 |
-
'ThemeURI' => $theme->ThemeURI,
|
404 |
-
'Description' => $theme->Description,
|
405 |
-
'Author' => $theme->Author,
|
406 |
-
'Version' => $theme->Version,
|
407 |
-
'get_template_directory' => $theme->get_template_directory(),
|
408 |
-
),
|
409 |
-
)
|
410 |
-
);
|
411 |
-
}
|
412 |
-
}
|
413 |
}
|
414 |
|
415 |
/**
|
@@ -452,21 +524,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
|
|
452 |
);
|
453 |
}
|
454 |
|
455 |
-
/**
|
456 |
-
* Get removed themes.
|
457 |
-
*
|
458 |
-
* @return array of WP_Theme objects
|
459 |
-
*/
|
460 |
-
protected function get_removed_themes() {
|
461 |
-
$result = $this->old_themes;
|
462 |
-
foreach ( $result as $i => $theme ) {
|
463 |
-
if ( file_exists( $theme->get_template_directory() ) ) {
|
464 |
-
unset( $result[ $i ] );
|
465 |
-
}
|
466 |
-
}
|
467 |
-
return array_values( $result );
|
468 |
-
}
|
469 |
-
|
470 |
/**
|
471 |
* Get event code by post type.
|
472 |
*
|
@@ -655,6 +712,16 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
|
|
655 |
return;
|
656 |
}
|
657 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
658 |
if ( array_key_exists( 'Name', $new_plugin_data ) ) {
|
659 |
$plugin_file = self::get_plugin_file_name( $new_plugin_data['Name'] );
|
660 |
if ( ! empty( $plugin_file ) ) {
|
4 |
*
|
5 |
* Plugins & Themes sensor file.
|
6 |
*
|
7 |
+
* @since 1.0.0
|
8 |
+
* @package wsal
|
9 |
+
* @subpackage sensors
|
10 |
*/
|
11 |
|
12 |
// Exit if accessed directly.
|
59 |
}
|
60 |
add_action( 'switch_theme', array( $this, 'event_theme_activated' ) );
|
61 |
add_action( 'upgrader_overwrote_package', array( $this, 'OnPackageOverwrite' ), 10, 3 );
|
62 |
+
|
63 |
+
add_action( 'deleted_theme', array( $this, 'on_deleted_theme' ), 10, 2 );
|
64 |
+
add_action( 'upgrader_process_complete', array( $this, 'detect_upgrade_completed' ), 10, 2 );
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Trigger event once an automatic theme or plugin update has occured
|
69 |
+
*
|
70 |
+
* @param WP_Upgrader $upgrader_object - WP Upgrader object.
|
71 |
+
* @param array $hook_extra - Update details.
|
72 |
+
* @return void
|
73 |
+
*/
|
74 |
+
public function detect_upgrade_completed( $upgrader_object, $hook_extra ) {
|
75 |
+
|
76 |
+
if ( is_array( $hook_extra ) && isset( $hook_extra['plugin'] ) && 'wp-security-audit-log.php' === $hook_extra['plugin'] ) {
|
77 |
+
/**
|
78 |
+
* Our own plugin gets updated, unfortunately we have no idea (and most probably that is the old version of our plugin) what is the state of the plugin and what has been changed in the new version - check code reference here - https://developer.wordpress.org/reference/hooks/upgrader_process_complete/ especially the part that stays:
|
79 |
+
* Use with caution: When you use the upgrader_process_complete action hook in your plugin and your plugin is the one which under upgrade, then this action will run the old version of your plugin.
|
80 |
+
*/
|
81 |
+
|
82 |
+
return;
|
83 |
+
}
|
84 |
+
|
85 |
+
if ( isset( $hook_extra['plugin'] ) ) {
|
86 |
+
self::log_plugin_updated_event( $hook_extra['plugin'] );
|
87 |
+
} elseif ( isset( $hook_extra['theme'] ) ) {
|
88 |
+
self::log_theme_updated_event( $hook_extra['theme'] );
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Handles a theme deletion attempt.
|
94 |
+
*
|
95 |
+
* @param string $stylesheet Stylesheet of the theme to delete.
|
96 |
+
* @param bool $deleted Whether the theme deletion was successful.
|
97 |
+
*
|
98 |
+
* @since 4.4.2
|
99 |
+
*
|
100 |
+
* phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
|
101 |
+
*/
|
102 |
+
public function on_deleted_theme( $stylesheet, $deleted ) {
|
103 |
+
if ( ! $deleted ) {
|
104 |
+
return;
|
105 |
+
}
|
106 |
+
|
107 |
+
if ( ! array_key_exists( $stylesheet, $this->old_themes ) ) {
|
108 |
+
return;
|
109 |
+
}
|
110 |
+
|
111 |
+
$theme = $this->old_themes[ $stylesheet ];
|
112 |
+
$this->plugin->alerts->trigger_event(
|
113 |
+
5007,
|
114 |
+
array(
|
115 |
+
'Theme' => (object) array(
|
116 |
+
'Name' => $theme->Name,
|
117 |
+
'ThemeURI' => $theme->ThemeURI,
|
118 |
+
'Description' => $theme->Description,
|
119 |
+
'Author' => $theme->Author,
|
120 |
+
'Version' => $theme->Version,
|
121 |
+
'get_template_directory' => $theme->get_template_directory(),
|
122 |
+
),
|
123 |
+
)
|
124 |
+
);
|
125 |
}
|
126 |
|
127 |
/**
|
166 |
|
167 |
// Install plugin.
|
168 |
if ( in_array( $action, array( 'install-plugin', 'upload-plugin', 'run_addon_install' ), true ) && current_user_can( 'install_plugins' ) ) {
|
169 |
+
$plugin = array_merge( array_diff( array_keys( get_plugins() ), array_keys( $this->old_plugins ) ), array_diff( array_keys( $this->old_plugins ), array_keys( get_plugins() ) ) );
|
170 |
+
|
171 |
+
// Check for premium version being installed / updated.
|
172 |
+
if ( in_array( 'wp-security-audit-log-premium/wp-security-audit-log.php', $plugin ) ) {
|
173 |
+
/**
|
174 |
+
* It looks like our own plugin is installed / updated. That means that we have no idea if there is a version on server or the plugin is in memory only (if it is he don't know which parts of it are there), that could lead to PHP errors which will prevent plugin install / update, better approach is to do nothing in terms of logging.
|
175 |
+
*
|
176 |
+
* TODO: the plugin name (see comparison in if clause above) could be whatever, we must introduce constant for that probably
|
177 |
+
*/
|
178 |
+
return;
|
179 |
+
}
|
180 |
+
// Check for free version being installed / updated.
|
181 |
+
if ( in_array( 'wp-security-audit-log/wp-security-audit-log.php', $plugin ) ) {
|
182 |
+
/**
|
183 |
+
* It looks like our own plugin is installed / updated. That means that we have no idea if there is a version on server or the plugin is in memory only (if it is he don't know which parts of it are there), that could lead to PHP errors which will prevent plugin install / update, better approach is to do nothing in terms of logging.
|
184 |
+
*
|
185 |
+
* TODO: the plugin name (see comparison in if clause above) could be whatever, we must introduce constant for that probably
|
186 |
+
*/
|
187 |
+
return;
|
188 |
+
}
|
189 |
+
|
190 |
+
if ( ! count( $plugin ) ) {
|
191 |
+
/**
|
192 |
+
* No changed plugins - there is nothing we suppose to log.
|
193 |
+
*/
|
194 |
+
return;
|
195 |
+
}
|
196 |
+
|
197 |
+
if ( count( $plugin ) > 1 ) {
|
198 |
$this->log_error(
|
199 |
'Expected exactly one new plugin but found ' . count( $plugin ),
|
200 |
array(
|
482 |
);
|
483 |
}
|
484 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
485 |
}
|
486 |
|
487 |
/**
|
524 |
);
|
525 |
}
|
526 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
527 |
/**
|
528 |
* Get event code by post type.
|
529 |
*
|
712 |
return;
|
713 |
}
|
714 |
|
715 |
+
if ( is_array( $new_plugin_data ) && isset( $new_plugin_data['TextDomain'] ) && 'wp-security-audit-log' === $new_plugin_data['TextDomain'] ) {
|
716 |
+
/**
|
717 |
+
* Out own plugin gets updated, unfortunately we have no idea (and most probably that is the old version of our plugin ) what is the state of the plugin and what has been changed in the new version - check code reference here - https://developer.wordpress.org/reference/hooks/upgrader_process_complete/ especially the part that stays:
|
718 |
+
* Use with caution: When you use the upgrader_process_complete action hook in your plugin and your plugin is the one which under upgrade, then this action will run the old version of your plugin.
|
719 |
+
* Yes - that is not upgrader_overwrote_package but same applies to it im afraid
|
720 |
+
*/
|
721 |
+
|
722 |
+
return;
|
723 |
+
}
|
724 |
+
|
725 |
if ( array_key_exists( 'Name', $new_plugin_data ) ) {
|
726 |
$plugin_file = self::get_plugin_file_name( $new_plugin_data['Name'] );
|
727 |
if ( ! empty( $plugin_file ) ) {
|
classes/Sensors/UserProfile.php
CHANGED
@@ -292,7 +292,7 @@ class WSAL_Sensors_UserProfile extends WSAL_AbstractSensor {
|
|
292 |
'FirstName' => $user->user_firstname,
|
293 |
'LastName' => $user->user_lastname,
|
294 |
'EditUserLink' => add_query_arg( 'user_id', $user_id, admin_url( 'user-edit.php' ) ),
|
295 |
-
'multisite_text' =>
|
296 |
),
|
297 |
array( $this, 'must_not_contain_user_changes' )
|
298 |
);
|
@@ -416,31 +416,32 @@ class WSAL_Sensors_UserProfile extends WSAL_AbstractSensor {
|
|
416 |
* @param string $user_login User's login name.
|
417 |
*/
|
418 |
public function event_password_reset_link_sent( $user_login ) {
|
419 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
420 |
|
421 |
-
|
422 |
-
|
423 |
-
', ',
|
424 |
-
array_map(
|
425 |
array(
|
426 |
-
$
|
427 |
-
'
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
array(
|
436 |
-
'roles' => $current_user_roles,
|
437 |
-
'login' => $current_user->user_login,
|
438 |
-
'firstname' => ( empty( $current_user->user_firstname ) ) ? ' ' : $current_user->user_firstname,
|
439 |
-
'lastname' => ( empty( $current_user->user_lastname ) ) ? ' ' : $current_user->user_lastname,
|
440 |
-
'CurrentUserID' => $current_user->ID,
|
441 |
-
'EventType' => 'submitted',
|
442 |
-
)
|
443 |
-
);
|
444 |
}
|
445 |
|
446 |
/**
|
@@ -509,7 +510,7 @@ class WSAL_Sensors_UserProfile extends WSAL_AbstractSensor {
|
|
509 |
'LastName' => ! empty( $user->user_lastname ) ? $user->user_lastname : '',
|
510 |
);
|
511 |
|
512 |
-
$event_code =
|
513 |
if ( 4001 === $event_code ) {
|
514 |
$new_user_data['Roles'] = is_array( $user->roles ) ? implode( ', ', $user->roles ) : $user->roles;
|
515 |
} elseif ( 4012 === $event_code ) {
|
@@ -522,6 +523,6 @@ class WSAL_Sensors_UserProfile extends WSAL_AbstractSensor {
|
|
522 |
'EditUserLink' => add_query_arg( 'user_id', $user_id, admin_url( 'user-edit.php' ) ),
|
523 |
);
|
524 |
|
525 |
-
$this->plugin->alerts->trigger_event( $event_code, $event_data,
|
526 |
}
|
527 |
}
|
292 |
'FirstName' => $user->user_firstname,
|
293 |
'LastName' => $user->user_lastname,
|
294 |
'EditUserLink' => add_query_arg( 'user_id', $user_id, admin_url( 'user-edit.php' ) ),
|
295 |
+
'multisite_text' => WpSecurityAuditLog::is_multisite() ? get_current_blog_id() : false,
|
296 |
),
|
297 |
array( $this, 'must_not_contain_user_changes' )
|
298 |
);
|
416 |
* @param string $user_login User's login name.
|
417 |
*/
|
418 |
public function event_password_reset_link_sent( $user_login ) {
|
419 |
+
$user = get_user_by( 'login', $user_login );
|
420 |
+
if ( $user instanceof WP_User ) {
|
421 |
+
$userdata = get_userdata( $user->ID );
|
422 |
+
$user_roles = implode(
|
423 |
+
', ',
|
424 |
+
array_map(
|
425 |
+
array(
|
426 |
+
$this,
|
427 |
+
'filter_role_names',
|
428 |
+
),
|
429 |
+
$userdata->roles
|
430 |
+
)
|
431 |
+
);
|
432 |
|
433 |
+
$this->plugin->alerts->trigger_event(
|
434 |
+
4029,
|
|
|
|
|
435 |
array(
|
436 |
+
'roles' => $user_roles,
|
437 |
+
'login' => $user->user_login,
|
438 |
+
'firstname' => ( empty( $user->user_firstname ) ) ? ' ' : $user->user_firstname,
|
439 |
+
'lastname' => ( empty( $user->user_lastname ) ) ? ' ' : $user->user_lastname,
|
440 |
+
'EventType' => 'submitted',
|
441 |
+
'TargetUserID' => $user->ID,
|
442 |
+
)
|
443 |
+
);
|
444 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
445 |
}
|
446 |
|
447 |
/**
|
510 |
'LastName' => ! empty( $user->user_lastname ) ? $user->user_lastname : '',
|
511 |
);
|
512 |
|
513 |
+
$event_code = WpSecurityAuditLog::is_multisite() ? 4012 : 4001;
|
514 |
if ( 4001 === $event_code ) {
|
515 |
$new_user_data['Roles'] = is_array( $user->roles ) ? implode( ', ', $user->roles ) : $user->roles;
|
516 |
} elseif ( 4012 === $event_code ) {
|
523 |
'EditUserLink' => add_query_arg( 'user_id', $user_id, admin_url( 'user-edit.php' ) ),
|
524 |
);
|
525 |
|
526 |
+
$this->plugin->alerts->trigger_event( $event_code, $event_data, WpSecurityAuditLog::is_multisite() );
|
527 |
}
|
528 |
}
|
classes/Settings.php
CHANGED
@@ -287,18 +287,6 @@ class WSAL_Settings {
|
|
287 |
return $this->pruning;
|
288 |
}
|
289 |
|
290 |
-
/**
|
291 |
-
* Set the new pruning date.
|
292 |
-
*
|
293 |
-
* @param string $newvalue - The new pruning date.
|
294 |
-
*/
|
295 |
-
public function set_pruning_date( $newvalue ) {
|
296 |
-
if ( strtotime( $newvalue ) ) {
|
297 |
-
$this->plugin->set_global_setting( 'pruning-date', $newvalue );
|
298 |
-
$this->pruning = $newvalue;
|
299 |
-
}
|
300 |
-
}
|
301 |
-
|
302 |
/**
|
303 |
* Return current pruning unit.
|
304 |
*
|
@@ -308,15 +296,6 @@ class WSAL_Settings {
|
|
308 |
return $this->plugin->get_global_setting( 'pruning-unit', 'months' );
|
309 |
}
|
310 |
|
311 |
-
/**
|
312 |
-
* Set current pruning unit.
|
313 |
-
*
|
314 |
-
* @param string $newvalue – New value of pruning unit.
|
315 |
-
*/
|
316 |
-
public function set_pruning_unit( $newvalue ) {
|
317 |
-
$this->plugin->set_global_setting( 'pruning-unit', $newvalue );
|
318 |
-
}
|
319 |
-
|
320 |
/**
|
321 |
* Maximum number of alerts to keep.
|
322 |
*
|
@@ -339,22 +318,62 @@ class WSAL_Settings {
|
|
339 |
/**
|
340 |
* Enables or disables time based retention period.
|
341 |
*
|
342 |
-
* @param bool
|
|
|
|
|
343 |
*/
|
344 |
-
public function
|
345 |
|
346 |
-
$
|
347 |
-
$
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
353 |
);
|
354 |
-
|
355 |
}
|
356 |
|
357 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
}
|
359 |
|
360 |
/**
|
@@ -661,7 +680,7 @@ class WSAL_Settings {
|
|
661 |
* @return array
|
662 |
*/
|
663 |
protected function get_super_admins() {
|
664 |
-
return
|
665 |
}
|
666 |
|
667 |
/**
|
@@ -670,7 +689,7 @@ class WSAL_Settings {
|
|
670 |
* @return string[]
|
671 |
*/
|
672 |
protected function get_admins() {
|
673 |
-
if (
|
674 |
if ( empty( $this->site_admins ) ) {
|
675 |
/**
|
676 |
* Get list of admins.
|
@@ -714,7 +733,7 @@ class WSAL_Settings {
|
|
714 |
// By default, the user has no privileges.
|
715 |
$result = false;
|
716 |
|
717 |
-
$is_multisite =
|
718 |
switch ( $action ) {
|
719 |
case 'view':
|
720 |
if ( ! $is_multisite ) {
|
@@ -1091,9 +1110,11 @@ class WSAL_Settings {
|
|
1091 |
/**
|
1092 |
* Get Custom Post Types excluded from monitoring.
|
1093 |
*
|
|
|
|
|
1094 |
* @since 2.6.7
|
1095 |
*/
|
1096 |
-
public function get_excluded_post_types() {
|
1097 |
if ( empty( $this->post_types ) ) {
|
1098 |
$this->post_types = array_unique( array_filter( explode( ',', $this->plugin->get_global_setting( 'custom-post-types' ) ) ) );
|
1099 |
}
|
@@ -1474,7 +1495,7 @@ class WSAL_Settings {
|
|
1474 |
'info' => '1',
|
1475 |
);
|
1476 |
|
1477 |
-
if (
|
1478 |
$columns = array_slice( $columns, 0, 6, true ) + array( 'site' => '1' ) + array_slice( $columns, 6, null, true );
|
1479 |
}
|
1480 |
|
@@ -1493,7 +1514,7 @@ class WSAL_Settings {
|
|
1493 |
'message' => '0',
|
1494 |
);
|
1495 |
|
1496 |
-
if (
|
1497 |
$columns = array_slice( $columns, 0, 6, true ) + array( 'site' => '0' ) + array_slice( $columns, 6, null, true );
|
1498 |
}
|
1499 |
|
@@ -1644,6 +1665,15 @@ class WSAL_Settings {
|
|
1644 |
return intval( $this->plugin->get_global_setting( 'log-visitor-failed-login-limit', 10 ) );
|
1645 |
}
|
1646 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1647 |
|
1648 |
/**
|
1649 |
* Method: Get Token Type.
|
@@ -1739,7 +1769,7 @@ class WSAL_Settings {
|
|
1739 |
// Update Freemius state to skipped.
|
1740 |
$this->plugin->set_global_setting( 'wsal_freemius_state', 'skipped', true );
|
1741 |
|
1742 |
-
if ( !
|
1743 |
wsal_freemius()->skip_connection(); // Opt out.
|
1744 |
} else {
|
1745 |
wsal_freemius()->skip_connection( null, true ); // Opt out for all websites.
|
@@ -1811,7 +1841,7 @@ class WSAL_Settings {
|
|
1811 |
public function get_view_site_id() {
|
1812 |
switch ( true ) {
|
1813 |
// Non-multisite.
|
1814 |
-
case !
|
1815 |
return 0;
|
1816 |
// Multisite + main site view.
|
1817 |
case $this->is_main_blog() && ! $this->is_specific_view():
|
287 |
return $this->pruning;
|
288 |
}
|
289 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
290 |
/**
|
291 |
* Return current pruning unit.
|
292 |
*
|
296 |
return $this->plugin->get_global_setting( 'pruning-unit', 'months' );
|
297 |
}
|
298 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
299 |
/**
|
300 |
* Maximum number of alerts to keep.
|
301 |
*
|
318 |
/**
|
319 |
* Enables or disables time based retention period.
|
320 |
*
|
321 |
+
* @param bool $enable If true, time based retention period is enabled.
|
322 |
+
* @param string $new_date - The new pruning date.
|
323 |
+
* @param string $new_unit – New value of pruning unit.
|
324 |
*/
|
325 |
+
public function set_pruning_date_settings( $enable, $new_date, $new_unit ) {
|
326 |
|
327 |
+
$was_enabled = $this->plugin->get_global_boolean_setting( 'pruning-date-e', false );
|
328 |
+
$old_period = $this->plugin->get_global_setting( 'pruning-date', '6 months' );
|
329 |
+
|
330 |
+
if ( ! $was_enabled && $enable ) {
|
331 |
+
// The retention period is being enabled.
|
332 |
+
$this->plugin->set_global_setting( 'pruning-date', $new_date );
|
333 |
+
$this->plugin->set_global_setting( 'pruning-unit', $new_unit );
|
334 |
+
$this->plugin->set_global_boolean_setting( 'pruning-date-e', $enable );
|
335 |
+
|
336 |
+
$this->plugin->alerts->trigger_event(
|
337 |
+
6052,
|
338 |
+
array(
|
339 |
+
'new_setting' => 'Delete events older than ' . $old_period,
|
340 |
+
'previous_setting' => 'Keep all data',
|
341 |
+
)
|
342 |
+
);
|
343 |
+
return;
|
344 |
+
}
|
345 |
+
|
346 |
+
if ( $was_enabled && ! $enable ) {
|
347 |
+
// The retention period is being disabled.
|
348 |
+
$this->plugin->delete_global_setting( 'pruning-date' );
|
349 |
+
$this->plugin->delete_global_setting( 'pruning-unit' );
|
350 |
+
$this->plugin->set_global_boolean_setting( 'pruning-date-e', $enable );
|
351 |
+
|
352 |
+
$this->plugin->alerts->trigger_event(
|
353 |
+
6052,
|
354 |
+
array(
|
355 |
+
'new_setting' => 'Keep all data',
|
356 |
+
'previous_setting' => 'Delete events older than ' . $old_period,
|
357 |
+
)
|
358 |
);
|
359 |
+
return;
|
360 |
}
|
361 |
|
362 |
+
if ( $enable ) {
|
363 |
+
// The retention period toggle has not changed, we need to check if the actual period changed.
|
364 |
+
if ( $new_date != $old_period ) {
|
365 |
+
$this->plugin->set_global_setting( 'pruning-date', $new_date );
|
366 |
+
$this->plugin->set_global_setting( 'pruning-unit', $new_unit );
|
367 |
+
|
368 |
+
$this->plugin->alerts->trigger_event(
|
369 |
+
6052,
|
370 |
+
array(
|
371 |
+
'new_setting' => 'Delete events older than ' . $new_date,
|
372 |
+
'previous_setting' => 'Delete events older than ' . $old_period,
|
373 |
+
)
|
374 |
+
);
|
375 |
+
}
|
376 |
+
}
|
377 |
}
|
378 |
|
379 |
/**
|
680 |
* @return array
|
681 |
*/
|
682 |
protected function get_super_admins() {
|
683 |
+
return WpSecurityAuditLog::is_multisite() ? get_super_admins() : array();
|
684 |
}
|
685 |
|
686 |
/**
|
689 |
* @return string[]
|
690 |
*/
|
691 |
protected function get_admins() {
|
692 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
693 |
if ( empty( $this->site_admins ) ) {
|
694 |
/**
|
695 |
* Get list of admins.
|
733 |
// By default, the user has no privileges.
|
734 |
$result = false;
|
735 |
|
736 |
+
$is_multisite = WpSecurityAuditLog::is_multisite();
|
737 |
switch ( $action ) {
|
738 |
case 'view':
|
739 |
if ( ! $is_multisite ) {
|
1110 |
/**
|
1111 |
* Get Custom Post Types excluded from monitoring.
|
1112 |
*
|
1113 |
+
* @return array
|
1114 |
+
*
|
1115 |
* @since 2.6.7
|
1116 |
*/
|
1117 |
+
public function get_excluded_post_types(): array {
|
1118 |
if ( empty( $this->post_types ) ) {
|
1119 |
$this->post_types = array_unique( array_filter( explode( ',', $this->plugin->get_global_setting( 'custom-post-types' ) ) ) );
|
1120 |
}
|
1495 |
'info' => '1',
|
1496 |
);
|
1497 |
|
1498 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
1499 |
$columns = array_slice( $columns, 0, 6, true ) + array( 'site' => '1' ) + array_slice( $columns, 6, null, true );
|
1500 |
}
|
1501 |
|
1514 |
'message' => '0',
|
1515 |
);
|
1516 |
|
1517 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
1518 |
$columns = array_slice( $columns, 0, 6, true ) + array( 'site' => '0' ) + array_slice( $columns, 6, null, true );
|
1519 |
}
|
1520 |
|
1665 |
return intval( $this->plugin->get_global_setting( 'log-visitor-failed-login-limit', 10 ) );
|
1666 |
}
|
1667 |
|
1668 |
+
/**
|
1669 |
+
* Checks if the archiving is enabled.
|
1670 |
+
*
|
1671 |
+
* @return mixed True if the archiving is enabled.
|
1672 |
+
*/
|
1673 |
+
public function is_archiving_enabled() {
|
1674 |
+
return $this->plugin->get_global_setting( 'archiving-e' );
|
1675 |
+
}
|
1676 |
+
|
1677 |
|
1678 |
/**
|
1679 |
* Method: Get Token Type.
|
1769 |
// Update Freemius state to skipped.
|
1770 |
$this->plugin->set_global_setting( 'wsal_freemius_state', 'skipped', true );
|
1771 |
|
1772 |
+
if ( ! WpSecurityAuditLog::is_multisite() ) {
|
1773 |
wsal_freemius()->skip_connection(); // Opt out.
|
1774 |
} else {
|
1775 |
wsal_freemius()->skip_connection( null, true ); // Opt out for all websites.
|
1841 |
public function get_view_site_id() {
|
1842 |
switch ( true ) {
|
1843 |
// Non-multisite.
|
1844 |
+
case ! WpSecurityAuditLog::is_multisite():
|
1845 |
return 0;
|
1846 |
// Multisite + main site view.
|
1847 |
case $this->is_main_blog() && ! $this->is_specific_view():
|
classes/Uninstall.php
CHANGED
@@ -86,14 +86,14 @@ class WSAL_Uninstall {
|
|
86 |
$plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wsal_%'" ); // phpcs:ignore
|
87 |
|
88 |
foreach ( $plugin_options as $option ) {
|
89 |
-
|
90 |
}
|
91 |
|
92 |
// Remove wsal specific Freemius entry.
|
93 |
-
|
94 |
|
95 |
// Ensue entry is fully cleared.
|
96 |
-
|
97 |
|
98 |
// @todo delete also options from site-level tables in multisite context
|
99 |
}
|
86 |
$plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wsal_%'" ); // phpcs:ignore
|
87 |
|
88 |
foreach ( $plugin_options as $option ) {
|
89 |
+
delete_site_option( $option->option_name );
|
90 |
}
|
91 |
|
92 |
// Remove wsal specific Freemius entry.
|
93 |
+
delete_site_option( 'fs_wsalp' );
|
94 |
|
95 |
// Ensue entry is fully cleared.
|
96 |
+
delete_site_option( 'wsal_networkwide_tracker_cpts' );
|
97 |
|
98 |
// @todo delete also options from site-level tables in multisite context
|
99 |
}
|
classes/Upgrade/MetadataMigration.php
DELETED
@@ -1,208 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Metadata migration class.
|
4 |
-
*
|
5 |
-
* @package wsal
|
6 |
-
* @subpackage upgrade
|
7 |
-
* @since 4.4.0
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly.
|
11 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
-
exit;
|
13 |
-
}
|
14 |
-
|
15 |
-
/**
|
16 |
-
* Background process for handling the migration of selected metadata from the meta table to the occurrences table. This
|
17 |
-
* was part of database schema changes introduced in version 4.4.0.
|
18 |
-
*
|
19 |
-
* It handles metadata migration for 1 connection defined as part of the process information. This can be either "local"
|
20 |
-
* to work with the local WP database or a name of connection defined by the Integrations extension.
|
21 |
-
*
|
22 |
-
* @package wsal
|
23 |
-
* @subpackage upgrade
|
24 |
-
* @since 4.4.0
|
25 |
-
*/
|
26 |
-
class WSAL_Upgrade_MetadataMigration extends WSAL_Vendor\WP_Background_Process {
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Name of the option holding the information about ongoing metadata migration.
|
30 |
-
*
|
31 |
-
* Note: the wsal_ prefix is automatically added by plugin's settings handling functions.
|
32 |
-
*
|
33 |
-
* @var string
|
34 |
-
*/
|
35 |
-
const OPTION_NAME_MIGRATION_INFO = 'meta_data_migration_info_440';
|
36 |
-
|
37 |
-
/**
|
38 |
-
* Action
|
39 |
-
*
|
40 |
-
* @var string
|
41 |
-
*/
|
42 |
-
protected $action = 'wsal_meta_data_migration_440';
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Displays an admin notice if a metadata migration is in progress.
|
46 |
-
*/
|
47 |
-
public static function maybe_display_progress_admin_notice() {
|
48 |
-
if ( ! is_user_logged_in() ) {
|
49 |
-
// Don't show to anonymous users (obviously).
|
50 |
-
return;
|
51 |
-
}
|
52 |
-
|
53 |
-
$current_user = get_userdata( get_current_user_id() );
|
54 |
-
if ( false === $current_user ) {
|
55 |
-
// Bail if there is a problem retrieving the current user.
|
56 |
-
return;
|
57 |
-
}
|
58 |
-
|
59 |
-
$is_admin = in_array( 'administrator', $current_user->roles, true ) || ( function_exists( 'is_super_admin' ) && is_super_admin( $current_user->ID ) );
|
60 |
-
if ( ! $is_admin ) {
|
61 |
-
// Don't show to admin users.
|
62 |
-
return;
|
63 |
-
}
|
64 |
-
|
65 |
-
$plugin = WpSecurityAuditLog::get_instance();
|
66 |
-
$existing_info = $plugin->get_global_setting( self::OPTION_NAME_MIGRATION_INFO, array() );
|
67 |
-
if ( empty( $existing_info ) ) {
|
68 |
-
return;
|
69 |
-
}
|
70 |
-
?>
|
71 |
-
<div class="notice notice-info">
|
72 |
-
<div class="notice-content-wrapper">
|
73 |
-
<p>
|
74 |
-
<strong><?php esc_html_e( 'Activity log database update in progress.', 'wp-security-audit-log' ); ?></strong>
|
75 |
-
<br />
|
76 |
-
<?php esc_html_e( 'WP Activity Log is updating the database tables where it stores the activity log. This is needed to upgrade the activity log tables to the new database schema, so the logs can be stored and read more efficiently. The duration of this process varies, depending on the number of events in the activity log. This process runs in the background and won\'t affect your website. During the upgrade, you might notice some "null" values in the activity log. This is temporary until the process is complete.', 'wp-security-audit-log' ); ?>
|
77 |
-
</p>
|
78 |
-
</div>
|
79 |
-
</div>
|
80 |
-
<?php
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
* {@inheritDoc}
|
85 |
-
*
|
86 |
-
* @param array{start_time: int, processed_events_count: int, batch_size: int, connection: string} $item Migration process item.
|
87 |
-
*/
|
88 |
-
protected function task( $item ) {
|
89 |
-
// Migrate metadata for the next batch of events.
|
90 |
-
$items_migrated = $this->process_next_batch( $item['connection'], $item['batch_size'] );
|
91 |
-
if ( 0 === $items_migrated ) {
|
92 |
-
// All metadata has been migrated.
|
93 |
-
try {
|
94 |
-
// Delete the migration job info to indicate that the migration is done.
|
95 |
-
self::remove_migration_info( $item['connection'] );
|
96 |
-
|
97 |
-
} catch ( Exception $exception ) {
|
98 |
-
$this->handle_error( $exception );
|
99 |
-
}
|
100 |
-
|
101 |
-
return false;
|
102 |
-
}
|
103 |
-
|
104 |
-
// Update and save the migration info.
|
105 |
-
$item['processed_events_count'] += $items_migrated;
|
106 |
-
self::store_migration_info( $item );
|
107 |
-
|
108 |
-
return $item;
|
109 |
-
}
|
110 |
-
|
111 |
-
/**
|
112 |
-
* Processes next batch of events that need to be migrated.
|
113 |
-
*
|
114 |
-
* @param string $connection Connection name.
|
115 |
-
* @param int $batch_size Batch size.
|
116 |
-
*
|
117 |
-
* @return int
|
118 |
-
*/
|
119 |
-
private function process_next_batch( $connection, $batch_size ) {
|
120 |
-
$plugin = WpSecurityAuditLog::get_instance();
|
121 |
-
if ( 'local' !== $connection && ! is_null( $plugin->external_db_util ) ) {
|
122 |
-
$connection = $plugin->external_db_util->get_connection( $connection );
|
123 |
-
if ( false === $connection ) {
|
124 |
-
return 0;
|
125 |
-
}
|
126 |
-
}
|
127 |
-
|
128 |
-
$connector = $plugin->get_connector( $connection );
|
129 |
-
/** @var WSAL_Adapters_MySQL_Occurrence $occurrence_adapter */
|
130 |
-
$occurrence_adapter = $connector->get_adapter( 'Occurrence' );
|
131 |
-
|
132 |
-
$occurrences_to_migrate = $occurrence_adapter->get_all_with_meta_to_migrate( $batch_size );
|
133 |
-
if ( ! empty( $occurrences_to_migrate ) ) {
|
134 |
-
$migrated_meta_keys = array_keys( WSAL_Models_Occurrence::$migrated_meta );
|
135 |
-
$lowercase_migrated_meta_keys = array_map( 'strtolower', $migrated_meta_keys );
|
136 |
-
foreach ( $occurrences_to_migrate as $occurrence ) {
|
137 |
-
$all_metadata = $occurrence_adapter->get_multi_meta( $occurrence );
|
138 |
-
if ( ! empty( $all_metadata ) ) {
|
139 |
-
foreach ( $all_metadata as $meta_model ) {
|
140 |
-
$meta_key = $meta_model->name;
|
141 |
-
$lowercase_meta_key = strtolower( $meta_key );
|
142 |
-
|
143 |
-
// We use lowercase meta keys to make sure we handle even legacy meta keys correctly, for
|
144 |
-
// example "username" was changed to "Username" at some point.
|
145 |
-
if ( in_array( $lowercase_meta_key, $lowercase_migrated_meta_keys ) ) { // phpcs:ignore
|
146 |
-
// This will store the meta in the occ table if it belongs there.
|
147 |
-
$is_empty_string = is_string( $meta_model->value ) && 0 === strlen( $meta_model->value );
|
148 |
-
if ( ! $is_empty_string && in_array( $meta_key, $migrated_meta_keys, true ) ) {
|
149 |
-
// The meta is set in the occurrence object on if it is an exact match, otherwise we
|
150 |
-
// would end up writing and deleting the same meta key endlessly.
|
151 |
-
$occurrence->set_meta_value( $meta_key, $meta_model->value );
|
152 |
-
}
|
153 |
-
|
154 |
-
$meta_model->delete();
|
155 |
-
}
|
156 |
-
}
|
157 |
-
|
158 |
-
$occurrence->save();
|
159 |
-
}
|
160 |
-
}
|
161 |
-
}
|
162 |
-
|
163 |
-
return count( $occurrences_to_migrate );
|
164 |
-
}
|
165 |
-
|
166 |
-
/**
|
167 |
-
* Removes migration info for a particular connection.
|
168 |
-
*
|
169 |
-
* @param string $connection_name Connection name.
|
170 |
-
*/
|
171 |
-
public static function remove_migration_info( $connection_name ) {
|
172 |
-
$plugin = WpSecurityAuditLog::get_instance();
|
173 |
-
$existing_info = $plugin->get_global_setting( self::OPTION_NAME_MIGRATION_INFO, array() );
|
174 |
-
|
175 |
-
if ( array_key_exists( $connection_name, $existing_info ) ) {
|
176 |
-
unset( $existing_info[ $connection_name ] );
|
177 |
-
}
|
178 |
-
|
179 |
-
if ( empty( $existing_info ) ) {
|
180 |
-
$plugin->delete_global_setting( self::OPTION_NAME_MIGRATION_INFO );
|
181 |
-
} else {
|
182 |
-
$plugin->set_global_setting( self::OPTION_NAME_MIGRATION_INFO, $existing_info );
|
183 |
-
}
|
184 |
-
}
|
185 |
-
|
186 |
-
/**
|
187 |
-
* Handles an error.
|
188 |
-
*
|
189 |
-
* @param Exception $exception Error to handle.
|
190 |
-
*/
|
191 |
-
private function handle_error( $exception ) {
|
192 |
-
// @todo handle migration error
|
193 |
-
}
|
194 |
-
|
195 |
-
/**
|
196 |
-
* Stores or updates migration info for one particular connection.
|
197 |
-
*
|
198 |
-
* @param array{start_time: int, processed_events_count: int, batch_size: int, connection: string} $info Migration info data.
|
199 |
-
*/
|
200 |
-
public static function store_migration_info( $info ) {
|
201 |
-
$plugin = WpSecurityAuditLog::get_instance();
|
202 |
-
$existing_info = $plugin->get_global_setting( self::OPTION_NAME_MIGRATION_INFO, array() );
|
203 |
-
$connection_name = $info['connection'];
|
204 |
-
|
205 |
-
$existing_info[ $connection_name ] = $info;
|
206 |
-
$plugin->set_global_setting( self::OPTION_NAME_MIGRATION_INFO, $existing_info );
|
207 |
-
}
|
208 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
classes/Upgrade/{Upgrade_43000_to_44400.php → Upgrade_43000_To_44400.php}
RENAMED
@@ -1,5 +1,7 @@
|
|
1 |
<?php
|
2 |
/**
|
|
|
|
|
3 |
* Class WSAL_Upgrade_43000_to_44400.
|
4 |
*
|
5 |
* @package wsal
|
1 |
<?php
|
2 |
/**
|
3 |
+
* TODO: That has to be removed - leaving it here for now for possible additional checks
|
4 |
+
*
|
5 |
* Class WSAL_Upgrade_43000_to_44400.
|
6 |
*
|
7 |
* @package wsal
|
classes/Utilities/Emailer.php
CHANGED
@@ -31,11 +31,11 @@ class WSAL_Utilities_Emailer {
|
|
31 |
$type_name = $wsal->settings()->get_type_username(); // Get the data to display.
|
32 |
$user = _wp_get_current_user();
|
33 |
$datetime_format = $wsal->settings()->get_datetime_format( false );
|
34 |
-
$now = current_time( 'timestamp' ); // phpcs:ignore
|
35 |
$date_time = str_replace(
|
36 |
'$$$',
|
37 |
substr( number_format( fmod( $now, 1 ), 3 ), 2 ),
|
38 |
-
date( $datetime_format, $now ) // phpcs:ignore
|
39 |
);
|
40 |
|
41 |
// Checks for display name.
|
@@ -95,8 +95,9 @@ class WSAL_Utilities_Emailer {
|
|
95 |
$email_address = self::get_emails( $email_address );
|
96 |
}
|
97 |
|
|
|
|
|
98 |
// @see: http://codex.wordpress.org/Function_Reference/wp_mail
|
99 |
-
add_filter( 'wp_mail_content_type', array( __CLASS__, 'set_html_content_type' ) );
|
100 |
add_filter( 'wp_mail_from', array( __CLASS__, 'custom_wp_mail_from' ) );
|
101 |
add_filter( 'wp_mail_from_name', array( __CLASS__, 'custom_wp_mail_from_name' ) );
|
102 |
|
@@ -107,7 +108,6 @@ class WSAL_Utilities_Emailer {
|
|
107 |
*
|
108 |
* @see http://core.trac.wordpress.org/ticket/23578
|
109 |
*/
|
110 |
-
remove_filter( 'wp_mail_content_type', array( __CLASS__, 'set_html_content_type' ) );
|
111 |
remove_filter( 'wp_mail_from', array( __CLASS__, 'custom_wp_mail_from' ) );
|
112 |
remove_filter( 'wp_mail_from_name', array( __CLASS__, 'custom_wp_mail_from_name' ) );
|
113 |
return $result;
|
31 |
$type_name = $wsal->settings()->get_type_username(); // Get the data to display.
|
32 |
$user = _wp_get_current_user();
|
33 |
$datetime_format = $wsal->settings()->get_datetime_format( false );
|
34 |
+
$now = current_time( 'timestamp' ); // phpcs:ignore
|
35 |
$date_time = str_replace(
|
36 |
'$$$',
|
37 |
substr( number_format( fmod( $now, 1 ), 3 ), 2 ),
|
38 |
+
date( $datetime_format, $now ) // phpcs:ignore
|
39 |
);
|
40 |
|
41 |
// Checks for display name.
|
95 |
$email_address = self::get_emails( $email_address );
|
96 |
}
|
97 |
|
98 |
+
$headers = array_merge_recursive( (array) $headers, array( 'Content-Type: ' . self::set_html_content_type() . '; charset=UTF-8' ) );
|
99 |
+
|
100 |
// @see: http://codex.wordpress.org/Function_Reference/wp_mail
|
|
|
101 |
add_filter( 'wp_mail_from', array( __CLASS__, 'custom_wp_mail_from' ) );
|
102 |
add_filter( 'wp_mail_from_name', array( __CLASS__, 'custom_wp_mail_from_name' ) );
|
103 |
|
108 |
*
|
109 |
* @see http://core.trac.wordpress.org/ticket/23578
|
110 |
*/
|
|
|
111 |
remove_filter( 'wp_mail_from', array( __CLASS__, 'custom_wp_mail_from' ) );
|
112 |
remove_filter( 'wp_mail_from_name', array( __CLASS__, 'custom_wp_mail_from_name' ) );
|
113 |
return $result;
|
classes/Utilities/FileSystemUtils.php
CHANGED
@@ -13,15 +13,18 @@
|
|
13 |
* @since 4.4.0
|
14 |
*/
|
15 |
class WSAL_Utilities_FileSystemUtils {
|
|
|
16 |
/**
|
17 |
* Returns a list of files matching given pattern in a given directory.
|
18 |
*
|
19 |
* It uses transients to cache the list of files for a day.
|
20 |
*
|
|
|
|
|
21 |
* @param string $directory Directory to search.
|
22 |
* @param string $pattern Filename pattern to narrow down the list of files.
|
23 |
*
|
24 |
-
* @return
|
25 |
*
|
26 |
* @since 4.4.0
|
27 |
*/
|
@@ -46,7 +49,7 @@ class WSAL_Utilities_FileSystemUtils {
|
|
46 |
closedir( $handle );
|
47 |
}
|
48 |
|
49 |
-
set_transient( $cache_key, $result, DAY_IN_SECONDS );
|
50 |
|
51 |
return $result;
|
52 |
}
|
13 |
* @since 4.4.0
|
14 |
*/
|
15 |
class WSAL_Utilities_FileSystemUtils {
|
16 |
+
|
17 |
/**
|
18 |
* Returns a list of files matching given pattern in a given directory.
|
19 |
*
|
20 |
* It uses transients to cache the list of files for a day.
|
21 |
*
|
22 |
+
* TODO: Check if that is necessary functionality. Currently it is used for loading sensors (switch to autoloader instead ? and give the users ability to load other sensors in a different way). If it is something that can be used in other parts of the code add exclusion filter and read subfolders as well
|
23 |
+
*
|
24 |
* @param string $directory Directory to search.
|
25 |
* @param string $pattern Filename pattern to narrow down the list of files.
|
26 |
*
|
27 |
+
* @return array
|
28 |
*
|
29 |
* @since 4.4.0
|
30 |
*/
|
49 |
closedir( $handle );
|
50 |
}
|
51 |
|
52 |
+
WpSecurityAuditLog::set_transient( $cache_key, $result, DAY_IN_SECONDS );
|
53 |
|
54 |
return $result;
|
55 |
}
|
classes/ViewManager.php
CHANGED
@@ -296,7 +296,7 @@ class WSAL_ViewManager {
|
|
296 |
*/
|
297 |
protected function get_backend_page_index() {
|
298 |
// Get current view via $_GET array.
|
299 |
-
$current_view =
|
300 |
|
301 |
if ( isset( $current_view ) ) {
|
302 |
foreach ( $this->views as $i => $view ) {
|
@@ -318,7 +318,7 @@ class WSAL_ViewManager {
|
|
318 |
$this->active_view = null;
|
319 |
|
320 |
// Get current view via $_GET array.
|
321 |
-
$current_view =
|
322 |
|
323 |
if ( isset( $current_view ) ) {
|
324 |
foreach ( $this->views as $view ) {
|
296 |
*/
|
297 |
protected function get_backend_page_index() {
|
298 |
// Get current view via $_GET array.
|
299 |
+
$current_view = ( isset( $_GET['page'] ) ) ? \sanitize_text_field( \wp_unslash( $_GET['page'] ) ) : '';
|
300 |
|
301 |
if ( isset( $current_view ) ) {
|
302 |
foreach ( $this->views as $i => $view ) {
|
318 |
$this->active_view = null;
|
319 |
|
320 |
// Get current view via $_GET array.
|
321 |
+
$current_view = ( isset( $_GET['page'] ) ) ? \sanitize_text_field( \wp_unslash( $_GET['page'] ) ) : '';
|
322 |
|
323 |
if ( isset( $current_view ) ) {
|
324 |
foreach ( $this->views as $view ) {
|
classes/Views/AuditLog.php
CHANGED
@@ -76,7 +76,6 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
|
|
76 |
add_action( 'wp_ajax_wsal_download_failed_login_log', array( $this, 'wsal_download_failed_login_log' ) );
|
77 |
add_action( 'wp_ajax_wsal_freemius_opt_in', array( $this, 'wsal_freemius_opt_in' ) );
|
78 |
add_action( 'wp_ajax_wsal_dismiss_setup_modal', array( $this, 'dismiss_setup_modal' ) );
|
79 |
-
add_action( 'wp_ajax_wsal_dismiss_advert', array( $this, 'wsal_dismiss_advert' ) );
|
80 |
add_action( 'wp_ajax_wsal_dismiss_notice_addon_available', array( $this, 'dismiss_notice_addon_available' ) );
|
81 |
add_action( 'wp_ajax_wsal_dismiss_missing_aws_sdk_nudge', array( $this, 'dismiss_missing_aws_sdk_nudge' ) );
|
82 |
add_action( 'wp_ajax_wsal_dismiss_helper_plugin_needed_nudge', array( $this, 'dismiss_helper_plugin_needed_nudge' ) );
|
@@ -134,8 +133,6 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
|
|
134 |
&& ! class_exists( 'WSAL_UserSessions_Plugin' )
|
135 |
&& 'anonymous' !== $this->plugin->get_global_setting( 'freemius_state', 'anonymous' ) // Anonymous mode option.
|
136 |
) {
|
137 |
-
$get_transient_fn = $this->plugin->is_multisite() ? 'get_site_transient' : 'get_transient'; // Check for multisite.
|
138 |
-
$wsal_is_advert_dismissed = $get_transient_fn( 'wsal-is-advert-dismissed' ); // Check if advert has been dismissed.
|
139 |
$wsal_premium_advert = $this->plugin->get_global_setting( 'premium-advert', false ); // Get the advert to display.
|
140 |
$wsal_premium_advert = false !== $wsal_premium_advert ? (int) $wsal_premium_advert : 0; // Set the default.
|
141 |
|
@@ -149,7 +146,7 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
|
|
149 |
'https://wpactivitylog.com/features/'
|
150 |
);
|
151 |
|
152 |
-
if ( current_user_can( 'manage_options' ) && $is_current_view
|
153 |
<div class="updated wsal_notice">
|
154 |
<div class="wsal_notice__wrapper">
|
155 |
<div class="wsal_notice__content">
|
@@ -183,11 +180,9 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
|
|
183 |
'https://wpactivitylog.com/pricing/'
|
184 |
);
|
185 |
?>
|
186 |
-
<?php wp_nonce_field( 'wsal_dismiss_advert', 'wsal-dismiss-advert', false, true ); ?>
|
187 |
<a href="<?php echo esc_url( $buy_now ); ?>" class="button button-primary wsal_notice__btn notice-cta" target="_blank"><?php esc_html_e( 'UPGRADE NOW', 'wp-security-audit-log' ); ?></a>
|
188 |
<br>
|
189 |
<a href="<?php echo esc_url( $trial_link ); ?>" class="start-trial-link" target="_blank"><?php esc_html_e( 'Start Free Trial', 'wp-security-audit-log' ); ?></a>
|
190 |
-
<a href="javascript:;" data-advert="<?php echo esc_attr( $wsal_premium_advert ); ?>" onclick="wsal_dismiss_advert(this)" class="wsal_notice__btn_dismiss" title="<?php esc_attr_e( 'Dismiss the banner', 'wp-security-audit-log' ); ?>"><?php esc_html_e( 'Close', 'wp-security-audit-log' ); ?></a>
|
191 |
</div>
|
192 |
<!-- /.wsal_notice__btns -->
|
193 |
</div>
|
@@ -227,10 +222,6 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
|
|
227 |
$screen = get_current_screen();
|
228 |
|
229 |
|
230 |
-
if ( class_exists( 'WSAL_Upgrade_MetadataMigration' ) ) {
|
231 |
-
WSAL_Upgrade_MetadataMigration::maybe_display_progress_admin_notice();
|
232 |
-
}
|
233 |
-
|
234 |
if ( $is_current_view && in_array( $screen->base, array( 'toplevel_page_wsal-auditlog', 'toplevel_page_wsal-auditlog-network' ), true ) ) {
|
235 |
// Grab list of installed plugins.
|
236 |
$all_plugins = get_plugins();
|
@@ -1028,50 +1019,6 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
|
|
1028 |
return $pointer;
|
1029 |
}
|
1030 |
|
1031 |
-
/**
|
1032 |
-
* Method: Ajax request handler to dismiss adverts.
|
1033 |
-
*
|
1034 |
-
* @since 3.2.4
|
1035 |
-
*/
|
1036 |
-
public function wsal_dismiss_advert() {
|
1037 |
-
// Die if user does not have permission to dismiss.
|
1038 |
-
if ( ! $this->plugin->settings()->current_user_can( 'edit' ) ) {
|
1039 |
-
echo wp_json_encode(
|
1040 |
-
array(
|
1041 |
-
'success' => false,
|
1042 |
-
'message' => esc_html__( 'You do not have sufficient permissions to dismiss this notice.', 'wp-security-audit-log' ),
|
1043 |
-
)
|
1044 |
-
);
|
1045 |
-
die();
|
1046 |
-
}
|
1047 |
-
|
1048 |
-
if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wsal_dismiss_advert' ) ) {
|
1049 |
-
// Nonce verification failed.
|
1050 |
-
echo wp_json_encode(
|
1051 |
-
array(
|
1052 |
-
'success' => false,
|
1053 |
-
'message' => esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' ),
|
1054 |
-
)
|
1055 |
-
);
|
1056 |
-
die();
|
1057 |
-
}
|
1058 |
-
|
1059 |
-
// @codingStandardsIgnoreStart
|
1060 |
-
$advert = isset( $_POST['advert'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['advert'] ) ) : false;
|
1061 |
-
// @codingStandardsIgnoreEnd
|
1062 |
-
|
1063 |
-
$advert = 2 === $advert ? '0' : $advert + 1;
|
1064 |
-
$this->plugin->set_global_setting( 'premium-advert', $advert );
|
1065 |
-
$set_transient_fn = $this->plugin->is_multisite() ? 'set_site_transient' : 'set_transient';
|
1066 |
-
$set_transient_fn( 'wsal-is-advert-dismissed', true, MONTH_IN_SECONDS );
|
1067 |
-
echo wp_json_encode(
|
1068 |
-
array(
|
1069 |
-
'success' => true,
|
1070 |
-
)
|
1071 |
-
);
|
1072 |
-
die();
|
1073 |
-
}
|
1074 |
-
|
1075 |
/**
|
1076 |
* Method: Ajax request handler to dismiss pointers.
|
1077 |
*
|
76 |
add_action( 'wp_ajax_wsal_download_failed_login_log', array( $this, 'wsal_download_failed_login_log' ) );
|
77 |
add_action( 'wp_ajax_wsal_freemius_opt_in', array( $this, 'wsal_freemius_opt_in' ) );
|
78 |
add_action( 'wp_ajax_wsal_dismiss_setup_modal', array( $this, 'dismiss_setup_modal' ) );
|
|
|
79 |
add_action( 'wp_ajax_wsal_dismiss_notice_addon_available', array( $this, 'dismiss_notice_addon_available' ) );
|
80 |
add_action( 'wp_ajax_wsal_dismiss_missing_aws_sdk_nudge', array( $this, 'dismiss_missing_aws_sdk_nudge' ) );
|
81 |
add_action( 'wp_ajax_wsal_dismiss_helper_plugin_needed_nudge', array( $this, 'dismiss_helper_plugin_needed_nudge' ) );
|
133 |
&& ! class_exists( 'WSAL_UserSessions_Plugin' )
|
134 |
&& 'anonymous' !== $this->plugin->get_global_setting( 'freemius_state', 'anonymous' ) // Anonymous mode option.
|
135 |
) {
|
|
|
|
|
136 |
$wsal_premium_advert = $this->plugin->get_global_setting( 'premium-advert', false ); // Get the advert to display.
|
137 |
$wsal_premium_advert = false !== $wsal_premium_advert ? (int) $wsal_premium_advert : 0; // Set the default.
|
138 |
|
146 |
'https://wpactivitylog.com/features/'
|
147 |
);
|
148 |
|
149 |
+
if ( current_user_can( 'manage_options' ) && $is_current_view ) : ?>
|
150 |
<div class="updated wsal_notice">
|
151 |
<div class="wsal_notice__wrapper">
|
152 |
<div class="wsal_notice__content">
|
180 |
'https://wpactivitylog.com/pricing/'
|
181 |
);
|
182 |
?>
|
|
|
183 |
<a href="<?php echo esc_url( $buy_now ); ?>" class="button button-primary wsal_notice__btn notice-cta" target="_blank"><?php esc_html_e( 'UPGRADE NOW', 'wp-security-audit-log' ); ?></a>
|
184 |
<br>
|
185 |
<a href="<?php echo esc_url( $trial_link ); ?>" class="start-trial-link" target="_blank"><?php esc_html_e( 'Start Free Trial', 'wp-security-audit-log' ); ?></a>
|
|
|
186 |
</div>
|
187 |
<!-- /.wsal_notice__btns -->
|
188 |
</div>
|
222 |
$screen = get_current_screen();
|
223 |
|
224 |
|
|
|
|
|
|
|
|
|
225 |
if ( $is_current_view && in_array( $screen->base, array( 'toplevel_page_wsal-auditlog', 'toplevel_page_wsal-auditlog-network' ), true ) ) {
|
226 |
// Grab list of installed plugins.
|
227 |
$all_plugins = get_plugins();
|
1019 |
return $pointer;
|
1020 |
}
|
1021 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1022 |
/**
|
1023 |
* Method: Ajax request handler to dismiss pointers.
|
1024 |
*
|
classes/Views/Help.php
CHANGED
@@ -254,9 +254,19 @@ class WSAL_Views_Help extends WSAL_AbstractView {
|
|
254 |
}
|
255 |
</style>
|
256 |
<?php
|
257 |
-
$freemius_id = wsal_freemius()->get_id()
|
258 |
-
|
259 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
260 |
}
|
261 |
|
262 |
/**
|
254 |
}
|
255 |
</style>
|
256 |
<?php
|
257 |
+
if ( $freemius_id = wsal_freemius()->get_id() ) { // phpcs:ignore
|
258 |
+
$vars = array( 'id' => $freemius_id );
|
259 |
+
echo fs_get_template( 'contact.php', $vars ); // phpcs:ignore
|
260 |
+
} else {
|
261 |
+
echo '<p>';
|
262 |
+
printf(
|
263 |
+
/* translators: Link to our contact form */
|
264 |
+
esc_html__( 'Please refer to the Help tab for links and information on how to open a support ticket, or access the database. If you have any other queries, please use our %1$scontact form %2$s', 'wp-security-audit-log' ),
|
265 |
+
'<a style="text-decoration:underline" href="https://www.wpwhitesecurity.com/contact/" target="_blank">',
|
266 |
+
'</a>'
|
267 |
+
);
|
268 |
+
echo '</p>';
|
269 |
+
}
|
270 |
}
|
271 |
|
272 |
/**
|
classes/Views/Settings.php
CHANGED
@@ -149,7 +149,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
149 |
$this->wsal_setting_tabs = $wsal_setting_tabs;
|
150 |
|
151 |
// Get the current tab.
|
152 |
-
$current_tab =
|
153 |
$this->current_tab = empty( $current_tab ) ? 'general' : $current_tab;
|
154 |
}
|
155 |
|
@@ -274,6 +274,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
274 |
|
275 |
$now = current_time( 'timestamp' ); // phpcs:ignore
|
276 |
$max_sdate = $this->plugin->settings()->get_pruning_date(); // Pruning date.
|
|
|
277 |
|
278 |
|
279 |
// Calculate limit timestamp.
|
@@ -552,7 +553,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
552 |
$label = esc_html__( 'Admin Bar Notification', 'wp-security-audit-log' );
|
553 |
if ( wsal_freemius()->is_free_plan() ) {
|
554 |
$disabled = 'disabled';
|
555 |
-
$label = esc_html__( 'Admin Bar Notification
|
556 |
}
|
557 |
?>
|
558 |
<th><label for="admin_bar_notif_on"><?php echo esc_html( $label ); ?></label></th>
|
@@ -579,7 +580,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
579 |
$label = esc_html__( 'Admin Bar Notification Updates', 'wp-security-audit-log' );
|
580 |
if ( wsal_freemius()->is_free_plan() ) {
|
581 |
$disabled = 'disabled';
|
582 |
-
$label = esc_html__( 'Admin Bar Notification Updates
|
583 |
}
|
584 |
?>
|
585 |
<th><label for="admin_bar_notif_refresh"><?php echo esc_html( $label ); ?></label></th>
|
@@ -742,7 +743,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
742 |
<label for="only_admins">
|
743 |
<input type="radio" name="restrict-plugin-settings" id="only_admins" value="only_admins" <?php checked( $restrict_settings, 'only_admins' ); ?> />
|
744 |
<?php
|
745 |
-
if (
|
746 |
esc_html_e( 'All superadmins', 'wp-security-audit-log' );
|
747 |
} else {
|
748 |
esc_html_e( 'All administrators', 'wp-security-audit-log' );
|
@@ -761,7 +762,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
761 |
<h3><?php esc_html_e( 'Allow other users to view the activity log', 'wp-security-audit-log' ); ?></h3>
|
762 |
<p class="description">
|
763 |
<?php
|
764 |
-
$is_multisite =
|
765 |
if ( $is_multisite ) {
|
766 |
$section_label = esc_html__( 'By default only super administrators and the child sites\' administrators can view the WordPress activity log. Though you can change this by using the setting below.', 'wp-security-audit-log' );
|
767 |
} else {
|
@@ -928,7 +929,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
928 |
}
|
929 |
|
930 |
// Handle log viewer settings in multisite context.
|
931 |
-
if (
|
932 |
$log_viewer_restrictions = isset( $post_array['restrict-log-viewer'] ) ? sanitize_text_field( $post_array['restrict-log-viewer'] ) : '';
|
933 |
$this->plugin->settings()->set_restrict_log_viewer( $log_viewer_restrictions );
|
934 |
if ( 'only_me' === $log_viewer_restrictions ) {
|
@@ -972,10 +973,12 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
972 |
</p>
|
973 |
|
974 |
<?php
|
|
|
975 |
// Ensure it doesn't load a 2nd time for premium users.
|
976 |
if ( ! wsal_freemius()->can_use_premium_code() ) {
|
977 |
$this->render_retention_settings_table();
|
978 |
}
|
|
|
979 |
?>
|
980 |
|
981 |
<h3><?php esc_html_e( 'What timestamp you would like to see in the WordPress activity log?', 'wp-security-audit-log' ); ?></h3>
|
@@ -1145,9 +1148,8 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
1145 |
$pruning_unit = isset( $post_array['pruning-unit'] ) ? sanitize_text_field( $post_array['pruning-unit'] ) : false;
|
1146 |
$pruning_date = ( ! empty( $pruning_date ) && ! empty( $pruning_unit ) ) ? $pruning_date . ' ' . $pruning_unit : false;
|
1147 |
|
1148 |
-
$
|
1149 |
-
$this->plugin->settings()->
|
1150 |
-
$this->plugin->settings()->set_pruning_unit( $pruning_unit );
|
1151 |
$this->plugin->settings()->set_timezone( $post_array['Timezone'] );
|
1152 |
$this->plugin->settings()->set_type_username( $post_array['type_username'] );
|
1153 |
$this->plugin->settings()->set_wp_backend( isset( $post_array['WPBackend'] ) ? sanitize_text_field( $post_array['WPBackend'] ) : false );
|
@@ -1394,6 +1396,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
1394 |
<th><?php esc_html_e( 'Purge Activity Log', 'wp-security-audit-log' ); ?></th>
|
1395 |
<td>
|
1396 |
<a href="#wsal_purge_activity" class="button-primary"><?php esc_html_e( 'PURGE', 'wp-security-audit-log' ); ?></a>
|
|
|
1397 |
</td>
|
1398 |
</tr>
|
1399 |
</tbody>
|
@@ -1614,6 +1617,12 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
1614 |
alert( "<?php esc_html_e( 'You have to select at least one column!', 'wp-security-audit-log' ); ?>" );
|
1615 |
}
|
1616 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
1617 |
});</script>
|
1618 |
<?php
|
1619 |
}
|
@@ -1667,8 +1676,15 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
1667 |
$get_array = filter_input_array( INPUT_GET );
|
1668 |
$this->check_ajax_request_is_valid( $get_array );
|
1669 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1670 |
echo $this->filter_values_for_searched_term( // phpcs:ignore
|
1671 |
-
|
1672 |
$get_array['term'] // phpcs:ignore
|
1673 |
);
|
1674 |
exit;
|
@@ -1899,8 +1915,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
|
|
1899 |
$nbld = true;
|
1900 |
$pruning_date = '6';
|
1901 |
$pruning_unit = 'months';
|
1902 |
-
$this->plugin->settings()->
|
1903 |
-
$this->plugin->settings()->set_pruning_date_enabled( true );
|
1904 |
$this->plugin->settings()->set_pruning_limit_enabled( false );
|
1905 |
}
|
1906 |
?>
|
149 |
$this->wsal_setting_tabs = $wsal_setting_tabs;
|
150 |
|
151 |
// Get the current tab.
|
152 |
+
$current_tab =( isset( $_GET['tab'] ) ) ? \sanitize_text_field( \wp_unslash( $_GET['tab'] ) ) : '';
|
153 |
$this->current_tab = empty( $current_tab ) ? 'general' : $current_tab;
|
154 |
}
|
155 |
|
274 |
|
275 |
$now = current_time( 'timestamp' ); // phpcs:ignore
|
276 |
$max_sdate = $this->plugin->settings()->get_pruning_date(); // Pruning date.
|
277 |
+
$archiving = $this->plugin->settings()->is_archiving_enabled();
|
278 |
|
279 |
|
280 |
// Calculate limit timestamp.
|
553 |
$label = esc_html__( 'Admin Bar Notification', 'wp-security-audit-log' );
|
554 |
if ( wsal_freemius()->is_free_plan() ) {
|
555 |
$disabled = 'disabled';
|
556 |
+
$label = esc_html__( 'Admin Bar Notification', 'wp-security-audit-log' );
|
557 |
}
|
558 |
?>
|
559 |
<th><label for="admin_bar_notif_on"><?php echo esc_html( $label ); ?></label></th>
|
580 |
$label = esc_html__( 'Admin Bar Notification Updates', 'wp-security-audit-log' );
|
581 |
if ( wsal_freemius()->is_free_plan() ) {
|
582 |
$disabled = 'disabled';
|
583 |
+
$label = esc_html__( 'Admin Bar Notification Updates', 'wp-security-audit-log' );
|
584 |
}
|
585 |
?>
|
586 |
<th><label for="admin_bar_notif_refresh"><?php echo esc_html( $label ); ?></label></th>
|
743 |
<label for="only_admins">
|
744 |
<input type="radio" name="restrict-plugin-settings" id="only_admins" value="only_admins" <?php checked( $restrict_settings, 'only_admins' ); ?> />
|
745 |
<?php
|
746 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
747 |
esc_html_e( 'All superadmins', 'wp-security-audit-log' );
|
748 |
} else {
|
749 |
esc_html_e( 'All administrators', 'wp-security-audit-log' );
|
762 |
<h3><?php esc_html_e( 'Allow other users to view the activity log', 'wp-security-audit-log' ); ?></h3>
|
763 |
<p class="description">
|
764 |
<?php
|
765 |
+
$is_multisite = WpSecurityAuditLog::is_multisite();
|
766 |
if ( $is_multisite ) {
|
767 |
$section_label = esc_html__( 'By default only super administrators and the child sites\' administrators can view the WordPress activity log. Though you can change this by using the setting below.', 'wp-security-audit-log' );
|
768 |
} else {
|
929 |
}
|
930 |
|
931 |
// Handle log viewer settings in multisite context.
|
932 |
+
if ( WpSecurityAuditLog::is_multisite() ) {
|
933 |
$log_viewer_restrictions = isset( $post_array['restrict-log-viewer'] ) ? sanitize_text_field( $post_array['restrict-log-viewer'] ) : '';
|
934 |
$this->plugin->settings()->set_restrict_log_viewer( $log_viewer_restrictions );
|
935 |
if ( 'only_me' === $log_viewer_restrictions ) {
|
973 |
</p>
|
974 |
|
975 |
<?php
|
976 |
+
/* @free:start */
|
977 |
// Ensure it doesn't load a 2nd time for premium users.
|
978 |
if ( ! wsal_freemius()->can_use_premium_code() ) {
|
979 |
$this->render_retention_settings_table();
|
980 |
}
|
981 |
+
/* @free:end */
|
982 |
?>
|
983 |
|
984 |
<h3><?php esc_html_e( 'What timestamp you would like to see in the WordPress activity log?', 'wp-security-audit-log' ); ?></h3>
|
1148 |
$pruning_unit = isset( $post_array['pruning-unit'] ) ? sanitize_text_field( $post_array['pruning-unit'] ) : false;
|
1149 |
$pruning_date = ( ! empty( $pruning_date ) && ! empty( $pruning_unit ) ) ? $pruning_date . ' ' . $pruning_unit : false;
|
1150 |
|
1151 |
+
$pruning_enabled = isset( $post_array['PruneBy'] ) ? 'date' === $post_array['PruneBy'] : '';
|
1152 |
+
$this->plugin->settings()->set_pruning_date_settings( $pruning_enabled, $pruning_date, $pruning_unit );
|
|
|
1153 |
$this->plugin->settings()->set_timezone( $post_array['Timezone'] );
|
1154 |
$this->plugin->settings()->set_type_username( $post_array['type_username'] );
|
1155 |
$this->plugin->settings()->set_wp_backend( isset( $post_array['WPBackend'] ) ? sanitize_text_field( $post_array['WPBackend'] ) : false );
|
1396 |
<th><?php esc_html_e( 'Purge Activity Log', 'wp-security-audit-log' ); ?></th>
|
1397 |
<td>
|
1398 |
<a href="#wsal_purge_activity" class="button-primary"><?php esc_html_e( 'PURGE', 'wp-security-audit-log' ); ?></a>
|
1399 |
+
<span class="notice purge-notice notice-success" style="display: none; margin-left: 10px; padding: 6px 10px;"><?php esc_html_e( 'Activity log successfully purged', 'wp-security-audit-log' ); ?></span>
|
1400 |
</td>
|
1401 |
</tr>
|
1402 |
</tbody>
|
1617 |
alert( "<?php esc_html_e( 'You have to select at least one column!', 'wp-security-audit-log' ); ?>" );
|
1618 |
}
|
1619 |
});
|
1620 |
+
jQuery( 'body' ).on( 'click', '.remodal-confirm', function ( e ) {
|
1621 |
+
jQuery( '.purge-notice' ).fadeIn(500);
|
1622 |
+
setTimeout(function() {
|
1623 |
+
jQuery( '.purge-notice' ).fadeOut(500);
|
1624 |
+
}, 4000);
|
1625 |
+
});
|
1626 |
});</script>
|
1627 |
<?php
|
1628 |
}
|
1676 |
$get_array = filter_input_array( INPUT_GET );
|
1677 |
$this->check_ajax_request_is_valid( $get_array );
|
1678 |
|
1679 |
+
$result = array_map(
|
1680 |
+
function ( $item ) {
|
1681 |
+
return ucfirst( strtolower( str_replace( 'WSAL_', '', $item ) ) );
|
1682 |
+
},
|
1683 |
+
array_keys( WSAL_ConstantManager::get_severities() )
|
1684 |
+
);
|
1685 |
+
|
1686 |
echo $this->filter_values_for_searched_term( // phpcs:ignore
|
1687 |
+
$result,
|
1688 |
$get_array['term'] // phpcs:ignore
|
1689 |
);
|
1690 |
exit;
|
1915 |
$nbld = true;
|
1916 |
$pruning_date = '6';
|
1917 |
$pruning_unit = 'months';
|
1918 |
+
$this->plugin->settings()->set_pruning_date_settings( true, $pruning_date . ' ' . $pruning_unit, $pruning_unit );
|
|
|
1919 |
$this->plugin->settings()->set_pruning_limit_enabled( false );
|
1920 |
}
|
1921 |
?>
|
classes/Views/SetupWizard.php
CHANGED
@@ -149,7 +149,8 @@ final class WSAL_Views_SetupWizard {
|
|
149 |
*/
|
150 |
public function setup_page() {
|
151 |
// Get page argument from $_GET array.
|
152 |
-
|
|
|
153 |
if ( empty( $page ) || 'wsal-setup' !== $page || ! ( current_user_can( 'manage_options' ) ) ) {
|
154 |
return;
|
155 |
}
|
149 |
*/
|
150 |
public function setup_page() {
|
151 |
// Get page argument from $_GET array.
|
152 |
+
|
153 |
+
$page = ( isset( $_GET['page'] ) ) ? \sanitize_text_field( \wp_unslash( $_GET['page'] ) ) : '';
|
154 |
if ( empty( $page ) || 'wsal-setup' !== $page || ! ( current_user_can( 'manage_options' ) ) ) {
|
155 |
return;
|
156 |
}
|
classes/Views/ToggleAlerts.php
CHANGED
@@ -228,6 +228,9 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
|
|
228 |
<option value="all"><?php esc_html_e( 'All categories', 'wp-security-audit-log' ); ?></option>
|
229 |
</select>
|
230 |
</div>
|
|
|
|
|
|
|
231 |
</div>
|
232 |
|
233 |
<table id="event-toggle-table">
|
@@ -667,12 +670,24 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
|
|
667 |
border: 1px solid #ddd;
|
668 |
font-size: 18px;
|
669 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
670 |
|
671 |
#event-toggle-table th, #event-toggle-table td {
|
672 |
text-align: left;
|
673 |
padding: 12px;
|
674 |
}
|
675 |
|
|
|
|
|
|
|
|
|
676 |
#event-toggle-table tr {
|
677 |
border-bottom: 1px solid #ddd;
|
678 |
}
|
@@ -750,6 +765,10 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
|
|
750 |
}
|
751 |
}
|
752 |
|
|
|
|
|
|
|
|
|
753 |
jQuery(document).ready(function(){
|
754 |
var scrollHeight = jQuery(document).scrollTop();
|
755 |
// tab handling code
|
@@ -812,13 +831,14 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
|
|
812 |
// Display a specific category based on browser hash.
|
813 |
var hash = window.location.hash;
|
814 |
jQuery('ul'+hash+':first').show();
|
815 |
-
|
816 |
if (window.location.href.indexOf( '#cat-' ) > -1) {
|
817 |
var hash = window.location.hash.toUpperCase();
|
818 |
hash = hash.replace('#CAT-', '');
|
819 |
-
|
|
|
820 |
var title = jQuery( this ).attr( 'data-alert-cat').toUpperCase();
|
821 |
-
if ( title == hash
|
|
|
822 |
jQuery( this ).css( 'display', '' );
|
823 |
} else {
|
824 |
jQuery( this ).css( 'display', 'none' );
|
@@ -844,6 +864,20 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
|
|
844 |
}
|
845 |
});
|
846 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
847 |
// Lovely tooltop.s
|
848 |
jQuery( '#event-toggle-table tr' ).darkTooltip( {
|
849 |
animation: 'fadeIn',
|
228 |
<option value="all"><?php esc_html_e( 'All categories', 'wp-security-audit-log' ); ?></option>
|
229 |
</select>
|
230 |
</div>
|
231 |
+
<div class="choose">
|
232 |
+
<p class="submit"><input type="submit" name="submit" id="top_submit" class="button button-primary" value="<?php echo esc_attr( __( 'Save Changes', 'wp-security-audit-log' ) ); ?>"></p>
|
233 |
+
</div>
|
234 |
</div>
|
235 |
|
236 |
<table id="event-toggle-table">
|
670 |
border: 1px solid #ddd;
|
671 |
font-size: 18px;
|
672 |
}
|
673 |
+
#event-toggle-table > thead, #event-toggle-table > thead:hover, #event-toggle-table > thead tr.header, #event-toggle-table > thead tr:hover {
|
674 |
+
background: #2c3338 !important;
|
675 |
+
color: #fff !important;
|
676 |
+
}
|
677 |
+
|
678 |
+
#event-toggle-table > thead * {
|
679 |
+
color: #fff;
|
680 |
+
}
|
681 |
|
682 |
#event-toggle-table th, #event-toggle-table td {
|
683 |
text-align: left;
|
684 |
padding: 12px;
|
685 |
}
|
686 |
|
687 |
+
.choose input[type=submit] {
|
688 |
+
margin-left: 10px;
|
689 |
+
}
|
690 |
+
|
691 |
#event-toggle-table tr {
|
692 |
border-bottom: 1px solid #ddd;
|
693 |
}
|
765 |
}
|
766 |
}
|
767 |
|
768 |
+
function isEmpty( el ){
|
769 |
+
return !$.trim(el.html())
|
770 |
+
}
|
771 |
+
|
772 |
jQuery(document).ready(function(){
|
773 |
var scrollHeight = jQuery(document).scrollTop();
|
774 |
// tab handling code
|
831 |
// Display a specific category based on browser hash.
|
832 |
var hash = window.location.hash;
|
833 |
jQuery('ul'+hash+':first').show();
|
|
|
834 |
if (window.location.href.indexOf( '#cat-' ) > -1) {
|
835 |
var hash = window.location.hash.toUpperCase();
|
836 |
hash = hash.replace('#CAT-', '');
|
837 |
+
hash = hash.replace('-', ' ');
|
838 |
+
jQuery('[data-alert-cat]').each( function( index, value ) {
|
839 |
var title = jQuery( this ).attr( 'data-alert-cat').toUpperCase();
|
840 |
+
if ( title == hash ) {
|
841 |
+
jQuery('#filter-cat [value="'+ jQuery( this ).attr( 'data-alert-cat') +'"]').attr('selected','selected');
|
842 |
jQuery( this ).css( 'display', '' );
|
843 |
} else {
|
844 |
jQuery( this ).css( 'display', 'none' );
|
864 |
}
|
865 |
});
|
866 |
|
867 |
+
jQuery('#event-toggle-table tr').each( function( index, value ) {
|
868 |
+
var td = jQuery( this ).find( 'td:first-of-type' );
|
869 |
+
if ( jQuery.trim( jQuery( td ).html() ) == '' ) {
|
870 |
+
jQuery( this ).prev().css( 'border-bottom', '1px solid #fff');
|
871 |
+
}
|
872 |
+
});
|
873 |
+
|
874 |
+
jQuery('#event-toggle-table tr.disabled').each( function( index, value ) {
|
875 |
+
var td = jQuery( this ).next().find( 'td:first-of-type' );
|
876 |
+
if ( jQuery.trim( jQuery( td ).html() ) == '' ) {
|
877 |
+
jQuery( td ).parent().addClass( 'disabled' );
|
878 |
+
}
|
879 |
+
});
|
880 |
+
|
881 |
// Lovely tooltop.s
|
882 |
jQuery( '#event-toggle-table tr' ).darkTooltip( {
|
883 |
animation: 'fadeIn',
|
classes/Views/addons/html-view.php
CHANGED
@@ -17,21 +17,35 @@ $utm_params = array(
|
|
17 |
'utm_content' => 'sessions',
|
18 |
);
|
19 |
|
|
|
|
|
|
|
|
|
20 |
switch ( $this->hook_suffix ) {
|
21 |
case 'wp-activity-log_page_wsal-loginusers':
|
22 |
$utm_params['utm_content'] = 'sessions';
|
|
|
|
|
23 |
break;
|
24 |
case 'wp-activity-log_page_wsal-reports':
|
25 |
$utm_params['utm_content'] = 'reports';
|
|
|
|
|
26 |
break;
|
27 |
case 'wp-activity-log_page_wsal-emailnotifications':
|
28 |
$utm_params['utm_content'] = 'notifications';
|
|
|
|
|
29 |
break;
|
30 |
case 'wp-activity-log_page_wsal-externaldb':
|
31 |
$utm_params['utm_content'] = 'integrations';
|
|
|
|
|
32 |
break;
|
33 |
case 'wp-activity-log_page_wsal-search':
|
34 |
$utm_params['utm_content'] = 'search';
|
|
|
|
|
35 |
break;
|
36 |
default:
|
37 |
// Fallback for any other hook suffix would go here.
|
@@ -43,31 +57,18 @@ $more_info = add_query_arg(
|
|
43 |
'https://wpactivitylog.com/features/'
|
44 |
);
|
45 |
|
46 |
-
//
|
47 |
-
$
|
48 |
-
|
49 |
-
|
50 |
-
'trial' => 'true',
|
51 |
);
|
|
|
52 |
|
53 |
-
|
54 |
-
$
|
55 |
-
|
56 |
-
|
57 |
|
58 |
-
// If user is not super admin and website is multisite then change the URL.
|
59 |
-
if ( $this->plugin->is_multisite() && ! is_super_admin() ) {
|
60 |
-
$buy_now = 'https://wpactivitylog.com/pricing/';
|
61 |
-
$trial_link = 'https://wpactivitylog.com/pricing/';
|
62 |
-
$buy_now_target = ' target="_blank"';
|
63 |
-
} elseif ( $this->plugin->is_multisite() && is_super_admin() ) {
|
64 |
-
$buy_now = add_query_arg( 'page', 'wsal-auditlog-pricing', network_admin_url( 'admin.php' ) );
|
65 |
-
$trial_link = add_query_arg( $trial_args, network_admin_url( 'admin.php' ) );
|
66 |
-
} elseif ( $this->plugin->is_multisite() && ! current_user_can( 'manage_options' ) ) {
|
67 |
-
$buy_now = 'https://wpactivitylog.com/pricing/';
|
68 |
-
$trial_link = 'https://wpactivitylog.com/pricing/';
|
69 |
-
$buy_now_target = ' target="_blank"';
|
70 |
-
}
|
71 |
?>
|
72 |
|
73 |
<div class="user-login-row">
|
17 |
'utm_content' => 'sessions',
|
18 |
);
|
19 |
|
20 |
+
$buy_now_utm_params = $utm_params;
|
21 |
+
|
22 |
+
$trial_link_utm_params = $utm_params;
|
23 |
+
|
24 |
switch ( $this->hook_suffix ) {
|
25 |
case 'wp-activity-log_page_wsal-loginusers':
|
26 |
$utm_params['utm_content'] = 'sessions';
|
27 |
+
$buy_now_utm_params['utm_content'] = 'upgrade+now+loginusers';
|
28 |
+
$trial_link_utm_params['utm_content'] = 'get+trial+loginusers';
|
29 |
break;
|
30 |
case 'wp-activity-log_page_wsal-reports':
|
31 |
$utm_params['utm_content'] = 'reports';
|
32 |
+
$buy_now_utm_params['utm_content'] = 'upgrade+now+reports';
|
33 |
+
$trial_link_utm_params['utm_content'] = 'get+trial+reports';
|
34 |
break;
|
35 |
case 'wp-activity-log_page_wsal-emailnotifications':
|
36 |
$utm_params['utm_content'] = 'notifications';
|
37 |
+
$buy_now_utm_params['utm_content'] = 'upgrade+now+notifications';
|
38 |
+
$trial_link_utm_params['utm_content'] = 'get+trial+notifications';
|
39 |
break;
|
40 |
case 'wp-activity-log_page_wsal-externaldb':
|
41 |
$utm_params['utm_content'] = 'integrations';
|
42 |
+
$buy_now_utm_params['utm_content'] = 'upgrade+now+integrations';
|
43 |
+
$trial_link_utm_params['utm_content'] = 'get+trial+integrations';
|
44 |
break;
|
45 |
case 'wp-activity-log_page_wsal-search':
|
46 |
$utm_params['utm_content'] = 'search';
|
47 |
+
$buy_now_utm_params['utm_content'] = 'upgrade+now+search';
|
48 |
+
$trial_link_utm_params['utm_content'] = 'get+trial+search';
|
49 |
break;
|
50 |
default:
|
51 |
// Fallback for any other hook suffix would go here.
|
57 |
'https://wpactivitylog.com/features/'
|
58 |
);
|
59 |
|
60 |
+
// Buy Now button link.
|
61 |
+
$buy_now = add_query_arg(
|
62 |
+
$buy_now_utm_params,
|
63 |
+
'https://wpactivitylog.com/pricing/'
|
|
|
64 |
);
|
65 |
+
$buy_now_target = ' target="_blank"';
|
66 |
|
67 |
+
$trial_link = add_query_arg(
|
68 |
+
$trial_link_utm_params,
|
69 |
+
'https://wpactivitylog.com/trial-premium-edition-plugin/'
|
70 |
+
);
|
71 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
?>
|
73 |
|
74 |
<div class="user-login-row">
|
css/dist/wsal-wizard.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
body{
|
1 |
+
body{margin:65px auto 24px;-webkit-box-shadow:none;box-shadow:none;background:#f1f1f1;padding:0;border:none}#wsal-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wsal-logo img{width:400px}.steps{display:flex;list-style-type:none;margin:0;padding:0 0 25px;text-align:center}.steps li{flex:1 0 auto;font-weight:700;margin:0 0 5px;color:#b4b9be;padding-bottom:15px;position:relative}.steps li.is-active{color:#009344}.steps li.is-active::before{border:4px solid #009344;background:#009344}.steps li::before{content:"";border:4px solid #b4b9be;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#b4b9be}.wsal-setup-content{box-shadow:0 1px 3px rgba(0, 0, 0, 0.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wsal-setup-content h4,.wsal-setup-content fieldset{line-height:1.5}.wsal-setup-content .addon-wrapper{border:1px solid #eee;padding:15px;display:flex;margin-bottom:15px}.wsal-setup-content .addon-wrapper:hover{border-color:#ccc}.wsal-setup-content .addon-wrapper img{align-self:center;max-width:200px;margin-right:15px}.wsal-setup-actions{text-align:center}.wsal-setup-actions .button{box-shadow:none;font-size:14px;height:auto;padding:8px 20px;min-width:12em;min-width:auto;transition:0.1s all linear}.wsal-setup-actions .button-primary{background-color:#009344;border-color:#009344;box-shadow:none;text-shadow:none;margin:0;opacity:1}.wsal-setup-actions .button-primary:hover,.wsal-setup-actions .button-primary:focus{background:#00ad50;border-color:#00ad50;box-shadow:none;color:#fff}.wsal-setup-footer{text-align:center}.wsal-setup-footer a{color:#009344;font-size:14px;text-decoration:none}.wsal-setup-form label[for="editor-users-box"],.wsal-setup-form label[for="editor-roles-box"],.wsal-setup-form label[for="exuser-query-box"],.wsal-setup-form label[for="exrole-query-box"],.wsal-setup-form label[for="ipaddr-query-box"]{display:inline-block;margin:5px 0}.wsal-setup-form label[for="editor-users-box"] span,.wsal-setup-form label[for="editor-roles-box"] span,.wsal-setup-form label[for="exuser-query-box"] span,.wsal-setup-form label[for="exrole-query-box"] span,.wsal-setup-form label[for="ipaddr-query-box"] span{display:inline-block;min-width:100px}.sectoken-user,.sectoken-role,.sectoken-ip,.sectoken-other{display:inline-block;border-width:1px;border-style:solid;padding:2px 4px;margin:2px 0 0 2px;border-radius:3px;cursor:default;line-height:1.3;font-size:14px}.sectoken-user a,.sectoken-role a,.sectoken-ip a,.sectoken-other a{text-decoration:none;font-size:12px;font-weight:bold;color:#FFF;margin-left:2px;background:#BBB;border-radius:25px;height:14px;display:inline-block;vertical-align:middle;width:14px;text-align:center;line-height:12px}.sectoken-user a:hover,.sectoken-role a:hover,.sectoken-ip a:hover,.sectoken-other a:hover{background:#FB9}.sectoken-other{display:table;border-collapse:separate}.sectoken-role{background:#EFE;border-color:#5B5}.sectoken-user{background:#EFF;border-color:#5BE}.sectoken-ip{background:#FFE;border-color:#ED5}.sectoken-other{background:#FFE;border-color:#ED5}p.description{font-size:13px;font-style:italic}
|
css/src/simple-lightbox.css
ADDED
@@ -0,0 +1,231 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
By André Rinas, www.andrerinas.de
|
3 |
+
Documentation, www.simplelightbox.de
|
4 |
+
Available for use under the MIT License
|
5 |
+
Version 2.7.0
|
6 |
+
*/
|
7 |
+
body.hidden-scroll {
|
8 |
+
overflow: hidden; }
|
9 |
+
|
10 |
+
.sl-overlay {
|
11 |
+
position: fixed;
|
12 |
+
left: 0;
|
13 |
+
right: 0;
|
14 |
+
top: 0;
|
15 |
+
bottom: 0;
|
16 |
+
background: #fff;
|
17 |
+
opacity: 0.7;
|
18 |
+
display: none;
|
19 |
+
z-index: 1035; }
|
20 |
+
|
21 |
+
.sl-wrapper {
|
22 |
+
z-index: 1040;
|
23 |
+
width: 100%;
|
24 |
+
height: 100%;
|
25 |
+
left: 0;
|
26 |
+
top: 0;
|
27 |
+
position: fixed; }
|
28 |
+
.sl-wrapper * {
|
29 |
+
box-sizing: border-box; }
|
30 |
+
.sl-wrapper button {
|
31 |
+
border: 0 none;
|
32 |
+
background: transparent;
|
33 |
+
font-size: 28px;
|
34 |
+
padding: 0;
|
35 |
+
cursor: pointer; }
|
36 |
+
.sl-wrapper button:hover {
|
37 |
+
opacity: 0.7; }
|
38 |
+
.sl-wrapper .sl-close {
|
39 |
+
display: none;
|
40 |
+
position: fixed;
|
41 |
+
right: 30px;
|
42 |
+
top: 30px;
|
43 |
+
z-index: 10060;
|
44 |
+
margin-top: -14px;
|
45 |
+
margin-right: -14px;
|
46 |
+
height: 44px;
|
47 |
+
width: 44px;
|
48 |
+
line-height: 44px;
|
49 |
+
font-family: Arial, Baskerville, monospace;
|
50 |
+
color: #000;
|
51 |
+
font-size: 3rem; }
|
52 |
+
.sl-wrapper .sl-counter {
|
53 |
+
display: none;
|
54 |
+
position: fixed;
|
55 |
+
top: 30px;
|
56 |
+
left: 30px;
|
57 |
+
z-index: 1060;
|
58 |
+
color: #000;
|
59 |
+
font-size: 1rem; }
|
60 |
+
.sl-wrapper .sl-navigation {
|
61 |
+
width: 100%;
|
62 |
+
display: none; }
|
63 |
+
.sl-wrapper .sl-navigation button {
|
64 |
+
position: fixed;
|
65 |
+
top: 50%;
|
66 |
+
margin-top: -22px;
|
67 |
+
height: 44px;
|
68 |
+
width: 22px;
|
69 |
+
line-height: 44px;
|
70 |
+
text-align: center;
|
71 |
+
display: block;
|
72 |
+
z-index: 10060;
|
73 |
+
font-family: Arial, Baskerville, monospace;
|
74 |
+
color: #000; }
|
75 |
+
.sl-wrapper .sl-navigation button.sl-next {
|
76 |
+
right: 5px;
|
77 |
+
font-size: 2rem; }
|
78 |
+
.sl-wrapper .sl-navigation button.sl-prev {
|
79 |
+
left: 5px;
|
80 |
+
font-size: 2rem; }
|
81 |
+
@media (min-width: 35.5em) {
|
82 |
+
.sl-wrapper .sl-navigation button {
|
83 |
+
width: 44px; }
|
84 |
+
.sl-wrapper .sl-navigation button.sl-next {
|
85 |
+
right: 10px;
|
86 |
+
font-size: 3rem; }
|
87 |
+
.sl-wrapper .sl-navigation button.sl-prev {
|
88 |
+
left: 10px;
|
89 |
+
font-size: 3rem; } }
|
90 |
+
@media (min-width: 50em) {
|
91 |
+
.sl-wrapper .sl-navigation button {
|
92 |
+
width: 44px; }
|
93 |
+
.sl-wrapper .sl-navigation button.sl-next {
|
94 |
+
right: 20px;
|
95 |
+
font-size: 3rem; }
|
96 |
+
.sl-wrapper .sl-navigation button.sl-prev {
|
97 |
+
left: 20px;
|
98 |
+
font-size: 3rem; } }
|
99 |
+
.sl-wrapper.sl-dir-rtl .sl-navigation {
|
100 |
+
direction: ltr; }
|
101 |
+
.sl-wrapper .sl-image {
|
102 |
+
position: fixed;
|
103 |
+
-ms-touch-action: none;
|
104 |
+
touch-action: none;
|
105 |
+
z-index: 10000; }
|
106 |
+
.sl-wrapper .sl-image img {
|
107 |
+
margin: 0;
|
108 |
+
padding: 0;
|
109 |
+
display: block;
|
110 |
+
border: 0 none;
|
111 |
+
width: 100%;
|
112 |
+
height: auto; }
|
113 |
+
@media (min-width: 35.5em) {
|
114 |
+
.sl-wrapper .sl-image img {
|
115 |
+
border: 0 none; } }
|
116 |
+
@media (min-width: 50em) {
|
117 |
+
.sl-wrapper .sl-image img {
|
118 |
+
border: 0 none; } }
|
119 |
+
.sl-wrapper .sl-image iframe {
|
120 |
+
background: #000;
|
121 |
+
border: 0 none; }
|
122 |
+
@media (min-width: 35.5em) {
|
123 |
+
.sl-wrapper .sl-image iframe {
|
124 |
+
border: 0 none; } }
|
125 |
+
@media (min-width: 50em) {
|
126 |
+
.sl-wrapper .sl-image iframe {
|
127 |
+
border: 0 none; } }
|
128 |
+
.sl-wrapper .sl-image .sl-caption {
|
129 |
+
display: none;
|
130 |
+
padding: 10px;
|
131 |
+
color: #fff;
|
132 |
+
background: rgba(0, 0, 0, 0.8);
|
133 |
+
font-size: 1rem;
|
134 |
+
position: absolute;
|
135 |
+
bottom: 0;
|
136 |
+
left: 0;
|
137 |
+
right: 0; }
|
138 |
+
.sl-wrapper .sl-image .sl-caption.pos-top {
|
139 |
+
bottom: auto;
|
140 |
+
top: 0; }
|
141 |
+
.sl-wrapper .sl-image .sl-caption.pos-outside {
|
142 |
+
bottom: auto; }
|
143 |
+
.sl-wrapper .sl-image .sl-download {
|
144 |
+
display: none;
|
145 |
+
position: absolute;
|
146 |
+
bottom: 5px;
|
147 |
+
right: 5px;
|
148 |
+
color: #000;
|
149 |
+
z-index: 1060; }
|
150 |
+
|
151 |
+
.sl-spinner {
|
152 |
+
display: none;
|
153 |
+
border: 5px solid #333;
|
154 |
+
border-radius: 40px;
|
155 |
+
height: 40px;
|
156 |
+
left: 50%;
|
157 |
+
margin: -20px 0 0 -20px;
|
158 |
+
opacity: 0;
|
159 |
+
position: fixed;
|
160 |
+
top: 50%;
|
161 |
+
width: 40px;
|
162 |
+
z-index: 1007;
|
163 |
+
-webkit-animation: pulsate 1s ease-out infinite;
|
164 |
+
-moz-animation: pulsate 1s ease-out infinite;
|
165 |
+
-ms-animation: pulsate 1s ease-out infinite;
|
166 |
+
-o-animation: pulsate 1s ease-out infinite;
|
167 |
+
animation: pulsate 1s ease-out infinite; }
|
168 |
+
|
169 |
+
.sl-scrollbar-measure {
|
170 |
+
position: absolute;
|
171 |
+
top: -9999px;
|
172 |
+
width: 50px;
|
173 |
+
height: 50px;
|
174 |
+
overflow: scroll; }
|
175 |
+
|
176 |
+
.sl-transition {
|
177 |
+
transition: -moz-transform ease 200ms;
|
178 |
+
transition: -ms-transform ease 200ms;
|
179 |
+
transition: -o-transform ease 200ms;
|
180 |
+
transition: -webkit-transform ease 200ms;
|
181 |
+
transition: transform ease 200ms; }
|
182 |
+
|
183 |
+
@-webkit-keyframes pulsate {
|
184 |
+
0% {
|
185 |
+
transform: scale(0.1);
|
186 |
+
opacity: 0.0; }
|
187 |
+
50% {
|
188 |
+
opacity: 1; }
|
189 |
+
100% {
|
190 |
+
transform: scale(1.2);
|
191 |
+
opacity: 0; } }
|
192 |
+
|
193 |
+
@keyframes pulsate {
|
194 |
+
0% {
|
195 |
+
transform: scale(0.1);
|
196 |
+
opacity: 0.0; }
|
197 |
+
50% {
|
198 |
+
opacity: 1; }
|
199 |
+
100% {
|
200 |
+
transform: scale(1.2);
|
201 |
+
opacity: 0; } }
|
202 |
+
|
203 |
+
@-moz-keyframes pulsate {
|
204 |
+
0% {
|
205 |
+
transform: scale(0.1);
|
206 |
+
opacity: 0.0; }
|
207 |
+
50% {
|
208 |
+
opacity: 1; }
|
209 |
+
100% {
|
210 |
+
transform: scale(1.2);
|
211 |
+
opacity: 0; } }
|
212 |
+
|
213 |
+
@-o-keyframes pulsate {
|
214 |
+
0% {
|
215 |
+
transform: scale(0.1);
|
216 |
+
opacity: 0.0; }
|
217 |
+
50% {
|
218 |
+
opacity: 1; }
|
219 |
+
100% {
|
220 |
+
transform: scale(1.2);
|
221 |
+
opacity: 0; } }
|
222 |
+
|
223 |
+
@-ms-keyframes pulsate {
|
224 |
+
0% {
|
225 |
+
transform: scale(0.1);
|
226 |
+
opacity: 0.0; }
|
227 |
+
50% {
|
228 |
+
opacity: 1; }
|
229 |
+
100% {
|
230 |
+
transform: scale(1.2);
|
231 |
+
opacity: 0; } }
|
css/src/simple-lightbox.min.css
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
By André Rinas, www.andrerinas.de
|
3 |
+
Documentation, www.simplelightbox.de
|
4 |
+
Available for use under the MIT License
|
5 |
+
Version 2.7.0
|
6 |
+
*/
|
7 |
+
body.hidden-scroll{overflow:hidden}.sl-overlay{position:fixed;left:0;right:0;top:0;bottom:0;background:#fff;opacity:.7;display:none;z-index:1035}.sl-wrapper{z-index:1040;width:100%;height:100%;left:0;top:0;position:fixed}.sl-wrapper *{box-sizing:border-box}.sl-wrapper button{border:0 none;background:transparent;font-size:28px;padding:0;cursor:pointer}.sl-wrapper button:hover{opacity:0.7}.sl-wrapper .sl-close{display:none;position:fixed;right:30px;top:30px;z-index:10060;margin-top:-14px;margin-right:-14px;height:44px;width:44px;line-height:44px;font-family:Arial,Baskerville,monospace;color:#000;font-size:3rem}.sl-wrapper .sl-counter{display:none;position:fixed;top:30px;left:30px;z-index:1060;color:#000;font-size:1rem}.sl-wrapper .sl-navigation{width:100%;display:none}.sl-wrapper .sl-navigation button{position:fixed;top:50%;margin-top:-22px;height:44px;width:22px;line-height:44px;text-align:center;display:block;z-index:10060;font-family:Arial,Baskerville,monospace;color:#000}.sl-wrapper .sl-navigation button.sl-next{right:5px;font-size:2rem}.sl-wrapper .sl-navigation button.sl-prev{left:5px;font-size:2rem}@media (min-width: 35.5em){.sl-wrapper .sl-navigation button{width:44px}.sl-wrapper .sl-navigation button.sl-next{right:10px;font-size:3rem}.sl-wrapper .sl-navigation button.sl-prev{left:10px;font-size:3rem}}@media (min-width: 50em){.sl-wrapper .sl-navigation button{width:44px}.sl-wrapper .sl-navigation button.sl-next{right:20px;font-size:3rem}.sl-wrapper .sl-navigation button.sl-prev{left:20px;font-size:3rem}}.sl-wrapper.sl-dir-rtl .sl-navigation{direction:ltr}.sl-wrapper .sl-image{position:fixed;-ms-touch-action:none;touch-action:none;z-index:10000}.sl-wrapper .sl-image img{margin:0;padding:0;display:block;border:0 none;width:100%;height:auto}@media (min-width: 35.5em){.sl-wrapper .sl-image img{border:0 none}}@media (min-width: 50em){.sl-wrapper .sl-image img{border:0 none}}.sl-wrapper .sl-image iframe{background:#000;border:0 none}@media (min-width: 35.5em){.sl-wrapper .sl-image iframe{border:0 none}}@media (min-width: 50em){.sl-wrapper .sl-image iframe{border:0 none}}.sl-wrapper .sl-image .sl-caption{display:none;padding:10px;color:#fff;background:rgba(0,0,0,0.8);font-size:1rem;position:absolute;bottom:0;left:0;right:0}.sl-wrapper .sl-image .sl-caption.pos-top{bottom:auto;top:0}.sl-wrapper .sl-image .sl-caption.pos-outside{bottom:auto}.sl-wrapper .sl-image .sl-download{display:none;position:absolute;bottom:5px;right:5px;color:#000;z-index:1060}.sl-spinner{display:none;border:5px solid #333;border-radius:40px;height:40px;left:50%;margin:-20px 0 0 -20px;opacity:0;position:fixed;top:50%;width:40px;z-index:1007;-webkit-animation:pulsate 1s ease-out infinite;-moz-animation:pulsate 1s ease-out infinite;-ms-animation:pulsate 1s ease-out infinite;-o-animation:pulsate 1s ease-out infinite;animation:pulsate 1s ease-out infinite}.sl-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.sl-transition{transition:-moz-transform ease 200ms;transition:-ms-transform ease 200ms;transition:-o-transform ease 200ms;transition:-webkit-transform ease 200ms;transition:transform ease 200ms}@-webkit-keyframes pulsate{0%{transform:scale(0.1);opacity:0.0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@keyframes pulsate{0%{transform:scale(0.1);opacity:0.0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@-moz-keyframes pulsate{0%{transform:scale(0.1);opacity:0.0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@-o-keyframes pulsate{0%{transform:scale(0.1);opacity:0.0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@-ms-keyframes pulsate{0%{transform:scale(0.1);opacity:0.0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}
|
defaults.php
CHANGED
@@ -702,6 +702,20 @@ function wsaldefaults_wsal_init() {
|
|
702 |
'post',
|
703 |
'modified',
|
704 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
705 |
),
|
706 |
|
707 |
esc_html__( 'Tags', 'wp-security-audit-log' ) => array(
|
@@ -2449,7 +2463,7 @@ function wsaldefaults_wsal_init() {
|
|
2449 |
6039,
|
2450 |
WSAL_CRITICAL,
|
2451 |
esc_html__( 'Deleted all the data of a specific type from the activity log.', 'wp-security-audit-log' ),
|
2452 |
-
esc_html__( 'Deleted all the data about the %
|
2453 |
array(),
|
2454 |
array(),
|
2455 |
'wp-activity-log',
|
702 |
'post',
|
703 |
'modified',
|
704 |
),
|
705 |
+
array(
|
706 |
+
2133,
|
707 |
+
WSAL_INFORMATIONAL,
|
708 |
+
esc_html__( 'Ownership of the post has changed', 'wp-security-audit-log' ),
|
709 |
+
esc_html__( 'Has taken over the post %PostTitle% from %user%', 'wp-security-audit-log' ),
|
710 |
+
array(
|
711 |
+
esc_html__( 'Post ID', 'wp-security-audit-log' ) => '%PostID%',
|
712 |
+
esc_html__( 'Post type', 'wp-security-audit-log' ) => '%PostType%',
|
713 |
+
esc_html__( 'Post status', 'wp-security-audit-log' ) => '%PostStatus%',
|
714 |
+
),
|
715 |
+
wsaldefaults_build_links( array( 'EditorLinkPost', 'PostUrlIfPublished' ) ),
|
716 |
+
'post',
|
717 |
+
'modified',
|
718 |
+
),
|
719 |
),
|
720 |
|
721 |
esc_html__( 'Tags', 'wp-security-audit-log' ) => array(
|
2463 |
6039,
|
2464 |
WSAL_CRITICAL,
|
2465 |
esc_html__( 'Deleted all the data of a specific type from the activity log.', 'wp-security-audit-log' ),
|
2466 |
+
esc_html__( 'Deleted all the data about the %deleted_data_type% %deleted_data% from the activity log.', 'wp-security-audit-log' ),
|
2467 |
array(),
|
2468 |
array(),
|
2469 |
'wp-activity-log',
|
js/auditlog.js
CHANGED
@@ -576,7 +576,8 @@ jQuery( document ).ready( function() {
|
|
576 |
});
|
577 |
});
|
578 |
|
579 |
-
|
|
|
580 |
var elm = jQuery( this );
|
581 |
var full_text = elm.data( 'shortened-text' );
|
582 |
elm.parent().find( 'span' ).text( full_text );
|
576 |
});
|
577 |
});
|
578 |
|
579 |
+
jQuery( document ).on( 'click', '[data-shortened-text]', function(event) {
|
580 |
+
event.preventDefault();
|
581 |
var elm = jQuery( this );
|
582 |
var full_text = elm.data( 'shortened-text' );
|
583 |
elm.parent().find( 'span' ).text( full_text );
|
js/common.js
CHANGED
@@ -140,4 +140,13 @@ jQuery( document ).ready( function() {
|
|
140 |
} else {
|
141 |
jQuery('.submit #submit').show(0);
|
142 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
});
|
140 |
} else {
|
141 |
jQuery('.submit #submit').show(0);
|
142 |
}
|
143 |
+
|
144 |
+
// Change URL and attributes for 'Upgrade' admin menu link.
|
145 |
+
if ( jQuery( '.fs-submenu-item.wp-security-audit-log.pricing' ).length ) {
|
146 |
+
var linkItem = jQuery( '.fs-submenu-item.wp-security-audit-log.pricing' ).parent();
|
147 |
+
jQuery( linkItem ).attr( {
|
148 |
+
target: '_blank',
|
149 |
+
href: 'https://wpactivitylog.com/pricing/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=upgrade+now+menu',
|
150 |
+
} );
|
151 |
+
}
|
152 |
});
|
js/dist/wsal-wizard.js
CHANGED
@@ -1 +1,7 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
try{
|
3 |
+
jQuery(document).ready(function(){jQuery('#editor-users-add, #editor-roles-add, #exuser-query-add, #exrole-query-add, #ipaddr-query-add').click(function(){const type=jQuery(this).attr('id').substr(0,6);const tokenType=jQuery(this).attr('id').substr(7,5);const tokenValue=jQuery.trim(jQuery(`#${type}-${tokenType}-box`).val());const existing=jQuery(`#${type}-list input`).filter(function(){return this.value===tokenValue;});if(!tokenValue||existing.length){return;}
|
4 |
+
jQuery(`#${type}-${tokenType}-box, #${type}-${tokenType}-add`).attr('disabled',true);jQuery.ajax({type:'POST',url:wsalData.ajaxURL,async:true,data:{action:'setup_check_security_token',token:tokenValue,nonce:wsalData.nonce},dataType:'json',success:function(data){jQuery(`#${type}-${tokenType}-box, #${type}-${tokenType}-add`).removeAttr('disabled');jQuery(`#${type}-${tokenType}-box`).val('');if(data.success){if('other'===data.tokenType&&('users'===tokenType||'exuser'===type)){alert(wsalData.usersError);return;}else if('other'===data.tokenType&&('roles'===tokenType||'exrole'===type)){alert(wsalData.rolesError);return;}else if('other'===data.tokenType&&('ip'===tokenType||'ipaddr'===type)){alert(wsalData.ipError);return;}
|
5 |
+
jQuery(`#${type}-list`).append(jQuery(`<span class="sectoken-${data.tokenType}"/>`).text(data.token).append(jQuery(`<input type="hidden" name="${type}s[]"/>`).val(data.token),jQuery('<a href="javascript:;" title="Remove">×</a>').click(removeSecToken)));}else{alert(data.message);}},error:function(xhr,textStatus,error){console.log(xhr.statusText);console.log(textStatus);console.log(error);}});});jQuery('#editor-users-box, #editor-roles-box, #exuser-query-box, #exrole-query-box, #ipaddr-query-box').keydown(function(event){if(13===event.keyCode){const type=jQuery(this).attr('id').substr(0,6);const tokenType=jQuery(this).attr('id').substr(7,5);jQuery(`#${type}-${tokenType}-add`).click();return false;}});jQuery('#editor-list>span>a, #exuser-list>span>a, #exrole-list>span>a, #ipaddr-list>span>a').click(removeSecToken);function removeSecToken(){const token=jQuery(this).parents('span:first');token.addClass('sectoken-del').fadeOut('fast',function(){token.remove();});};});
|
6 |
+
}
|
7 |
+
catch(e){console.error("An error has occurred wsal-wizard.js: "+e.stack);}
|
js/settings.js
CHANGED
@@ -11,7 +11,7 @@ jQuery( document ).ready( function() {
|
|
11 |
});
|
12 |
};
|
13 |
|
14 |
-
jQuery( '.js-query-box, #ViewerQueryBox, #EditorQueryBox, #ExRoleQueryBox, #ExUserQueryBox, #CustomQueryBox, #IpAddrQueryBox, #ExCPTsQueryBox, #ExURLsQueryBox' ).keydown( function( event ) {
|
15 |
if ( 13 === event.keyCode ) {
|
16 |
var type = jQuery( this ).closest( 'fieldset' ).attr( 'data-type' );
|
17 |
if (! type ) {
|
@@ -98,6 +98,11 @@ jQuery( document ).ready( function() {
|
|
98 |
minLength: 1
|
99 |
});
|
100 |
|
|
|
|
|
|
|
|
|
|
|
101 |
var rolesUrl = ajaxurl + '?action=AjaxGetAllRoles&wsal_nonce=' + wsal_data.wp_nonce;
|
102 |
jQuery( '#ExRoleQueryBox' ).autocomplete({
|
103 |
source: rolesUrl,
|
11 |
});
|
12 |
};
|
13 |
|
14 |
+
jQuery( '.js-query-box, #ViewerQueryBox, #EditorQueryBox, #ExRoleQueryBox, #ExUserQueryBox, #ExUserSubjectQueryBox, #CustomQueryBox, #IpAddrQueryBox, #IpAddrSubjectQueryBox, #ExCPTsQueryBox, #ExURLsQueryBox' ).keydown( function( event ) {
|
15 |
if ( 13 === event.keyCode ) {
|
16 |
var type = jQuery( this ).closest( 'fieldset' ).attr( 'data-type' );
|
17 |
if (! type ) {
|
98 |
minLength: 1
|
99 |
});
|
100 |
|
101 |
+
jQuery( '#ExUserSubjectQueryBox' ).autocomplete({
|
102 |
+
source: usersUrl,
|
103 |
+
minLength: 1
|
104 |
+
});
|
105 |
+
|
106 |
var rolesUrl = ajaxurl + '?action=AjaxGetAllRoles&wsal_nonce=' + wsal_data.wp_nonce;
|
107 |
jQuery( '#ExRoleQueryBox' ).autocomplete({
|
108 |
source: rolesUrl,
|
js/src/jquery-steps/build/jquery.steps.js
ADDED
@@ -0,0 +1,2054 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* jQuery Steps v1.1.1 - 16/07/2021 (changed by WP White Security)
|
3 |
+
* Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)
|
4 |
+
* Licensed under MIT http://www.opensource.org/licenses/MIT
|
5 |
+
*/
|
6 |
+
;(function ($, undefined)
|
7 |
+
{
|
8 |
+
$.fn.extend({
|
9 |
+
_aria: function (name, value)
|
10 |
+
{
|
11 |
+
return this.attr("aria-" + name, value);
|
12 |
+
},
|
13 |
+
|
14 |
+
_removeAria: function (name)
|
15 |
+
{
|
16 |
+
return this.removeAttr("aria-" + name);
|
17 |
+
},
|
18 |
+
|
19 |
+
_enableAria: function (enable)
|
20 |
+
{
|
21 |
+
return (enable == null || enable) ?
|
22 |
+
this.removeClass("disabled")._aria("disabled", "false") :
|
23 |
+
this.addClass("disabled")._aria("disabled", "true");
|
24 |
+
},
|
25 |
+
|
26 |
+
_showAria: function (show)
|
27 |
+
{
|
28 |
+
return (show == null || show) ?
|
29 |
+
this.show()._aria("hidden", "false") :
|
30 |
+
this.hide()._aria("hidden", "true");
|
31 |
+
},
|
32 |
+
|
33 |
+
_selectAria: function (select)
|
34 |
+
{
|
35 |
+
return (select == null || select) ?
|
36 |
+
this.addClass("current")._aria("selected", "true") :
|
37 |
+
this.removeClass("current")._aria("selected", "false");
|
38 |
+
},
|
39 |
+
|
40 |
+
_id: function (id)
|
41 |
+
{
|
42 |
+
return (id) ? this.attr("id", id) : this.attr("id");
|
43 |
+
}
|
44 |
+
});
|
45 |
+
|
46 |
+
if (!String.prototype.format)
|
47 |
+
{
|
48 |
+
String.prototype.format = function()
|
49 |
+
{
|
50 |
+
var args = (arguments.length === 1 && $.isArray(arguments[0])) ? arguments[0] : arguments;
|
51 |
+
var formattedString = this;
|
52 |
+
for (var i = 0; i < args.length; i++)
|
53 |
+
{
|
54 |
+
var pattern = new RegExp("\\{" + i + "\\}", "gm");
|
55 |
+
formattedString = formattedString.replace(pattern, args[i]);
|
56 |
+
}
|
57 |
+
return formattedString;
|
58 |
+
};
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* A global unique id count.
|
63 |
+
*
|
64 |
+
* @static
|
65 |
+
* @private
|
66 |
+
* @property _uniqueId
|
67 |
+
* @type Integer
|
68 |
+
**/
|
69 |
+
var _uniqueId = 0;
|
70 |
+
|
71 |
+
/**
|
72 |
+
* The plugin prefix for cookies.
|
73 |
+
*
|
74 |
+
* @final
|
75 |
+
* @private
|
76 |
+
* @property _cookiePrefix
|
77 |
+
* @type String
|
78 |
+
**/
|
79 |
+
var _cookiePrefix = "jQu3ry_5teps_St@te_";
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Suffix for the unique tab id.
|
83 |
+
*
|
84 |
+
* @final
|
85 |
+
* @private
|
86 |
+
* @property _tabSuffix
|
87 |
+
* @type String
|
88 |
+
* @since 0.9.7
|
89 |
+
**/
|
90 |
+
var _tabSuffix = "-t-";
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Suffix for the unique tabpanel id.
|
94 |
+
*
|
95 |
+
* @final
|
96 |
+
* @private
|
97 |
+
* @property _tabpanelSuffix
|
98 |
+
* @type String
|
99 |
+
* @since 0.9.7
|
100 |
+
**/
|
101 |
+
var _tabpanelSuffix = "-p-";
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Suffix for the unique title id.
|
105 |
+
*
|
106 |
+
* @final
|
107 |
+
* @private
|
108 |
+
* @property _titleSuffix
|
109 |
+
* @type String
|
110 |
+
* @since 0.9.7
|
111 |
+
**/
|
112 |
+
var _titleSuffix = "-h-";
|
113 |
+
|
114 |
+
/**
|
115 |
+
* An error message for an "index out of range" error.
|
116 |
+
*
|
117 |
+
* @final
|
118 |
+
* @private
|
119 |
+
* @property _indexOutOfRangeErrorMessage
|
120 |
+
* @type String
|
121 |
+
**/
|
122 |
+
var _indexOutOfRangeErrorMessage = "Index out of range.";
|
123 |
+
|
124 |
+
/**
|
125 |
+
* An error message for an "missing corresponding element" error.
|
126 |
+
*
|
127 |
+
* @final
|
128 |
+
* @private
|
129 |
+
* @property _missingCorrespondingElementErrorMessage
|
130 |
+
* @type String
|
131 |
+
**/
|
132 |
+
var _missingCorrespondingElementErrorMessage = "One or more corresponding step {0} are missing.";
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Adds a step to the cache.
|
136 |
+
*
|
137 |
+
* @static
|
138 |
+
* @private
|
139 |
+
* @method addStepToCache
|
140 |
+
* @param wizard {Object} A jQuery wizard object
|
141 |
+
* @param step {Object} The step object to add
|
142 |
+
**/
|
143 |
+
function addStepToCache(wizard, step)
|
144 |
+
{
|
145 |
+
getSteps(wizard).push(step);
|
146 |
+
}
|
147 |
+
|
148 |
+
function analyzeData(wizard, options, state)
|
149 |
+
{
|
150 |
+
var stepTitles = wizard.children(options.headerTag),
|
151 |
+
stepContents = wizard.children(options.bodyTag);
|
152 |
+
|
153 |
+
// Validate content
|
154 |
+
if (stepTitles.length > stepContents.length)
|
155 |
+
{
|
156 |
+
throwError(_missingCorrespondingElementErrorMessage, "contents");
|
157 |
+
}
|
158 |
+
else if (stepTitles.length < stepContents.length)
|
159 |
+
{
|
160 |
+
throwError(_missingCorrespondingElementErrorMessage, "titles");
|
161 |
+
}
|
162 |
+
|
163 |
+
var startIndex = options.startIndex;
|
164 |
+
|
165 |
+
state.stepCount = stepTitles.length;
|
166 |
+
|
167 |
+
// Tries to load the saved state (step position)
|
168 |
+
if (options.saveState && $.cookie)
|
169 |
+
{
|
170 |
+
var savedState = $.cookie(_cookiePrefix + getUniqueId(wizard));
|
171 |
+
// Sets the saved position to the start index if not undefined or out of range
|
172 |
+
var savedIndex = parseInt(savedState, 0);
|
173 |
+
if (!isNaN(savedIndex) && savedIndex < state.stepCount)
|
174 |
+
{
|
175 |
+
startIndex = savedIndex;
|
176 |
+
}
|
177 |
+
}
|
178 |
+
|
179 |
+
state.currentIndex = startIndex;
|
180 |
+
|
181 |
+
stepTitles.each(function (index)
|
182 |
+
{
|
183 |
+
var item = $(this), // item == header
|
184 |
+
content = stepContents.eq(index),
|
185 |
+
modeData = content.data("mode"),
|
186 |
+
mode = (modeData == null) ? contentMode.html : getValidEnumValue(contentMode,
|
187 |
+
(/^\s*$/.test(modeData) || isNaN(modeData)) ? modeData : parseInt(modeData, 0)),
|
188 |
+
contentUrl = (mode === contentMode.html || content.data("url") === undefined) ?
|
189 |
+
"" : content.data("url"),
|
190 |
+
contentLoaded = (mode !== contentMode.html && content.data("loaded") === "1"),
|
191 |
+
step = $.extend({}, stepModel, {
|
192 |
+
title: item.html(),
|
193 |
+
content: (mode === contentMode.html) ? content.html() : "",
|
194 |
+
contentUrl: contentUrl,
|
195 |
+
contentMode: mode,
|
196 |
+
contentLoaded: contentLoaded
|
197 |
+
});
|
198 |
+
|
199 |
+
addStepToCache(wizard, step);
|
200 |
+
});
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Triggers the onCanceled event.
|
205 |
+
*
|
206 |
+
* @static
|
207 |
+
* @private
|
208 |
+
* @method cancel
|
209 |
+
* @param wizard {Object} The jQuery wizard object
|
210 |
+
**/
|
211 |
+
function cancel(wizard)
|
212 |
+
{
|
213 |
+
wizard.triggerHandler("canceled");
|
214 |
+
}
|
215 |
+
|
216 |
+
function decreaseCurrentIndexBy(state, decreaseBy)
|
217 |
+
{
|
218 |
+
return state.currentIndex - decreaseBy;
|
219 |
+
}
|
220 |
+
|
221 |
+
/**
|
222 |
+
* Removes the control functionality completely and transforms the current state to the initial HTML structure.
|
223 |
+
*
|
224 |
+
* @static
|
225 |
+
* @private
|
226 |
+
* @method destroy
|
227 |
+
* @param wizard {Object} A jQuery wizard object
|
228 |
+
**/
|
229 |
+
function destroy(wizard, options)
|
230 |
+
{
|
231 |
+
var eventNamespace = getEventNamespace(wizard);
|
232 |
+
|
233 |
+
// Remove virtual data objects from the wizard
|
234 |
+
wizard.unbind(eventNamespace).removeData("uid").removeData("options")
|
235 |
+
.removeData("state").removeData("steps").removeData("eventNamespace")
|
236 |
+
.find(".actions a").unbind(eventNamespace);
|
237 |
+
|
238 |
+
// Remove attributes and CSS classes from the wizard
|
239 |
+
wizard.removeClass(options.clearFixCssClass + " vertical");
|
240 |
+
|
241 |
+
var contents = wizard.find(".content > *");
|
242 |
+
|
243 |
+
// Remove virtual data objects from panels and their titles
|
244 |
+
contents.removeData("loaded").removeData("mode").removeData("url");
|
245 |
+
|
246 |
+
// Remove attributes, CSS classes and reset inline styles on all panels and their titles
|
247 |
+
contents.removeAttr("id").removeAttr("role").removeAttr("tabindex")
|
248 |
+
.removeAttr("class").removeAttr("style")._removeAria("labelledby")
|
249 |
+
._removeAria("hidden");
|
250 |
+
|
251 |
+
// Empty panels if the mode is set to 'async' or 'iframe'
|
252 |
+
wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();
|
253 |
+
|
254 |
+
var wizardSubstitute = $("<{0} class=\"{1}\"></{0}>".format(wizard.get(0).tagName, wizard.attr("class")));
|
255 |
+
|
256 |
+
var wizardId = wizard._id();
|
257 |
+
if (wizardId != null && wizardId !== "")
|
258 |
+
{
|
259 |
+
wizardSubstitute._id(wizardId);
|
260 |
+
}
|
261 |
+
|
262 |
+
wizardSubstitute.html(wizard.find(".content").html());
|
263 |
+
wizard.after(wizardSubstitute);
|
264 |
+
wizard.remove();
|
265 |
+
|
266 |
+
return wizardSubstitute;
|
267 |
+
}
|
268 |
+
|
269 |
+
/**
|
270 |
+
* Triggers the onFinishing and onFinished event.
|
271 |
+
*
|
272 |
+
* @static
|
273 |
+
* @private
|
274 |
+
* @method finishStep
|
275 |
+
* @param wizard {Object} The jQuery wizard object
|
276 |
+
* @param state {Object} The state container of the current wizard
|
277 |
+
**/
|
278 |
+
function finishStep(wizard, state)
|
279 |
+
{
|
280 |
+
var currentStep = wizard.find(".steps li").eq(state.currentIndex);
|
281 |
+
|
282 |
+
if (wizard.triggerHandler("finishing", [state.currentIndex]))
|
283 |
+
{
|
284 |
+
currentStep.addClass("done").removeClass("error");
|
285 |
+
wizard.triggerHandler("finished", [state.currentIndex]);
|
286 |
+
}
|
287 |
+
else
|
288 |
+
{
|
289 |
+
currentStep.addClass("error");
|
290 |
+
}
|
291 |
+
}
|
292 |
+
|
293 |
+
/**
|
294 |
+
* Gets or creates if not exist an unique event namespace for the given wizard instance.
|
295 |
+
*
|
296 |
+
* @static
|
297 |
+
* @private
|
298 |
+
* @method getEventNamespace
|
299 |
+
* @param wizard {Object} A jQuery wizard object
|
300 |
+
* @return {String} Returns the unique event namespace for the given wizard
|
301 |
+
*/
|
302 |
+
function getEventNamespace(wizard)
|
303 |
+
{
|
304 |
+
var eventNamespace = wizard.data("eventNamespace");
|
305 |
+
|
306 |
+
if (eventNamespace == null)
|
307 |
+
{
|
308 |
+
eventNamespace = "." + getUniqueId(wizard);
|
309 |
+
wizard.data("eventNamespace", eventNamespace);
|
310 |
+
}
|
311 |
+
|
312 |
+
return eventNamespace;
|
313 |
+
}
|
314 |
+
|
315 |
+
function getStepAnchor(wizard, index)
|
316 |
+
{
|
317 |
+
var uniqueId = getUniqueId(wizard);
|
318 |
+
|
319 |
+
return wizard.find("#" + uniqueId + _tabSuffix + index);
|
320 |
+
}
|
321 |
+
|
322 |
+
function getStepPanel(wizard, index)
|
323 |
+
{
|
324 |
+
var uniqueId = getUniqueId(wizard);
|
325 |
+
|
326 |
+
return wizard.find("#" + uniqueId + _tabpanelSuffix + index);
|
327 |
+
}
|
328 |
+
|
329 |
+
function getStepTitle(wizard, index)
|
330 |
+
{
|
331 |
+
var uniqueId = getUniqueId(wizard);
|
332 |
+
|
333 |
+
return wizard.find("#" + uniqueId + _titleSuffix + index);
|
334 |
+
}
|
335 |
+
|
336 |
+
function getOptions(wizard)
|
337 |
+
{
|
338 |
+
return wizard.data("options");
|
339 |
+
}
|
340 |
+
|
341 |
+
function getState(wizard)
|
342 |
+
{
|
343 |
+
return wizard.data("state");
|
344 |
+
}
|
345 |
+
|
346 |
+
function getSteps(wizard)
|
347 |
+
{
|
348 |
+
return wizard.data("steps");
|
349 |
+
}
|
350 |
+
|
351 |
+
/**
|
352 |
+
* Gets a specific step object by index.
|
353 |
+
*
|
354 |
+
* @static
|
355 |
+
* @private
|
356 |
+
* @method getStep
|
357 |
+
* @param index {Integer} An integer that belongs to the position of a step
|
358 |
+
* @return {Object} A specific step object
|
359 |
+
**/
|
360 |
+
function getStep(wizard, index)
|
361 |
+
{
|
362 |
+
var steps = getSteps(wizard);
|
363 |
+
|
364 |
+
if (index < 0 || index >= steps.length)
|
365 |
+
{
|
366 |
+
throwError(_indexOutOfRangeErrorMessage);
|
367 |
+
}
|
368 |
+
|
369 |
+
return steps[index];
|
370 |
+
}
|
371 |
+
|
372 |
+
/**
|
373 |
+
* Gets or creates if not exist an unique id from the given wizard instance.
|
374 |
+
*
|
375 |
+
* @static
|
376 |
+
* @private
|
377 |
+
* @method getUniqueId
|
378 |
+
* @param wizard {Object} A jQuery wizard object
|
379 |
+
* @return {String} Returns the unique id for the given wizard
|
380 |
+
*/
|
381 |
+
function getUniqueId(wizard)
|
382 |
+
{
|
383 |
+
var uniqueId = wizard.data("uid");
|
384 |
+
|
385 |
+
if (uniqueId == null)
|
386 |
+
{
|
387 |
+
uniqueId = wizard._id();
|
388 |
+
if (uniqueId == null)
|
389 |
+
{
|
390 |
+
uniqueId = "steps-uid-".concat(_uniqueId);
|
391 |
+
wizard._id(uniqueId);
|
392 |
+
}
|
393 |
+
|
394 |
+
_uniqueId++;
|
395 |
+
wizard.data("uid", uniqueId);
|
396 |
+
}
|
397 |
+
|
398 |
+
return uniqueId;
|
399 |
+
}
|
400 |
+
|
401 |
+
/**
|
402 |
+
* Gets a valid enum value by checking a specific enum key or value.
|
403 |
+
*
|
404 |
+
* @static
|
405 |
+
* @private
|
406 |
+
* @method getValidEnumValue
|
407 |
+
* @param enumType {Object} Type of enum
|
408 |
+
* @param keyOrValue {Object} Key as `String` or value as `Integer` to check for
|
409 |
+
*/
|
410 |
+
function getValidEnumValue(enumType, keyOrValue)
|
411 |
+
{
|
412 |
+
validateArgument("enumType", enumType);
|
413 |
+
validateArgument("keyOrValue", keyOrValue);
|
414 |
+
|
415 |
+
// Is key
|
416 |
+
if (typeof keyOrValue === "string")
|
417 |
+
{
|
418 |
+
var value = enumType[keyOrValue];
|
419 |
+
if (value === undefined)
|
420 |
+
{
|
421 |
+
throwError("The enum key '{0}' does not exist.", keyOrValue);
|
422 |
+
}
|
423 |
+
|
424 |
+
return value;
|
425 |
+
}
|
426 |
+
// Is value
|
427 |
+
else if (typeof keyOrValue === "number")
|
428 |
+
{
|
429 |
+
for (var key in enumType)
|
430 |
+
{
|
431 |
+
if (enumType[key] === keyOrValue)
|
432 |
+
{
|
433 |
+
return keyOrValue;
|
434 |
+
}
|
435 |
+
}
|
436 |
+
|
437 |
+
throwError("Invalid enum value '{0}'.", keyOrValue);
|
438 |
+
}
|
439 |
+
// Type is not supported
|
440 |
+
else
|
441 |
+
{
|
442 |
+
throwError("Invalid key or value type.");
|
443 |
+
}
|
444 |
+
}
|
445 |
+
|
446 |
+
/**
|
447 |
+
* Routes to the next step.
|
448 |
+
*
|
449 |
+
* @static
|
450 |
+
* @private
|
451 |
+
* @method goToNextStep
|
452 |
+
* @param wizard {Object} The jQuery wizard object
|
453 |
+
* @param options {Object} Settings of the current wizard
|
454 |
+
* @param state {Object} The state container of the current wizard
|
455 |
+
* @return {Boolean} Indicates whether the action executed
|
456 |
+
**/
|
457 |
+
function goToNextStep(wizard, options, state)
|
458 |
+
{
|
459 |
+
return paginationClick(wizard, options, state, increaseCurrentIndexBy(state, 1));
|
460 |
+
}
|
461 |
+
|
462 |
+
/**
|
463 |
+
* Routes to the previous step.
|
464 |
+
*
|
465 |
+
* @static
|
466 |
+
* @private
|
467 |
+
* @method goToPreviousStep
|
468 |
+
* @param wizard {Object} The jQuery wizard object
|
469 |
+
* @param options {Object} Settings of the current wizard
|
470 |
+
* @param state {Object} The state container of the current wizard
|
471 |
+
* @return {Boolean} Indicates whether the action executed
|
472 |
+
**/
|
473 |
+
function goToPreviousStep(wizard, options, state)
|
474 |
+
{
|
475 |
+
return paginationClick(wizard, options, state, decreaseCurrentIndexBy(state, 1));
|
476 |
+
}
|
477 |
+
|
478 |
+
/**
|
479 |
+
* Routes to a specific step by a given index.
|
480 |
+
*
|
481 |
+
* @static
|
482 |
+
* @private
|
483 |
+
* @method goToStep
|
484 |
+
* @param wizard {Object} The jQuery wizard object
|
485 |
+
* @param options {Object} Settings of the current wizard
|
486 |
+
* @param state {Object} The state container of the current wizard
|
487 |
+
* @param index {Integer} The position (zero-based) to route to
|
488 |
+
* @return {Boolean} Indicates whether the action succeeded or failed
|
489 |
+
**/
|
490 |
+
function goToStep(wizard, options, state, index)
|
491 |
+
{
|
492 |
+
if (index < 0 || index >= state.stepCount)
|
493 |
+
{
|
494 |
+
throwError(_indexOutOfRangeErrorMessage);
|
495 |
+
}
|
496 |
+
|
497 |
+
if (options.forceMoveForward && index < state.currentIndex)
|
498 |
+
{
|
499 |
+
return;
|
500 |
+
}
|
501 |
+
|
502 |
+
var oldIndex = state.currentIndex;
|
503 |
+
if (wizard.triggerHandler("stepChanging", [state.currentIndex, index]))
|
504 |
+
{
|
505 |
+
// Save new state
|
506 |
+
state.currentIndex = index;
|
507 |
+
saveCurrentStateToCookie(wizard, options, state);
|
508 |
+
|
509 |
+
// Change visualisation
|
510 |
+
refreshStepNavigation(wizard, options, state, oldIndex);
|
511 |
+
refreshPagination(wizard, options, state);
|
512 |
+
loadAsyncContent(wizard, options, state);
|
513 |
+
startTransitionEffect(wizard, options, state, index, oldIndex, function()
|
514 |
+
{
|
515 |
+
wizard.triggerHandler("stepChanged", [index, oldIndex]);
|
516 |
+
});
|
517 |
+
}
|
518 |
+
else
|
519 |
+
{
|
520 |
+
wizard.find(".steps li").eq(oldIndex).addClass("error");
|
521 |
+
}
|
522 |
+
|
523 |
+
return true;
|
524 |
+
}
|
525 |
+
|
526 |
+
function increaseCurrentIndexBy(state, increaseBy)
|
527 |
+
{
|
528 |
+
return state.currentIndex + increaseBy;
|
529 |
+
}
|
530 |
+
|
531 |
+
/**
|
532 |
+
* Initializes the component.
|
533 |
+
*
|
534 |
+
* @static
|
535 |
+
* @private
|
536 |
+
* @method initialize
|
537 |
+
* @param options {Object} The component settings
|
538 |
+
**/
|
539 |
+
function initialize(options)
|
540 |
+
{
|
541 |
+
/*jshint -W040 */
|
542 |
+
var opts = $.extend(true, {}, defaults, options);
|
543 |
+
|
544 |
+
return this.each(function ()
|
545 |
+
{
|
546 |
+
var wizard = $(this);
|
547 |
+
var state = {
|
548 |
+
currentIndex: opts.startIndex,
|
549 |
+
currentStep: null,
|
550 |
+
stepCount: 0,
|
551 |
+
transitionElement: null
|
552 |
+
};
|
553 |
+
|
554 |
+
// Create data container
|
555 |
+
wizard.data("options", opts);
|
556 |
+
wizard.data("state", state);
|
557 |
+
wizard.data("steps", []);
|
558 |
+
|
559 |
+
analyzeData(wizard, opts, state);
|
560 |
+
render(wizard, opts, state);
|
561 |
+
registerEvents(wizard, opts);
|
562 |
+
|
563 |
+
// Trigger focus
|
564 |
+
if (opts.autoFocus && _uniqueId === 0)
|
565 |
+
{
|
566 |
+
getStepAnchor(wizard, opts.startIndex).focus();
|
567 |
+
}
|
568 |
+
|
569 |
+
wizard.triggerHandler("init", [opts.startIndex]);
|
570 |
+
});
|
571 |
+
}
|
572 |
+
|
573 |
+
/**
|
574 |
+
* Inserts a new step to a specific position.
|
575 |
+
*
|
576 |
+
* @static
|
577 |
+
* @private
|
578 |
+
* @method insertStep
|
579 |
+
* @param wizard {Object} The jQuery wizard object
|
580 |
+
* @param options {Object} Settings of the current wizard
|
581 |
+
* @param state {Object} The state container of the current wizard
|
582 |
+
* @param index {Integer} The position (zero-based) to add
|
583 |
+
* @param step {Object} The step object to add
|
584 |
+
* @example
|
585 |
+
* $("#wizard").steps().insert(0, {
|
586 |
+
* title: "Title",
|
587 |
+
* content: "", // optional
|
588 |
+
* contentMode: "async", // optional
|
589 |
+
* contentUrl: "/Content/Step/1" // optional
|
590 |
+
* });
|
591 |
+
* @chainable
|
592 |
+
**/
|
593 |
+
function insertStep(wizard, options, state, index, step)
|
594 |
+
{
|
595 |
+
if (index < 0 || index > state.stepCount)
|
596 |
+
{
|
597 |
+
throwError(_indexOutOfRangeErrorMessage);
|
598 |
+
}
|
599 |
+
|
600 |
+
// TODO: Validate step object
|
601 |
+
|
602 |
+
// Change data
|
603 |
+
step = $.extend({}, stepModel, step);
|
604 |
+
insertStepToCache(wizard, index, step);
|
605 |
+
if (state.currentIndex !== state.stepCount && state.currentIndex >= index)
|
606 |
+
{
|
607 |
+
state.currentIndex++;
|
608 |
+
saveCurrentStateToCookie(wizard, options, state);
|
609 |
+
}
|
610 |
+
state.stepCount++;
|
611 |
+
|
612 |
+
var contentContainer = wizard.find(".content"),
|
613 |
+
header = $("<{0}>{1}</{0}>".format(options.headerTag, step.title)),
|
614 |
+
body = $("<{0}></{0}>".format(options.bodyTag));
|
615 |
+
|
616 |
+
if (step.contentMode == null || step.contentMode === contentMode.html)
|
617 |
+
{
|
618 |
+
body.html(step.content);
|
619 |
+
}
|
620 |
+
|
621 |
+
if (index === 0)
|
622 |
+
{
|
623 |
+
contentContainer.prepend(body).prepend(header);
|
624 |
+
}
|
625 |
+
else
|
626 |
+
{
|
627 |
+
getStepPanel(wizard, (index - 1)).after(body).after(header);
|
628 |
+
}
|
629 |
+
|
630 |
+
renderBody(wizard, state, body, index);
|
631 |
+
renderTitle(wizard, options, state, header, index);
|
632 |
+
refreshSteps(wizard, options, state, index);
|
633 |
+
if (index === state.currentIndex)
|
634 |
+
{
|
635 |
+
refreshStepNavigation(wizard, options, state);
|
636 |
+
}
|
637 |
+
refreshPagination(wizard, options, state);
|
638 |
+
|
639 |
+
return wizard;
|
640 |
+
}
|
641 |
+
|
642 |
+
/**
|
643 |
+
* Inserts a step object to the cache at a specific position.
|
644 |
+
*
|
645 |
+
* @static
|
646 |
+
* @private
|
647 |
+
* @method insertStepToCache
|
648 |
+
* @param wizard {Object} A jQuery wizard object
|
649 |
+
* @param index {Integer} The position (zero-based) to add
|
650 |
+
* @param step {Object} The step object to add
|
651 |
+
**/
|
652 |
+
function insertStepToCache(wizard, index, step)
|
653 |
+
{
|
654 |
+
getSteps(wizard).splice(index, 0, step);
|
655 |
+
}
|
656 |
+
|
657 |
+
/**
|
658 |
+
* Handles the keyup DOM event for pagination.
|
659 |
+
*
|
660 |
+
* @static
|
661 |
+
* @private
|
662 |
+
* @event keyup
|
663 |
+
* @param event {Object} An event object
|
664 |
+
*/
|
665 |
+
function keyUpHandler(event)
|
666 |
+
{
|
667 |
+
var wizard = $(this),
|
668 |
+
options = getOptions(wizard),
|
669 |
+
state = getState(wizard);
|
670 |
+
|
671 |
+
if (options.suppressPaginationOnFocus && wizard.find(":focus").is(":input"))
|
672 |
+
{
|
673 |
+
event.preventDefault();
|
674 |
+
return false;
|
675 |
+
}
|
676 |
+
|
677 |
+
var keyCodes = { left: 37, right: 39 };
|
678 |
+
if (event.keyCode === keyCodes.left)
|
679 |
+
{
|
680 |
+
event.preventDefault();
|
681 |
+
goToPreviousStep(wizard, options, state);
|
682 |
+
}
|
683 |
+
else if (event.keyCode === keyCodes.right)
|
684 |
+
{
|
685 |
+
event.preventDefault();
|
686 |
+
goToNextStep(wizard, options, state);
|
687 |
+
}
|
688 |
+
}
|
689 |
+
|
690 |
+
/**
|
691 |
+
* Loads and includes async content.
|
692 |
+
*
|
693 |
+
* @static
|
694 |
+
* @private
|
695 |
+
* @method loadAsyncContent
|
696 |
+
* @param wizard {Object} A jQuery wizard object
|
697 |
+
* @param options {Object} Settings of the current wizard
|
698 |
+
* @param state {Object} The state container of the current wizard
|
699 |
+
*/
|
700 |
+
function loadAsyncContent(wizard, options, state)
|
701 |
+
{
|
702 |
+
if (state.stepCount > 0)
|
703 |
+
{
|
704 |
+
var currentIndex = state.currentIndex,
|
705 |
+
currentStep = getStep(wizard, currentIndex);
|
706 |
+
|
707 |
+
if (!options.enableContentCache || !currentStep.contentLoaded)
|
708 |
+
{
|
709 |
+
switch (getValidEnumValue(contentMode, currentStep.contentMode))
|
710 |
+
{
|
711 |
+
case contentMode.iframe:
|
712 |
+
wizard.find(".content > .body").eq(state.currentIndex).empty()
|
713 |
+
.html("<iframe src=\"" + currentStep.contentUrl + "\" frameborder=\"0\" scrolling=\"no\" />")
|
714 |
+
.data("loaded", "1");
|
715 |
+
break;
|
716 |
+
|
717 |
+
case contentMode.async:
|
718 |
+
var currentStepContent = getStepPanel(wizard, currentIndex)._aria("busy", "true")
|
719 |
+
.empty().append(renderTemplate(options.loadingTemplate, { text: options.labels.loading }));
|
720 |
+
|
721 |
+
$.ajax({ url: currentStep.contentUrl, cache: false }).done(function (data)
|
722 |
+
{
|
723 |
+
currentStepContent.empty().html(data)._aria("busy", "false").data("loaded", "1");
|
724 |
+
wizard.triggerHandler("contentLoaded", [currentIndex]);
|
725 |
+
});
|
726 |
+
break;
|
727 |
+
}
|
728 |
+
}
|
729 |
+
}
|
730 |
+
}
|
731 |
+
|
732 |
+
/**
|
733 |
+
* Fires the action next or previous click event.
|
734 |
+
*
|
735 |
+
* @static
|
736 |
+
* @private
|
737 |
+
* @method paginationClick
|
738 |
+
* @param wizard {Object} The jQuery wizard object
|
739 |
+
* @param options {Object} Settings of the current wizard
|
740 |
+
* @param state {Object} The state container of the current wizard
|
741 |
+
* @param index {Integer} The position (zero-based) to route to
|
742 |
+
* @return {Boolean} Indicates whether the event fired successfully or not
|
743 |
+
**/
|
744 |
+
function paginationClick(wizard, options, state, index)
|
745 |
+
{
|
746 |
+
var oldIndex = state.currentIndex;
|
747 |
+
|
748 |
+
if (index >= 0 && index < state.stepCount && !(options.forceMoveForward && index < state.currentIndex))
|
749 |
+
{
|
750 |
+
var anchor = getStepAnchor(wizard, index),
|
751 |
+
parent = anchor.parent(),
|
752 |
+
isDisabled = parent.hasClass("disabled");
|
753 |
+
|
754 |
+
// Enable the step to make the anchor clickable!
|
755 |
+
parent._enableAria();
|
756 |
+
anchor.click();
|
757 |
+
|
758 |
+
// An error occured
|
759 |
+
if (oldIndex === state.currentIndex && isDisabled)
|
760 |
+
{
|
761 |
+
// Disable the step again if current index has not changed; prevents click action.
|
762 |
+
parent._enableAria(false);
|
763 |
+
return false;
|
764 |
+
}
|
765 |
+
|
766 |
+
return true;
|
767 |
+
}
|
768 |
+
|
769 |
+
return false;
|
770 |
+
}
|
771 |
+
|
772 |
+
/**
|
773 |
+
* Fires when a pagination click happens.
|
774 |
+
*
|
775 |
+
* @static
|
776 |
+
* @private
|
777 |
+
* @event click
|
778 |
+
* @param event {Object} An event object
|
779 |
+
*/
|
780 |
+
function paginationClickHandler(event)
|
781 |
+
{
|
782 |
+
event.preventDefault();
|
783 |
+
|
784 |
+
var anchor = $(this),
|
785 |
+
wizard = anchor.parent().parent().parent().parent(),
|
786 |
+
options = getOptions(wizard),
|
787 |
+
state = getState(wizard),
|
788 |
+
href = anchor.attr("href");
|
789 |
+
|
790 |
+
switch (href.substring(href.lastIndexOf("#") + 1))
|
791 |
+
{
|
792 |
+
case "cancel":
|
793 |
+
cancel(wizard);
|
794 |
+
break;
|
795 |
+
|
796 |
+
case "finish":
|
797 |
+
finishStep(wizard, state);
|
798 |
+
break;
|
799 |
+
|
800 |
+
case "next":
|
801 |
+
goToNextStep(wizard, options, state);
|
802 |
+
break;
|
803 |
+
|
804 |
+
case "previous":
|
805 |
+
goToPreviousStep(wizard, options, state);
|
806 |
+
break;
|
807 |
+
}
|
808 |
+
}
|
809 |
+
|
810 |
+
/**
|
811 |
+
* Refreshs the visualization state for the entire pagination.
|
812 |
+
*
|
813 |
+
* @static
|
814 |
+
* @private
|
815 |
+
* @method refreshPagination
|
816 |
+
* @param wizard {Object} A jQuery wizard object
|
817 |
+
* @param options {Object} Settings of the current wizard
|
818 |
+
* @param state {Object} The state container of the current wizard
|
819 |
+
*/
|
820 |
+
function refreshPagination(wizard, options, state)
|
821 |
+
{
|
822 |
+
if (options.enablePagination)
|
823 |
+
{
|
824 |
+
var finish = wizard.find(".actions a[href$='#finish']").parent(),
|
825 |
+
next = wizard.find(".actions a[href$='#next']").parent();
|
826 |
+
|
827 |
+
if (!options.forceMoveForward)
|
828 |
+
{
|
829 |
+
var previous = wizard.find(".actions a[href$='#previous']").parent();
|
830 |
+
previous._enableAria(state.currentIndex > 0);
|
831 |
+
}
|
832 |
+
|
833 |
+
if (options.enableFinishButton && options.showFinishButtonAlways)
|
834 |
+
{
|
835 |
+
finish._enableAria(state.stepCount > 0);
|
836 |
+
next._enableAria(state.stepCount > 1 && state.stepCount > (state.currentIndex + 1));
|
837 |
+
}
|
838 |
+
else
|
839 |
+
{
|
840 |
+
finish._showAria(options.enableFinishButton && state.stepCount === (state.currentIndex + 1));
|
841 |
+
next._showAria(state.stepCount === 0 || state.stepCount > (state.currentIndex + 1)).
|
842 |
+
_enableAria(state.stepCount > (state.currentIndex + 1) || !options.enableFinishButton);
|
843 |
+
}
|
844 |
+
}
|
845 |
+
}
|
846 |
+
|
847 |
+
/**
|
848 |
+
* Refreshs the visualization state for the step navigation (tabs).
|
849 |
+
*
|
850 |
+
* @static
|
851 |
+
* @private
|
852 |
+
* @method refreshStepNavigation
|
853 |
+
* @param wizard {Object} A jQuery wizard object
|
854 |
+
* @param options {Object} Settings of the current wizard
|
855 |
+
* @param state {Object} The state container of the current wizard
|
856 |
+
* @param [oldIndex] {Integer} The index of the prior step
|
857 |
+
*/
|
858 |
+
function refreshStepNavigation(wizard, options, state, oldIndex)
|
859 |
+
{
|
860 |
+
var currentOrNewStepAnchor = getStepAnchor(wizard, state.currentIndex),
|
861 |
+
currentInfo = $("<span class=\"current-info audible\">" + options.labels.current + " </span>"),
|
862 |
+
stepTitles = wizard.find(".content > .title");
|
863 |
+
|
864 |
+
if (oldIndex != null)
|
865 |
+
{
|
866 |
+
var oldStepAnchor = getStepAnchor(wizard, oldIndex);
|
867 |
+
oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);
|
868 |
+
stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");
|
869 |
+
currentInfo = oldStepAnchor.find(".current-info");
|
870 |
+
currentOrNewStepAnchor.focus();
|
871 |
+
}
|
872 |
+
|
873 |
+
currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();
|
874 |
+
stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current");
|
875 |
+
}
|
876 |
+
|
877 |
+
/**
|
878 |
+
* Refreshes step buttons and their related titles beyond a certain position.
|
879 |
+
*
|
880 |
+
* @static
|
881 |
+
* @private
|
882 |
+
* @method refreshSteps
|
883 |
+
* @param wizard {Object} A jQuery wizard object
|
884 |
+
* @param options {Object} Settings of the current wizard
|
885 |
+
* @param state {Object} The state container of the current wizard
|
886 |
+
* @param index {Integer} The start point for refreshing ids
|
887 |
+
*/
|
888 |
+
function refreshSteps(wizard, options, state, index)
|
889 |
+
{
|
890 |
+
var uniqueId = getUniqueId(wizard);
|
891 |
+
|
892 |
+
for (var i = index; i < state.stepCount; i++)
|
893 |
+
{
|
894 |
+
var uniqueStepId = uniqueId + _tabSuffix + i,
|
895 |
+
uniqueBodyId = uniqueId + _tabpanelSuffix + i,
|
896 |
+
uniqueHeaderId = uniqueId + _titleSuffix + i,
|
897 |
+
title = wizard.find(".title").eq(i)._id(uniqueHeaderId);
|
898 |
+
|
899 |
+
wizard.find(".steps a").eq(i)._id(uniqueStepId)
|
900 |
+
._aria("controls", uniqueBodyId).attr("href", "#" + uniqueHeaderId)
|
901 |
+
.html(renderTemplate(options.titleTemplate, { index: i + 1, title: title.html() }));
|
902 |
+
wizard.find(".body").eq(i)._id(uniqueBodyId)
|
903 |
+
._aria("labelledby", uniqueHeaderId);
|
904 |
+
}
|
905 |
+
}
|
906 |
+
|
907 |
+
function registerEvents(wizard, options)
|
908 |
+
{
|
909 |
+
var eventNamespace = getEventNamespace(wizard);
|
910 |
+
|
911 |
+
wizard.bind("canceled" + eventNamespace, options.onCanceled);
|
912 |
+
wizard.bind("contentLoaded" + eventNamespace, options.onContentLoaded);
|
913 |
+
wizard.bind("finishing" + eventNamespace, options.onFinishing);
|
914 |
+
wizard.bind("finished" + eventNamespace, options.onFinished);
|
915 |
+
wizard.bind("init" + eventNamespace, options.onInit);
|
916 |
+
wizard.bind("stepChanging" + eventNamespace, options.onStepChanging);
|
917 |
+
wizard.bind("stepChanged" + eventNamespace, options.onStepChanged);
|
918 |
+
|
919 |
+
if (options.enableKeyNavigation)
|
920 |
+
{
|
921 |
+
wizard.bind("keyup" + eventNamespace, keyUpHandler);
|
922 |
+
}
|
923 |
+
|
924 |
+
wizard.find(".actions a").bind("click" + eventNamespace, paginationClickHandler);
|
925 |
+
}
|
926 |
+
|
927 |
+
/**
|
928 |
+
* Removes a specific step by an given index.
|
929 |
+
*
|
930 |
+
* @static
|
931 |
+
* @private
|
932 |
+
* @method removeStep
|
933 |
+
* @param wizard {Object} A jQuery wizard object
|
934 |
+
* @param options {Object} Settings of the current wizard
|
935 |
+
* @param state {Object} The state container of the current wizard
|
936 |
+
* @param index {Integer} The position (zero-based) of the step to remove
|
937 |
+
* @return Indecates whether the item is removed.
|
938 |
+
**/
|
939 |
+
function removeStep(wizard, options, state, index)
|
940 |
+
{
|
941 |
+
// Index out of range and try deleting current item will return false.
|
942 |
+
if (index < 0 || index >= state.stepCount || state.currentIndex === index)
|
943 |
+
{
|
944 |
+
return false;
|
945 |
+
}
|
946 |
+
|
947 |
+
// Change data
|
948 |
+
removeStepFromCache(wizard, index);
|
949 |
+
if (state.currentIndex > index)
|
950 |
+
{
|
951 |
+
state.currentIndex--;
|
952 |
+
saveCurrentStateToCookie(wizard, options, state);
|
953 |
+
}
|
954 |
+
state.stepCount--;
|
955 |
+
|
956 |
+
getStepTitle(wizard, index).remove();
|
957 |
+
getStepPanel(wizard, index).remove();
|
958 |
+
getStepAnchor(wizard, index).parent().remove();
|
959 |
+
|
960 |
+
// Set the "first" class to the new first step button
|
961 |
+
if (index === 0)
|
962 |
+
{
|
963 |
+
wizard.find(".steps li").first().addClass("first");
|
964 |
+
}
|
965 |
+
|
966 |
+
// Set the "last" class to the new last step button
|
967 |
+
if (index === state.stepCount)
|
968 |
+
{
|
969 |
+
wizard.find(".steps li").eq(index).addClass("last");
|
970 |
+
}
|
971 |
+
|
972 |
+
refreshSteps(wizard, options, state, index);
|
973 |
+
refreshPagination(wizard, options, state);
|
974 |
+
|
975 |
+
return true;
|
976 |
+
}
|
977 |
+
|
978 |
+
function removeStepFromCache(wizard, index)
|
979 |
+
{
|
980 |
+
getSteps(wizard).splice(index, 1);
|
981 |
+
}
|
982 |
+
|
983 |
+
/**
|
984 |
+
* Transforms the base html structure to a more sensible html structure.
|
985 |
+
*
|
986 |
+
* @static
|
987 |
+
* @private
|
988 |
+
* @method render
|
989 |
+
* @param wizard {Object} A jQuery wizard object
|
990 |
+
* @param options {Object} Settings of the current wizard
|
991 |
+
* @param state {Object} The state container of the current wizard
|
992 |
+
**/
|
993 |
+
function render(wizard, options, state)
|
994 |
+
{
|
995 |
+
// Create a content wrapper and copy HTML from the intial wizard structure
|
996 |
+
var wrapperTemplate = "<{0} class=\"{1}\">{2}</{0}>",
|
997 |
+
orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation),
|
998 |
+
verticalCssClass = (orientation === stepsOrientation.vertical) ? " vertical" : "",
|
999 |
+
contentWrapper = $(wrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass, wizard.html())),
|
1000 |
+
stepsWrapper = $(wrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, "<ul role=\"tablist\"></ul>")),
|
1001 |
+
stepTitles = contentWrapper.children(options.headerTag),
|
1002 |
+
stepContents = contentWrapper.children(options.bodyTag);
|
1003 |
+
|
1004 |
+
// Transform the wizard wrapper and remove the inner HTML
|
1005 |
+
wizard.attr("role", "application").empty().append(stepsWrapper).append(contentWrapper)
|
1006 |
+
.addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass);
|
1007 |
+
|
1008 |
+
// Add WIA-ARIA support
|
1009 |
+
stepContents.each(function (index)
|
1010 |
+
{
|
1011 |
+
renderBody(wizard, state, $(this), index);
|
1012 |
+
});
|
1013 |
+
|
1014 |
+
stepTitles.each(function (index)
|
1015 |
+
{
|
1016 |
+
renderTitle(wizard, options, state, $(this), index);
|
1017 |
+
});
|
1018 |
+
|
1019 |
+
refreshStepNavigation(wizard, options, state);
|
1020 |
+
renderPagination(wizard, options, state);
|
1021 |
+
}
|
1022 |
+
|
1023 |
+
/**
|
1024 |
+
* Transforms the body to a proper tabpanel.
|
1025 |
+
*
|
1026 |
+
* @static
|
1027 |
+
* @private
|
1028 |
+
* @method renderBody
|
1029 |
+
* @param wizard {Object} A jQuery wizard object
|
1030 |
+
* @param body {Object} A jQuery body object
|
1031 |
+
* @param index {Integer} The position of the body
|
1032 |
+
*/
|
1033 |
+
function renderBody(wizard, state, body, index)
|
1034 |
+
{
|
1035 |
+
var uniqueId = getUniqueId(wizard),
|
1036 |
+
uniqueBodyId = uniqueId + _tabpanelSuffix + index,
|
1037 |
+
uniqueHeaderId = uniqueId + _titleSuffix + index;
|
1038 |
+
|
1039 |
+
body._id(uniqueBodyId).attr("role", "tabpanel")._aria("labelledby", uniqueHeaderId)
|
1040 |
+
.addClass("body")._showAria(state.currentIndex === index);
|
1041 |
+
}
|
1042 |
+
|
1043 |
+
/**
|
1044 |
+
* Renders a pagination if enabled.
|
1045 |
+
*
|
1046 |
+
* @static
|
1047 |
+
* @private
|
1048 |
+
* @method renderPagination
|
1049 |
+
* @param wizard {Object} A jQuery wizard object
|
1050 |
+
* @param options {Object} Settings of the current wizard
|
1051 |
+
* @param state {Object} The state container of the current wizard
|
1052 |
+
*/
|
1053 |
+
function renderPagination(wizard, options, state)
|
1054 |
+
{
|
1055 |
+
if (options.enablePagination)
|
1056 |
+
{
|
1057 |
+
var pagination = "<{0} class=\"actions {1}\"><ul role=\"menu\" aria-label=\"{2}\">{3}</ul></{0}>",
|
1058 |
+
buttonTemplate = "<li><a href=\"#{0}\" role=\"menuitem\">{1}</a></li>",
|
1059 |
+
buttons = "";
|
1060 |
+
|
1061 |
+
if (!options.forceMoveForward)
|
1062 |
+
{
|
1063 |
+
buttons += buttonTemplate.format("previous", options.labels.previous);
|
1064 |
+
}
|
1065 |
+
|
1066 |
+
buttons += buttonTemplate.format("next", options.labels.next);
|
1067 |
+
|
1068 |
+
if (options.enableFinishButton)
|
1069 |
+
{
|
1070 |
+
buttons += buttonTemplate.format("finish", options.labels.finish);
|
1071 |
+
}
|
1072 |
+
|
1073 |
+
if (options.enableCancelButton)
|
1074 |
+
{
|
1075 |
+
buttons += buttonTemplate.format("cancel", options.labels.cancel);
|
1076 |
+
}
|
1077 |
+
|
1078 |
+
wizard.append(pagination.format(options.actionContainerTag, options.clearFixCssClass,
|
1079 |
+
options.labels.pagination, buttons));
|
1080 |
+
|
1081 |
+
refreshPagination(wizard, options, state);
|
1082 |
+
loadAsyncContent(wizard, options, state);
|
1083 |
+
}
|
1084 |
+
}
|
1085 |
+
|
1086 |
+
/**
|
1087 |
+
* Renders a template and replaces all placeholder.
|
1088 |
+
*
|
1089 |
+
* @static
|
1090 |
+
* @private
|
1091 |
+
* @method renderTemplate
|
1092 |
+
* @param template {String} A template
|
1093 |
+
* @param substitutes {Object} A list of substitute
|
1094 |
+
* @return {String} The rendered template
|
1095 |
+
*/
|
1096 |
+
function renderTemplate(template, substitutes)
|
1097 |
+
{
|
1098 |
+
var matches = template.match(/#([a-z]*)#/gi);
|
1099 |
+
|
1100 |
+
for (var i = 0; i < matches.length; i++)
|
1101 |
+
{
|
1102 |
+
var match = matches[i],
|
1103 |
+
key = match.substring(1, match.length - 1);
|
1104 |
+
|
1105 |
+
if (substitutes[key] === undefined)
|
1106 |
+
{
|
1107 |
+
throwError("The key '{0}' does not exist in the substitute collection!", key);
|
1108 |
+
}
|
1109 |
+
|
1110 |
+
template = template.replace(match, substitutes[key]);
|
1111 |
+
}
|
1112 |
+
|
1113 |
+
return template;
|
1114 |
+
}
|
1115 |
+
|
1116 |
+
/**
|
1117 |
+
* Transforms the title to a step item button.
|
1118 |
+
*
|
1119 |
+
* @static
|
1120 |
+
* @private
|
1121 |
+
* @method renderTitle
|
1122 |
+
* @param wizard {Object} A jQuery wizard object
|
1123 |
+
* @param options {Object} Settings of the current wizard
|
1124 |
+
* @param state {Object} The state container of the current wizard
|
1125 |
+
* @param header {Object} A jQuery header object
|
1126 |
+
* @param index {Integer} The position of the header
|
1127 |
+
*/
|
1128 |
+
function renderTitle(wizard, options, state, header, index)
|
1129 |
+
{
|
1130 |
+
var uniqueId = getUniqueId(wizard),
|
1131 |
+
uniqueStepId = uniqueId + _tabSuffix + index,
|
1132 |
+
uniqueBodyId = uniqueId + _tabpanelSuffix + index,
|
1133 |
+
uniqueHeaderId = uniqueId + _titleSuffix + index,
|
1134 |
+
stepCollection = wizard.find(".steps > ul"),
|
1135 |
+
title = renderTemplate(options.titleTemplate, {
|
1136 |
+
index: index + 1,
|
1137 |
+
title: header.html()
|
1138 |
+
}),
|
1139 |
+
stepItem = $("<li role=\"tab\"><a id=\"" + uniqueStepId + "\" href=\"#" + uniqueHeaderId +
|
1140 |
+
"\" aria-controls=\"" + uniqueBodyId + "\">" + title + "</a></li>");
|
1141 |
+
|
1142 |
+
stepItem._enableAria(options.enableAllSteps || state.currentIndex > index);
|
1143 |
+
|
1144 |
+
if (state.currentIndex > index)
|
1145 |
+
{
|
1146 |
+
stepItem.addClass("done");
|
1147 |
+
}
|
1148 |
+
|
1149 |
+
header._id(uniqueHeaderId).attr("tabindex", "-1").addClass("title");
|
1150 |
+
|
1151 |
+
if (index === 0)
|
1152 |
+
{
|
1153 |
+
stepCollection.prepend(stepItem);
|
1154 |
+
}
|
1155 |
+
else
|
1156 |
+
{
|
1157 |
+
stepCollection.find("li").eq(index - 1).after(stepItem);
|
1158 |
+
}
|
1159 |
+
|
1160 |
+
// Set the "first" class to the new first step button
|
1161 |
+
if (index === 0)
|
1162 |
+
{
|
1163 |
+
stepCollection.find("li").removeClass("first").eq(index).addClass("first");
|
1164 |
+
}
|
1165 |
+
|
1166 |
+
// Set the "last" class to the new last step button
|
1167 |
+
if (index === (state.stepCount - 1))
|
1168 |
+
{
|
1169 |
+
stepCollection.find("li").removeClass("last").eq(index).addClass("last");
|
1170 |
+
}
|
1171 |
+
|
1172 |
+
// Register click event
|
1173 |
+
stepItem.children("a").bind("click" + getEventNamespace(wizard), stepClickHandler);
|
1174 |
+
}
|
1175 |
+
|
1176 |
+
/**
|
1177 |
+
* Saves the current state to a cookie.
|
1178 |
+
*
|
1179 |
+
* @static
|
1180 |
+
* @private
|
1181 |
+
* @method saveCurrentStateToCookie
|
1182 |
+
* @param wizard {Object} A jQuery wizard object
|
1183 |
+
* @param options {Object} Settings of the current wizard
|
1184 |
+
* @param state {Object} The state container of the current wizard
|
1185 |
+
*/
|
1186 |
+
function saveCurrentStateToCookie(wizard, options, state)
|
1187 |
+
{
|
1188 |
+
if (options.saveState && $.cookie)
|
1189 |
+
{
|
1190 |
+
$.cookie(_cookiePrefix + getUniqueId(wizard), state.currentIndex);
|
1191 |
+
}
|
1192 |
+
}
|
1193 |
+
|
1194 |
+
function startTransitionEffect(wizard, options, state, index, oldIndex, doneCallback)
|
1195 |
+
{
|
1196 |
+
var stepContents = wizard.find(".content > .body"),
|
1197 |
+
effect = getValidEnumValue(transitionEffect, options.transitionEffect),
|
1198 |
+
effectSpeed = options.transitionEffectSpeed,
|
1199 |
+
newStep = stepContents.eq(index),
|
1200 |
+
currentStep = stepContents.eq(oldIndex);
|
1201 |
+
|
1202 |
+
switch (effect)
|
1203 |
+
{
|
1204 |
+
case transitionEffect.fade:
|
1205 |
+
case transitionEffect.slide:
|
1206 |
+
var hide = (effect === transitionEffect.fade) ? "fadeOut" : "slideUp",
|
1207 |
+
show = (effect === transitionEffect.fade) ? "fadeIn" : "slideDown";
|
1208 |
+
|
1209 |
+
state.transitionElement = newStep;
|
1210 |
+
currentStep[hide](effectSpeed, function ()
|
1211 |
+
{
|
1212 |
+
var wizard = $(this)._showAria(false).parent().parent(),
|
1213 |
+
state = getState(wizard);
|
1214 |
+
|
1215 |
+
if (state.transitionElement)
|
1216 |
+
{
|
1217 |
+
state.transitionElement[show](effectSpeed, function ()
|
1218 |
+
{
|
1219 |
+
$(this)._showAria();
|
1220 |
+
}).promise().done(doneCallback);
|
1221 |
+
state.transitionElement = null;
|
1222 |
+
}
|
1223 |
+
});
|
1224 |
+
break;
|
1225 |
+
|
1226 |
+
case transitionEffect.slideLeft:
|
1227 |
+
var outerWidth = currentStep.outerWidth(true),
|
1228 |
+
posFadeOut = (index > oldIndex) ? -(outerWidth) : outerWidth,
|
1229 |
+
posFadeIn = (index > oldIndex) ? outerWidth : -(outerWidth);
|
1230 |
+
|
1231 |
+
$.when(currentStep.animate({ left: posFadeOut }, effectSpeed,
|
1232 |
+
function () { $(this)._showAria(false); }),
|
1233 |
+
newStep.css("left", posFadeIn + "px")._showAria()
|
1234 |
+
.animate({ left: 0 }, effectSpeed)).done(doneCallback);
|
1235 |
+
break;
|
1236 |
+
|
1237 |
+
default:
|
1238 |
+
$.when(currentStep._showAria(false), newStep._showAria())
|
1239 |
+
.done(doneCallback);
|
1240 |
+
break;
|
1241 |
+
}
|
1242 |
+
}
|
1243 |
+
|
1244 |
+
/**
|
1245 |
+
* Fires when a step click happens.
|
1246 |
+
*
|
1247 |
+
* @static
|
1248 |
+
* @private
|
1249 |
+
* @event click
|
1250 |
+
* @param event {Object} An event object
|
1251 |
+
*/
|
1252 |
+
function stepClickHandler(event)
|
1253 |
+
{
|
1254 |
+
event.preventDefault();
|
1255 |
+
|
1256 |
+
var anchor = $(this),
|
1257 |
+
wizard = anchor.parent().parent().parent().parent(),
|
1258 |
+
options = getOptions(wizard),
|
1259 |
+
state = getState(wizard),
|
1260 |
+
oldIndex = state.currentIndex;
|
1261 |
+
|
1262 |
+
if (anchor.parent().is(":not(.disabled):not(.current)"))
|
1263 |
+
{
|
1264 |
+
var href = anchor.attr("href"),
|
1265 |
+
position = parseInt(href.substring(href.lastIndexOf("-") + 1), 0);
|
1266 |
+
|
1267 |
+
goToStep(wizard, options, state, position);
|
1268 |
+
}
|
1269 |
+
|
1270 |
+
// If nothing has changed
|
1271 |
+
if (oldIndex === state.currentIndex)
|
1272 |
+
{
|
1273 |
+
getStepAnchor(wizard, oldIndex).focus();
|
1274 |
+
return false;
|
1275 |
+
}
|
1276 |
+
}
|
1277 |
+
|
1278 |
+
function throwError(message)
|
1279 |
+
{
|
1280 |
+
if (arguments.length > 1)
|
1281 |
+
{
|
1282 |
+
message = message.format(Array.prototype.slice.call(arguments, 1));
|
1283 |
+
}
|
1284 |
+
|
1285 |
+
throw new Error(message);
|
1286 |
+
}
|
1287 |
+
|
1288 |
+
/**
|
1289 |
+
* Checks an argument for null or undefined and throws an error if one check applies.
|
1290 |
+
*
|
1291 |
+
* @static
|
1292 |
+
* @private
|
1293 |
+
* @method validateArgument
|
1294 |
+
* @param argumentName {String} The name of the given argument
|
1295 |
+
* @param argumentValue {Object} The argument itself
|
1296 |
+
*/
|
1297 |
+
function validateArgument(argumentName, argumentValue)
|
1298 |
+
{
|
1299 |
+
if (argumentValue == null)
|
1300 |
+
{
|
1301 |
+
throwError("The argument '{0}' is null or undefined.", argumentName);
|
1302 |
+
}
|
1303 |
+
}
|
1304 |
+
|
1305 |
+
/**
|
1306 |
+
* Represents a jQuery wizard plugin.
|
1307 |
+
*
|
1308 |
+
* @class steps
|
1309 |
+
* @constructor
|
1310 |
+
* @param [method={}] The name of the method as `String` or an JSON object for initialization
|
1311 |
+
* @param [params=]* {Array} Additional arguments for a method call
|
1312 |
+
* @chainable
|
1313 |
+
**/
|
1314 |
+
$.fn.steps = function (method)
|
1315 |
+
{
|
1316 |
+
if ($.fn.steps[method])
|
1317 |
+
{
|
1318 |
+
return $.fn.steps[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
1319 |
+
}
|
1320 |
+
else if (typeof method === "object" || !method)
|
1321 |
+
{
|
1322 |
+
return initialize.apply(this, arguments);
|
1323 |
+
}
|
1324 |
+
else
|
1325 |
+
{
|
1326 |
+
$.error("Method " + method + " does not exist on jQuery.steps");
|
1327 |
+
}
|
1328 |
+
};
|
1329 |
+
|
1330 |
+
$.fn.steps.reset = function () {
|
1331 |
+
var wizard = this,
|
1332 |
+
options = getOptions(this),
|
1333 |
+
state = getState(this);
|
1334 |
+
goToStep(wizard, options, state, 0);
|
1335 |
+
|
1336 |
+
for (i = 1; i < state.stepCount; i++) {
|
1337 |
+
var stepAnchor = getStepAnchor(wizard, i);
|
1338 |
+
stepAnchor.parent().removeClass("done")._enableAria(false);
|
1339 |
+
}
|
1340 |
+
};
|
1341 |
+
|
1342 |
+
/**
|
1343 |
+
* Adds a new step.
|
1344 |
+
*
|
1345 |
+
* @method add
|
1346 |
+
* @param step {Object} The step object to add
|
1347 |
+
* @chainable
|
1348 |
+
**/
|
1349 |
+
$.fn.steps.add = function (step)
|
1350 |
+
{
|
1351 |
+
var state = getState(this);
|
1352 |
+
return insertStep(this, getOptions(this), state, state.stepCount, step);
|
1353 |
+
};
|
1354 |
+
|
1355 |
+
/**
|
1356 |
+
* Removes the control functionality completely and transforms the current state to the initial HTML structure.
|
1357 |
+
*
|
1358 |
+
* @method destroy
|
1359 |
+
* @chainable
|
1360 |
+
**/
|
1361 |
+
$.fn.steps.destroy = function ()
|
1362 |
+
{
|
1363 |
+
return destroy(this, getOptions(this));
|
1364 |
+
};
|
1365 |
+
|
1366 |
+
/**
|
1367 |
+
* Triggers the onFinishing and onFinished event.
|
1368 |
+
*
|
1369 |
+
* @method finish
|
1370 |
+
**/
|
1371 |
+
$.fn.steps.finish = function ()
|
1372 |
+
{
|
1373 |
+
finishStep(this, getState(this));
|
1374 |
+
};
|
1375 |
+
|
1376 |
+
/**
|
1377 |
+
* Gets the current step index.
|
1378 |
+
*
|
1379 |
+
* @method getCurrentIndex
|
1380 |
+
* @return {Integer} The actual step index (zero-based)
|
1381 |
+
* @for steps
|
1382 |
+
**/
|
1383 |
+
$.fn.steps.getCurrentIndex = function ()
|
1384 |
+
{
|
1385 |
+
return getState(this).currentIndex;
|
1386 |
+
};
|
1387 |
+
|
1388 |
+
/**
|
1389 |
+
* Gets the current step object.
|
1390 |
+
*
|
1391 |
+
* @method getCurrentStep
|
1392 |
+
* @return {Object} The actual step object
|
1393 |
+
**/
|
1394 |
+
$.fn.steps.getCurrentStep = function ()
|
1395 |
+
{
|
1396 |
+
return getStep(this, getState(this).currentIndex);
|
1397 |
+
};
|
1398 |
+
|
1399 |
+
/**
|
1400 |
+
* Gets a specific step object by index.
|
1401 |
+
*
|
1402 |
+
* @method getStep
|
1403 |
+
* @param index {Integer} An integer that belongs to the position of a step
|
1404 |
+
* @return {Object} A specific step object
|
1405 |
+
**/
|
1406 |
+
$.fn.steps.getStep = function (index)
|
1407 |
+
{
|
1408 |
+
return getStep(this, index);
|
1409 |
+
};
|
1410 |
+
|
1411 |
+
/**
|
1412 |
+
* Inserts a new step to a specific position.
|
1413 |
+
*
|
1414 |
+
* @method insert
|
1415 |
+
* @param index {Integer} The position (zero-based) to add
|
1416 |
+
* @param step {Object} The step object to add
|
1417 |
+
* @example
|
1418 |
+
* $("#wizard").steps().insert(0, {
|
1419 |
+
* title: "Title",
|
1420 |
+
* content: "", // optional
|
1421 |
+
* contentMode: "async", // optional
|
1422 |
+
* contentUrl: "/Content/Step/1" // optional
|
1423 |
+
* });
|
1424 |
+
* @chainable
|
1425 |
+
**/
|
1426 |
+
$.fn.steps.insert = function (index, step)
|
1427 |
+
{
|
1428 |
+
return insertStep(this, getOptions(this), getState(this), index, step);
|
1429 |
+
};
|
1430 |
+
|
1431 |
+
/**
|
1432 |
+
* Routes to the next step.
|
1433 |
+
*
|
1434 |
+
* @method next
|
1435 |
+
* @return {Boolean} Indicates whether the action executed
|
1436 |
+
**/
|
1437 |
+
$.fn.steps.next = function ()
|
1438 |
+
{
|
1439 |
+
return goToNextStep(this, getOptions(this), getState(this));
|
1440 |
+
};
|
1441 |
+
|
1442 |
+
/**
|
1443 |
+
* Routes to the previous step.
|
1444 |
+
*
|
1445 |
+
* @method previous
|
1446 |
+
* @return {Boolean} Indicates whether the action executed
|
1447 |
+
**/
|
1448 |
+
$.fn.steps.previous = function ()
|
1449 |
+
{
|
1450 |
+
return goToPreviousStep(this, getOptions(this), getState(this));
|
1451 |
+
};
|
1452 |
+
|
1453 |
+
/**
|
1454 |
+
* Removes a specific step by an given index.
|
1455 |
+
*
|
1456 |
+
* @method remove
|
1457 |
+
* @param index {Integer} The position (zero-based) of the step to remove
|
1458 |
+
* @return Indecates whether the item is removed.
|
1459 |
+
**/
|
1460 |
+
$.fn.steps.remove = function (index)
|
1461 |
+
{
|
1462 |
+
return removeStep(this, getOptions(this), getState(this), index);
|
1463 |
+
};
|
1464 |
+
|
1465 |
+
/**
|
1466 |
+
* Sets a specific step object by index.
|
1467 |
+
*
|
1468 |
+
* @method setStep
|
1469 |
+
* @param index {Integer} An integer that belongs to the position of a step
|
1470 |
+
* @param step {Object} The step object to change
|
1471 |
+
**/
|
1472 |
+
$.fn.steps.setStep = function (index, step)
|
1473 |
+
{
|
1474 |
+
throw new Error("Not yet implemented!");
|
1475 |
+
};
|
1476 |
+
|
1477 |
+
/**
|
1478 |
+
* Skips an certain amount of steps.
|
1479 |
+
*
|
1480 |
+
* @method skip
|
1481 |
+
* @param count {Integer} The amount of steps that should be skipped
|
1482 |
+
* @return {Boolean} Indicates whether the action executed
|
1483 |
+
**/
|
1484 |
+
$.fn.steps.skip = function (count)
|
1485 |
+
{
|
1486 |
+
throw new Error("Not yet implemented!");
|
1487 |
+
};
|
1488 |
+
|
1489 |
+
/**
|
1490 |
+
* An enum represents the different content types of a step and their loading mechanisms.
|
1491 |
+
*
|
1492 |
+
* @class contentMode
|
1493 |
+
* @for steps
|
1494 |
+
**/
|
1495 |
+
var contentMode = $.fn.steps.contentMode = {
|
1496 |
+
/**
|
1497 |
+
* HTML embedded content
|
1498 |
+
*
|
1499 |
+
* @readOnly
|
1500 |
+
* @property html
|
1501 |
+
* @type Integer
|
1502 |
+
* @for contentMode
|
1503 |
+
**/
|
1504 |
+
html: 0,
|
1505 |
+
|
1506 |
+
/**
|
1507 |
+
* IFrame embedded content
|
1508 |
+
*
|
1509 |
+
* @readOnly
|
1510 |
+
* @property iframe
|
1511 |
+
* @type Integer
|
1512 |
+
* @for contentMode
|
1513 |
+
**/
|
1514 |
+
iframe: 1,
|
1515 |
+
|
1516 |
+
/**
|
1517 |
+
* Async embedded content
|
1518 |
+
*
|
1519 |
+
* @readOnly
|
1520 |
+
* @property async
|
1521 |
+
* @type Integer
|
1522 |
+
* @for contentMode
|
1523 |
+
**/
|
1524 |
+
async: 2
|
1525 |
+
};
|
1526 |
+
|
1527 |
+
/**
|
1528 |
+
* An enum represents the orientation of the steps navigation.
|
1529 |
+
*
|
1530 |
+
* @class stepsOrientation
|
1531 |
+
* @for steps
|
1532 |
+
**/
|
1533 |
+
var stepsOrientation = $.fn.steps.stepsOrientation = {
|
1534 |
+
/**
|
1535 |
+
* Horizontal orientation
|
1536 |
+
*
|
1537 |
+
* @readOnly
|
1538 |
+
* @property horizontal
|
1539 |
+
* @type Integer
|
1540 |
+
* @for stepsOrientation
|
1541 |
+
**/
|
1542 |
+
horizontal: 0,
|
1543 |
+
|
1544 |
+
/**
|
1545 |
+
* Vertical orientation
|
1546 |
+
*
|
1547 |
+
* @readOnly
|
1548 |
+
* @property vertical
|
1549 |
+
* @type Integer
|
1550 |
+
* @for stepsOrientation
|
1551 |
+
**/
|
1552 |
+
vertical: 1
|
1553 |
+
};
|
1554 |
+
|
1555 |
+
/**
|
1556 |
+
* An enum that represents the various transition animations.
|
1557 |
+
*
|
1558 |
+
* @class transitionEffect
|
1559 |
+
* @for steps
|
1560 |
+
**/
|
1561 |
+
var transitionEffect = $.fn.steps.transitionEffect = {
|
1562 |
+
/**
|
1563 |
+
* No transition animation
|
1564 |
+
*
|
1565 |
+
* @readOnly
|
1566 |
+
* @property none
|
1567 |
+
* @type Integer
|
1568 |
+
* @for transitionEffect
|
1569 |
+
**/
|
1570 |
+
none: 0,
|
1571 |
+
|
1572 |
+
/**
|
1573 |
+
* Fade in transition
|
1574 |
+
*
|
1575 |
+
* @readOnly
|
1576 |
+
* @property fade
|
1577 |
+
* @type Integer
|
1578 |
+
* @for transitionEffect
|
1579 |
+
**/
|
1580 |
+
fade: 1,
|
1581 |
+
|
1582 |
+
/**
|
1583 |
+
* Slide up transition
|
1584 |
+
*
|
1585 |
+
* @readOnly
|
1586 |
+
* @property slide
|
1587 |
+
* @type Integer
|
1588 |
+
* @for transitionEffect
|
1589 |
+
**/
|
1590 |
+
slide: 2,
|
1591 |
+
|
1592 |
+
/**
|
1593 |
+
* Slide left transition
|
1594 |
+
*
|
1595 |
+
* @readOnly
|
1596 |
+
* @property slideLeft
|
1597 |
+
* @type Integer
|
1598 |
+
* @for transitionEffect
|
1599 |
+
**/
|
1600 |
+
slideLeft: 3
|
1601 |
+
};
|
1602 |
+
|
1603 |
+
var stepModel = $.fn.steps.stepModel = {
|
1604 |
+
title: "",
|
1605 |
+
content: "",
|
1606 |
+
contentUrl: "",
|
1607 |
+
contentMode: contentMode.html,
|
1608 |
+
contentLoaded: false
|
1609 |
+
};
|
1610 |
+
|
1611 |
+
/**
|
1612 |
+
* An object that represents the default settings.
|
1613 |
+
* There are two possibities to override the sub-properties.
|
1614 |
+
* Either by doing it generally (global) or on initialization.
|
1615 |
+
*
|
1616 |
+
* @static
|
1617 |
+
* @class defaults
|
1618 |
+
* @for steps
|
1619 |
+
* @example
|
1620 |
+
* // Global approach
|
1621 |
+
* $.steps.defaults.headerTag = "h3";
|
1622 |
+
* @example
|
1623 |
+
* // Initialization approach
|
1624 |
+
* $("#wizard").steps({ headerTag: "h3" });
|
1625 |
+
**/
|
1626 |
+
var defaults = $.fn.steps.defaults = {
|
1627 |
+
/**
|
1628 |
+
* The header tag is used to find the step button text within the declared wizard area.
|
1629 |
+
*
|
1630 |
+
* @property headerTag
|
1631 |
+
* @type String
|
1632 |
+
* @default "h1"
|
1633 |
+
* @for defaults
|
1634 |
+
**/
|
1635 |
+
headerTag: "h1",
|
1636 |
+
|
1637 |
+
/**
|
1638 |
+
* The body tag is used to find the step content within the declared wizard area.
|
1639 |
+
*
|
1640 |
+
* @property bodyTag
|
1641 |
+
* @type String
|
1642 |
+
* @default "div"
|
1643 |
+
* @for defaults
|
1644 |
+
**/
|
1645 |
+
bodyTag: "div",
|
1646 |
+
|
1647 |
+
/**
|
1648 |
+
* The content container tag which will be used to wrap all step contents.
|
1649 |
+
*
|
1650 |
+
* @property contentContainerTag
|
1651 |
+
* @type String
|
1652 |
+
* @default "div"
|
1653 |
+
* @for defaults
|
1654 |
+
**/
|
1655 |
+
contentContainerTag: "div",
|
1656 |
+
|
1657 |
+
/**
|
1658 |
+
* The action container tag which will be used to wrap the pagination navigation.
|
1659 |
+
*
|
1660 |
+
* @property actionContainerTag
|
1661 |
+
* @type String
|
1662 |
+
* @default "div"
|
1663 |
+
* @for defaults
|
1664 |
+
**/
|
1665 |
+
actionContainerTag: "div",
|
1666 |
+
|
1667 |
+
/**
|
1668 |
+
* The steps container tag which will be used to wrap the steps navigation.
|
1669 |
+
*
|
1670 |
+
* @property stepsContainerTag
|
1671 |
+
* @type String
|
1672 |
+
* @default "div"
|
1673 |
+
* @for defaults
|
1674 |
+
**/
|
1675 |
+
stepsContainerTag: "div",
|
1676 |
+
|
1677 |
+
/**
|
1678 |
+
* The css class which will be added to the outer component wrapper.
|
1679 |
+
*
|
1680 |
+
* @property cssClass
|
1681 |
+
* @type String
|
1682 |
+
* @default "wizard"
|
1683 |
+
* @for defaults
|
1684 |
+
* @example
|
1685 |
+
* <div class="wizard">
|
1686 |
+
* ...
|
1687 |
+
* </div>
|
1688 |
+
**/
|
1689 |
+
cssClass: "wizard",
|
1690 |
+
|
1691 |
+
/**
|
1692 |
+
* The css class which will be used for floating scenarios.
|
1693 |
+
*
|
1694 |
+
* @property clearFixCssClass
|
1695 |
+
* @type String
|
1696 |
+
* @default "clearfix"
|
1697 |
+
* @for defaults
|
1698 |
+
**/
|
1699 |
+
clearFixCssClass: "clearfix",
|
1700 |
+
|
1701 |
+
/**
|
1702 |
+
* Determines whether the steps are vertically or horizontally oriented.
|
1703 |
+
*
|
1704 |
+
* @property stepsOrientation
|
1705 |
+
* @type stepsOrientation
|
1706 |
+
* @default horizontal
|
1707 |
+
* @for defaults
|
1708 |
+
* @since 1.0.0
|
1709 |
+
**/
|
1710 |
+
stepsOrientation: stepsOrientation.horizontal,
|
1711 |
+
|
1712 |
+
/*
|
1713 |
+
* Tempplates
|
1714 |
+
*/
|
1715 |
+
|
1716 |
+
/**
|
1717 |
+
* The title template which will be used to create a step button.
|
1718 |
+
*
|
1719 |
+
* @property titleTemplate
|
1720 |
+
* @type String
|
1721 |
+
* @default "<span class=\"number\">#index#.</span> #title#"
|
1722 |
+
* @for defaults
|
1723 |
+
**/
|
1724 |
+
titleTemplate: "<span class=\"number\">#index#.</span> #title#",
|
1725 |
+
|
1726 |
+
/**
|
1727 |
+
* The loading template which will be used to create the loading animation.
|
1728 |
+
*
|
1729 |
+
* @property loadingTemplate
|
1730 |
+
* @type String
|
1731 |
+
* @default "<span class=\"spinner\"></span> #text#"
|
1732 |
+
* @for defaults
|
1733 |
+
**/
|
1734 |
+
loadingTemplate: "<span class=\"spinner\"></span> #text#",
|
1735 |
+
|
1736 |
+
/*
|
1737 |
+
* Behaviour
|
1738 |
+
*/
|
1739 |
+
|
1740 |
+
/**
|
1741 |
+
* Sets the focus to the first wizard instance in order to enable the key navigation from the begining if `true`.
|
1742 |
+
*
|
1743 |
+
* @property autoFocus
|
1744 |
+
* @type Boolean
|
1745 |
+
* @default false
|
1746 |
+
* @for defaults
|
1747 |
+
* @since 0.9.4
|
1748 |
+
**/
|
1749 |
+
autoFocus: false,
|
1750 |
+
|
1751 |
+
/**
|
1752 |
+
* Enables all steps from the begining if `true` (all steps are clickable).
|
1753 |
+
*
|
1754 |
+
* @property enableAllSteps
|
1755 |
+
* @type Boolean
|
1756 |
+
* @default false
|
1757 |
+
* @for defaults
|
1758 |
+
**/
|
1759 |
+
enableAllSteps: false,
|
1760 |
+
|
1761 |
+
/**
|
1762 |
+
* Enables keyboard navigation if `true` (arrow left and arrow right).
|
1763 |
+
*
|
1764 |
+
* @property enableKeyNavigation
|
1765 |
+
* @type Boolean
|
1766 |
+
* @default true
|
1767 |
+
* @for defaults
|
1768 |
+
**/
|
1769 |
+
enableKeyNavigation: true,
|
1770 |
+
|
1771 |
+
/**
|
1772 |
+
* Enables pagination if `true`.
|
1773 |
+
*
|
1774 |
+
* @property enablePagination
|
1775 |
+
* @type Boolean
|
1776 |
+
* @default true
|
1777 |
+
* @for defaults
|
1778 |
+
**/
|
1779 |
+
enablePagination: true,
|
1780 |
+
|
1781 |
+
/**
|
1782 |
+
* Suppresses pagination if a form field is focused.
|
1783 |
+
*
|
1784 |
+
* @property suppressPaginationOnFocus
|
1785 |
+
* @type Boolean
|
1786 |
+
* @default true
|
1787 |
+
* @for defaults
|
1788 |
+
**/
|
1789 |
+
suppressPaginationOnFocus: true,
|
1790 |
+
|
1791 |
+
/**
|
1792 |
+
* Enables cache for async loaded or iframe embedded content.
|
1793 |
+
*
|
1794 |
+
* @property enableContentCache
|
1795 |
+
* @type Boolean
|
1796 |
+
* @default true
|
1797 |
+
* @for defaults
|
1798 |
+
**/
|
1799 |
+
enableContentCache: true,
|
1800 |
+
|
1801 |
+
/**
|
1802 |
+
* Shows the cancel button if enabled.
|
1803 |
+
*
|
1804 |
+
* @property enableCancelButton
|
1805 |
+
* @type Boolean
|
1806 |
+
* @default false
|
1807 |
+
* @for defaults
|
1808 |
+
**/
|
1809 |
+
enableCancelButton: false,
|
1810 |
+
|
1811 |
+
/**
|
1812 |
+
* Shows the finish button if enabled.
|
1813 |
+
*
|
1814 |
+
* @property enableFinishButton
|
1815 |
+
* @type Boolean
|
1816 |
+
* @default true
|
1817 |
+
* @for defaults
|
1818 |
+
**/
|
1819 |
+
enableFinishButton: true,
|
1820 |
+
|
1821 |
+
/**
|
1822 |
+
* Not yet implemented.
|
1823 |
+
*
|
1824 |
+
* @property preloadContent
|
1825 |
+
* @type Boolean
|
1826 |
+
* @default false
|
1827 |
+
* @for defaults
|
1828 |
+
**/
|
1829 |
+
preloadContent: false,
|
1830 |
+
|
1831 |
+
/**
|
1832 |
+
* Shows the finish button always (on each step; right beside the next button) if `true`.
|
1833 |
+
* Otherwise the next button will be replaced by the finish button if the last step becomes active.
|
1834 |
+
*
|
1835 |
+
* @property showFinishButtonAlways
|
1836 |
+
* @type Boolean
|
1837 |
+
* @default false
|
1838 |
+
* @for defaults
|
1839 |
+
**/
|
1840 |
+
showFinishButtonAlways: false,
|
1841 |
+
|
1842 |
+
/**
|
1843 |
+
* Prevents jumping to a previous step.
|
1844 |
+
*
|
1845 |
+
* @property forceMoveForward
|
1846 |
+
* @type Boolean
|
1847 |
+
* @default false
|
1848 |
+
* @for defaults
|
1849 |
+
**/
|
1850 |
+
forceMoveForward: false,
|
1851 |
+
|
1852 |
+
/**
|
1853 |
+
* Saves the current state (step position) to a cookie.
|
1854 |
+
* By coming next time the last active step becomes activated.
|
1855 |
+
*
|
1856 |
+
* @property saveState
|
1857 |
+
* @type Boolean
|
1858 |
+
* @default false
|
1859 |
+
* @for defaults
|
1860 |
+
**/
|
1861 |
+
saveState: false,
|
1862 |
+
|
1863 |
+
/**
|
1864 |
+
* The position to start on (zero-based).
|
1865 |
+
*
|
1866 |
+
* @property startIndex
|
1867 |
+
* @type Integer
|
1868 |
+
* @default 0
|
1869 |
+
* @for defaults
|
1870 |
+
**/
|
1871 |
+
startIndex: 0,
|
1872 |
+
|
1873 |
+
/*
|
1874 |
+
* Animation Effect Configuration
|
1875 |
+
*/
|
1876 |
+
|
1877 |
+
/**
|
1878 |
+
* The animation effect which will be used for step transitions.
|
1879 |
+
*
|
1880 |
+
* @property transitionEffect
|
1881 |
+
* @type transitionEffect
|
1882 |
+
* @default none
|
1883 |
+
* @for defaults
|
1884 |
+
**/
|
1885 |
+
transitionEffect: transitionEffect.none,
|
1886 |
+
|
1887 |
+
/**
|
1888 |
+
* Animation speed for step transitions (in milliseconds).
|
1889 |
+
*
|
1890 |
+
* @property transitionEffectSpeed
|
1891 |
+
* @type Integer
|
1892 |
+
* @default 200
|
1893 |
+
* @for defaults
|
1894 |
+
**/
|
1895 |
+
transitionEffectSpeed: 200,
|
1896 |
+
|
1897 |
+
/*
|
1898 |
+
* Events
|
1899 |
+
*/
|
1900 |
+
|
1901 |
+
/**
|
1902 |
+
* Fires before the step changes and can be used to prevent step changing by returning `false`.
|
1903 |
+
* Very useful for form validation.
|
1904 |
+
*
|
1905 |
+
* @property onStepChanging
|
1906 |
+
* @type Event
|
1907 |
+
* @default function (event, currentIndex, newIndex) { return true; }
|
1908 |
+
* @for defaults
|
1909 |
+
**/
|
1910 |
+
onStepChanging: function (event, currentIndex, newIndex) { return true; },
|
1911 |
+
|
1912 |
+
/**
|
1913 |
+
* Fires after the step has change.
|
1914 |
+
*
|
1915 |
+
* @property onStepChanged
|
1916 |
+
* @type Event
|
1917 |
+
* @default function (event, currentIndex, priorIndex) { }
|
1918 |
+
* @for defaults
|
1919 |
+
**/
|
1920 |
+
onStepChanged: function (event, currentIndex, priorIndex) { },
|
1921 |
+
|
1922 |
+
/**
|
1923 |
+
* Fires after cancelation.
|
1924 |
+
*
|
1925 |
+
* @property onCanceled
|
1926 |
+
* @type Event
|
1927 |
+
* @default function (event) { }
|
1928 |
+
* @for defaults
|
1929 |
+
**/
|
1930 |
+
onCanceled: function (event) { },
|
1931 |
+
|
1932 |
+
/**
|
1933 |
+
* Fires before finishing and can be used to prevent completion by returning `false`.
|
1934 |
+
* Very useful for form validation.
|
1935 |
+
*
|
1936 |
+
* @property onFinishing
|
1937 |
+
* @type Event
|
1938 |
+
* @default function (event, currentIndex) { return true; }
|
1939 |
+
* @for defaults
|
1940 |
+
**/
|
1941 |
+
onFinishing: function (event, currentIndex) { return true; },
|
1942 |
+
|
1943 |
+
/**
|
1944 |
+
* Fires after completion.
|
1945 |
+
*
|
1946 |
+
* @property onFinished
|
1947 |
+
* @type Event
|
1948 |
+
* @default function (event, currentIndex) { }
|
1949 |
+
* @for defaults
|
1950 |
+
**/
|
1951 |
+
onFinished: function (event, currentIndex) { },
|
1952 |
+
|
1953 |
+
/**
|
1954 |
+
* Fires after async content is loaded.
|
1955 |
+
*
|
1956 |
+
* @property onContentLoaded
|
1957 |
+
* @type Event
|
1958 |
+
* @default function (event, index) { }
|
1959 |
+
* @for defaults
|
1960 |
+
**/
|
1961 |
+
onContentLoaded: function (event, currentIndex) { },
|
1962 |
+
|
1963 |
+
/**
|
1964 |
+
* Fires when the wizard is initialized.
|
1965 |
+
*
|
1966 |
+
* @property onInit
|
1967 |
+
* @type Event
|
1968 |
+
* @default function (event) { }
|
1969 |
+
* @for defaults
|
1970 |
+
**/
|
1971 |
+
onInit: function (event, currentIndex) { },
|
1972 |
+
|
1973 |
+
/**
|
1974 |
+
* Contains all labels.
|
1975 |
+
*
|
1976 |
+
* @property labels
|
1977 |
+
* @type Object
|
1978 |
+
* @for defaults
|
1979 |
+
**/
|
1980 |
+
labels: {
|
1981 |
+
/**
|
1982 |
+
* Label for the cancel button.
|
1983 |
+
*
|
1984 |
+
* @property cancel
|
1985 |
+
* @type String
|
1986 |
+
* @default "Cancel"
|
1987 |
+
* @for defaults
|
1988 |
+
**/
|
1989 |
+
cancel: "Cancel",
|
1990 |
+
|
1991 |
+
/**
|
1992 |
+
* This label is important for accessability reasons.
|
1993 |
+
* Indicates which step is activated.
|
1994 |
+
*
|
1995 |
+
* @property current
|
1996 |
+
* @type String
|
1997 |
+
* @default "current step:"
|
1998 |
+
* @for defaults
|
1999 |
+
**/
|
2000 |
+
current: "current step:",
|
2001 |
+
|
2002 |
+
/**
|
2003 |
+
* This label is important for accessability reasons and describes the kind of navigation.
|
2004 |
+
*
|
2005 |
+
* @property pagination
|
2006 |
+
* @type String
|
2007 |
+
* @default "Pagination"
|
2008 |
+
* @for defaults
|
2009 |
+
* @since 0.9.7
|
2010 |
+
**/
|
2011 |
+
pagination: "Pagination",
|
2012 |
+
|
2013 |
+
/**
|
2014 |
+
* Label for the finish button.
|
2015 |
+
*
|
2016 |
+
* @property finish
|
2017 |
+
* @type String
|
2018 |
+
* @default "Finish"
|
2019 |
+
* @for defaults
|
2020 |
+
**/
|
2021 |
+
finish: "Finish",
|
2022 |
+
|
2023 |
+
/**
|
2024 |
+
* Label for the next button.
|
2025 |
+
*
|
2026 |
+
* @property next
|
2027 |
+
* @type String
|
2028 |
+
* @default "Next"
|
2029 |
+
* @for defaults
|
2030 |
+
**/
|
2031 |
+
next: "Next",
|
2032 |
+
|
2033 |
+
/**
|
2034 |
+
* Label for the previous button.
|
2035 |
+
*
|
2036 |
+
* @property previous
|
2037 |
+
* @type String
|
2038 |
+
* @default "Previous"
|
2039 |
+
* @for defaults
|
2040 |
+
**/
|
2041 |
+
previous: "Previous",
|
2042 |
+
|
2043 |
+
/**
|
2044 |
+
* Label for the loading animation.
|
2045 |
+
*
|
2046 |
+
* @property loading
|
2047 |
+
* @type String
|
2048 |
+
* @default "Loading ..."
|
2049 |
+
* @for defaults
|
2050 |
+
**/
|
2051 |
+
loading: "Loading ..."
|
2052 |
+
}
|
2053 |
+
};
|
2054 |
+
})(jQuery);
|
js/src/jquery-steps/build/jquery.steps.min.js
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* jQuery Steps v1.1.0 - 09/04/2014
|
3 |
+
* Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)
|
4 |
+
* Licensed under MIT http://www.opensource.org/licenses/MIT
|
5 |
+
*/
|
6 |
+
!function(a,b){function c(a,b){o(a).push(b)}function d(d,e,f){var g=d.children(e.headerTag),h=d.children(e.bodyTag);g.length>h.length?R(Z,"contents"):g.length<h.length&&R(Z,"titles");var i=e.startIndex;if(f.stepCount=g.length,e.saveState&&a.cookie){var j=a.cookie(U+q(d)),k=parseInt(j,0);!isNaN(k)&&k<f.stepCount&&(i=k)}f.currentIndex=i,g.each(function(e){var f=a(this),g=h.eq(e),i=g.data("mode"),j=null==i?$.html:r($,/^\s*$/.test(i)||isNaN(i)?i:parseInt(i,0)),k=j===$.html||g.data("url")===b?"":g.data("url"),l=j!==$.html&&"1"===g.data("loaded"),m=a.extend({},bb,{title:f.html(),content:j===$.html?g.html():"",contentUrl:k,contentMode:j,contentLoaded:l});c(d,m)})}function e(a){a.triggerHandler("canceled")}function f(a,b){return a.currentIndex-b}function g(b,c){var d=i(b);b.unbind(d).removeData("uid").removeData("options").removeData("state").removeData("steps").removeData("eventNamespace").find(".actions a").unbind(d),b.removeClass(c.clearFixCssClass+" vertical");var e=b.find(".content > *");e.removeData("loaded").removeData("mode").removeData("url"),e.removeAttr("id").removeAttr("role").removeAttr("tabindex").removeAttr("class").removeAttr("style")._removeAria("labelledby")._removeAria("hidden"),b.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();var f=a('<{0} class="{1}"></{0}>'.format(b.get(0).tagName,b.attr("class"))),g=b._id();return null!=g&&""!==g&&f._id(g),f.html(b.find(".content").html()),b.after(f),b.remove(),f}function h(a,b){var c=a.find(".steps li").eq(b.currentIndex);a.triggerHandler("finishing",[b.currentIndex])?(c.addClass("done").removeClass("error"),a.triggerHandler("finished",[b.currentIndex])):c.addClass("error")}function i(a){var b=a.data("eventNamespace");return null==b&&(b="."+q(a),a.data("eventNamespace",b)),b}function j(a,b){var c=q(a);return a.find("#"+c+V+b)}function k(a,b){var c=q(a);return a.find("#"+c+W+b)}function l(a,b){var c=q(a);return a.find("#"+c+X+b)}function m(a){return a.data("options")}function n(a){return a.data("state")}function o(a){return a.data("steps")}function p(a,b){var c=o(a);return(0>b||b>=c.length)&&R(Y),c[b]}function q(a){var b=a.data("uid");return null==b&&(b=a._id(),null==b&&(b="steps-uid-".concat(T),a._id(b)),T++,a.data("uid",b)),b}function r(a,c){if(S("enumType",a),S("keyOrValue",c),"string"==typeof c){var d=a[c];return d===b&&R("The enum key '{0}' does not exist.",c),d}if("number"==typeof c){for(var e in a)if(a[e]===c)return c;R("Invalid enum value '{0}'.",c)}else R("Invalid key or value type.")}function s(a,b,c){return B(a,b,c,v(c,1))}function t(a,b,c){return B(a,b,c,f(c,1))}function u(a,b,c,d){if((0>d||d>=c.stepCount)&&R(Y),!(b.forceMoveForward&&d<c.currentIndex)){var e=c.currentIndex;return a.triggerHandler("stepChanging",[c.currentIndex,d])?(c.currentIndex=d,O(a,b,c),E(a,b,c,e),D(a,b,c),A(a,b,c),P(a,b,c,d,e,function(){a.triggerHandler("stepChanged",[d,e])})):a.find(".steps li").eq(e).addClass("error"),!0}}function v(a,b){return a.currentIndex+b}function w(b){var c=a.extend(!0,{},cb,b);return this.each(function(){var b=a(this),e={currentIndex:c.startIndex,currentStep:null,stepCount:0,transitionElement:null};b.data("options",c),b.data("state",e),b.data("steps",[]),d(b,c,e),J(b,c,e),G(b,c),c.autoFocus&&0===T&&j(b,c.startIndex).focus(),b.triggerHandler("init",[c.startIndex])})}function x(b,c,d,e,f){(0>e||e>d.stepCount)&&R(Y),f=a.extend({},bb,f),y(b,e,f),d.currentIndex!==d.stepCount&&d.currentIndex>=e&&(d.currentIndex++,O(b,c,d)),d.stepCount++;var g=b.find(".content"),h=a("<{0}>{1}</{0}>".format(c.headerTag,f.title)),i=a("<{0}></{0}>".format(c.bodyTag));return(null==f.contentMode||f.contentMode===$.html)&&i.html(f.content),0===e?g.prepend(i).prepend(h):k(b,e-1).after(i).after(h),K(b,d,i,e),N(b,c,d,h,e),F(b,c,d,e),e===d.currentIndex&&E(b,c,d),D(b,c,d),b}function y(a,b,c){o(a).splice(b,0,c)}function z(b){var c=a(this),d=m(c),e=n(c);if(d.suppressPaginationOnFocus&&c.find(":focus").is(":input"))return b.preventDefault(),!1;var f={left:37,right:39};b.keyCode===f.left?(b.preventDefault(),t(c,d,e)):b.keyCode===f.right&&(b.preventDefault(),s(c,d,e))}function A(b,c,d){if(d.stepCount>0){var e=d.currentIndex,f=p(b,e);if(!c.enableContentCache||!f.contentLoaded)switch(r($,f.contentMode)){case $.iframe:b.find(".content > .body").eq(d.currentIndex).empty().html('<iframe src="'+f.contentUrl+'" frameborder="0" scrolling="no" />').data("loaded","1");break;case $.async:var g=k(b,e)._aria("busy","true").empty().append(M(c.loadingTemplate,{text:c.labels.loading}));a.ajax({url:f.contentUrl,cache:!1}).done(function(a){g.empty().html(a)._aria("busy","false").data("loaded","1"),b.triggerHandler("contentLoaded",[e])})}}}function B(a,b,c,d){var e=c.currentIndex;if(d>=0&&d<c.stepCount&&!(b.forceMoveForward&&d<c.currentIndex)){var f=j(a,d),g=f.parent(),h=g.hasClass("disabled");return g._enableAria(),f.click(),e===c.currentIndex&&h?(g._enableAria(!1),!1):!0}return!1}function C(b){b.preventDefault();var c=a(this),d=c.parent().parent().parent().parent(),f=m(d),g=n(d),i=c.attr("href");switch(i.substring(i.lastIndexOf("#")+1)){case"cancel":e(d);break;case"finish":h(d,g);break;case"next":s(d,f,g);break;case"previous":t(d,f,g)}}function D(a,b,c){if(b.enablePagination){var d=a.find(".actions a[href$='#finish']").parent(),e=a.find(".actions a[href$='#next']").parent();if(!b.forceMoveForward){var f=a.find(".actions a[href$='#previous']").parent();f._enableAria(c.currentIndex>0)}b.enableFinishButton&&b.showFinishButtonAlways?(d._enableAria(c.stepCount>0),e._enableAria(c.stepCount>1&&c.stepCount>c.currentIndex+1)):(d._showAria(b.enableFinishButton&&c.stepCount===c.currentIndex+1),e._showAria(0===c.stepCount||c.stepCount>c.currentIndex+1)._enableAria(c.stepCount>c.currentIndex+1||!b.enableFinishButton))}}function E(b,c,d,e){var f=j(b,d.currentIndex),g=a('<span class="current-info audible">'+c.labels.current+" </span>"),h=b.find(".content > .title");if(null!=e){var i=j(b,e);i.parent().addClass("done").removeClass("error")._selectAria(!1),h.eq(e).removeClass("current").next(".body").removeClass("current"),g=i.find(".current-info"),f.focus()}f.prepend(g).parent()._selectAria().removeClass("done")._enableAria(),h.eq(d.currentIndex).addClass("current").next(".body").addClass("current")}function F(a,b,c,d){for(var e=q(a),f=d;f<c.stepCount;f++){var g=e+V+f,h=e+W+f,i=e+X+f,j=a.find(".title").eq(f)._id(i);a.find(".steps a").eq(f)._id(g)._aria("controls",h).attr("href","#"+i).html(M(b.titleTemplate,{index:f+1,title:j.html()})),a.find(".body").eq(f)._id(h)._aria("labelledby",i)}}function G(a,b){var c=i(a);a.bind("canceled"+c,b.onCanceled),a.bind("contentLoaded"+c,b.onContentLoaded),a.bind("finishing"+c,b.onFinishing),a.bind("finished"+c,b.onFinished),a.bind("init"+c,b.onInit),a.bind("stepChanging"+c,b.onStepChanging),a.bind("stepChanged"+c,b.onStepChanged),b.enableKeyNavigation&&a.bind("keyup"+c,z),a.find(".actions a").bind("click"+c,C)}function H(a,b,c,d){return 0>d||d>=c.stepCount||c.currentIndex===d?!1:(I(a,d),c.currentIndex>d&&(c.currentIndex--,O(a,b,c)),c.stepCount--,l(a,d).remove(),k(a,d).remove(),j(a,d).parent().remove(),0===d&&a.find(".steps li").first().addClass("first"),d===c.stepCount&&a.find(".steps li").eq(d).addClass("last"),F(a,b,c,d),D(a,b,c),!0)}function I(a,b){o(a).splice(b,1)}function J(b,c,d){var e='<{0} class="{1}">{2}</{0}>',f=r(_,c.stepsOrientation),g=f===_.vertical?" vertical":"",h=a(e.format(c.contentContainerTag,"content "+c.clearFixCssClass,b.html())),i=a(e.format(c.stepsContainerTag,"steps "+c.clearFixCssClass,'<ul role="tablist"></ul>')),j=h.children(c.headerTag),k=h.children(c.bodyTag);b.attr("role","application").empty().append(i).append(h).addClass(c.cssClass+" "+c.clearFixCssClass+g),k.each(function(c){K(b,d,a(this),c)}),j.each(function(e){N(b,c,d,a(this),e)}),E(b,c,d),L(b,c,d)}function K(a,b,c,d){var e=q(a),f=e+W+d,g=e+X+d;c._id(f).attr("role","tabpanel")._aria("labelledby",g).addClass("body")._showAria(b.currentIndex===d)}function L(a,b,c){if(b.enablePagination){var d='<{0} class="actions {1}"><ul role="menu" aria-label="{2}">{3}</ul></{0}>',e='<li><a href="#{0}" role="menuitem">{1}</a></li>',f="";b.forceMoveForward||(f+=e.format("previous",b.labels.previous)),f+=e.format("next",b.labels.next),b.enableFinishButton&&(f+=e.format("finish",b.labels.finish)),b.enableCancelButton&&(f+=e.format("cancel",b.labels.cancel)),a.append(d.format(b.actionContainerTag,b.clearFixCssClass,b.labels.pagination,f)),D(a,b,c),A(a,b,c)}}function M(a,c){for(var d=a.match(/#([a-z]*)#/gi),e=0;e<d.length;e++){var f=d[e],g=f.substring(1,f.length-1);c[g]===b&&R("The key '{0}' does not exist in the substitute collection!",g),a=a.replace(f,c[g])}return a}function N(b,c,d,e,f){var g=q(b),h=g+V+f,j=g+W+f,k=g+X+f,l=b.find(".steps > ul"),m=M(c.titleTemplate,{index:f+1,title:e.html()}),n=a('<li role="tab"><a id="'+h+'" href="#'+k+'" aria-controls="'+j+'">'+m+"</a></li>");n._enableAria(c.enableAllSteps||d.currentIndex>f),d.currentIndex>f&&n.addClass("done"),e._id(k).attr("tabindex","-1").addClass("title"),0===f?l.prepend(n):l.find("li").eq(f-1).after(n),0===f&&l.find("li").removeClass("first").eq(f).addClass("first"),f===d.stepCount-1&&l.find("li").removeClass("last").eq(f).addClass("last"),n.children("a").bind("click"+i(b),Q)}function O(b,c,d){c.saveState&&a.cookie&&a.cookie(U+q(b),d.currentIndex)}function P(b,c,d,e,f,g){var h=b.find(".content > .body"),i=r(ab,c.transitionEffect),j=c.transitionEffectSpeed,k=h.eq(e),l=h.eq(f);switch(i){case ab.fade:case ab.slide:var m=i===ab.fade?"fadeOut":"slideUp",o=i===ab.fade?"fadeIn":"slideDown";d.transitionElement=k,l[m](j,function(){var b=a(this)._showAria(!1).parent().parent(),c=n(b);c.transitionElement&&(c.transitionElement[o](j,function(){a(this)._showAria()}).promise().done(g),c.transitionElement=null)});break;case ab.slideLeft:var p=l.outerWidth(!0),q=e>f?-p:p,s=e>f?p:-p;a.when(l.animate({left:q},j,function(){a(this)._showAria(!1)}),k.css("left",s+"px")._showAria().animate({left:0},j)).done(g);break;default:a.when(l._showAria(!1),k._showAria()).done(g)}}function Q(b){b.preventDefault();var c=a(this),d=c.parent().parent().parent().parent(),e=m(d),f=n(d),g=f.currentIndex;if(c.parent().is(":not(.disabled):not(.current)")){var h=c.attr("href"),i=parseInt(h.substring(h.lastIndexOf("-")+1),0);u(d,e,f,i)}return g===f.currentIndex?(j(d,g).focus(),!1):void 0}function R(a){throw arguments.length>1&&(a=a.format(Array.prototype.slice.call(arguments,1))),new Error(a)}function S(a,b){null==b&&R("The argument '{0}' is null or undefined.",a)}a.fn.extend({_aria:function(a,b){return this.attr("aria-"+a,b)},_removeAria:function(a){return this.removeAttr("aria-"+a)},_enableAria:function(a){return null==a||a?this.removeClass("disabled")._aria("disabled","false"):this.addClass("disabled")._aria("disabled","true")},_showAria:function(a){return null==a||a?this.show()._aria("hidden","false"):this.hide()._aria("hidden","true")},_selectAria:function(a){return null==a||a?this.addClass("current")._aria("selected","true"):this.removeClass("current")._aria("selected","false")},_id:function(a){return a?this.attr("id",a):this.attr("id")}}),String.prototype.format||(String.prototype.format=function(){for(var b=1===arguments.length&&a.isArray(arguments[0])?arguments[0]:arguments,c=this,d=0;d<b.length;d++){var e=new RegExp("\\{"+d+"\\}","gm");c=c.replace(e,b[d])}return c});var T=0,U="jQu3ry_5teps_St@te_",V="-t-",W="-p-",X="-h-",Y="Index out of range.",Z="One or more corresponding step {0} are missing.";a.fn.steps=function(b){return a.fn.steps[b]?a.fn.steps[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?void a.error("Method "+b+" does not exist on jQuery.steps"):w.apply(this,arguments)},a.fn.steps.add=function(a){var b=n(this);return x(this,m(this),b,b.stepCount,a)},a.fn.steps.destroy=function(){return g(this,m(this))},a.fn.steps.finish=function(){h(this,n(this))},a.fn.steps.getCurrentIndex=function(){return n(this).currentIndex},a.fn.steps.getCurrentStep=function(){return p(this,n(this).currentIndex)},a.fn.steps.getStep=function(a){return p(this,a)},a.fn.steps.insert=function(a,b){return x(this,m(this),n(this),a,b)},a.fn.steps.next=function(){return s(this,m(this),n(this))},a.fn.steps.previous=function(){return t(this,m(this),n(this))},a.fn.steps.remove=function(a){return H(this,m(this),n(this),a)},a.fn.steps.setStep=function(){throw new Error("Not yet implemented!")},a.fn.steps.skip=function(){throw new Error("Not yet implemented!")};var $=a.fn.steps.contentMode={html:0,iframe:1,async:2},_=a.fn.steps.stepsOrientation={horizontal:0,vertical:1},ab=a.fn.steps.transitionEffect={none:0,fade:1,slide:2,slideLeft:3},bb=a.fn.steps.stepModel={title:"",content:"",contentUrl:"",contentMode:$.html,contentLoaded:!1},cb=a.fn.steps.defaults={headerTag:"h1",bodyTag:"div",contentContainerTag:"div",actionContainerTag:"div",stepsContainerTag:"div",cssClass:"wizard",clearFixCssClass:"clearfix",stepsOrientation:_.horizontal,titleTemplate:'<span class="number">#index#.</span> #title#',loadingTemplate:'<span class="spinner"></span> #text#',autoFocus:!1,enableAllSteps:!1,enableKeyNavigation:!0,enablePagination:!0,suppressPaginationOnFocus:!0,enableContentCache:!0,enableCancelButton:!1,enableFinishButton:!0,preloadContent:!1,showFinishButtonAlways:!1,forceMoveForward:!1,saveState:!1,startIndex:0,transitionEffect:ab.none,transitionEffectSpeed:200,onStepChanging:function(){return!0},onStepChanged:function(){},onCanceled:function(){},onFinishing:function(){return!0},onFinished:function(){},onContentLoaded:function(){},onInit:function(){},labels:{cancel:"Cancel",current:"current step:",pagination:"Pagination",finish:"Finish",next:"Next",previous:"Previous",loading:"Loading ..."}}}(jQuery);
|
js/src/jquery-steps/demo/css/jquery.steps.css
ADDED
@@ -0,0 +1,382 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
Common
|
3 |
+
*/
|
4 |
+
|
5 |
+
.wizard,
|
6 |
+
.tabcontrol
|
7 |
+
{
|
8 |
+
display: block;
|
9 |
+
width: 100%;
|
10 |
+
overflow: hidden;
|
11 |
+
}
|
12 |
+
|
13 |
+
.wizard a,
|
14 |
+
.tabcontrol a
|
15 |
+
{
|
16 |
+
outline: 0;
|
17 |
+
}
|
18 |
+
|
19 |
+
.wizard ul,
|
20 |
+
.tabcontrol ul
|
21 |
+
{
|
22 |
+
list-style: none !important;
|
23 |
+
padding: 0;
|
24 |
+
margin: 0;
|
25 |
+
}
|
26 |
+
|
27 |
+
.wizard ul > li,
|
28 |
+
.tabcontrol ul > li
|
29 |
+
{
|
30 |
+
display: block;
|
31 |
+
padding: 0;
|
32 |
+
}
|
33 |
+
|
34 |
+
/* Accessibility */
|
35 |
+
.wizard > .steps .current-info,
|
36 |
+
.tabcontrol > .steps .current-info
|
37 |
+
{
|
38 |
+
position: absolute;
|
39 |
+
left: -999em;
|
40 |
+
}
|
41 |
+
|
42 |
+
.wizard > .content > .title,
|
43 |
+
.tabcontrol > .content > .title
|
44 |
+
{
|
45 |
+
position: absolute;
|
46 |
+
left: -999em;
|
47 |
+
}
|
48 |
+
|
49 |
+
|
50 |
+
|
51 |
+
/*
|
52 |
+
Wizard
|
53 |
+
*/
|
54 |
+
|
55 |
+
.wizard > .steps
|
56 |
+
{
|
57 |
+
position: relative;
|
58 |
+
display: block;
|
59 |
+
width: 100%;
|
60 |
+
}
|
61 |
+
|
62 |
+
.wizard.vertical > .steps
|
63 |
+
{
|
64 |
+
display: inline;
|
65 |
+
float: left;
|
66 |
+
width: 30%;
|
67 |
+
}
|
68 |
+
|
69 |
+
.wizard > .steps .number
|
70 |
+
{
|
71 |
+
font-size: 1.429em;
|
72 |
+
}
|
73 |
+
|
74 |
+
.wizard > .steps > ul > li
|
75 |
+
{
|
76 |
+
width: 25%;
|
77 |
+
}
|
78 |
+
|
79 |
+
.wizard > .steps > ul > li,
|
80 |
+
.wizard > .actions > ul > li
|
81 |
+
{
|
82 |
+
float: left;
|
83 |
+
}
|
84 |
+
|
85 |
+
.wizard.vertical > .steps > ul > li
|
86 |
+
{
|
87 |
+
float: none;
|
88 |
+
width: 100%;
|
89 |
+
}
|
90 |
+
|
91 |
+
.wizard > .steps a,
|
92 |
+
.wizard > .steps a:hover,
|
93 |
+
.wizard > .steps a:active
|
94 |
+
{
|
95 |
+
display: block;
|
96 |
+
width: auto;
|
97 |
+
margin: 0 0.5em 0.5em;
|
98 |
+
padding: 1em 1em;
|
99 |
+
text-decoration: none;
|
100 |
+
|
101 |
+
-webkit-border-radius: 5px;
|
102 |
+
-moz-border-radius: 5px;
|
103 |
+
border-radius: 5px;
|
104 |
+
}
|
105 |
+
|
106 |
+
.wizard > .steps .disabled a,
|
107 |
+
.wizard > .steps .disabled a:hover,
|
108 |
+
.wizard > .steps .disabled a:active
|
109 |
+
{
|
110 |
+
background: #eee;
|
111 |
+
color: #aaa;
|
112 |
+
cursor: default;
|
113 |
+
}
|
114 |
+
|
115 |
+
.wizard > .steps .current a,
|
116 |
+
.wizard > .steps .current a:hover,
|
117 |
+
.wizard > .steps .current a:active
|
118 |
+
{
|
119 |
+
background: #2184be;
|
120 |
+
color: #fff;
|
121 |
+
cursor: default;
|
122 |
+
}
|
123 |
+
|
124 |
+
.wizard > .steps .done a,
|
125 |
+
.wizard > .steps .done a:hover,
|
126 |
+
.wizard > .steps .done a:active
|
127 |
+
{
|
128 |
+
background: #9dc8e2;
|
129 |
+
color: #fff;
|
130 |
+
}
|
131 |
+
|
132 |
+
.wizard > .steps .error a,
|
133 |
+
.wizard > .steps .error a:hover,
|
134 |
+
.wizard > .steps .error a:active
|
135 |
+
{
|
136 |
+
background: #ff3111;
|
137 |
+
color: #fff;
|
138 |
+
}
|
139 |
+
|
140 |
+
.wizard > .content
|
141 |
+
{
|
142 |
+
background: #eee;
|
143 |
+
display: block;
|
144 |
+
margin: 0.5em;
|
145 |
+
min-height: 35em;
|
146 |
+
overflow: hidden;
|
147 |
+
position: relative;
|
148 |
+
width: auto;
|
149 |
+
|
150 |
+
-webkit-border-radius: 5px;
|
151 |
+
-moz-border-radius: 5px;
|
152 |
+
border-radius: 5px;
|
153 |
+
}
|
154 |
+
|
155 |
+
.wizard.vertical > .content
|
156 |
+
{
|
157 |
+
display: inline;
|
158 |
+
float: left;
|
159 |
+
margin: 0 2.5% 0.5em 2.5%;
|
160 |
+
width: 65%;
|
161 |
+
}
|
162 |
+
|
163 |
+
.wizard > .content > .body
|
164 |
+
{
|
165 |
+
float: left;
|
166 |
+
position: absolute;
|
167 |
+
width: 95%;
|
168 |
+
height: 95%;
|
169 |
+
padding: 2.5%;
|
170 |
+
}
|
171 |
+
|
172 |
+
.wizard > .content > .body ul
|
173 |
+
{
|
174 |
+
list-style: disc !important;
|
175 |
+
}
|
176 |
+
|
177 |
+
.wizard > .content > .body ul > li
|
178 |
+
{
|
179 |
+
display: list-item;
|
180 |
+
}
|
181 |
+
|
182 |
+
.wizard > .content > .body > iframe
|
183 |
+
{
|
184 |
+
border: 0 none;
|
185 |
+
width: 100%;
|
186 |
+
height: 100%;
|
187 |
+
}
|
188 |
+
|
189 |
+
.wizard > .content > .body input
|
190 |
+
{
|
191 |
+
display: block;
|
192 |
+
border: 1px solid #ccc;
|
193 |
+
}
|
194 |
+
|
195 |
+
.wizard > .content > .body input[type="checkbox"]
|
196 |
+
{
|
197 |
+
display: inline-block;
|
198 |
+
}
|
199 |
+
|
200 |
+
.wizard > .content > .body input.error
|
201 |
+
{
|
202 |
+
background: rgb(251, 227, 228);
|
203 |
+
border: 1px solid #fbc2c4;
|
204 |
+
color: #8a1f11;
|
205 |
+
}
|
206 |
+
|
207 |
+
.wizard > .content > .body label
|
208 |
+
{
|
209 |
+
display: inline-block;
|
210 |
+
margin-bottom: 0.5em;
|
211 |
+
}
|
212 |
+
|
213 |
+
.wizard > .content > .body label.error
|
214 |
+
{
|
215 |
+
color: #8a1f11;
|
216 |
+
display: inline-block;
|
217 |
+
margin-left: 1.5em;
|
218 |
+
}
|
219 |
+
|
220 |
+
.wizard > .actions
|
221 |
+
{
|
222 |
+
position: relative;
|
223 |
+
display: block;
|
224 |
+
text-align: right;
|
225 |
+
width: 100%;
|
226 |
+
}
|
227 |
+
|
228 |
+
.wizard.vertical > .actions
|
229 |
+
{
|
230 |
+
display: inline;
|
231 |
+
float: right;
|
232 |
+
margin: 0 2.5%;
|
233 |
+
width: 95%;
|
234 |
+
}
|
235 |
+
|
236 |
+
.wizard > .actions > ul
|
237 |
+
{
|
238 |
+
display: inline-block;
|
239 |
+
text-align: right;
|
240 |
+
}
|
241 |
+
|
242 |
+
.wizard > .actions > ul > li
|
243 |
+
{
|
244 |
+
margin: 0 0.5em;
|
245 |
+
}
|
246 |
+
|
247 |
+
.wizard.vertical > .actions > ul > li
|
248 |
+
{
|
249 |
+
margin: 0 0 0 1em;
|
250 |
+
}
|
251 |
+
|
252 |
+
.wizard > .actions a,
|
253 |
+
.wizard > .actions a:hover,
|
254 |
+
.wizard > .actions a:active
|
255 |
+
{
|
256 |
+
background: #2184be;
|
257 |
+
color: #fff;
|
258 |
+
display: block;
|
259 |
+
padding: 0.5em 1em;
|
260 |
+
text-decoration: none;
|
261 |
+
|
262 |
+
-webkit-border-radius: 5px;
|
263 |
+
-moz-border-radius: 5px;
|
264 |
+
border-radius: 5px;
|
265 |
+
}
|
266 |
+
|
267 |
+
.wizard > .actions .disabled a,
|
268 |
+
.wizard > .actions .disabled a:hover,
|
269 |
+
.wizard > .actions .disabled a:active
|
270 |
+
{
|
271 |
+
background: #eee;
|
272 |
+
color: #aaa;
|
273 |
+
}
|
274 |
+
|
275 |
+
.wizard > .loading
|
276 |
+
{
|
277 |
+
}
|
278 |
+
|
279 |
+
.wizard > .loading .spinner
|
280 |
+
{
|
281 |
+
}
|
282 |
+
|
283 |
+
|
284 |
+
|
285 |
+
/*
|
286 |
+
Tabcontrol
|
287 |
+
*/
|
288 |
+
|
289 |
+
.tabcontrol > .steps
|
290 |
+
{
|
291 |
+
position: relative;
|
292 |
+
display: block;
|
293 |
+
width: 100%;
|
294 |
+
}
|
295 |
+
|
296 |
+
.tabcontrol > .steps > ul
|
297 |
+
{
|
298 |
+
position: relative;
|
299 |
+
margin: 6px 0 0 0;
|
300 |
+
top: 1px;
|
301 |
+
z-index: 1;
|
302 |
+
}
|
303 |
+
|
304 |
+
.tabcontrol > .steps > ul > li
|
305 |
+
{
|
306 |
+
float: left;
|
307 |
+
margin: 5px 2px 0 0;
|
308 |
+
padding: 1px;
|
309 |
+
|
310 |
+
-webkit-border-top-left-radius: 5px;
|
311 |
+
-webkit-border-top-right-radius: 5px;
|
312 |
+
-moz-border-radius-topleft: 5px;
|
313 |
+
-moz-border-radius-topright: 5px;
|
314 |
+
border-top-left-radius: 5px;
|
315 |
+
border-top-right-radius: 5px;
|
316 |
+
}
|
317 |
+
|
318 |
+
.tabcontrol > .steps > ul > li:hover
|
319 |
+
{
|
320 |
+
background: #edecec;
|
321 |
+
border: 1px solid #bbb;
|
322 |
+
padding: 0;
|
323 |
+
}
|
324 |
+
|
325 |
+
.tabcontrol > .steps > ul > li.current
|
326 |
+
{
|
327 |
+
background: #fff;
|
328 |
+
border: 1px solid #bbb;
|
329 |
+
border-bottom: 0 none;
|
330 |
+
padding: 0 0 1px 0;
|
331 |
+
margin-top: 0;
|
332 |
+
}
|
333 |
+
|
334 |
+
.tabcontrol > .steps > ul > li > a
|
335 |
+
{
|
336 |
+
color: #5f5f5f;
|
337 |
+
display: inline-block;
|
338 |
+
border: 0 none;
|
339 |
+
margin: 0;
|
340 |
+
padding: 10px 30px;
|
341 |
+
text-decoration: none;
|
342 |
+
}
|
343 |
+
|
344 |
+
.tabcontrol > .steps > ul > li > a:hover
|
345 |
+
{
|
346 |
+
text-decoration: none;
|
347 |
+
}
|
348 |
+
|
349 |
+
.tabcontrol > .steps > ul > li.current > a
|
350 |
+
{
|
351 |
+
padding: 15px 30px 10px 30px;
|
352 |
+
}
|
353 |
+
|
354 |
+
.tabcontrol > .content
|
355 |
+
{
|
356 |
+
position: relative;
|
357 |
+
display: inline-block;
|
358 |
+
width: 100%;
|
359 |
+
height: 35em;
|
360 |
+
overflow: hidden;
|
361 |
+
border-top: 1px solid #bbb;
|
362 |
+
padding-top: 20px;
|
363 |
+
}
|
364 |
+
|
365 |
+
.tabcontrol > .content > .body
|
366 |
+
{
|
367 |
+
float: left;
|
368 |
+
position: absolute;
|
369 |
+
width: 95%;
|
370 |
+
height: 95%;
|
371 |
+
padding: 2.5%;
|
372 |
+
}
|
373 |
+
|
374 |
+
.tabcontrol > .content > .body ul
|
375 |
+
{
|
376 |
+
list-style: disc !important;
|
377 |
+
}
|
378 |
+
|
379 |
+
.tabcontrol > .content > .body ul > li
|
380 |
+
{
|
381 |
+
display: list-item;
|
382 |
+
}
|
js/src/jquery-steps/demo/css/main.css
ADDED
@@ -0,0 +1,300 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* HTML5 Boilerplate
|
3 |
+
*
|
4 |
+
* What follows is the result of much research on cross-browser styling.
|
5 |
+
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
|
6 |
+
* Kroc Camen, and the H5BP dev community and team.
|
7 |
+
*/
|
8 |
+
|
9 |
+
/* ==========================================================================
|
10 |
+
Base styles: opinionated defaults
|
11 |
+
========================================================================== */
|
12 |
+
|
13 |
+
html,
|
14 |
+
button,
|
15 |
+
input,
|
16 |
+
select,
|
17 |
+
textarea {
|
18 |
+
color: #222;
|
19 |
+
}
|
20 |
+
|
21 |
+
body {
|
22 |
+
font-size: 1em;
|
23 |
+
line-height: 1.4;
|
24 |
+
}
|
25 |
+
|
26 |
+
/*
|
27 |
+
* Remove text-shadow in selection highlight: h5bp.com/i
|
28 |
+
* These selection rule sets have to be separate.
|
29 |
+
* Customize the background color to match your design.
|
30 |
+
*/
|
31 |
+
|
32 |
+
::-moz-selection {
|
33 |
+
background: #b3d4fc;
|
34 |
+
text-shadow: none;
|
35 |
+
}
|
36 |
+
|
37 |
+
::selection {
|
38 |
+
background: #b3d4fc;
|
39 |
+
text-shadow: none;
|
40 |
+
}
|
41 |
+
|
42 |
+
/*
|
43 |
+
* A better looking default horizontal rule
|
44 |
+
*/
|
45 |
+
|
46 |
+
hr {
|
47 |
+
display: block;
|
48 |
+
height: 1px;
|
49 |
+
border: 0;
|
50 |
+
border-top: 1px solid #ccc;
|
51 |
+
margin: 1em 0;
|
52 |
+
padding: 0;
|
53 |
+
}
|
54 |
+
|
55 |
+
/*
|
56 |
+
* Remove the gap between images and the bottom of their containers: h5bp.com/i/440
|
57 |
+
*/
|
58 |
+
|
59 |
+
img {
|
60 |
+
vertical-align: middle;
|
61 |
+
}
|
62 |
+
|
63 |
+
/*
|
64 |
+
* Remove default fieldset styles.
|
65 |
+
*/
|
66 |
+
|
67 |
+
fieldset {
|
68 |
+
border: 0;
|
69 |
+
margin: 0;
|
70 |
+
padding: 0;
|
71 |
+
}
|
72 |
+
|
73 |
+
/*
|
74 |
+
* Allow only vertical resizing of textareas.
|
75 |
+
*/
|
76 |
+
|
77 |
+
textarea {
|
78 |
+
resize: vertical;
|
79 |
+
}
|
80 |
+
|
81 |
+
/* ==========================================================================
|
82 |
+
Chrome Frame prompt
|
83 |
+
========================================================================== */
|
84 |
+
|
85 |
+
.chromeframe {
|
86 |
+
margin: 0.2em 0;
|
87 |
+
background: #ccc;
|
88 |
+
color: #000;
|
89 |
+
padding: 0.2em 0;
|
90 |
+
}
|
91 |
+
|
92 |
+
/* ==========================================================================
|
93 |
+
Author's custom styles
|
94 |
+
========================================================================== */
|
95 |
+
|
96 |
+
|
97 |
+
|
98 |
+
|
99 |
+
|
100 |
+
|
101 |
+
|
102 |
+
|
103 |
+
|
104 |
+
|
105 |
+
|
106 |
+
|
107 |
+
|
108 |
+
|
109 |
+
|
110 |
+
|
111 |
+
|
112 |
+
/* ==========================================================================
|
113 |
+
Helper classes
|
114 |
+
========================================================================== */
|
115 |
+
|
116 |
+
/*
|
117 |
+
* Image replacement
|
118 |
+
*/
|
119 |
+
|
120 |
+
.ir {
|
121 |
+
background-color: transparent;
|
122 |
+
border: 0;
|
123 |
+
overflow: hidden;
|
124 |
+
/* IE 6/7 fallback */
|
125 |
+
*text-indent: -9999px;
|
126 |
+
}
|
127 |
+
|
128 |
+
.ir:before {
|
129 |
+
content: "";
|
130 |
+
display: block;
|
131 |
+
width: 0;
|
132 |
+
height: 150%;
|
133 |
+
}
|
134 |
+
|
135 |
+
/*
|
136 |
+
* Hide from both screenreaders and browsers: h5bp.com/u
|
137 |
+
*/
|
138 |
+
|
139 |
+
.hidden {
|
140 |
+
display: none !important;
|
141 |
+
visibility: hidden;
|
142 |
+
}
|
143 |
+
|
144 |
+
/*
|
145 |
+
* Hide only visually, but have it available for screenreaders: h5bp.com/v
|
146 |
+
*/
|
147 |
+
|
148 |
+
.visuallyhidden {
|
149 |
+
border: 0;
|
150 |
+
clip: rect(0 0 0 0);
|
151 |
+
height: 1px;
|
152 |
+
margin: -1px;
|
153 |
+
overflow: hidden;
|
154 |
+
padding: 0;
|
155 |
+
position: absolute;
|
156 |
+
width: 1px;
|
157 |
+
}
|
158 |
+
|
159 |
+
/*
|
160 |
+
* Extends the .visuallyhidden class to allow the element to be focusable
|
161 |
+
* when navigated to via the keyboard: h5bp.com/p
|
162 |
+
*/
|
163 |
+
|
164 |
+
.visuallyhidden.focusable:active,
|
165 |
+
.visuallyhidden.focusable:focus {
|
166 |
+
clip: auto;
|
167 |
+
height: auto;
|
168 |
+
margin: 0;
|
169 |
+
overflow: visible;
|
170 |
+
position: static;
|
171 |
+
width: auto;
|
172 |
+
}
|
173 |
+
|
174 |
+
/*
|
175 |
+
* Hide visually and from screenreaders, but maintain layout
|
176 |
+
*/
|
177 |
+
|
178 |
+
.invisible {
|
179 |
+
visibility: hidden;
|
180 |
+
}
|
181 |
+
|
182 |
+
/*
|
183 |
+
* Clearfix: contain floats
|
184 |
+
*
|
185 |
+
* For modern browsers
|
186 |
+
* 1. The space content is one way to avoid an Opera bug when the
|
187 |
+
* `contenteditable` attribute is included anywhere else in the document.
|
188 |
+
* Otherwise it causes space to appear at the top and bottom of elements
|
189 |
+
* that receive the `clearfix` class.
|
190 |
+
* 2. The use of `table` rather than `block` is only necessary if using
|
191 |
+
* `:before` to contain the top-margins of child elements.
|
192 |
+
*/
|
193 |
+
|
194 |
+
.clearfix:before,
|
195 |
+
.clearfix:after {
|
196 |
+
content: " "; /* 1 */
|
197 |
+
display: table; /* 2 */
|
198 |
+
}
|
199 |
+
|
200 |
+
.clearfix:after {
|
201 |
+
clear: both;
|
202 |
+
}
|
203 |
+
|
204 |
+
/*
|
205 |
+
* For IE 6/7 only
|
206 |
+
* Include this rule to trigger hasLayout and contain floats.
|
207 |
+
*/
|
208 |
+
|
209 |
+
.clearfix {
|
210 |
+
*zoom: 1;
|
211 |
+
}
|
212 |
+
|
213 |
+
/* ==========================================================================
|
214 |
+
EXAMPLE Media Queries for Responsive Design.
|
215 |
+
These examples override the primary ('mobile first') styles.
|
216 |
+
Modify as content requires.
|
217 |
+
========================================================================== */
|
218 |
+
|
219 |
+
@media only screen and (min-width: 35em) {
|
220 |
+
/* Style adjustments for viewports that meet the condition */
|
221 |
+
}
|
222 |
+
|
223 |
+
@media print,
|
224 |
+
(-o-min-device-pixel-ratio: 5/4),
|
225 |
+
(-webkit-min-device-pixel-ratio: 1.25),
|
226 |
+
(min-resolution: 120dpi) {
|
227 |
+
/* Style adjustments for high resolution devices */
|
228 |
+
}
|
229 |
+
|
230 |
+
/* ==========================================================================
|
231 |
+
Print styles.
|
232 |
+
Inlined to avoid required HTTP connection: h5bp.com/r
|
233 |
+
========================================================================== */
|
234 |
+
|
235 |
+
@media print {
|
236 |
+
* {
|
237 |
+
background: transparent !important;
|
238 |
+
color: #000 !important; /* Black prints faster: h5bp.com/s */
|
239 |
+
box-shadow: none !important;
|
240 |
+
text-shadow: none !important;
|
241 |
+
}
|
242 |
+
|
243 |
+
a,
|
244 |
+
a:visited {
|
245 |
+
text-decoration: underline;
|
246 |
+
}
|
247 |
+
|
248 |
+
a[href]:after {
|
249 |
+
content: " (" attr(href) ")";
|
250 |
+
}
|
251 |
+
|
252 |
+
abbr[title]:after {
|
253 |
+
content: " (" attr(title) ")";
|
254 |
+
}
|
255 |
+
|
256 |
+
/*
|
257 |
+
* Don't show links for images, or javascript/internal links
|
258 |
+
*/
|
259 |
+
|
260 |
+
.ir a:after,
|
261 |
+
a[href^="javascript:"]:after,
|
262 |
+
a[href^="#"]:after {
|
263 |
+
content: "";
|
264 |
+
}
|
265 |
+
|
266 |
+
pre,
|
267 |
+
blockquote {
|
268 |
+
border: 1px solid #999;
|
269 |
+
page-break-inside: avoid;
|
270 |
+
}
|
271 |
+
|
272 |
+
thead {
|
273 |
+
display: table-header-group; /* h5bp.com/t */
|
274 |
+
}
|
275 |
+
|
276 |
+
tr,
|
277 |
+
img {
|
278 |
+
page-break-inside: avoid;
|
279 |
+
}
|
280 |
+
|
281 |
+
img {
|
282 |
+
max-width: 100% !important;
|
283 |
+
}
|
284 |
+
|
285 |
+
@page {
|
286 |
+
margin: 0.5cm;
|
287 |
+
}
|
288 |
+
|
289 |
+
p,
|
290 |
+
h2,
|
291 |
+
h3 {
|
292 |
+
orphans: 3;
|
293 |
+
widows: 3;
|
294 |
+
}
|
295 |
+
|
296 |
+
h2,
|
297 |
+
h3 {
|
298 |
+
page-break-after: avoid;
|
299 |
+
}
|
300 |
+
}
|
js/src/jquery-steps/demo/css/normalize.css
ADDED
@@ -0,0 +1,533 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*! normalize.css v1.1.1 | MIT License | git.io/normalize */
|
2 |
+
|
3 |
+
/* ==========================================================================
|
4 |
+
HTML5 display definitions
|
5 |
+
========================================================================== */
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
|
9 |
+
*/
|
10 |
+
|
11 |
+
article,
|
12 |
+
aside,
|
13 |
+
details,
|
14 |
+
figcaption,
|
15 |
+
figure,
|
16 |
+
footer,
|
17 |
+
header,
|
18 |
+
hgroup,
|
19 |
+
main,
|
20 |
+
nav,
|
21 |
+
section,
|
22 |
+
summary {
|
23 |
+
display: block;
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
|
28 |
+
*/
|
29 |
+
|
30 |
+
audio,
|
31 |
+
canvas,
|
32 |
+
video {
|
33 |
+
display: inline-block;
|
34 |
+
*display: inline;
|
35 |
+
*zoom: 1;
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Prevent modern browsers from displaying `audio` without controls.
|
40 |
+
* Remove excess height in iOS 5 devices.
|
41 |
+
*/
|
42 |
+
|
43 |
+
audio:not([controls]) {
|
44 |
+
display: none;
|
45 |
+
height: 0;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
|
50 |
+
* Known issue: no IE 6 support.
|
51 |
+
*/
|
52 |
+
|
53 |
+
[hidden] {
|
54 |
+
display: none;
|
55 |
+
}
|
56 |
+
|
57 |
+
/* ==========================================================================
|
58 |
+
Base
|
59 |
+
========================================================================== */
|
60 |
+
|
61 |
+
/**
|
62 |
+
* 1. Prevent system color scheme's background color being used in Firefox, IE,
|
63 |
+
* and Opera.
|
64 |
+
* 2. Prevent system color scheme's text color being used in Firefox, IE, and
|
65 |
+
* Opera.
|
66 |
+
* 3. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
|
67 |
+
* `em` units.
|
68 |
+
* 4. Prevent iOS text size adjust after orientation change, without disabling
|
69 |
+
* user zoom.
|
70 |
+
*/
|
71 |
+
|
72 |
+
html {
|
73 |
+
background: #fff; /* 1 */
|
74 |
+
color: #000; /* 2 */
|
75 |
+
font-size: 100%; /* 3 */
|
76 |
+
-webkit-text-size-adjust: 100%; /* 4 */
|
77 |
+
-ms-text-size-adjust: 100%; /* 4 */
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Address `font-family` inconsistency between `textarea` and other form
|
82 |
+
* elements.
|
83 |
+
*/
|
84 |
+
|
85 |
+
html,
|
86 |
+
button,
|
87 |
+
input,
|
88 |
+
select,
|
89 |
+
textarea {
|
90 |
+
font-family: sans-serif;
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Address margins handled incorrectly in IE 6/7.
|
95 |
+
*/
|
96 |
+
|
97 |
+
body {
|
98 |
+
margin: 0;
|
99 |
+
}
|
100 |
+
|
101 |
+
/* ==========================================================================
|
102 |
+
Links
|
103 |
+
========================================================================== */
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Address `outline` inconsistency between Chrome and other browsers.
|
107 |
+
*/
|
108 |
+
|
109 |
+
a:focus {
|
110 |
+
outline: thin dotted;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Improve readability when focused and also mouse hovered in all browsers.
|
115 |
+
*/
|
116 |
+
|
117 |
+
a:active,
|
118 |
+
a:hover {
|
119 |
+
outline: 0;
|
120 |
+
}
|
121 |
+
|
122 |
+
/* ==========================================================================
|
123 |
+
Typography
|
124 |
+
========================================================================== */
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Address font sizes and margins set differently in IE 6/7.
|
128 |
+
* Address font sizes within `section` and `article` in Firefox 4+, Safari 5,
|
129 |
+
* and Chrome.
|
130 |
+
*/
|
131 |
+
|
132 |
+
h1 {
|
133 |
+
font-size: 2em;
|
134 |
+
margin: 0.67em 0;
|
135 |
+
}
|
136 |
+
|
137 |
+
h2 {
|
138 |
+
font-size: 1.5em;
|
139 |
+
margin: 0.83em 0;
|
140 |
+
}
|
141 |
+
|
142 |
+
h3 {
|
143 |
+
font-size: 1.17em;
|
144 |
+
margin: 1em 0;
|
145 |
+
}
|
146 |
+
|
147 |
+
h4 {
|
148 |
+
font-size: 1em;
|
149 |
+
margin: 1.33em 0;
|
150 |
+
}
|
151 |
+
|
152 |
+
h5 {
|
153 |
+
font-size: 0.83em;
|
154 |
+
margin: 1.67em 0;
|
155 |
+
}
|
156 |
+
|
157 |
+
h6 {
|
158 |
+
font-size: 0.67em;
|
159 |
+
margin: 2.33em 0;
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Address styling not present in IE 7/8/9, Safari 5, and Chrome.
|
164 |
+
*/
|
165 |
+
|
166 |
+
abbr[title] {
|
167 |
+
border-bottom: 1px dotted;
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
* Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.
|
172 |
+
*/
|
173 |
+
|
174 |
+
b,
|
175 |
+
strong {
|
176 |
+
font-weight: bold;
|
177 |
+
}
|
178 |
+
|
179 |
+
blockquote {
|
180 |
+
margin: 1em 40px;
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Address styling not present in Safari 5 and Chrome.
|
185 |
+
*/
|
186 |
+
|
187 |
+
dfn {
|
188 |
+
font-style: italic;
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Address differences between Firefox and other browsers.
|
193 |
+
* Known issue: no IE 6/7 normalization.
|
194 |
+
*/
|
195 |
+
|
196 |
+
hr {
|
197 |
+
-moz-box-sizing: content-box;
|
198 |
+
box-sizing: content-box;
|
199 |
+
height: 0;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Address styling not present in IE 6/7/8/9.
|
204 |
+
*/
|
205 |
+
|
206 |
+
mark {
|
207 |
+
background: #ff0;
|
208 |
+
color: #000;
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Address margins set differently in IE 6/7.
|
213 |
+
*/
|
214 |
+
|
215 |
+
p,
|
216 |
+
pre {
|
217 |
+
margin: 1em 0;
|
218 |
+
}
|
219 |
+
|
220 |
+
/**
|
221 |
+
* Correct font family set oddly in IE 6, Safari 4/5, and Chrome.
|
222 |
+
*/
|
223 |
+
|
224 |
+
code,
|
225 |
+
kbd,
|
226 |
+
pre,
|
227 |
+
samp {
|
228 |
+
font-family: monospace, serif;
|
229 |
+
_font-family: 'courier new', monospace;
|
230 |
+
font-size: 1em;
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Improve readability of pre-formatted text in all browsers.
|
235 |
+
*/
|
236 |
+
|
237 |
+
pre {
|
238 |
+
white-space: pre;
|
239 |
+
white-space: pre-wrap;
|
240 |
+
word-wrap: break-word;
|
241 |
+
}
|
242 |
+
|
243 |
+
/**
|
244 |
+
* Address CSS quotes not supported in IE 6/7.
|
245 |
+
*/
|
246 |
+
|
247 |
+
q {
|
248 |
+
quotes: none;
|
249 |
+
}
|
250 |
+
|
251 |
+
/**
|
252 |
+
* Address `quotes` property not supported in Safari 4.
|
253 |
+
*/
|
254 |
+
|
255 |
+
q:before,
|
256 |
+
q:after {
|
257 |
+
content: '';
|
258 |
+
content: none;
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Address inconsistent and variable font size in all browsers.
|
263 |
+
*/
|
264 |
+
|
265 |
+
small {
|
266 |
+
font-size: 80%;
|
267 |
+
}
|
268 |
+
|
269 |
+
/**
|
270 |
+
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
271 |
+
*/
|
272 |
+
|
273 |
+
sub,
|
274 |
+
sup {
|
275 |
+
font-size: 75%;
|
276 |
+
line-height: 0;
|
277 |
+
position: relative;
|
278 |
+
vertical-align: baseline;
|
279 |
+
}
|
280 |
+
|
281 |
+
sup {
|
282 |
+
top: -0.5em;
|
283 |
+
}
|
284 |
+
|
285 |
+
sub {
|
286 |
+
bottom: -0.25em;
|
287 |
+
}
|
288 |
+
|
289 |
+
/* ==========================================================================
|
290 |
+
Lists
|
291 |
+
========================================================================== */
|
292 |
+
|
293 |
+
/**
|
294 |
+
* Address margins set differently in IE 6/7.
|
295 |
+
*/
|
296 |
+
|
297 |
+
dl,
|
298 |
+
menu,
|
299 |
+
ol,
|
300 |
+
ul {
|
301 |
+
margin: 1em 0;
|
302 |
+
}
|
303 |
+
|
304 |
+
dd {
|
305 |
+
margin: 0 0 0 40px;
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* Address paddings set differently in IE 6/7.
|
310 |
+
*/
|
311 |
+
|
312 |
+
menu,
|
313 |
+
ol,
|
314 |
+
ul {
|
315 |
+
padding: 0 0 0 40px;
|
316 |
+
}
|
317 |
+
|
318 |
+
/**
|
319 |
+
* Correct list images handled incorrectly in IE 7.
|
320 |
+
*/
|
321 |
+
|
322 |
+
nav ul,
|
323 |
+
nav ol {
|
324 |
+
list-style: none;
|
325 |
+
list-style-image: none;
|
326 |
+
}
|
327 |
+
|
328 |
+
/* ==========================================================================
|
329 |
+
Embedded content
|
330 |
+
========================================================================== */
|
331 |
+
|
332 |
+
/**
|
333 |
+
* 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
|
334 |
+
* 2. Improve image quality when scaled in IE 7.
|
335 |
+
*/
|
336 |
+
|
337 |
+
img {
|
338 |
+
border: 0; /* 1 */
|
339 |
+
-ms-interpolation-mode: bicubic; /* 2 */
|
340 |
+
}
|
341 |
+
|
342 |
+
/**
|
343 |
+
* Correct overflow displayed oddly in IE 9.
|
344 |
+
*/
|
345 |
+
|
346 |
+
svg:not(:root) {
|
347 |
+
overflow: hidden;
|
348 |
+
}
|
349 |
+
|
350 |
+
/* ==========================================================================
|
351 |
+
Figures
|
352 |
+
========================================================================== */
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
|
356 |
+
*/
|
357 |
+
|
358 |
+
figure {
|
359 |
+
margin: 0;
|
360 |
+
}
|
361 |
+
|
362 |
+
/* ==========================================================================
|
363 |
+
Forms
|
364 |
+
========================================================================== */
|
365 |
+
|
366 |
+
/**
|
367 |
+
* Correct margin displayed oddly in IE 6/7.
|
368 |
+
*/
|
369 |
+
|
370 |
+
form {
|
371 |
+
margin: 0;
|
372 |
+
}
|
373 |
+
|
374 |
+
/**
|
375 |
+
* Define consistent border, margin, and padding.
|
376 |
+
*/
|
377 |
+
|
378 |
+
fieldset {
|
379 |
+
border: 1px solid #c0c0c0;
|
380 |
+
margin: 0 2px;
|
381 |
+
padding: 0.35em 0.625em 0.75em;
|
382 |
+
}
|
383 |
+
|
384 |
+
/**
|
385 |
+
* 1. Correct color not being inherited in IE 6/7/8/9.
|
386 |
+
* 2. Correct text not wrapping in Firefox 3.
|
387 |
+
* 3. Correct alignment displayed oddly in IE 6/7.
|
388 |
+
*/
|
389 |
+
|
390 |
+
legend {
|
391 |
+
border: 0; /* 1 */
|
392 |
+
padding: 0;
|
393 |
+
white-space: normal; /* 2 */
|
394 |
+
*margin-left: -7px; /* 3 */
|
395 |
+
}
|
396 |
+
|
397 |
+
/**
|
398 |
+
* 1. Correct font size not being inherited in all browsers.
|
399 |
+
* 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
|
400 |
+
* and Chrome.
|
401 |
+
* 3. Improve appearance and consistency in all browsers.
|
402 |
+
*/
|
403 |
+
|
404 |
+
button,
|
405 |
+
input,
|
406 |
+
select,
|
407 |
+
textarea {
|
408 |
+
font-size: 100%; /* 1 */
|
409 |
+
margin: 0; /* 2 */
|
410 |
+
vertical-align: baseline; /* 3 */
|
411 |
+
*vertical-align: middle; /* 3 */
|
412 |
+
}
|
413 |
+
|
414 |
+
/**
|
415 |
+
* Address Firefox 3+ setting `line-height` on `input` using `!important` in
|
416 |
+
* the UA stylesheet.
|
417 |
+
*/
|
418 |
+
|
419 |
+
button,
|
420 |
+
input {
|
421 |
+
line-height: normal;
|
422 |
+
}
|
423 |
+
|
424 |
+
/**
|
425 |
+
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
426 |
+
* All other form control elements do not inherit `text-transform` values.
|
427 |
+
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
|
428 |
+
* Correct `select` style inheritance in Firefox 4+ and Opera.
|
429 |
+
*/
|
430 |
+
|
431 |
+
button,
|
432 |
+
select {
|
433 |
+
text-transform: none;
|
434 |
+
}
|
435 |
+
|
436 |
+
/**
|
437 |
+
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
438 |
+
* and `video` controls.
|
439 |
+
* 2. Correct inability to style clickable `input` types in iOS.
|
440 |
+
* 3. Improve usability and consistency of cursor style between image-type
|
441 |
+
* `input` and others.
|
442 |
+
* 4. Remove inner spacing in IE 7 without affecting normal text inputs.
|
443 |
+
* Known issue: inner spacing remains in IE 6.
|
444 |
+
*/
|
445 |
+
|
446 |
+
button,
|
447 |
+
html input[type="button"], /* 1 */
|
448 |
+
input[type="reset"],
|
449 |
+
input[type="submit"] {
|
450 |
+
-webkit-appearance: button; /* 2 */
|
451 |
+
cursor: pointer; /* 3 */
|
452 |
+
*overflow: visible; /* 4 */
|
453 |
+
}
|
454 |
+
|
455 |
+
/**
|
456 |
+
* Re-set default cursor for disabled elements.
|
457 |
+
*/
|
458 |
+
|
459 |
+
button[disabled],
|
460 |
+
html input[disabled] {
|
461 |
+
cursor: default;
|
462 |
+
}
|
463 |
+
|
464 |
+
/**
|
465 |
+
* 1. Address box sizing set to content-box in IE 8/9.
|
466 |
+
* 2. Remove excess padding in IE 8/9.
|
467 |
+
* 3. Remove excess padding in IE 7.
|
468 |
+
* Known issue: excess padding remains in IE 6.
|
469 |
+
*/
|
470 |
+
|
471 |
+
input[type="checkbox"],
|
472 |
+
input[type="radio"] {
|
473 |
+
box-sizing: border-box; /* 1 */
|
474 |
+
padding: 0; /* 2 */
|
475 |
+
*height: 13px; /* 3 */
|
476 |
+
*width: 13px; /* 3 */
|
477 |
+
}
|
478 |
+
|
479 |
+
/**
|
480 |
+
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
|
481 |
+
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
|
482 |
+
* (include `-moz` to future-proof).
|
483 |
+
*/
|
484 |
+
|
485 |
+
input[type="search"] {
|
486 |
+
-webkit-appearance: textfield; /* 1 */
|
487 |
+
-moz-box-sizing: content-box;
|
488 |
+
-webkit-box-sizing: content-box; /* 2 */
|
489 |
+
box-sizing: content-box;
|
490 |
+
}
|
491 |
+
|
492 |
+
/**
|
493 |
+
* Remove inner padding and search cancel button in Safari 5 and Chrome
|
494 |
+
* on OS X.
|
495 |
+
*/
|
496 |
+
|
497 |
+
input[type="search"]::-webkit-search-cancel-button,
|
498 |
+
input[type="search"]::-webkit-search-decoration {
|
499 |
+
-webkit-appearance: none;
|
500 |
+
}
|
501 |
+
|
502 |
+
/**
|
503 |
+
* Remove inner padding and border in Firefox 3+.
|
504 |
+
*/
|
505 |
+
|
506 |
+
button::-moz-focus-inner,
|
507 |
+
input::-moz-focus-inner {
|
508 |
+
border: 0;
|
509 |
+
padding: 0;
|
510 |
+
}
|
511 |
+
|
512 |
+
/**
|
513 |
+
* 1. Remove default vertical scrollbar in IE 6/7/8/9.
|
514 |
+
* 2. Improve readability and alignment in all browsers.
|
515 |
+
*/
|
516 |
+
|
517 |
+
textarea {
|
518 |
+
overflow: auto; /* 1 */
|
519 |
+
vertical-align: top; /* 2 */
|
520 |
+
}
|
521 |
+
|
522 |
+
/* ==========================================================================
|
523 |
+
Tables
|
524 |
+
========================================================================== */
|
525 |
+
|
526 |
+
/**
|
527 |
+
* Remove most spacing between table cells.
|
528 |
+
*/
|
529 |
+
|
530 |
+
table {
|
531 |
+
border-collapse: collapse;
|
532 |
+
border-spacing: 0;
|
533 |
+
}
|
js/src/jquery-validation/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The MIT License (MIT)
|
2 |
+
=====================
|
3 |
+
|
4 |
+
Copyright Jörn Zaefferer
|
5 |
+
|
6 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7 |
+
of this software and associated documentation files (the "Software"), to deal
|
8 |
+
in the Software without restriction, including without limitation the rights
|
9 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10 |
+
copies of the Software, and to permit persons to whom the Software is
|
11 |
+
furnished to do so, subject to the following conditions:
|
12 |
+
|
13 |
+
The above copyright notice and this permission notice shall be included in
|
14 |
+
all copies or substantial portions of the Software.
|
15 |
+
|
16 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22 |
+
THE SOFTWARE.
|
js/src/jquery-validation/README.md
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[jQuery Validation Plugin](https://jqueryvalidation.org/) - Form validation made easy
|
2 |
+
================================
|
3 |
+
|
4 |
+
[![release](https://img.shields.io/github/release/jquery-validation/jquery-validation.svg)](https://github.com/jquery-validation/jquery-validation/releases/latest)
|
5 |
+
[![Build Status](https://secure.travis-ci.org/jquery-validation/jquery-validation.svg)](https://travis-ci.org/jquery-validation/jquery-validation)
|
6 |
+
[![devDependency Status](https://david-dm.org/jquery-validation/jquery-validation/dev-status.svg?theme=shields.io)](https://david-dm.org/jquery-validation/jquery-validation#info=devDependencies)
|
7 |
+
[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/jquery-validation/badge?style=rounded)](https://www.jsdelivr.com/package/npm/jquery-validation)
|
8 |
+
|
9 |
+
The jQuery Validation Plugin provides drop-in validation for your existing forms, while making all kinds of customizations to fit your application really easy.
|
10 |
+
|
11 |
+
## Getting Started
|
12 |
+
|
13 |
+
### Downloading the prebuilt files
|
14 |
+
|
15 |
+
Prebuilt files can be downloaded from https://jqueryvalidation.org/
|
16 |
+
|
17 |
+
### Downloading the latest changes
|
18 |
+
|
19 |
+
The unreleased development files can be obtained by:
|
20 |
+
|
21 |
+
1. [Downloading](https://github.com/jquery-validation/jquery-validation/archive/master.zip) or Forking this repository
|
22 |
+
2. [Setup the build](CONTRIBUTING.md#build-setup)
|
23 |
+
3. Run `grunt` to create the built files in the "dist" directory
|
24 |
+
|
25 |
+
### Including it on your page
|
26 |
+
|
27 |
+
Include jQuery and the plugin on a page. Then select a form to validate and call the `validate` method.
|
28 |
+
|
29 |
+
```html
|
30 |
+
<form>
|
31 |
+
<input required>
|
32 |
+
</form>
|
33 |
+
<script src="jquery.js"></script>
|
34 |
+
<script src="jquery.validate.js"></script>
|
35 |
+
<script>
|
36 |
+
$("form").validate();
|
37 |
+
</script>
|
38 |
+
```
|
39 |
+
|
40 |
+
Alternatively include jQuery and the plugin via requirejs in your module.
|
41 |
+
|
42 |
+
```js
|
43 |
+
define(["jquery", "jquery.validate"], function( $ ) {
|
44 |
+
$("form").validate();
|
45 |
+
});
|
46 |
+
```
|
47 |
+
|
48 |
+
For more information on how to setup a rules and customizations, [check the documentation](https://jqueryvalidation.org/documentation/).
|
49 |
+
|
50 |
+
## Reporting issues and contributing code
|
51 |
+
|
52 |
+
See the [Contributing Guidelines](CONTRIBUTING.md) for details.
|
53 |
+
|
54 |
+
**IMPORTANT NOTE ABOUT EMAIL VALIDATION**. As of version 1.12.0 this plugin is using the same regular expression that the [HTML5 specification suggests for browsers to use](https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address). We will follow their lead and use the same check. If you think the specification is wrong, please report the issue to them. If you have different requirements, consider [using a custom method](https://jqueryvalidation.org/jQuery.validator.addMethod/).
|
55 |
+
In case you need to adjust the built-in validation regular expression patterns, please [follow the documentation](https://jqueryvalidation.org/jQuery.validator.methods/).
|
56 |
+
|
57 |
+
**IMPORTANT NOTE ABOUT REQUIRED METHOD**. As of version 1.14.0 this plugin stops trimming white spaces from the value of the attached element. If you want to achieve the same result, you can use the [`normalizer`](https://jqueryvalidation.org/normalizer/) that can be used to transform the value of an element before validation. This feature was available since `v1.15.0`. In other words, you can do something like this:
|
58 |
+
``` js
|
59 |
+
$("#myForm").validate({
|
60 |
+
rules: {
|
61 |
+
username: {
|
62 |
+
required: true,
|
63 |
+
// Using the normalizer to trim the value of the element
|
64 |
+
// before validating it.
|
65 |
+
//
|
66 |
+
// The value of `this` inside the `normalizer` is the corresponding
|
67 |
+
// DOMElement. In this example, `this` references the `username` element.
|
68 |
+
normalizer: function(value) {
|
69 |
+
return $.trim(value);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
}
|
73 |
+
});
|
74 |
+
```
|
75 |
+
|
76 |
+
## Accessibility
|
77 |
+
For an invalid field, the default output for the jQuery Validation Plugin is an error message in a `<label>` element. This results in two `<label>` elements pointing to a single input field using the `for` attribute. While this is valid HTML, it has inconsistent support across screen readers.
|
78 |
+
|
79 |
+
For greater screen reader support in your form's validation, use the `errorElement` parameter in the `validate()` method. This option outputs the error in an element of your choice and automatically adds ARIA attributes to the HTML that help with screen reader support.
|
80 |
+
|
81 |
+
`aria-describedby` is added to the input field and it is programmatically tied to the error element chosen in the `errorElement` parameter.
|
82 |
+
|
83 |
+
``` js
|
84 |
+
$("#myform").validate({
|
85 |
+
errorElement: "span"
|
86 |
+
});
|
87 |
+
```
|
88 |
+
|
89 |
+
``` html
|
90 |
+
<label for="name">Name</label>
|
91 |
+
<input id="name" aria-describedby="unique-id-here">
|
92 |
+
<span class="error" id="unique-id-here">This field is required</span>
|
93 |
+
```
|
94 |
+
|
95 |
+
[Learn more about errorElement](https://jqueryvalidation.org/validate/#errorelement)
|
96 |
+
|
97 |
+
## License
|
98 |
+
Copyright © Jörn Zaefferer<br>
|
99 |
+
Licensed under the MIT license.
|
js/src/jquery-validation/changelog.md
ADDED
@@ -0,0 +1,776 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
1.19.2 / 2020-05-23
|
2 |
+
===================
|
3 |
+
|
4 |
+
## Core
|
5 |
+
* Core: Fixes deprecated calls to jQuery trim for compat with newer jQuery core versions (#2328)
|
6 |
+
|
7 |
+
1.19.1 / 2019-06-15
|
8 |
+
===================
|
9 |
+
|
10 |
+
## Core
|
11 |
+
* Change focus() to trigger("focus") (#2243)
|
12 |
+
|
13 |
+
## Build
|
14 |
+
* Set jQuery as a peer dependency (#2248)
|
15 |
+
|
16 |
+
## Localization
|
17 |
+
* Add zh_TW translation for step message (#2245)
|
18 |
+
* Adding Serbian translation for step method message (#2251)
|
19 |
+
|
20 |
+
1.19.0 / 2018-11-28
|
21 |
+
===================
|
22 |
+
|
23 |
+
## Subresource Integrity hashes
|
24 |
+
|
25 |
+
As of 1.18.0, we started to provide Subresource Integrity hashes of all distribution files.
|
26 |
+
|
27 |
+
The hashes for the 1.19.0 release can be found in the file [`jquery-validation-sri.json`](https://raw.githubusercontent.com/jquery-validation/jquery-validation/1.19.0/dist/jquery-validation-sri.json) under `dist` folder.
|
28 |
+
|
29 |
+
## Additional
|
30 |
+
* Don't fail when field is optional in CNPJBR & CPFBR rules (#2236)
|
31 |
+
* Add validation rule for mobile number of Russia Federation (#2207)
|
32 |
+
* Add Brazillian CNPJ validation rule (#2222)
|
33 |
+
* Add Brazillian CNH number (Carteira Nacional de Habilitacao) (#2234)
|
34 |
+
* Add ABA Routing Number Validation (#2216)
|
35 |
+
|
36 |
+
## Core
|
37 |
+
* Fix contenteditable detection's regression introduced in #2142 (#2235)
|
38 |
+
|
39 |
+
## Localization
|
40 |
+
* Add Swedish translation for pattern (#2227)
|
41 |
+
|
42 |
+
1.18.0 / 2018-09-09
|
43 |
+
===================
|
44 |
+
|
45 |
+
## Additional
|
46 |
+
* Add Brazillian PIS/NIS number validation method (#2204)
|
47 |
+
* Add validation method for Polish telephone number (#2136)
|
48 |
+
* Updated link to EAN docs in creditcard.js (#2120)
|
49 |
+
* Allow N11 exchange for non-geo US phone (#2098)
|
50 |
+
* Add new BIN range for MasterCard (#2088)
|
51 |
+
* Add maxfiles, maxsize and maxsizetotal methods (#2087)
|
52 |
+
* Add greaterThan and lessThan methods (#2061)
|
53 |
+
|
54 |
+
## Build
|
55 |
+
* Test on node 6.x and drop node 0.12.x (#2133)
|
56 |
+
* Generate sub-resource integrity hashes of the distribution files (#2082)
|
57 |
+
* Include localization files in tagged releases (#2057)
|
58 |
+
* Include minified version of additional methods in npm package (#2057)
|
59 |
+
|
60 |
+
## Core
|
61 |
+
* Don't call submitHandler when in debug mode (#2193)
|
62 |
+
* Cast empty data attributes to 'true' (#2182)
|
63 |
+
* Ignore elements that belong to other/nested forms (#2147)
|
64 |
+
* Use element.isContentEditable instead of hasAttribute (#2142)
|
65 |
+
* Add deprecation warning to 'date' method (#2138)
|
66 |
+
* Allow the normalizer to return any value (#2054)
|
67 |
+
* Guard against null & undefined values in required method (#2053)
|
68 |
+
|
69 |
+
## Demo
|
70 |
+
* Add sample code for Bootstrap 4 usage (#2173)
|
71 |
+
|
72 |
+
## Localization
|
73 |
+
* Added Czech and Slovak translations for STEP method (#2197)
|
74 |
+
* Add localized methods for italian culture (it) (#2195)
|
75 |
+
* Add step validation string to message_zh (#2177)
|
76 |
+
* Fix typo in pt-BR localization file (#2139)
|
77 |
+
* Add message for phonePL method (#2136)
|
78 |
+
* Update Norwegian language file (#2132)
|
79 |
+
* Update Persian language file (#2122)
|
80 |
+
* Update German language file (#2115)
|
81 |
+
* Fix meaning in Bulgarian sentence (#2112)
|
82 |
+
* Add remote translation to no (#2097)
|
83 |
+
* Fixed wrong placeholder in vi translation (#2085)
|
84 |
+
* Add missing format method in message_{fr,tr}.js files (#2075)
|
85 |
+
* Fix typos in messages_pt_BR.js (#2073)
|
86 |
+
* Add new danish translations (#2067)
|
87 |
+
* Add Swedish validation message for remote (#2066)
|
88 |
+
|
89 |
+
## Test
|
90 |
+
* Cast empty data attributes to 'true' (#2182)
|
91 |
+
* Ignore elements that belong to other/nested forms (#2147)
|
92 |
+
* Add tests for phonePL method (#2136)
|
93 |
+
* Add missing description to a test (#2055)
|
94 |
+
* Required method should return false for null & undefined values (#2053)
|
95 |
+
|
96 |
+
1.17.0 / 2017-07-20
|
97 |
+
==================
|
98 |
+
|
99 |
+
## Core
|
100 |
+
* Pass on the value of the used submit button for scripted submits (#2019)
|
101 |
+
* Removed aria-required attribute (#2012)
|
102 |
+
* Assign rules to contenteditable via `.validate()` and `.rules()` (#1947)
|
103 |
+
* Count invalid fields with empty message in `numberOfInvalids()` (#1942)
|
104 |
+
* Added support for button elements with descendants (#1901)
|
105 |
+
* Add support for defining a global normalizer (#1905)
|
106 |
+
|
107 |
+
## Additional
|
108 |
+
* Add localized number validation to methods_nl.js (#2014)
|
109 |
+
* Remove unreachable return from `cifES.js` (#1994)
|
110 |
+
* Add optional support to cifES, nifES and nieES (#1966)
|
111 |
+
* Add netmask validation method (#1955)
|
112 |
+
* Add Polish tax id validation method (#1850)
|
113 |
+
* Fixed validation for specific case for Spanish NIFs (#1914)
|
114 |
+
|
115 |
+
## Localization
|
116 |
+
* Added Step Range Validation to messages_ja (#1936)
|
117 |
+
* Add hungarian step message (#1888)
|
118 |
+
* Add Sindhi locale (#1900)
|
119 |
+
* Added norsk step translation (#1918)
|
120 |
+
* Add missing french step translation (#1928)
|
121 |
+
* Added nl- translation for "step" property (#1902)
|
122 |
+
* Add French translation for notEqualTo method (#2033)
|
123 |
+
|
124 |
+
## Readme
|
125 |
+
* Add note about trimming whitespaces inside required method (#2028)
|
126 |
+
|
127 |
+
## Tests
|
128 |
+
* Pass on the value of the used submit button for scripted submits (#2019)
|
129 |
+
* Use assert#pushResult instead of assert#push (#2018)
|
130 |
+
|
131 |
+
## All
|
132 |
+
* Fix links after move to organization
|
133 |
+
* Use https
|
134 |
+
|
135 |
+
## Build
|
136 |
+
* Upgrade QUnit to 2.3.3 (#2018)
|
137 |
+
|
138 |
+
1.16.0 / 2016-12-01
|
139 |
+
==================
|
140 |
+
|
141 |
+
## Additional
|
142 |
+
* Refine cifES and nieES algorithms. Closes #1826
|
143 |
+
|
144 |
+
## Build
|
145 |
+
* Include Minified Version in NPM Package
|
146 |
+
* Bump dev-dependencies to latest versions
|
147 |
+
|
148 |
+
## Core
|
149 |
+
* Add binding for input with button type. Closes #1891
|
150 |
+
* Support jquery3. Closes #1866
|
151 |
+
* Change jQuery alias 'expr[":"]' to 'expr.pseudos'
|
152 |
+
|
153 |
+
## Localisation
|
154 |
+
* Add Urdu translation. Closes #1873.
|
155 |
+
|
156 |
+
## Localization
|
157 |
+
* Fixed wrong file-extension for az translation. Closes #1890.
|
158 |
+
* Added missing translation in pt-BR (Closes #1897)
|
159 |
+
* Fixed typo in arabien language file.
|
160 |
+
|
161 |
+
## Tests
|
162 |
+
* Upgrade QUnit to 2.0.
|
163 |
+
|
164 |
+
## UMD
|
165 |
+
* Better support for CommonJS.
|
166 |
+
|
167 |
+
1.15.1 / 2016-07-22
|
168 |
+
==================
|
169 |
+
|
170 |
+
## Additional
|
171 |
+
* Fix multiple mime-type validation
|
172 |
+
* IBAN require at least 5 chars (Closes #1797, Fixes #1674)
|
173 |
+
* Correct notEqualTo jQuery reference
|
174 |
+
|
175 |
+
## Core
|
176 |
+
* Added failing test for #1805
|
177 |
+
* Fix group validation with 3 and more fields
|
178 |
+
* Fix regressions introduced in #1644 and #1657 (Closes #1800)
|
179 |
+
* Update step validation to handle floating points correctly
|
180 |
+
* Fix error when calling $.fn.rules() on a non-form element
|
181 |
+
* Call `errorPlacement` in validator scope
|
182 |
+
* Fixed issue with contenteditable elements in forms where events for single input validation would cause exceptions
|
183 |
+
|
184 |
+
## Demo
|
185 |
+
* Add links to Bootstrap and Semantic-UI demos to index.html
|
186 |
+
* Use `.on()` instead of `.validateDelegate()`
|
187 |
+
|
188 |
+
## Localization
|
189 |
+
* Added Azeri language
|
190 |
+
|
191 |
+
## Tests
|
192 |
+
* Added regression unit tests for PR #1760
|
193 |
+
|
194 |
+
1.15.0 / 2016-02-24
|
195 |
+
==================
|
196 |
+
|
197 |
+
## All
|
198 |
+
* Fixed code style issues
|
199 |
+
|
200 |
+
## Core
|
201 |
+
* `resetForm` should also remove `valid` class from elements.
|
202 |
+
* Unhighlighting field if already highlighted when using remote rule.
|
203 |
+
* Bind the `blur` event just once in `equalTo` rule
|
204 |
+
* Fixed error when calling .rules() on empty jquery set.
|
205 |
+
* Fix handling of error messages with input groups.
|
206 |
+
* Fix TypeError in `showLabel` when using `groups` settings
|
207 |
+
* Adding a way to pass method name to remote
|
208 |
+
* Validation fails to trigger when next field is already filled out (Fixes #1508)
|
209 |
+
* Required rule take precedence over number & digits rules
|
210 |
+
* Error hidden but input error class not removed
|
211 |
+
* Remote validation uses wrong error messages
|
212 |
+
* Fixed field highlighting with remote validation.
|
213 |
+
* Fixed `:filled` selector for multiple select elements.
|
214 |
+
* Added doc reference to jQuery.validator.methods
|
215 |
+
* Move message processing from `formatAndAdd` to `defaultMessage`
|
216 |
+
* ErrorList should contain only the errors that it should
|
217 |
+
* Extract the file name without including "C:\fakepath\"
|
218 |
+
* HTML5 step attribute support. Fixes #1295
|
219 |
+
* Added support for "pending" class on outstanding requests
|
220 |
+
* Added normalizer (#1602)
|
221 |
+
* Split out `creditcard` method
|
222 |
+
* Escape errorID for use in the regex, not to build aria-describedby
|
223 |
+
* Escape single quotes in names avoiding a Sizzle Error being thrown
|
224 |
+
* Instead of using validating field's value to skip api call, use the serialized data object of the request
|
225 |
+
* Add support for contentEditable tags
|
226 |
+
|
227 |
+
## Additional
|
228 |
+
* BIC: allow digits 1-9 in second place of location
|
229 |
+
* Accept method regex should be escaped properly.
|
230 |
+
* Case-insensitive check for BIC
|
231 |
+
* Correct postalCodeCA to exclude invalid combinations
|
232 |
+
* Make postalCodeCA method more lenient
|
233 |
+
|
234 |
+
## Localization
|
235 |
+
* Added Macedonian localization.
|
236 |
+
* Added missing pattern message in Polish (adamwojtkiewicz)
|
237 |
+
* Fixed Persian translation of min/max message.
|
238 |
+
* Updated messages_sk.js
|
239 |
+
* Update Malay translation
|
240 |
+
* Included messages from additional methods
|
241 |
+
* Improving pt_BR translation and fixing a typo on the 'cifES' key.
|
242 |
+
|
243 |
+
1.14.0 / 2015-06-30
|
244 |
+
==================
|
245 |
+
|
246 |
+
## Core
|
247 |
+
* Remove unused removeAttrs method
|
248 |
+
* Replace regex for url method
|
249 |
+
* Remove bad url param in $.ajax, overwritten by $.extend
|
250 |
+
* Properly handle nested cancel submit button
|
251 |
+
* Fix indent
|
252 |
+
* Refactor attributeRules and dataRules to share noramlizer
|
253 |
+
* dataRules method to convert value to number for number inputs
|
254 |
+
* Update url method to allow for protocol-relative URLs
|
255 |
+
* Remove deprecated $.format placeholder
|
256 |
+
* Use jQuery 1.7+ on/off, add destroy method
|
257 |
+
* IE8 compatibility changed .indexOf to $.inArray
|
258 |
+
* Cast NaN value attributes to undefined for Opera Mini
|
259 |
+
* Stop trimming value inside required method
|
260 |
+
* Use :disabled selector to match disabled elements
|
261 |
+
* Exclude some keyboard keys to prevent revalidating the field
|
262 |
+
* Do not search the whole DOM for radio/checkbox elements
|
263 |
+
* Throw better errors for bad rule methods
|
264 |
+
* Fixed number validation error
|
265 |
+
* Fix reference to whatwg spec
|
266 |
+
* Focus invalid element when validating a custom set of inputs
|
267 |
+
* Reset element styles when using custom highlight methods
|
268 |
+
* Escape dollar sign in error id
|
269 |
+
* Revert "Ignore readonly as well as disabled fields."
|
270 |
+
* Update link in comment for Luhn algorithm
|
271 |
+
|
272 |
+
## Additionals
|
273 |
+
* Update dateITA to address timezone issue
|
274 |
+
* Fix extension method to only method period
|
275 |
+
* Fix accept method to match period only
|
276 |
+
* Update time method to allow single digit hour
|
277 |
+
* Drop bad test for notEqualTo method
|
278 |
+
* Add notEqualTo method
|
279 |
+
* Use correct jQuery reference via `$`
|
280 |
+
* Remove useless regex check in iban method
|
281 |
+
* Brazilian CPF number
|
282 |
+
|
283 |
+
## Localization
|
284 |
+
* Update messages_tr.js
|
285 |
+
* Update messages_sr_lat.js
|
286 |
+
* Adding Perú Spanish (ES PE)
|
287 |
+
* Adding Georgian (ქართული, ge)
|
288 |
+
* Fixed typo in catalan translation
|
289 |
+
* Improve Finnish (fi) translation
|
290 |
+
* Add armenian (hy_AM) locale
|
291 |
+
* Extend italian (it) translation with currency method
|
292 |
+
* Add bn_BD locale
|
293 |
+
* Update zh locale
|
294 |
+
* Remove full stop at the end of italian messages
|
295 |
+
|
296 |
+
1.13.1 / 2014-10-14
|
297 |
+
==================
|
298 |
+
|
299 |
+
## Core
|
300 |
+
* Allow 0 as value for autoCreateRanges
|
301 |
+
* Apply ignore setting to all validationTargetFor elements
|
302 |
+
* Don't trim value in min/max/rangelength methods
|
303 |
+
* Escape id/name before using it as a selector in errorsFor
|
304 |
+
* Explicit default for focusCleanup option
|
305 |
+
* Fix incorrect regexp for describedby matcher
|
306 |
+
* Ignore readonly as well as disabled fields
|
307 |
+
* Improve id escaping, store escaped id in describedby
|
308 |
+
* Use return value of submitHandler to allow or prevent form submit
|
309 |
+
|
310 |
+
## Additionals
|
311 |
+
* Add postalcodeBR method
|
312 |
+
* Fix pattern method when parameter is a string
|
313 |
+
|
314 |
+
|
315 |
+
1.13.0 / 2014-07-01
|
316 |
+
==================
|
317 |
+
|
318 |
+
## All
|
319 |
+
* Add plugin UMD wrapper
|
320 |
+
|
321 |
+
## Core
|
322 |
+
* Respect non-error aria-describedby and empty hidden errors
|
323 |
+
* Improve dateISO RegExp
|
324 |
+
* Added radio/checkbox to delegate click-event
|
325 |
+
* Use aria-describedby for non-label elements
|
326 |
+
* Register focusin, focusout and keyup also on radio/checkbox
|
327 |
+
* Fix normalization for rangelength attribute value
|
328 |
+
* Update elementValue method to deal with type="number" fields
|
329 |
+
* Use charAt instead of array notation on strings, to support IE8(?)
|
330 |
+
|
331 |
+
## Localization
|
332 |
+
* Fix sk translation of rangelength method
|
333 |
+
* Add Finnish methods
|
334 |
+
* Fixed GL number validation message
|
335 |
+
* Fixed ES number method validation message
|
336 |
+
* Added galician (GL)
|
337 |
+
* Fixed French messages for min and max methods
|
338 |
+
|
339 |
+
## Additionals
|
340 |
+
* Add statesUS method
|
341 |
+
* Fix dateITA method to deal with DST bug
|
342 |
+
* Add persian date method
|
343 |
+
* Add postalCodeCA method
|
344 |
+
* Add postalcodeIT method
|
345 |
+
|
346 |
+
1.12.0 / 2014-04-01
|
347 |
+
==================
|
348 |
+
|
349 |
+
* Add ARIA testing ([3d5658e](https://github.com/jzaefferer/jquery-validation/commit/3d5658e9e4825fab27198c256beed86f0bd12577))
|
350 |
+
* Add es-AR localization messages. ([7b30beb](https://github.com/jzaefferer/jquery-validation/commit/7b30beb8ebd218c38a55d26a63d529e16035c7a2))
|
351 |
+
* Add missing dots to 'es' and 'es_AR' messages. ([a2a653c](https://github.com/jzaefferer/jquery-validation/commit/a2a653cb68926ca034b4b09d742d275db934d040))
|
352 |
+
* Added Indonesian (ID) localization ([1d348bd](https://github.com/jzaefferer/jquery-validation/commit/1d348bdcb65807c71da8d0bfc13a97663631cd3a))
|
353 |
+
* Added NIF, NIE and CIF Spanish documents numbers validation ([#830](https://github.com/jzaefferer/jquery-validation/issues/830), [317c20f](https://github.com/jzaefferer/jquery-validation/commit/317c20fa9bb772770bb9b70d46c7081d7cfc6545))
|
354 |
+
* Added the current form to the context of the remote ajax request ([0a18ae6](https://github.com/jzaefferer/jquery-validation/commit/0a18ae65b9b6d877e3d15650a5c2617a9d2b11d5))
|
355 |
+
* Additionals: Update IBAN method, trim trailing whitespaces ([#970](https://github.com/jzaefferer/jquery-validation/issues/970), [347b04a](https://github.com/jzaefferer/jquery-validation/commit/347b04a7d4e798227405246a5de3fc57451d52e1))
|
356 |
+
* BIC method: Improve RegEx, {1} is always redundant. Closes gh-744 ([5cad6b4](https://github.com/jzaefferer/jquery-validation/commit/5cad6b493575e8a9a82470d17e0900c881130873))
|
357 |
+
* Bower: Add Bower.json for package registration ([e86ccb0](https://github.com/jzaefferer/jquery-validation/commit/e86ccb06e301613172d472cf15dd4011ff71b398))
|
358 |
+
* Changes dollar references to 'jQuery', for compability with jQuery.noConflict. Closes gh-754 ([2049afe](https://github.com/jzaefferer/jquery-validation/commit/2049afe46c1be7b3b89b1d9f0690f5bebf4fbf68))
|
359 |
+
* Core: Add "method" field to error list entry ([89a15c7](https://github.com/jzaefferer/jquery-validation/commit/89a15c7a4b17fa2caaf4ff817f09b04c094c3884))
|
360 |
+
* Core: Added support for generic messages via data-msg attribute ([5bebaa5](https://github.com/jzaefferer/jquery-validation/commit/5bebaa5c55c73f457c0e0181ec4e3b0c409e2a9d))
|
361 |
+
* Core: Allow attributes to have a value of zero (eg min='0') ([#854](https://github.com/jzaefferer/jquery-validation/issues/854), [9dc0d1d](https://github.com/jzaefferer/jquery-validation/commit/9dc0d1dd946b2c6178991fb16df0223c76162579))
|
362 |
+
* Core: Disable deprecated $.format ([#755](https://github.com/jzaefferer/jquery-validation/issues/755), [bf3b350](https://github.com/jzaefferer/jquery-validation/commit/bf3b3509140ea8ab5d83d3ec58fd9f1d7822efc5))
|
363 |
+
* Core: Fix support for multiple error classes ([c1f0baf](https://github.com/jzaefferer/jquery-validation/commit/c1f0baf36c21ca175bbc05fb9345e5b44b094821))
|
364 |
+
* Core: Ignore events on ignored elements ([#700](https://github.com/jzaefferer/jquery-validation/issues/700), [a864211](https://github.com/jzaefferer/jquery-validation/commit/a86421131ea69786ee9e0d23a68a54a7658ccdbf))
|
365 |
+
* Core: Improve elementValue method ([6c041ed](https://github.com/jzaefferer/jquery-validation/commit/6c041edd21af1425d12d06cdd1e6e32a78263e82))
|
366 |
+
* Core: Make element() handle ignored elements properly. ([3f464a8](https://github.com/jzaefferer/jquery-validation/commit/3f464a8da49dbb0e4881ada04165668e4a63cecb))
|
367 |
+
* Core: Switch dataRules parsing to W3C HTML5 spec style ([460fd22](https://github.com/jzaefferer/jquery-validation/commit/460fd22b6c84a74c825ce1fa860c0a9da20b56bb))
|
368 |
+
* Core: Trigger success on optional but have other successful validators ([#851](https://github.com/jzaefferer/jquery-validation/issues/851), [f93e1de](https://github.com/jzaefferer/jquery-validation/commit/f93e1deb48ec8b3a8a54e946a37db2de42d3aa2a))
|
369 |
+
* Core: Use plain element instead of un-wrapping the element again ([03cd4c9](https://github.com/jzaefferer/jquery-validation/commit/03cd4c93069674db5415a0bf174a5870da47e5d2))
|
370 |
+
* Core: make sure remote is executed last ([#711](https://github.com/jzaefferer/jquery-validation/issues/711), [ad91b6f](https://github.com/jzaefferer/jquery-validation/commit/ad91b6f388b7fdfb03b74e78554cbab9fd8fca6f))
|
371 |
+
* Demo: Use correct option in multipart demo. ([#1025](https://github.com/jzaefferer/jquery-validation/issues/1025), [070edc7](https://github.com/jzaefferer/jquery-validation/commit/070edc7be4de564cb74cfa9ee4e3f40b6b70b76f))
|
372 |
+
* Fix $/jQuery usage in additional methods. Fixes #839 ([#839](https://github.com/jzaefferer/jquery-validation/issues/839), [59bc899](https://github.com/jzaefferer/jquery-validation/commit/59bc899e4586255a4251903712e813c21d25b3e1))
|
373 |
+
* Improve Chinese translations ([1a0bfe3](https://github.com/jzaefferer/jquery-validation/commit/1a0bfe32b16f8912ddb57388882aa880fab04ffe))
|
374 |
+
* Initial ARIA-Required implementation ([bf3cfb2](https://github.com/jzaefferer/jquery-validation/commit/bf3cfb234ede2891d3f7e19df02894797dd7ba5e))
|
375 |
+
* Localization: change accept values to extension. Fixes #771, closes gh-793. ([#771](https://github.com/jzaefferer/jquery-validation/issues/771), [12edec6](https://github.com/jzaefferer/jquery-validation/commit/12edec66eb30dc7e86756222d455d49b34016f65))
|
376 |
+
* Messages: Add icelandic localization ([dc88575](https://github.com/jzaefferer/jquery-validation/commit/dc885753c8872044b0eaa1713cecd94c19d4c73d))
|
377 |
+
* Messages: Add missing dots to 'bg', 'fr' and 'sr' messages. ([adbc636](https://github.com/jzaefferer/jquery-validation/commit/adbc6361c377bf6b74c35df9782479b1115fbad7))
|
378 |
+
* Messages: Create messages_sr_lat.js ([f2f9007](https://github.com/jzaefferer/jquery-validation/commit/f2f90076518014d98495c2a9afb9a35d45d184e6))
|
379 |
+
* Messages: Create messages_tj.js ([de830b3](https://github.com/jzaefferer/jquery-validation/commit/de830b3fd8689a7384656c17565ee92c2878d8a5))
|
380 |
+
* Messages: Fix sr_lat translation, add missing space ([880ba1c](https://github.com/jzaefferer/jquery-validation/commit/880ba1ca545903a41d8c5332fc4038a7e9a580bd))
|
381 |
+
* Messages: Update messages_sr.js, fix missing space ([10313f4](https://github.com/jzaefferer/jquery-validation/commit/10313f418c18ea75f385248468c2d3600f136cfb))
|
382 |
+
* Methods: Add additional method for currency ([1a981b4](https://github.com/jzaefferer/jquery-validation/commit/1a981b440346620964c87ebdd0fa03246348390e))
|
383 |
+
* Methods: Adding Smart Quotes to stripHTML's punctuation removal ([aa0d624](https://github.com/jzaefferer/jquery-validation/commit/aa0d6241c3ea04663edc1e45ed6e6134630bdd2f))
|
384 |
+
* Methods: Fix dateITA method, avoiding summertime errors ([279b932](https://github.com/jzaefferer/jquery-validation/commit/279b932c1267b7238e6652880b7846ba3bbd2084))
|
385 |
+
* Methods: Localized methods for chilean culture (es-CL) ([cf36b93](https://github.com/jzaefferer/jquery-validation/commit/cf36b933499e435196d951401221d533a4811810))
|
386 |
+
* Methods: Update email to use HTML5 regex, remove email2 method ([#828](https://github.com/jzaefferer/jquery-validation/issues/828), [dd162ae](https://github.com/jzaefferer/jquery-validation/commit/dd162ae360639f73edd2dcf7a256710b2f5a4e64))
|
387 |
+
* Pattern method: Remove delimiters, since HTML5 implementations don't include those either. ([37992c1](https://github.com/jzaefferer/jquery-validation/commit/37992c1c9e2e0be8b315ccccc2acb74863439d3e))
|
388 |
+
* Restricting credit card validator to include length check. Closes gh-772 ([f5f47c5](https://github.com/jzaefferer/jquery-validation/commit/f5f47c5c661da5b0c0c6d59d169e82230928a804))
|
389 |
+
* Update messages_ko.js - closes gh-715 ([5da3085](https://github.com/jzaefferer/jquery-validation/commit/5da3085ff02e0e6ecc955a8bfc3bb9a8d220581b))
|
390 |
+
* Update messages_pt_BR.js. Closes gh-782 ([4bf813b](https://github.com/jzaefferer/jquery-validation/commit/4bf813b751ce34fac3c04eaa2e80f75da3461124))
|
391 |
+
* Update phonesUK and mobileUK to accept new prefixes. Closes gh-750 ([d447b41](https://github.com/jzaefferer/jquery-validation/commit/d447b41b830dee984be21d8281ec7b87a852001d))
|
392 |
+
* Verify nine-digit zip codes. Closes gh-726 ([165005d](https://github.com/jzaefferer/jquery-validation/commit/165005d4b5780e22d13d13189d107940c622a76f))
|
393 |
+
* phoneUS: Add N11 exclusions. Closes gh-861 ([519bbc6](https://github.com/jzaefferer/jquery-validation/commit/519bbc656bcb26e8aae5166d7b2e000014e0d12a))
|
394 |
+
* resetForm should clear any aria-invalid values ([4f8a631](https://github.com/jzaefferer/jquery-validation/commit/4f8a631cbe84f496ec66260ada52db2aa0bb3733))
|
395 |
+
* valid(): Check all elements. Fixes #791 - valid() validates only the first (invalid) element ([#791](https://github.com/jzaefferer/jquery-validation/issues/791), [6f26803](https://github.com/jzaefferer/jquery-validation/commit/6f268031afaf4e155424ee74dd11f6c47fbb8553))
|
396 |
+
|
397 |
+
1.11.1 / 2013-03-22
|
398 |
+
==================
|
399 |
+
|
400 |
+
* Revert to also converting parameters of range method to numbers. Closes gh-702
|
401 |
+
* Replace most usage of PHP with mockjax handlers. Do some demo cleanup as well, update to newer masked-input plugin. Keep captcha demo in PHP. Fixes #662
|
402 |
+
* Remove inline code highlighting from milk demo. View source works fine.
|
403 |
+
* Fix dynamic-totals demo by trimming whitespace from template content before passing to jQuery constructor
|
404 |
+
* Fix min/max validation. Closes gh-666. Fixes #648
|
405 |
+
* Fixed 'messages' coming up as a rule and causing an exception after being updated through rules("add"). Closes gh-670, fixes #624
|
406 |
+
* Add Korean (ko) localization. Closes gh-671
|
407 |
+
* Improved the UK postcode method to filter out more invalid postcodes. Closes #682
|
408 |
+
* Update messages_sv.js. Closes #683
|
409 |
+
* Change grunt link to the project website. Closes #684
|
410 |
+
* Move remote method down the list to run last, after all other methods applied to a field. Fixes #679
|
411 |
+
* Update plugin.json description, should include the word 'validate'
|
412 |
+
* Fix typos
|
413 |
+
* Fix jQuery loader to use path of itself. Fixes nested demos.
|
414 |
+
* Update grunt-contrib-qunit to make use of PhantomJS 1.8, when installed through node module 'phantomjs'
|
415 |
+
* Make valid() return a boolean instead of 0 or 1. Fixes #109 - valid() does not return boolean value
|
416 |
+
|
417 |
+
1.11.0 / 2013-02-04
|
418 |
+
==================
|
419 |
+
|
420 |
+
* Remove clearing as numbers of `min`, `max` and `range` rules. Fixes #455. Closes gh-528.
|
421 |
+
* Update pre-existing labels - fixes #430 closes gh-436
|
422 |
+
* Fix $.validator.format to avoid group interpolation, where at least IE8/9 replaces -bash with the match. Fixes #614
|
423 |
+
* Fix mimetype regex
|
424 |
+
* Add plugin manifest and update headers to just MIT license, drop unnecessary dual-licensing (like jQuery).
|
425 |
+
* Hebrew messages: Removed dots at end of sentences - Fixes gh-568
|
426 |
+
* French translation for require_from_group validation. Fixes gh-573.
|
427 |
+
* Allow groups to be an array or a string - Fixes #479
|
428 |
+
* Removed spaces with multiple MIME types
|
429 |
+
* Fix some date validations, JS syntax errors.
|
430 |
+
* Remove support for metadata plugin, replace with data-rule- and data-msg- (added in 907467e8) properties.
|
431 |
+
* Added sftp as a valid url-pattern
|
432 |
+
* Add Malay (my) localization
|
433 |
+
* Update localization/messages_hu.js
|
434 |
+
* Remove focusin/focusout polyfill. Fixes #542 - Inclusion of jquery.validate interfers with focusin and focusout events in IE9
|
435 |
+
* Localization: Fixed typo in finnish translation
|
436 |
+
* Fix RTM demo to show invalid icon when going from valid back to invalid
|
437 |
+
* Fixed premature return in remote function which prevented ajax call from being made in case an input was entered too quickly. Ensures remote validation always validates the newest value.
|
438 |
+
* Undo fix for #244. Fixes #521 - E-mail validation fires immediately when text is in the field.
|
439 |
+
|
440 |
+
1.10.0 / 2012-09-07
|
441 |
+
===================
|
442 |
+
|
443 |
+
* Corrected French strings for nowhitespace, phoneUS, phoneUK and mobileUK based upon community feedback.
|
444 |
+
* rename files for language_REGION according to the standard ISO_3166-1 (http://en.wikipedia.org/wiki/ISO_3166-1), for Taiwan tha language is Chinese (zh) and the region is Taiwan (TW)
|
445 |
+
* Optimise RegEx patterns, especially for UK phone numbers.
|
446 |
+
* Add Language Name for each file, rename the language code according to the standard ISO 639 for Estonian, Georgian, Ukrainian and Chinese (http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
|
447 |
+
* Added croatian (HR) localization
|
448 |
+
* Existing French translations were edited and French translations for the additional methods were added.
|
449 |
+
* Merged in changes for specifying custom error messages in data attributes
|
450 |
+
* Updated UK Mobile phone number regex for new numbers. Fixes #154
|
451 |
+
* Add element to success call with test. Fixes #60
|
452 |
+
* Fixed regex for time additional method. Fixes #131
|
453 |
+
* resetForm now clears old previousValue on form elements. Fixes #312
|
454 |
+
* Added checkbox test to require_from_group and changed require_from_group to use elementValue. Fixes #359
|
455 |
+
* Fixed dataFilter response issues in jQuery 1.5.2+. Fixes #405
|
456 |
+
* Added jQuery Mobile demo. Fixes #249
|
457 |
+
* Deoptimize findByName for correctness. Fixes #82 - $.validator.prototype.findByName breaks in IE7
|
458 |
+
* Added US zip code support and test. Fixes #90
|
459 |
+
* Changed lastElement to lastActive in keyup, skip validation on tab or empty element. Fixes #244
|
460 |
+
* Removed number stripping from stripHtml. Fixes #2
|
461 |
+
* Fixed invalid count on invalid to valid remote validation. Fixes #286
|
462 |
+
* Add link to file_input to demo index
|
463 |
+
* Moved old accept method to extension additional-method, added new accept method to handle standard browser mimetype filtering. Fixes #287 and supersedes #369
|
464 |
+
* Disables blur event when onfocusout is set to false. Test added.
|
465 |
+
* Fixed value issue for radio buttons and checkboxes. Fixes #363
|
466 |
+
* Added test for rangeWords and fixed regex and bounds in method. Fixes #308
|
467 |
+
* Fixed TinyMCE Demo and added link on demo page. Fixes #382
|
468 |
+
* Changed localization message for min/max. Fixes #273
|
469 |
+
* Added pseudo selector for text input types to fix issue with default empty type attribute. Added tests and some test markup. Fixes #217
|
470 |
+
* Fixed delegate bug for dynamic-totals demo. Fixes #51
|
471 |
+
* Fix incorrect message for alphanumeric validator
|
472 |
+
* Removed incorrect false check on required attribute
|
473 |
+
* required attribute fix for non-html5 browsers. Fixes #301
|
474 |
+
* Added methods "require_from_group" and "skip_or_fill_minimum"
|
475 |
+
* Use correct iso code for swedish
|
476 |
+
* Updated demo HTML files to use HTML5 doctype
|
477 |
+
* Fixed regex issue for decimals without leading zeroes. Added new methods test. Fixes #41
|
478 |
+
* Introduce a elementValue method that normalizes only string values (don't touch array value of multi-select). Fixes #116
|
479 |
+
* Support for dynamically added submit buttons, and updated test case. Uses validateDelegate. Code from PR #9
|
480 |
+
* Fix bad double quote in test fixtures
|
481 |
+
* Fix maxWords method to include the upper bound, not exclude it. Fixes #284
|
482 |
+
* Fixed grammar error in german range validator message. Fixes #315
|
483 |
+
* Fixed handling of multiple class names for errorClass option. Test by Max Lynch. Fixes #280
|
484 |
+
* Fix jQuery.format usage, should be $.validator.format. Fixes #329
|
485 |
+
* Methods for 'all' UK phone numbers + UK postcodes
|
486 |
+
* Pattern method: Convert string param to RegExp. Fixes issue #223
|
487 |
+
* grammar error in german localization file
|
488 |
+
* Added Estonian localization for messages
|
489 |
+
* Improve tooltip handling on themerollered demo
|
490 |
+
* Add type="text" to input fields without type attribute to please qSA
|
491 |
+
* Update themerollered demo to use tooltip to show errors as overlay.
|
492 |
+
* Update themerollered demo to use latest jQuery UI (along with newer jQuery version). Move code around to speed up page load.
|
493 |
+
* Fixed min error message broken in Japanese.
|
494 |
+
* Update form plugin to latest version. Enhance the ajaxSubmit demo.
|
495 |
+
* Drop dateDE and numberDE methods from classRuleSettings, leftover from moving those to localized methods
|
496 |
+
* Passing submit event to submitHandler callback
|
497 |
+
* Fixed #219 - Fix valid() on elements with dependency-callback or dependency-expression.
|
498 |
+
* Improve build to remove dist dir to ensure only the current release gets zipped up
|
499 |
+
|
500 |
+
1.9.0
|
501 |
+
---
|
502 |
+
* Added Basque (EU) localization
|
503 |
+
* Added Slovenian (SL) localization
|
504 |
+
* Fixed issue #127 - Finnish translations has one : instead of ;
|
505 |
+
* Fixed Russian localization, minor syntax issue
|
506 |
+
* Added in support for HTML5 input types, fixes #97
|
507 |
+
* Improved HTML5 support by setting novalidate attribute on the form, and reading the type attribute.
|
508 |
+
* Fixed showLabel() removing all classes from error element. Remove only settings.validClass. Fixes #151.
|
509 |
+
* Added 'pattern' to additional-methods to validate against arbitrary regular expressions.
|
510 |
+
* Improved email method to not allow the dot at the end (valid by RFC, but unwanted here). Fixes #143
|
511 |
+
* Fixed swedish and norwegian translations, min/max messages got switched. Fixes #181
|
512 |
+
* Fixed #184 - resetForm: should unset lastElement
|
513 |
+
* Fixed #71 - improve existing time method and add time12h method for 12h am/pm time format
|
514 |
+
* Fixed #177 - Fix validation of a single radio or checkbox input
|
515 |
+
* Fixed #189 - :hidden elements are now ignored by default
|
516 |
+
* Fixed #194 - Required as attribute fails if jQuery>=1.6 - Use .prop instead of .attr
|
517 |
+
* Fixed #47, #39, #32 - Allowed credit card numbers to contain spaces as well as dashes (spaces are commonly input by users).
|
518 |
+
|
519 |
+
1.8.1
|
520 |
+
---
|
521 |
+
* Added Thai (TH) localization, fixes #85
|
522 |
+
* Added Vietnamese (VI) localization, thanks Ngoc
|
523 |
+
* Fixed issue #78. Error/Valid styling applies to all radio buttons of same group for required validation.
|
524 |
+
* Don't use form.elements as that isn't supported in jQuery 1.6 anymore. Its buggy as hell anyway (IE6-8: form.elements === form).
|
525 |
+
|
526 |
+
1.8.0
|
527 |
+
---
|
528 |
+
* Improved NL localization (http://plugins.jquery.com/node/14120)
|
529 |
+
* Added Georgian (GE) localization, thanks Avtandil Kikabidze
|
530 |
+
* Added Serbian (SR) localization, thanks Aleksandar Milovac
|
531 |
+
* Added ipv4 and ipv6 to additional methods, thanks Natal Ngétal
|
532 |
+
* Added Japanese (JA) localization, thanks Bryan Meyerovich
|
533 |
+
* Added Catalan (CA) localization, thanks Xavier de Pedro
|
534 |
+
* Fixed missing var statements within for-in loops
|
535 |
+
* Fix for remote validation, where a formatted message got messed up (https://github.com/jzaefferer/jquery-validation/issues/11)
|
536 |
+
* Bugfixes for compatibility with jQuery 1.5.1, while maintaining backwards-compatibility
|
537 |
+
|
538 |
+
1.7
|
539 |
+
---
|
540 |
+
* Added Lithuanian (LT) localization
|
541 |
+
* Added Greek (EL) localization (http://plugins.jquery.com/node/12319)
|
542 |
+
* Added Latvian (LV) localization (http://plugins.jquery.com/node/12349)
|
543 |
+
* Added Hebrew (HE) localization (http://plugins.jquery.com/node/12039)
|
544 |
+
* Fixed Spanish (ES) localization (http://plugins.jquery.com/node/12696)
|
545 |
+
* Added jQuery UI themerolled demo
|
546 |
+
* Removed cmxform.js
|
547 |
+
* Fixed four missing semicolons (http://plugins.jquery.com/node/12639)
|
548 |
+
* Renamed phone-method in additional-methods.js to phoneUS
|
549 |
+
* Added phoneUK and mobileUK methods to additional-methods.js (http://plugins.jquery.com/node/12359)
|
550 |
+
* Deep extend options to avoid modifying multiple forms when using the rules-method on a single element (http://plugins.jquery.com/node/12411)
|
551 |
+
* Bugfixes for compatibility with jQuery 1.4.2, while maintaining backwards-compatibility
|
552 |
+
|
553 |
+
1.6
|
554 |
+
---
|
555 |
+
* Added Arabic (AR), Portuguese (PTPT), Persian (FA), Finnish (FI) and Bulgarian (BR) localization
|
556 |
+
* Updated Swedish (SE) localization (some missing html iso characters)
|
557 |
+
* Fixed $.validator.addMethod to properly handle empty string vs. undefined for the message argument
|
558 |
+
* Fixed two accidental global variables
|
559 |
+
* Enhanced min/max/rangeWords (in additional-methods.js) to strip html before counting; good when counting words in a richtext editor
|
560 |
+
* Added localized methods for DE, NL and PT, removing the dateDE and numberDE methods (use messages_de.js and methods_de.js with date and number methods instead)
|
561 |
+
* Fixed remote form submit synchronization, kudos to Matas Petrikas
|
562 |
+
* Improved interactive select validation, now validating also on click (via option or select, inconsistent across browsers); doesn't work in Safari, which doesn't trigger a click event at all on select elements; fixes http://plugins.jquery.com/node/11520
|
563 |
+
* Updated to latest form plugin (2.36), fixing http://plugins.jquery.com/node/11487
|
564 |
+
* Bind to blur event for equalTo target to revalidate when that target changes, fixes http://plugins.jquery.com/node/11450
|
565 |
+
* Simplified select validation, delegating to jQuery's val() method to get the select value; should fix http://plugins.jquery.com/node/11239
|
566 |
+
* Fixed default message for digits (http://plugins.jquery.com/node/9853)
|
567 |
+
* Fixed issue with cached remote message (http://plugins.jquery.com/node/11029 and http://plugins.jquery.com/node/9351)
|
568 |
+
* Fixed a missing semicolon in additional-methods.js (http://plugins.jquery.com/node/9233)
|
569 |
+
* Added automatic detection of substitution parameters in messages, removing the need to provide format functions (http://plugins.jquery.com/node/11195)
|
570 |
+
* Fixed an issue with :filled/:blank somewhat caused by Sizzle (http://plugins.jquery.com/node/11144)
|
571 |
+
* Added an integer method to additional-methods.js (http://plugins.jquery.com/node/9612)
|
572 |
+
* Fixed errorsFor method where the for-attribute contains characters that need escaping to be valid inside a selector (http://plugins.jquery.com/node/9611)
|
573 |
+
|
574 |
+
1.5.5
|
575 |
+
---
|
576 |
+
* Fix for http://plugins.jquery.com/node/8659
|
577 |
+
* Fixed trailing comma in messages_cs.js
|
578 |
+
|
579 |
+
1.5.4
|
580 |
+
---
|
581 |
+
* Fixed remote method bug (http://plugins.jquery.com/node/8658)
|
582 |
+
|
583 |
+
1.5.3
|
584 |
+
---
|
585 |
+
* Fixed a bug related to the wrapper-option, where all ancestor-elements that matched the wrapper-option where selected (http://plugins.jquery.com/node/7624)
|
586 |
+
* Updated multipart demo to use latest jQuery UI accordion
|
587 |
+
* Added dateNL and time methods to additionalMethods.js
|
588 |
+
* Added Traditional Chinese (Taiwan, tw) and Kazakhstan (KK) localization
|
589 |
+
* Moved jQuery.format (formerly String.format) to jQuery.validator.format, jQuery.format is deprecated and will be removed in 1.6 (see http://code.google.com/p/jquery-utils/issues/detail?id=15 for details)
|
590 |
+
* Cleaned up messages_pl.js and messages_ptbr.js (still defined messages for max/min/rangeValue, which were removed in 1.4)
|
591 |
+
* Fixed flawed boolean logic in valid-plugin-method for multiple elements; now all elements need to be valid for a boolean-true result (http://plugins.jquery.com/node/8481)
|
592 |
+
* Enhancement $.validator.addMethod: An undefined third message-argument won't overwrite an existing message (http://plugins.jquery.com/node/8443)
|
593 |
+
* Enhancement to submitHandler option: When used, click events on submit buttons are captured and the submitting button is inserted into the form before calling submitHandler, and removed afterwards; keeps submit buttons intact (http://plugins.jquery.com/node/7183#comment-3585)
|
594 |
+
* Added option validClass, default "valid", which adds that class to all valid elements, after validation (http://dev.jquery.com/ticket/2205)
|
595 |
+
* Added creditcardtypes method to additionalMethods.js, including tests (via http://dev.jquery.com/ticket/3635)
|
596 |
+
* Improved remote method to allow serverside message as a string, or true for valid, or false for invalid using the clientside defined message (http://dev.jquery.com/ticket/3807)
|
597 |
+
* Improved accept method to also accept a Drupal-style comma-separated list of values (http://plugins.jquery.com/node/8580)
|
598 |
+
|
599 |
+
1.5.2
|
600 |
+
---
|
601 |
+
* Fixed messages in additional-methods.js for maxWords, minWords, and rangeWords to include call to $.format
|
602 |
+
* Fixed value passed to methods to exclude carriage return (\r), same as jQuery's val() does
|
603 |
+
* Added slovak (sk) localization
|
604 |
+
* Added demo for integration with jQuery UI tabs
|
605 |
+
* Added selects-grouping example to tabs demo (see second tab, birthdate field)
|
606 |
+
|
607 |
+
1.5.1
|
608 |
+
---
|
609 |
+
* Updated marketo demo to use invalidHandler option instead of binding invalid-form event
|
610 |
+
* Added TinyMCE integration example
|
611 |
+
* Added ukrainian (ua) localization
|
612 |
+
* Fixed length validation to work with trimmed value (regression from 1.5 where general trimming before validation was removed)
|
613 |
+
* Various small fixes for compatibility with both 1.2.6 and 1.3
|
614 |
+
|
615 |
+
1.5
|
616 |
+
---
|
617 |
+
* Improved basic demo, validating confirm-password field after password changed
|
618 |
+
* Fixed basic validation to pass the untrimmed input value as the first parameter to validation methods, changed required accordingly; breaks existing custom method that rely on the trimming
|
619 |
+
* Added norwegian (no), italian (it), hungarian (hu) and romanian (ro) localization
|
620 |
+
* Fixed #3195: Two flaws in swedish localization
|
621 |
+
* Fixed #3503: Extended rules("add") to accept messages property: use to specify add custom messages to an element via rules("add", { messages: { required: "Required! " } });
|
622 |
+
* Fixed #3356: Regression from #2908 when using meta-option
|
623 |
+
* Fixed #3370: Added ignoreTitle option, set to skip reading messages from the title attribute, helps to avoid issues with Google Toolbar; default is false for compatibility
|
624 |
+
* Fixed #3516: Trigger invalid-form event even when remote validation is involved
|
625 |
+
* Added invalidHandler option as a shortcut to bind("invalid-form", function() {})
|
626 |
+
* Fixed Safari issue for loading indicator in ajaxSubmit-integration-demo (append to body first, then hide)
|
627 |
+
* Added test for creditcard validation and improved default message
|
628 |
+
* Enhanced remote validation, accepting options to passthrough to $.ajax as parameter (either url string or options, including url property plus everything else that $.ajax supports)
|
629 |
+
|
630 |
+
1.4
|
631 |
+
---
|
632 |
+
* Fixed #2931, validate elements in document order and ignore type=image inputs
|
633 |
+
* Fixed usage of $ and jQuery variables, now fully compatible with all variations of noConflict usage
|
634 |
+
* Implemented #2908, enabling custom messages via metadata ala class="{required:true,messages:{required:'required field'}}", added demo/custom-messages-metadata-demo.html
|
635 |
+
* Removed deprecated methods minValue (min), maxValue (max), rangeValue (rangevalue), minLength (minlength), maxLength (maxlength), rangeLength (rangelength)
|
636 |
+
* Fixed #2215 regression: Call unhighlight only for current elements, not everything
|
637 |
+
* Implemented #2989, enabling image button to cancel validation
|
638 |
+
* Fixed issue where IE incorrectly validates against maxlength=0
|
639 |
+
* Added czech (cs) localization
|
640 |
+
* Reset validator.submitted on validator.resetForm(), enabling a full reset when necessary
|
641 |
+
* Fixed #3035, skipping all falsy attributes when reading rules (0, undefined, empty string), removed part of the maxlength workaround (for 0)
|
642 |
+
* Added dutch (nl) localization (#3201)
|
643 |
+
|
644 |
+
1.3
|
645 |
+
---
|
646 |
+
* Fixed invalid-form event, now only triggered when form is invalid
|
647 |
+
* Added spanish (es), russian (ru), portuguese brazilian (ptbr), turkish (tr), and polish (pl) localization
|
648 |
+
* Added removeAttrs plugin to facilitate adding and removing multiple attributes
|
649 |
+
* Added groups option to display a single message for multiple elements, via groups: { arbitraryGroupName: "fieldName1 fieldName2[, fieldNameN" }
|
650 |
+
* Enhanced rules() for adding and removing (static) rules: rules("add", "method1[, methodN]"/{method1:param[, method_n:param]}) and rules("remove"[, "method1[, method_n]")
|
651 |
+
* Enhanced rules-option, accepts space-separated string-list of methods, eg. {birthdate: "required date"}
|
652 |
+
* Fixed checkbox group validation with inline rules: As long as the rules are specified on the first element, the group is now properly validated on click
|
653 |
+
* Fixed #2473, ignoring all rules with an explicit parameter of boolean-false, eg. required:false is the same as not specifying required at all (it was handled as required:true so far)
|
654 |
+
* Fixed #2424, with a modified patch from #2473: Methods returning a dependency-mismatch don't stop other rules from being evaluated anymore; still, success isn't applied for optional fields
|
655 |
+
* Fixed url and email validation to not use trimmed values
|
656 |
+
* Fixed creditcard validation to accept only digits and dashes ("asdf" is not a valid creditcard number)
|
657 |
+
* Allow both button and input elements for cancel buttons (via class="cancel")
|
658 |
+
* Fixed #2215: Fixed message display to call unhighlight as part of showing and hiding messages, no more visual side-effects while checking an element and extracted validator.checkForm to validate a form without UI sideeffects
|
659 |
+
* Rewrote custom selectors (:blank, :filled, :unchecked) with functions for compatibility with AIR
|
660 |
+
|
661 |
+
1.2.1
|
662 |
+
-----
|
663 |
+
|
664 |
+
* Bundled delegate plugin with validate plugin - its always required anyway
|
665 |
+
* Improved remote validation to include parts from the ajaxQueue plugin for proper synchronization (no additional plugin necessary)
|
666 |
+
* Fixed stopRequest to prevent pendingRequest < 0
|
667 |
+
* Added jQuery.validator.autoCreateRanges property, defaults to false, enable to convert min/max to range and minlength/maxlength to rangelength; this basically fixes the issue introduced by automatically creating ranges in 1.2
|
668 |
+
* Fixed optional-methods to not highlight anything at all if the field is blank, that is, don't trigger success
|
669 |
+
* Allow false/null for highlight/unhighlight options instead of forcing a do-nothing-callback even when nothing needs to be highlighted
|
670 |
+
* Fixed validate() call with no elements selected, returning undefined instead of throwing an error
|
671 |
+
* Improved demo, replacing metadata with classes/attributes for specifying rules
|
672 |
+
* Fixed error when no custom message is used for remote validation
|
673 |
+
* Modified email and url validation to require domain label and top label
|
674 |
+
* Fixed url and email validation to require TLD (actually to require domain label); 1.2 version (TLD is optional) is moved to additions as url2 and email2
|
675 |
+
* Fixed dynamic-totals demo in IE6/7 and improved templating, using textarea to store multiline template and string interpolation
|
676 |
+
* Added login form example with "Email password" link that makes the password field optional
|
677 |
+
* Enhanced dynamic-totals demo with an example of a single message for two fields
|
678 |
+
|
679 |
+
1.2
|
680 |
+
---
|
681 |
+
|
682 |
+
* Added AJAX-captcha validation example (based on http://psyrens.com/captcha/)
|
683 |
+
* Added remember-the-milk-demo (thanks RTM team for the permission!)
|
684 |
+
* Added marketo-demo (thanks Glen Lipka!)
|
685 |
+
* Added support for ajax-validation, see method "remote"; serverside returns JSON, true for valid elements, false or a String for invalid, String is used as message
|
686 |
+
* Added highlight and unhighlight options, by default toggles errorClass on element, allows custom highlighting
|
687 |
+
* Added valid() plugin method for easy programmatic checking of forms and fields without the need to use the validator API
|
688 |
+
* Added rules() plugin method to read and write rules for an element (currently read only)
|
689 |
+
* Replaced regex for email method, thanks to the contribution by Scott Gonzalez, see http://projects.scottsplayground.com/email_address_validation/
|
690 |
+
* Restructured event architecture to rely solely on delegation, both improving performance, and ease-of-use for the developer (requires jquery.delegate.js)
|
691 |
+
* Moved documentation from inline to http://docs.jquery.com/Plugins/Validation - including interactive examples for all methods
|
692 |
+
* Removed validator.refresh(), validation is now completely dynamic
|
693 |
+
* Renamed minValue to min, maxValue to max and rangeValue to range, deprecating the previous names (to be removed in 1.3)
|
694 |
+
* Renamed minLength to minlength, maxLength to maxlength and rangeLength to rangelength, deprecating the previous names (to be removed in 1.3)
|
695 |
+
* Added feature to merge min + max into and range and minlength + maxlength into rangelength
|
696 |
+
* Added support for dynamic rule parameters, allowing to specify a function as a parameter eg. for minlength, called when validating the element
|
697 |
+
* Allow to specify null or an empty string as a message to display nothing (see marketo demo)
|
698 |
+
* Rules overhaul: Now supports combination of rules-option, metadata, classes (new) and attributes (new), see rules() for details
|
699 |
+
|
700 |
+
1.1.2
|
701 |
+
---
|
702 |
+
|
703 |
+
* Replaced regex for URL method, thanks to the contribution by Scott Gonzalez, see http://projects.scottsplayground.com/iri/
|
704 |
+
* Improved email method to better handle unicode characters
|
705 |
+
* Fixed error container to hide when all elements are valid, not only on form submit
|
706 |
+
* Fixed String.format to jQuery.format (moving into jQuery namespace)
|
707 |
+
* Fixed accept method to accept both upper and lowercase extensions
|
708 |
+
* Fixed validate() plugin method to create only one validator instance for a given form and always return that one instance (avoids binding events multiple times)
|
709 |
+
* Changed debug-mode console log from "error" to "warn" level
|
710 |
+
|
711 |
+
1.1.1
|
712 |
+
-----
|
713 |
+
|
714 |
+
* Fixed invalid XHTML, preventing error label creation in IE since jQuery 1.1.4
|
715 |
+
* Fixed and improved String.format: Global search & replace, better handling of array arguments
|
716 |
+
* Fixed cancel-button handling to use validator-object for storing state instead of form element
|
717 |
+
* Fixed name selectors to handle "complex" names, eg. containing brackets ("list[]")
|
718 |
+
* Added button and disabled elements to exclude from validation
|
719 |
+
* Moved element event handlers to refresh to be able to add handlers to new elements
|
720 |
+
* Fixed email validation to allow long top level domains (eg. ".travel")
|
721 |
+
* Moved showErrors() from valid() to form()
|
722 |
+
* Added validator.size(): returns the number of current errors
|
723 |
+
* Call submitHandler with validator as scope for easier access of it's methods, eg. to find error labels using errorsFor(Element)
|
724 |
+
* Compatible with jQuery 1.1.x and 1.2.x
|
725 |
+
|
726 |
+
1.1
|
727 |
+
---
|
728 |
+
|
729 |
+
* Added validation on blur, keyup and click (for checkboxes and radiobutton). Replaces event-option.
|
730 |
+
* Fixed resetForm
|
731 |
+
* Fixed custom-methods-demo
|
732 |
+
|
733 |
+
1.0
|
734 |
+
---
|
735 |
+
|
736 |
+
* Improved number and numberDE methods to check for correct decimal numbers with delimiters
|
737 |
+
* Only elements that have rules are checked (otherwise success-option is applied to all elements)
|
738 |
+
* Added creditcard number method (thanks to Brian Klug)
|
739 |
+
* Added ignore-option, eg. ignore: "[@type=hidden]", using that expression to exclude elements to validate. Default: none, though submit and reset buttons are always ignored
|
740 |
+
* Heavily enhanced Functions-as-messages by providing a flexible String.format helper
|
741 |
+
* Accept Functions as messages, providing runtime-custom-messages
|
742 |
+
* Fixed exclusion of elements without rules from successList
|
743 |
+
* Fixed custom-method-demo, replaced the alert with message displaying the number of errors
|
744 |
+
* Fixed form-submit-prevention when using submitHandler
|
745 |
+
* Completely removed dependency on element IDs, though they are still used (when present) to link error labels to inputs. Achieved by using
|
746 |
+
an array with {name, message, element} instead of an object with id:message pairs for the internal errorList.
|
747 |
+
* Added support for specifying simple rules as simple strings, eg. "required" is equivalent to {required: true}
|
748 |
+
* Added feature: Add errorClass to invalid field�s parent element, making it easy to style the label/field container or the label for the field.
|
749 |
+
* Added feature: focusCleanup - If enabled, removes the errorClass from the invalid elements and hides all errors messages whenever the element is focused.
|
750 |
+
* Added success option to show the a field was validated successfully
|
751 |
+
* Fixed Opera select-issue (avoiding a attribute-collision)
|
752 |
+
* Fixed problems with focussing hidden elements in IE
|
753 |
+
* Added feature to skip validation for submit buttons with class "cancel"
|
754 |
+
* Fixed potential issues with Google Toolbar by preferring plugin option messages over title attribute
|
755 |
+
* submitHandler is only called when an actual submit event was handled, validator.form() returns false only for invalid forms
|
756 |
+
* Invalid elements are now focused only on submit or via validator.focusInvalid(), avoiding all trouble with focus-on-blur
|
757 |
+
* IE6 error container layout issue is solved
|
758 |
+
* Customize error element via errorElement option
|
759 |
+
* Added validator.refresh() to find new inputs in the form
|
760 |
+
* Added accept validation method, checks file extensions
|
761 |
+
* Improved dependency feature by adding two custom expressions: ":blank" to select elements with an empty value and �:filled� to select elements with a value, both excluding whitespace
|
762 |
+
* Added a resetForm() method to the validator: Resets each form element (using the form plugin, if available), removes classes on invalid elements and hides all error messages
|
763 |
+
* Fixed docs for validator.showErrors()
|
764 |
+
* Fixed error label creation to always use html() instead of text(), allowing arbitrary HTML passed in as messages
|
765 |
+
* Fixed error label creation to use specified error class
|
766 |
+
* Added dependency feature: The requires method accepts both String (jQuery expressions) and Functions as the argument
|
767 |
+
* Heavily improved customizing of error message display: Use normal messages and show/hide an additional container; Completely replace message display with own mechanism (while being able to delegate to the default handler; Customize placing of generated labels (instead of default below-element)
|
768 |
+
* Fixed two major bugs in IE (error containers) and Opera (metadata)
|
769 |
+
* Modified validation methods to accept empty fields as valid (exception: of course �required� and also �equalTo� methods)
|
770 |
+
* Renamed "min" to "minLength", "max" to "maxLength", "length" to "rangeLength"
|
771 |
+
* Added "minValue", "maxValue" and "rangeValue"
|
772 |
+
* Streamlined API for support of different events. The default, submit, can be disabled. If any event is specified, that is applied to each element (instead of the entire form). Combining keyup-validation with submit-validation is now extremely easy to setup
|
773 |
+
* Added support for one-message-per-rule when defining messages via plugin settings
|
774 |
+
* Added support to wrap metadata in some parent element. Useful when metadata is used for other plugins, too.
|
775 |
+
* Refactored tests and demos: Less files, better demos
|
776 |
+
* Improved documentation: More examples for methods, more reference texts explaining some basics
|
js/src/jquery-validation/dist/jquery.validate.js
ADDED
@@ -0,0 +1,1657 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* jQuery Validation Plugin v1.19.3
|
3 |
+
*
|
4 |
+
* https://jqueryvalidation.org/
|
5 |
+
*
|
6 |
+
* Copyright (c) 2021 Jörn Zaefferer
|
7 |
+
* Released under the MIT license
|
8 |
+
*/
|
9 |
+
(function( factory ) {
|
10 |
+
if ( typeof define === "function" && define.amd ) {
|
11 |
+
define( ["jquery"], factory );
|
12 |
+
} else if (typeof module === "object" && module.exports) {
|
13 |
+
module.exports = factory( require( "jquery" ) );
|
14 |
+
} else {
|
15 |
+
factory( jQuery );
|
16 |
+
}
|
17 |
+
}(function( $ ) {
|
18 |
+
|
19 |
+
$.extend( $.fn, {
|
20 |
+
|
21 |
+
// https://jqueryvalidation.org/validate/
|
22 |
+
validate: function( options ) {
|
23 |
+
|
24 |
+
// If nothing is selected, return nothing; can't chain anyway
|
25 |
+
if ( !this.length ) {
|
26 |
+
if ( options && options.debug && window.console ) {
|
27 |
+
console.warn( "Nothing selected, can't validate, returning nothing." );
|
28 |
+
}
|
29 |
+
return;
|
30 |
+
}
|
31 |
+
|
32 |
+
// Check if a validator for this form was already created
|
33 |
+
var validator = $.data( this[ 0 ], "validator" );
|
34 |
+
if ( validator ) {
|
35 |
+
return validator;
|
36 |
+
}
|
37 |
+
|
38 |
+
// Add novalidate tag if HTML5.
|
39 |
+
this.attr( "novalidate", "novalidate" );
|
40 |
+
|
41 |
+
validator = new $.validator( options, this[ 0 ] );
|
42 |
+
$.data( this[ 0 ], "validator", validator );
|
43 |
+
|
44 |
+
if ( validator.settings.onsubmit ) {
|
45 |
+
|
46 |
+
this.on( "click.validate", ":submit", function( event ) {
|
47 |
+
|
48 |
+
// Track the used submit button to properly handle scripted
|
49 |
+
// submits later.
|
50 |
+
validator.submitButton = event.currentTarget;
|
51 |
+
|
52 |
+
// Allow suppressing validation by adding a cancel class to the submit button
|
53 |
+
if ( $( this ).hasClass( "cancel" ) ) {
|
54 |
+
validator.cancelSubmit = true;
|
55 |
+
}
|
56 |
+
|
57 |
+
// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
|
58 |
+
if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
|
59 |
+
validator.cancelSubmit = true;
|
60 |
+
}
|
61 |
+
} );
|
62 |
+
|
63 |
+
// Validate the form on submit
|
64 |
+
this.on( "submit.validate", function( event ) {
|
65 |
+
if ( validator.settings.debug ) {
|
66 |
+
|
67 |
+
// Prevent form submit to be able to see console output
|
68 |
+
event.preventDefault();
|
69 |
+
}
|
70 |
+
|
71 |
+
function handle() {
|
72 |
+
var hidden, result;
|
73 |
+
|
74 |
+
// Insert a hidden input as a replacement for the missing submit button
|
75 |
+
// The hidden input is inserted in two cases:
|
76 |
+
// - A user defined a `submitHandler`
|
77 |
+
// - There was a pending request due to `remote` method and `stopRequest()`
|
78 |
+
// was called to submit the form in case it's valid
|
79 |
+
if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
|
80 |
+
hidden = $( "<input type='hidden'/>" )
|
81 |
+
.attr( "name", validator.submitButton.name )
|
82 |
+
.val( $( validator.submitButton ).val() )
|
83 |
+
.appendTo( validator.currentForm );
|
84 |
+
}
|
85 |
+
|
86 |
+
if ( validator.settings.submitHandler && !validator.settings.debug ) {
|
87 |
+
result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
|
88 |
+
if ( hidden ) {
|
89 |
+
|
90 |
+
// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
|
91 |
+
hidden.remove();
|
92 |
+
}
|
93 |
+
if ( result !== undefined ) {
|
94 |
+
return result;
|
95 |
+
}
|
96 |
+
return false;
|
97 |
+
}
|
98 |
+
return true;
|
99 |
+
}
|
100 |
+
|
101 |
+
// Prevent submit for invalid forms or custom submit handlers
|
102 |
+
if ( validator.cancelSubmit ) {
|
103 |
+
validator.cancelSubmit = false;
|
104 |
+
return handle();
|
105 |
+
}
|
106 |
+
if ( validator.form() ) {
|
107 |
+
if ( validator.pendingRequest ) {
|
108 |
+
validator.formSubmitted = true;
|
109 |
+
return false;
|
110 |
+
}
|
111 |
+
return handle();
|
112 |
+
} else {
|
113 |
+
validator.focusInvalid();
|
114 |
+
return false;
|
115 |
+
}
|
116 |
+
} );
|
117 |
+
}
|
118 |
+
|
119 |
+
return validator;
|
120 |
+
},
|
121 |
+
|
122 |
+
// https://jqueryvalidation.org/valid/
|
123 |
+
valid: function() {
|
124 |
+
var valid, validator, errorList;
|
125 |
+
|
126 |
+
if ( $( this[ 0 ] ).is( "form" ) ) {
|
127 |
+
valid = this.validate().form();
|
128 |
+
} else {
|
129 |
+
errorList = [];
|
130 |
+
valid = true;
|
131 |
+
validator = $( this[ 0 ].form ).validate();
|
132 |
+
this.each( function() {
|
133 |
+
valid = validator.element( this ) && valid;
|
134 |
+
if ( !valid ) {
|
135 |
+
errorList = errorList.concat( validator.errorList );
|
136 |
+
}
|
137 |
+
} );
|
138 |
+
validator.errorList = errorList;
|
139 |
+
}
|
140 |
+
return valid;
|
141 |
+
},
|
142 |
+
|
143 |
+
// https://jqueryvalidation.org/rules/
|
144 |
+
rules: function( command, argument ) {
|
145 |
+
var element = this[ 0 ],
|
146 |
+
isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
|
147 |
+
settings, staticRules, existingRules, data, param, filtered;
|
148 |
+
|
149 |
+
// If nothing is selected, return empty object; can't chain anyway
|
150 |
+
if ( element == null ) {
|
151 |
+
return;
|
152 |
+
}
|
153 |
+
|
154 |
+
if ( !element.form && isContentEditable ) {
|
155 |
+
element.form = this.closest( "form" )[ 0 ];
|
156 |
+
element.name = this.attr( "name" );
|
157 |
+
}
|
158 |
+
|
159 |
+
if ( element.form == null ) {
|
160 |
+
return;
|
161 |
+
}
|
162 |
+
|
163 |
+
if ( command ) {
|
164 |
+
settings = $.data( element.form, "validator" ).settings;
|
165 |
+
staticRules = settings.rules;
|
166 |
+
existingRules = $.validator.staticRules( element );
|
167 |
+
switch ( command ) {
|
168 |
+
case "add":
|
169 |
+
$.extend( existingRules, $.validator.normalizeRule( argument ) );
|
170 |
+
|
171 |
+
// Remove messages from rules, but allow them to be set separately
|
172 |
+
delete existingRules.messages;
|
173 |
+
staticRules[ element.name ] = existingRules;
|
174 |
+
if ( argument.messages ) {
|
175 |
+
settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
|
176 |
+
}
|
177 |
+
break;
|
178 |
+
case "remove":
|
179 |
+
if ( !argument ) {
|
180 |
+
delete staticRules[ element.name ];
|
181 |
+
return existingRules;
|
182 |
+
}
|
183 |
+
filtered = {};
|
184 |
+
$.each( argument.split( /\s/ ), function( index, method ) {
|
185 |
+
filtered[ method ] = existingRules[ method ];
|
186 |
+
delete existingRules[ method ];
|
187 |
+
} );
|
188 |
+
return filtered;
|
189 |
+
}
|
190 |
+
}
|
191 |
+
|
192 |
+
data = $.validator.normalizeRules(
|
193 |
+
$.extend(
|
194 |
+
{},
|
195 |
+
$.validator.classRules( element ),
|
196 |
+
$.validator.attributeRules( element ),
|
197 |
+
$.validator.dataRules( element ),
|
198 |
+
$.validator.staticRules( element )
|
199 |
+
), element );
|
200 |
+
|
201 |
+
// Make sure required is at front
|
202 |
+
if ( data.required ) {
|
203 |
+
param = data.required;
|
204 |
+
delete data.required;
|
205 |
+
data = $.extend( { required: param }, data );
|
206 |
+
}
|
207 |
+
|
208 |
+
// Make sure remote is at back
|
209 |
+
if ( data.remote ) {
|
210 |
+
param = data.remote;
|
211 |
+
delete data.remote;
|
212 |
+
data = $.extend( data, { remote: param } );
|
213 |
+
}
|
214 |
+
|
215 |
+
return data;
|
216 |
+
}
|
217 |
+
} );
|
218 |
+
|
219 |
+
// JQuery trim is deprecated, provide a trim method based on String.prototype.trim
|
220 |
+
var trim = function( str ) {
|
221 |
+
|
222 |
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill
|
223 |
+
return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "" );
|
224 |
+
};
|
225 |
+
|
226 |
+
// Custom selectors
|
227 |
+
$.extend( $.expr.pseudos || $.expr[ ":" ], { // '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
|
228 |
+
|
229 |
+
// https://jqueryvalidation.org/blank-selector/
|
230 |
+
blank: function( a ) {
|
231 |
+
return !trim( "" + $( a ).val() );
|
232 |
+
},
|
233 |
+
|
234 |
+
// https://jqueryvalidation.org/filled-selector/
|
235 |
+
filled: function( a ) {
|
236 |
+
var val = $( a ).val();
|
237 |
+
return val !== null && !!trim( "" + val );
|
238 |
+
},
|
239 |
+
|
240 |
+
// https://jqueryvalidation.org/unchecked-selector/
|
241 |
+
unchecked: function( a ) {
|
242 |
+
return !$( a ).prop( "checked" );
|
243 |
+
}
|
244 |
+
} );
|
245 |
+
|
246 |
+
// Constructor for validator
|
247 |
+
$.validator = function( options, form ) {
|
248 |
+
this.settings = $.extend( true, {}, $.validator.defaults, options );
|
249 |
+
this.currentForm = form;
|
250 |
+
this.init();
|
251 |
+
};
|
252 |
+
|
253 |
+
// https://jqueryvalidation.org/jQuery.validator.format/
|
254 |
+
$.validator.format = function( source, params ) {
|
255 |
+
if ( arguments.length === 1 ) {
|
256 |
+
return function() {
|
257 |
+
var args = $.makeArray( arguments );
|
258 |
+
args.unshift( source );
|
259 |
+
return $.validator.format.apply( this, args );
|
260 |
+
};
|
261 |
+
}
|
262 |
+
if ( params === undefined ) {
|
263 |
+
return source;
|
264 |
+
}
|
265 |
+
if ( arguments.length > 2 && params.constructor !== Array ) {
|
266 |
+
params = $.makeArray( arguments ).slice( 1 );
|
267 |
+
}
|
268 |
+
if ( params.constructor !== Array ) {
|
269 |
+
params = [ params ];
|
270 |
+
}
|
271 |
+
$.each( params, function( i, n ) {
|
272 |
+
source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
|
273 |
+
return n;
|
274 |
+
} );
|
275 |
+
} );
|
276 |
+
return source;
|
277 |
+
};
|
278 |
+
|
279 |
+
$.extend( $.validator, {
|
280 |
+
|
281 |
+
defaults: {
|
282 |
+
messages: {},
|
283 |
+
groups: {},
|
284 |
+
rules: {},
|
285 |
+
errorClass: "error",
|
286 |
+
pendingClass: "pending",
|
287 |
+
validClass: "valid",
|
288 |
+
errorElement: "label",
|
289 |
+
focusCleanup: false,
|
290 |
+
focusInvalid: true,
|
291 |
+
errorContainer: $( [] ),
|
292 |
+
errorLabelContainer: $( [] ),
|
293 |
+
onsubmit: true,
|
294 |
+
ignore: ":hidden",
|
295 |
+
ignoreTitle: false,
|
296 |
+
onfocusin: function( element ) {
|
297 |
+
this.lastActive = element;
|
298 |
+
|
299 |
+
// Hide error label and remove error class on focus if enabled
|
300 |
+
if ( this.settings.focusCleanup ) {
|
301 |
+
if ( this.settings.unhighlight ) {
|
302 |
+
this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
|
303 |
+
}
|
304 |
+
this.hideThese( this.errorsFor( element ) );
|
305 |
+
}
|
306 |
+
},
|
307 |
+
onfocusout: function( element ) {
|
308 |
+
if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
|
309 |
+
this.element( element );
|
310 |
+
}
|
311 |
+
},
|
312 |
+
onkeyup: function( element, event ) {
|
313 |
+
|
314 |
+
// Avoid revalidate the field when pressing one of the following keys
|
315 |
+
// Shift => 16
|
316 |
+
// Ctrl => 17
|
317 |
+
// Alt => 18
|
318 |
+
// Caps lock => 20
|
319 |
+
// End => 35
|
320 |
+
// Home => 36
|
321 |
+
// Left arrow => 37
|
322 |
+
// Up arrow => 38
|
323 |
+
// Right arrow => 39
|
324 |
+
// Down arrow => 40
|
325 |
+
// Insert => 45
|
326 |
+
// Num lock => 144
|
327 |
+
// AltGr key => 225
|
328 |
+
var excludedKeys = [
|
329 |
+
16, 17, 18, 20, 35, 36, 37,
|
330 |
+
38, 39, 40, 45, 144, 225
|
331 |
+
];
|
332 |
+
|
333 |
+
if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
|
334 |
+
return;
|
335 |
+
} else if ( element.name in this.submitted || element.name in this.invalid ) {
|
336 |
+
this.element( element );
|
337 |
+
}
|
338 |
+
},
|
339 |
+
onclick: function( element ) {
|
340 |
+
|
341 |
+
// Click on selects, radiobuttons and checkboxes
|
342 |
+
if ( element.name in this.submitted ) {
|
343 |
+
this.element( element );
|
344 |
+
|
345 |
+
// Or option elements, check parent select in that case
|
346 |
+
} else if ( element.parentNode.name in this.submitted ) {
|
347 |
+
this.element( element.parentNode );
|
348 |
+
}
|
349 |
+
},
|
350 |
+
highlight: function( element, errorClass, validClass ) {
|
351 |
+
if ( element.type === "radio" ) {
|
352 |
+
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
|
353 |
+
} else {
|
354 |
+
$( element ).addClass( errorClass ).removeClass( validClass );
|
355 |
+
}
|
356 |
+
},
|
357 |
+
unhighlight: function( element, errorClass, validClass ) {
|
358 |
+
if ( element.type === "radio" ) {
|
359 |
+
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
|
360 |
+
} else {
|
361 |
+
$( element ).removeClass( errorClass ).addClass( validClass );
|
362 |
+
}
|
363 |
+
}
|
364 |
+
},
|
365 |
+
|
366 |
+
// https://jqueryvalidation.org/jQuery.validator.setDefaults/
|
367 |
+
setDefaults: function( settings ) {
|
368 |
+
$.extend( $.validator.defaults, settings );
|
369 |
+
},
|
370 |
+
|
371 |
+
messages: {
|
372 |
+
required: "This field is required.",
|
373 |
+
remote: "Please fix this field.",
|
374 |
+
email: "Please enter a valid email address.",
|
375 |
+
url: "Please enter a valid URL.",
|
376 |
+
date: "Please enter a valid date.",
|
377 |
+
dateISO: "Please enter a valid date (ISO).",
|
378 |
+
number: "Please enter a valid number.",
|
379 |
+
digits: "Please enter only digits.",
|
380 |
+
equalTo: "Please enter the same value again.",
|
381 |
+
maxlength: $.validator.format( "Please enter no more than {0} characters." ),
|
382 |
+
minlength: $.validator.format( "Please enter at least {0} characters." ),
|
383 |
+
rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
|
384 |
+
range: $.validator.format( "Please enter a value between {0} and {1}." ),
|
385 |
+
max: $.validator.format( "Please enter a value less than or equal to {0}." ),
|
386 |
+
min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
|
387 |
+
step: $.validator.format( "Please enter a multiple of {0}." )
|
388 |
+
},
|
389 |
+
|
390 |
+
autoCreateRanges: false,
|
391 |
+
|
392 |
+
prototype: {
|
393 |
+
|
394 |
+
init: function() {
|
395 |
+
this.labelContainer = $( this.settings.errorLabelContainer );
|
396 |
+
this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
|
397 |
+
this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
|
398 |
+
this.submitted = {};
|
399 |
+
this.valueCache = {};
|
400 |
+
this.pendingRequest = 0;
|
401 |
+
this.pending = {};
|
402 |
+
this.invalid = {};
|
403 |
+
this.reset();
|
404 |
+
|
405 |
+
var currentForm = this.currentForm,
|
406 |
+
groups = ( this.groups = {} ),
|
407 |
+
rules;
|
408 |
+
$.each( this.settings.groups, function( key, value ) {
|
409 |
+
if ( typeof value === "string" ) {
|
410 |
+
value = value.split( /\s/ );
|
411 |
+
}
|
412 |
+
$.each( value, function( index, name ) {
|
413 |
+
groups[ name ] = key;
|
414 |
+
} );
|
415 |
+
} );
|
416 |
+
rules = this.settings.rules;
|
417 |
+
$.each( rules, function( key, value ) {
|
418 |
+
rules[ key ] = $.validator.normalizeRule( value );
|
419 |
+
} );
|
420 |
+
|
421 |
+
function delegate( event ) {
|
422 |
+
var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
|
423 |
+
|
424 |
+
// Set form expando on contenteditable
|
425 |
+
if ( !this.form && isContentEditable ) {
|
426 |
+
this.form = $( this ).closest( "form" )[ 0 ];
|
427 |
+
this.name = $( this ).attr( "name" );
|
428 |
+
}
|
429 |
+
|
430 |
+
// Ignore the element if it belongs to another form. This will happen mainly
|
431 |
+
// when setting the `form` attribute of an input to the id of another form.
|
432 |
+
if ( currentForm !== this.form ) {
|
433 |
+
return;
|
434 |
+
}
|
435 |
+
|
436 |
+
var validator = $.data( this.form, "validator" ),
|
437 |
+
eventType = "on" + event.type.replace( /^validate/, "" ),
|
438 |
+
settings = validator.settings;
|
439 |
+
if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
|
440 |
+
settings[ eventType ].call( validator, this, event );
|
441 |
+
}
|
442 |
+
}
|
443 |
+
|
444 |
+
$( this.currentForm )
|
445 |
+
.on( "focusin.validate focusout.validate keyup.validate",
|
446 |
+
":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
|
447 |
+
"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
|
448 |
+
"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
|
449 |
+
"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
|
450 |
+
|
451 |
+
// Support: Chrome, oldIE
|
452 |
+
// "select" is provided as event.target when clicking a option
|
453 |
+
.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
|
454 |
+
|
455 |
+
if ( this.settings.invalidHandler ) {
|
456 |
+
$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
|
457 |
+
}
|
458 |
+
},
|
459 |
+
|
460 |
+
// https://jqueryvalidation.org/Validator.form/
|
461 |
+
form: function() {
|
462 |
+
this.checkForm();
|
463 |
+
$.extend( this.submitted, this.errorMap );
|
464 |
+
this.invalid = $.extend( {}, this.errorMap );
|
465 |
+
if ( !this.valid() ) {
|
466 |
+
$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
|
467 |
+
}
|
468 |
+
this.showErrors();
|
469 |
+
return this.valid();
|
470 |
+
},
|
471 |
+
|
472 |
+
checkForm: function() {
|
473 |
+
this.prepareForm();
|
474 |
+
for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
|
475 |
+
this.check( elements[ i ] );
|
476 |
+
}
|
477 |
+
return this.valid();
|
478 |
+
},
|
479 |
+
|
480 |
+
// https://jqueryvalidation.org/Validator.element/
|
481 |
+
element: function( element ) {
|
482 |
+
var cleanElement = this.clean( element ),
|
483 |
+
checkElement = this.validationTargetFor( cleanElement ),
|
484 |
+
v = this,
|
485 |
+
result = true,
|
486 |
+
rs, group;
|
487 |
+
|
488 |
+
if ( checkElement === undefined ) {
|
489 |
+
delete this.invalid[ cleanElement.name ];
|
490 |
+
} else {
|
491 |
+
this.prepareElement( checkElement );
|
492 |
+
this.currentElements = $( checkElement );
|
493 |
+
|
494 |
+
// If this element is grouped, then validate all group elements already
|
495 |
+
// containing a value
|
496 |
+
group = this.groups[ checkElement.name ];
|
497 |
+
if ( group ) {
|
498 |
+
$.each( this.groups, function( name, testgroup ) {
|
499 |
+
if ( testgroup === group && name !== checkElement.name ) {
|
500 |
+
cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
|
501 |
+
if ( cleanElement && cleanElement.name in v.invalid ) {
|
502 |
+
v.currentElements.push( cleanElement );
|
503 |
+
result = v.check( cleanElement ) && result;
|
504 |
+
}
|
505 |
+
}
|
506 |
+
} );
|
507 |
+
}
|
508 |
+
|
509 |
+
rs = this.check( checkElement ) !== false;
|
510 |
+
result = result && rs;
|
511 |
+
if ( rs ) {
|
512 |
+
this.invalid[ checkElement.name ] = false;
|
513 |
+
} else {
|
514 |
+
this.invalid[ checkElement.name ] = true;
|
515 |
+
}
|
516 |
+
|
517 |
+
if ( !this.numberOfInvalids() ) {
|
518 |
+
|
519 |
+
// Hide error containers on last error
|
520 |
+
this.toHide = this.toHide.add( this.containers );
|
521 |
+
}
|
522 |
+
this.showErrors();
|
523 |
+
|
524 |
+
// Add aria-invalid status for screen readers
|
525 |
+
$( element ).attr( "aria-invalid", !rs );
|
526 |
+
}
|
527 |
+
|
528 |
+
return result;
|
529 |
+
},
|
530 |
+
|
531 |
+
// https://jqueryvalidation.org/Validator.showErrors/
|
532 |
+
showErrors: function( errors ) {
|
533 |
+
if ( errors ) {
|
534 |
+
var validator = this;
|
535 |
+
|
536 |
+
// Add items to error list and map
|
537 |
+
$.extend( this.errorMap, errors );
|
538 |
+
this.errorList = $.map( this.errorMap, function( message, name ) {
|
539 |
+
return {
|
540 |
+
message: message,
|
541 |
+
element: validator.findByName( name )[ 0 ]
|
542 |
+
};
|
543 |
+
} );
|
544 |
+
|
545 |
+
// Remove items from success list
|
546 |
+
this.successList = $.grep( this.successList, function( element ) {
|
547 |
+
return !( element.name in errors );
|
548 |
+
} );
|
549 |
+
}
|
550 |
+
if ( this.settings.showErrors ) {
|
551 |
+
this.settings.showErrors.call( this, this.errorMap, this.errorList );
|
552 |
+
} else {
|
553 |
+
this.defaultShowErrors();
|
554 |
+
}
|
555 |
+
},
|
556 |
+
|
557 |
+
// https://jqueryvalidation.org/Validator.resetForm/
|
558 |
+
resetForm: function() {
|
559 |
+
if ( $.fn.resetForm ) {
|
560 |
+
$( this.currentForm ).resetForm();
|
561 |
+
}
|
562 |
+
this.invalid = {};
|
563 |
+
this.submitted = {};
|
564 |
+
this.prepareForm();
|
565 |
+
this.hideErrors();
|
566 |
+
var elements = this.elements()
|
567 |
+
.removeData( "previousValue" )
|
568 |
+
.removeAttr( "aria-invalid" );
|
569 |
+
|
570 |
+
this.resetElements( elements );
|
571 |
+
},
|
572 |
+
|
573 |
+
resetElements: function( elements ) {
|
574 |
+
var i;
|
575 |
+
|
576 |
+
if ( this.settings.unhighlight ) {
|
577 |
+
for ( i = 0; elements[ i ]; i++ ) {
|
578 |
+
this.settings.unhighlight.call( this, elements[ i ],
|
579 |
+
this.settings.errorClass, "" );
|
580 |
+
this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
|
581 |
+
}
|
582 |
+
} else {
|
583 |
+
elements
|
584 |
+
.removeClass( this.settings.errorClass )
|
585 |
+
.removeClass( this.settings.validClass );
|
586 |
+
}
|
587 |
+
},
|
588 |
+
|
589 |
+
numberOfInvalids: function() {
|
590 |
+
return this.objectLength( this.invalid );
|
591 |
+
},
|
592 |
+
|
593 |
+
objectLength: function( obj ) {
|
594 |
+
/* jshint unused: false */
|
595 |
+
var count = 0,
|
596 |
+
i;
|
597 |
+
for ( i in obj ) {
|
598 |
+
|
599 |
+
// This check allows counting elements with empty error
|
600 |
+
// message as invalid elements
|
601 |
+
if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
|
602 |
+
count++;
|
603 |
+
}
|
604 |
+
}
|
605 |
+
return count;
|
606 |
+
},
|
607 |
+
|
608 |
+
hideErrors: function() {
|
609 |
+
this.hideThese( this.toHide );
|
610 |
+
},
|
611 |
+
|
612 |
+
hideThese: function( errors ) {
|
613 |
+
errors.not( this.containers ).text( "" );
|
614 |
+
this.addWrapper( errors ).hide();
|
615 |
+
},
|
616 |
+
|
617 |
+
valid: function() {
|
618 |
+
return this.size() === 0;
|
619 |
+
},
|
620 |
+
|
621 |
+
size: function() {
|
622 |
+
return this.errorList.length;
|
623 |
+
},
|
624 |
+
|
625 |
+
focusInvalid: function() {
|
626 |
+
if ( this.settings.focusInvalid ) {
|
627 |
+
try {
|
628 |
+
$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
|
629 |
+
.filter( ":visible" )
|
630 |
+
.trigger( "focus" )
|
631 |
+
|
632 |
+
// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
|
633 |
+
.trigger( "focusin" );
|
634 |
+
} catch ( e ) {
|
635 |
+
|
636 |
+
// Ignore IE throwing errors when focusing hidden elements
|
637 |
+
}
|
638 |
+
}
|
639 |
+
},
|
640 |
+
|
641 |
+
findLastActive: function() {
|
642 |
+
var lastActive = this.lastActive;
|
643 |
+
return lastActive && $.grep( this.errorList, function( n ) {
|
644 |
+
return n.element.name === lastActive.name;
|
645 |
+
} ).length === 1 && lastActive;
|
646 |
+
},
|
647 |
+
|
648 |
+
elements: function() {
|
649 |
+
var validator = this,
|
650 |
+
rulesCache = {};
|
651 |
+
|
652 |
+
// Select all valid inputs inside the form (no submit or reset buttons)
|
653 |
+
return $( this.currentForm )
|
654 |
+
.find( "input, select, textarea, [contenteditable]" )
|
655 |
+
.not( ":submit, :reset, :image, :disabled" )
|
656 |
+
.not( this.settings.ignore )
|
657 |
+
.filter( function() {
|
658 |
+
var name = this.name || $( this ).attr( "name" ); // For contenteditable
|
659 |
+
var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
|
660 |
+
|
661 |
+
if ( !name && validator.settings.debug && window.console ) {
|
662 |
+
console.error( "%o has no name assigned", this );
|
663 |
+
}
|
664 |
+
|
665 |
+
// Set form expando on contenteditable
|
666 |
+
if ( isContentEditable ) {
|
667 |
+
this.form = $( this ).closest( "form" )[ 0 ];
|
668 |
+
this.name = name;
|
669 |
+
}
|
670 |
+
|
671 |
+
// Ignore elements that belong to other/nested forms
|
672 |
+
if ( this.form !== validator.currentForm ) {
|
673 |
+
return false;
|
674 |
+
}
|
675 |
+
|
676 |
+
// Select only the first element for each name, and only those with rules specified
|
677 |
+
if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
|
678 |
+
return false;
|
679 |
+
}
|
680 |
+
|
681 |
+
rulesCache[ name ] = true;
|
682 |
+
return true;
|
683 |
+
} );
|
684 |
+
},
|
685 |
+
|
686 |
+
clean: function( selector ) {
|
687 |
+
return $( selector )[ 0 ];
|
688 |
+
},
|
689 |
+
|
690 |
+
errors: function() {
|
691 |
+
var errorClass = this.settings.errorClass.split( " " ).join( "." );
|
692 |
+
return $( this.settings.errorElement + "." + errorClass, this.errorContext );
|
693 |
+
},
|
694 |
+
|
695 |
+
resetInternals: function() {
|
696 |
+
this.successList = [];
|
697 |
+
this.errorList = [];
|
698 |
+
this.errorMap = {};
|
699 |
+
this.toShow = $( [] );
|
700 |
+
this.toHide = $( [] );
|
701 |
+
},
|
702 |
+
|
703 |
+
reset: function() {
|
704 |
+
this.resetInternals();
|
705 |
+
this.currentElements = $( [] );
|
706 |
+
},
|
707 |
+
|
708 |
+
prepareForm: function() {
|
709 |
+
this.reset();
|
710 |
+
this.toHide = this.errors().add( this.containers );
|
711 |
+
},
|
712 |
+
|
713 |
+
prepareElement: function( element ) {
|
714 |
+
this.reset();
|
715 |
+
this.toHide = this.errorsFor( element );
|
716 |
+
},
|
717 |
+
|
718 |
+
elementValue: function( element ) {
|
719 |
+
var $element = $( element ),
|
720 |
+
type = element.type,
|
721 |
+
isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
|
722 |
+
val, idx;
|
723 |
+
|
724 |
+
if ( type === "radio" || type === "checkbox" ) {
|
725 |
+
return this.findByName( element.name ).filter( ":checked" ).val();
|
726 |
+
} else if ( type === "number" && typeof element.validity !== "undefined" ) {
|
727 |
+
return element.validity.badInput ? "NaN" : $element.val();
|
728 |
+
}
|
729 |
+
|
730 |
+
if ( isContentEditable ) {
|
731 |
+
val = $element.text();
|
732 |
+
} else {
|
733 |
+
val = $element.val();
|
734 |
+
}
|
735 |
+
|
736 |
+
if ( type === "file" ) {
|
737 |
+
|
738 |
+
// Modern browser (chrome & safari)
|
739 |
+
if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
|
740 |
+
return val.substr( 12 );
|
741 |
+
}
|
742 |
+
|
743 |
+
// Legacy browsers
|
744 |
+
// Unix-based path
|
745 |
+
idx = val.lastIndexOf( "/" );
|
746 |
+
if ( idx >= 0 ) {
|
747 |
+
return val.substr( idx + 1 );
|
748 |
+
}
|
749 |
+
|
750 |
+
// Windows-based path
|
751 |
+
idx = val.lastIndexOf( "\\" );
|
752 |
+
if ( idx >= 0 ) {
|
753 |
+
return val.substr( idx + 1 );
|
754 |
+
}
|
755 |
+
|
756 |
+
// Just the file name
|
757 |
+
return val;
|
758 |
+
}
|
759 |
+
|
760 |
+
if ( typeof val === "string" ) {
|
761 |
+
return val.replace( /\r/g, "" );
|
762 |
+
}
|
763 |
+
return val;
|
764 |
+
},
|
765 |
+
|
766 |
+
check: function( element ) {
|
767 |
+
element = this.validationTargetFor( this.clean( element ) );
|
768 |
+
|
769 |
+
var rules = $( element ).rules(),
|
770 |
+
rulesCount = $.map( rules, function( n, i ) {
|
771 |
+
return i;
|
772 |
+
} ).length,
|
773 |
+
dependencyMismatch = false,
|
774 |
+
val = this.elementValue( element ),
|
775 |
+
result, method, rule, normalizer;
|
776 |
+
|
777 |
+
// Prioritize the local normalizer defined for this element over the global one
|
778 |
+
// if the former exists, otherwise user the global one in case it exists.
|
779 |
+
if ( typeof rules.normalizer === "function" ) {
|
780 |
+
normalizer = rules.normalizer;
|
781 |
+
} else if ( typeof this.settings.normalizer === "function" ) {
|
782 |
+
normalizer = this.settings.normalizer;
|
783 |
+
}
|
784 |
+
|
785 |
+
// If normalizer is defined, then call it to retreive the changed value instead
|
786 |
+
// of using the real one.
|
787 |
+
// Note that `this` in the normalizer is `element`.
|
788 |
+
if ( normalizer ) {
|
789 |
+
val = normalizer.call( element, val );
|
790 |
+
|
791 |
+
// Delete the normalizer from rules to avoid treating it as a pre-defined method.
|
792 |
+
delete rules.normalizer;
|
793 |
+
}
|
794 |
+
|
795 |
+
for ( method in rules ) {
|
796 |
+
rule = { method: method, parameters: rules[ method ] };
|
797 |
+
try {
|
798 |
+
result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
|
799 |
+
|
800 |
+
// If a method indicates that the field is optional and therefore valid,
|
801 |
+
// don't mark it as valid when there are no other rules
|
802 |
+
if ( result === "dependency-mismatch" && rulesCount === 1 ) {
|
803 |
+
dependencyMismatch = true;
|
804 |
+
continue;
|
805 |
+
}
|
806 |
+
dependencyMismatch = false;
|
807 |
+
|
808 |
+
if ( result === "pending" ) {
|
809 |
+
this.toHide = this.toHide.not( this.errorsFor( element ) );
|
810 |
+
return;
|
811 |
+
}
|
812 |
+
|
813 |
+
if ( !result ) {
|
814 |
+
this.formatAndAdd( element, rule );
|
815 |
+
return false;
|
816 |
+
}
|
817 |
+
} catch ( e ) {
|
818 |
+
if ( this.settings.debug && window.console ) {
|
819 |
+
console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
|
820 |
+
}
|
821 |
+
if ( e instanceof TypeError ) {
|
822 |
+
e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
|
823 |
+
}
|
824 |
+
|
825 |
+
throw e;
|
826 |
+
}
|
827 |
+
}
|
828 |
+
if ( dependencyMismatch ) {
|
829 |
+
return;
|
830 |
+
}
|
831 |
+
if ( this.objectLength( rules ) ) {
|
832 |
+
this.successList.push( element );
|
833 |
+
}
|
834 |
+
return true;
|
835 |
+
},
|
836 |
+
|
837 |
+
// Return the custom message for the given element and validation method
|
838 |
+
// specified in the element's HTML5 data attribute
|
839 |
+
// return the generic message if present and no method specific message is present
|
840 |
+
customDataMessage: function( element, method ) {
|
841 |
+
return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
|
842 |
+
method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
|
843 |
+
},
|
844 |
+
|
845 |
+
// Return the custom message for the given element name and validation method
|
846 |
+
customMessage: function( name, method ) {
|
847 |
+
var m = this.settings.messages[ name ];
|
848 |
+
return m && ( m.constructor === String ? m : m[ method ] );
|
849 |
+
},
|
850 |
+
|
851 |
+
// Return the first defined argument, allowing empty strings
|
852 |
+
findDefined: function() {
|
853 |
+
for ( var i = 0; i < arguments.length; i++ ) {
|
854 |
+
if ( arguments[ i ] !== undefined ) {
|
855 |
+
return arguments[ i ];
|
856 |
+
}
|
857 |
+
}
|
858 |
+
return undefined;
|
859 |
+
},
|
860 |
+
|
861 |
+
// The second parameter 'rule' used to be a string, and extended to an object literal
|
862 |
+
// of the following form:
|
863 |
+
// rule = {
|
864 |
+
// method: "method name",
|
865 |
+
// parameters: "the given method parameters"
|
866 |
+
// }
|
867 |
+
//
|
868 |
+
// The old behavior still supported, kept to maintain backward compatibility with
|
869 |
+
// old code, and will be removed in the next major release.
|
870 |
+
defaultMessage: function( element, rule ) {
|
871 |
+
if ( typeof rule === "string" ) {
|
872 |
+
rule = { method: rule };
|
873 |
+
}
|
874 |
+
|
875 |
+
var message = this.findDefined(
|
876 |
+
this.customMessage( element.name, rule.method ),
|
877 |
+
this.customDataMessage( element, rule.method ),
|
878 |
+
|
879 |
+
// 'title' is never undefined, so handle empty string as undefined
|
880 |
+
!this.settings.ignoreTitle && element.title || undefined,
|
881 |
+
$.validator.messages[ rule.method ],
|
882 |
+
"<strong>Warning: No message defined for " + element.name + "</strong>"
|
883 |
+
),
|
884 |
+
theregex = /\$?\{(\d+)\}/g;
|
885 |
+
if ( typeof message === "function" ) {
|
886 |
+
message = message.call( this, rule.parameters, element );
|
887 |
+
} else if ( theregex.test( message ) ) {
|
888 |
+
message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
|
889 |
+
}
|
890 |
+
|
891 |
+
return message;
|
892 |
+
},
|
893 |
+
|
894 |
+
formatAndAdd: function( element, rule ) {
|
895 |
+
var message = this.defaultMessage( element, rule );
|
896 |
+
|
897 |
+
this.errorList.push( {
|
898 |
+
message: message,
|
899 |
+
element: element,
|
900 |
+
method: rule.method
|
901 |
+
} );
|
902 |
+
|
903 |
+
this.errorMap[ element.name ] = message;
|
904 |
+
this.submitted[ element.name ] = message;
|
905 |
+
},
|
906 |
+
|
907 |
+
addWrapper: function( toToggle ) {
|
908 |
+
if ( this.settings.wrapper ) {
|
909 |
+
toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
|
910 |
+
}
|
911 |
+
return toToggle;
|
912 |
+
},
|
913 |
+
|
914 |
+
defaultShowErrors: function() {
|
915 |
+
var i, elements, error;
|
916 |
+
for ( i = 0; this.errorList[ i ]; i++ ) {
|
917 |
+
error = this.errorList[ i ];
|
918 |
+
if ( this.settings.highlight ) {
|
919 |
+
this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
|
920 |
+
}
|
921 |
+
this.showLabel( error.element, error.message );
|
922 |
+
}
|
923 |
+
if ( this.errorList.length ) {
|
924 |
+
this.toShow = this.toShow.add( this.containers );
|
925 |
+
}
|
926 |
+
if ( this.settings.success ) {
|
927 |
+
for ( i = 0; this.successList[ i ]; i++ ) {
|
928 |
+
this.showLabel( this.successList[ i ] );
|
929 |
+
}
|
930 |
+
}
|
931 |
+
if ( this.settings.unhighlight ) {
|
932 |
+
for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
|
933 |
+
this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
|
934 |
+
}
|
935 |
+
}
|
936 |
+
this.toHide = this.toHide.not( this.toShow );
|
937 |
+
this.hideErrors();
|
938 |
+
this.addWrapper( this.toShow ).show();
|
939 |
+
},
|
940 |
+
|
941 |
+
validElements: function() {
|
942 |
+
return this.currentElements.not( this.invalidElements() );
|
943 |
+
},
|
944 |
+
|
945 |
+
invalidElements: function() {
|
946 |
+
return $( this.errorList ).map( function() {
|
947 |
+
return this.element;
|
948 |
+
} );
|
949 |
+
},
|
950 |
+
|
951 |
+
showLabel: function( element, message ) {
|
952 |
+
var place, group, errorID, v,
|
953 |
+
error = this.errorsFor( element ),
|
954 |
+
elementID = this.idOrName( element ),
|
955 |
+
describedBy = $( element ).attr( "aria-describedby" );
|
956 |
+
|
957 |
+
if ( error.length ) {
|
958 |
+
|
959 |
+
// Refresh error/success class
|
960 |
+
error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
|
961 |
+
|
962 |
+
// Replace message on existing label
|
963 |
+
error.html( message );
|
964 |
+
} else {
|
965 |
+
|
966 |
+
// Create error element
|
967 |
+
error = $( "<" + this.settings.errorElement + ">" )
|
968 |
+
.attr( "id", elementID + "-error" )
|
969 |
+
.addClass( this.settings.errorClass )
|
970 |
+
.html( message || "" );
|
971 |
+
|
972 |
+
// Maintain reference to the element to be placed into the DOM
|
973 |
+
place = error;
|
974 |
+
if ( this.settings.wrapper ) {
|
975 |
+
|
976 |
+
// Make sure the element is visible, even in IE
|
977 |
+
// actually showing the wrapped element is handled elsewhere
|
978 |
+
place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
|
979 |
+
}
|
980 |
+
if ( this.labelContainer.length ) {
|
981 |
+
this.labelContainer.append( place );
|
982 |
+
} else if ( this.settings.errorPlacement ) {
|
983 |
+
this.settings.errorPlacement.call( this, place, $( element ) );
|
984 |
+
} else {
|
985 |
+
place.insertAfter( element );
|
986 |
+
}
|
987 |
+
|
988 |
+
// Link error back to the element
|
989 |
+
if ( error.is( "label" ) ) {
|
990 |
+
|
991 |
+
// If the error is a label, then associate using 'for'
|
992 |
+
error.attr( "for", elementID );
|
993 |
+
|
994 |
+
// If the element is not a child of an associated label, then it's necessary
|
995 |
+
// to explicitly apply aria-describedby
|
996 |
+
} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
|
997 |
+
errorID = error.attr( "id" );
|
998 |
+
|
999 |
+
// Respect existing non-error aria-describedby
|
1000 |
+
if ( !describedBy ) {
|
1001 |
+
describedBy = errorID;
|
1002 |
+
} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
|
1003 |
+
|
1004 |
+
// Add to end of list if not already present
|
1005 |
+
describedBy += " " + errorID;
|
1006 |
+
}
|
1007 |
+
$( element ).attr( "aria-describedby", describedBy );
|
1008 |
+
|
1009 |
+
// If this element is grouped, then assign to all elements in the same group
|
1010 |
+
group = this.groups[ element.name ];
|
1011 |
+
if ( group ) {
|
1012 |
+
v = this;
|
1013 |
+
$.each( v.groups, function( name, testgroup ) {
|
1014 |
+
if ( testgroup === group ) {
|
1015 |
+
$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
|
1016 |
+
.attr( "aria-describedby", error.attr( "id" ) );
|
1017 |
+
}
|
1018 |
+
} );
|
1019 |
+
}
|
1020 |
+
}
|
1021 |
+
}
|
1022 |
+
if ( !message && this.settings.success ) {
|
1023 |
+
error.text( "" );
|
1024 |
+
if ( typeof this.settings.success === "string" ) {
|
1025 |
+
error.addClass( this.settings.success );
|
1026 |
+
} else {
|
1027 |
+
this.settings.success( error, element );
|
1028 |
+
}
|
1029 |
+
}
|
1030 |
+
this.toShow = this.toShow.add( error );
|
1031 |
+
},
|
1032 |
+
|
1033 |
+
errorsFor: function( element ) {
|
1034 |
+
var name = this.escapeCssMeta( this.idOrName( element ) ),
|
1035 |
+
describer = $( element ).attr( "aria-describedby" ),
|
1036 |
+
selector = "label[for='" + name + "'], label[for='" + name + "'] *";
|
1037 |
+
|
1038 |
+
// 'aria-describedby' should directly reference the error element
|
1039 |
+
if ( describer ) {
|
1040 |
+
selector = selector + ", #" + this.escapeCssMeta( describer )
|
1041 |
+
.replace( /\s+/g, ", #" );
|
1042 |
+
}
|
1043 |
+
|
1044 |
+
return this
|
1045 |
+
.errors()
|
1046 |
+
.filter( selector );
|
1047 |
+
},
|
1048 |
+
|
1049 |
+
// See https://api.jquery.com/category/selectors/, for CSS
|
1050 |
+
// meta-characters that should be escaped in order to be used with JQuery
|
1051 |
+
// as a literal part of a name/id or any selector.
|
1052 |
+
escapeCssMeta: function( string ) {
|
1053 |
+
return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
|
1054 |
+
},
|
1055 |
+
|
1056 |
+
idOrName: function( element ) {
|
1057 |
+
return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
|
1058 |
+
},
|
1059 |
+
|
1060 |
+
validationTargetFor: function( element ) {
|
1061 |
+
|
1062 |
+
// If radio/checkbox, validate first element in group instead
|
1063 |
+
if ( this.checkable( element ) ) {
|
1064 |
+
element = this.findByName( element.name );
|
1065 |
+
}
|
1066 |
+
|
1067 |
+
// Always apply ignore filter
|
1068 |
+
return $( element ).not( this.settings.ignore )[ 0 ];
|
1069 |
+
},
|
1070 |
+
|
1071 |
+
checkable: function( element ) {
|
1072 |
+
return ( /radio|checkbox/i ).test( element.type );
|
1073 |
+
},
|
1074 |
+
|
1075 |
+
findByName: function( name ) {
|
1076 |
+
return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
|
1077 |
+
},
|
1078 |
+
|
1079 |
+
getLength: function( value, element ) {
|
1080 |
+
switch ( element.nodeName.toLowerCase() ) {
|
1081 |
+
case "select":
|
1082 |
+
return $( "option:selected", element ).length;
|
1083 |
+
case "input":
|
1084 |
+
if ( this.checkable( element ) ) {
|
1085 |
+
return this.findByName( element.name ).filter( ":checked" ).length;
|
1086 |
+
}
|
1087 |
+
}
|
1088 |
+
return value.length;
|
1089 |
+
},
|
1090 |
+
|
1091 |
+
depend: function( param, element ) {
|
1092 |
+
return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
|
1093 |
+
},
|
1094 |
+
|
1095 |
+
dependTypes: {
|
1096 |
+
"boolean": function( param ) {
|
1097 |
+
return param;
|
1098 |
+
},
|
1099 |
+
"string": function( param, element ) {
|
1100 |
+
return !!$( param, element.form ).length;
|
1101 |
+
},
|
1102 |
+
"function": function( param, element ) {
|
1103 |
+
return param( element );
|
1104 |
+
}
|
1105 |
+
},
|
1106 |
+
|
1107 |
+
optional: function( element ) {
|
1108 |
+
var val = this.elementValue( element );
|
1109 |
+
return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
|
1110 |
+
},
|
1111 |
+
|
1112 |
+
startRequest: function( element ) {
|
1113 |
+
if ( !this.pending[ element.name ] ) {
|
1114 |
+
this.pendingRequest++;
|
1115 |
+
$( element ).addClass( this.settings.pendingClass );
|
1116 |
+
this.pending[ element.name ] = true;
|
1117 |
+
}
|
1118 |
+
},
|
1119 |
+
|
1120 |
+
stopRequest: function( element, valid ) {
|
1121 |
+
this.pendingRequest--;
|
1122 |
+
|
1123 |
+
// Sometimes synchronization fails, make sure pendingRequest is never < 0
|
1124 |
+
if ( this.pendingRequest < 0 ) {
|
1125 |
+
this.pendingRequest = 0;
|
1126 |
+
}
|
1127 |
+
delete this.pending[ element.name ];
|
1128 |
+
$( element ).removeClass( this.settings.pendingClass );
|
1129 |
+
if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
|
1130 |
+
$( this.currentForm ).submit();
|
1131 |
+
|
1132 |
+
// Remove the hidden input that was used as a replacement for the
|
1133 |
+
// missing submit button. The hidden input is added by `handle()`
|
1134 |
+
// to ensure that the value of the used submit button is passed on
|
1135 |
+
// for scripted submits triggered by this method
|
1136 |
+
if ( this.submitButton ) {
|
1137 |
+
$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
|
1138 |
+
}
|
1139 |
+
|
1140 |
+
this.formSubmitted = false;
|
1141 |
+
} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
|
1142 |
+
$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
|
1143 |
+
this.formSubmitted = false;
|
1144 |
+
}
|
1145 |
+
},
|
1146 |
+
|
1147 |
+
previousValue: function( element, method ) {
|
1148 |
+
method = typeof method === "string" && method || "remote";
|
1149 |
+
|
1150 |
+
return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
|
1151 |
+
old: null,
|
1152 |
+
valid: true,
|
1153 |
+
message: this.defaultMessage( element, { method: method } )
|
1154 |
+
} );
|
1155 |
+
},
|
1156 |
+
|
1157 |
+
// Cleans up all forms and elements, removes validator-specific events
|
1158 |
+
destroy: function() {
|
1159 |
+
this.resetForm();
|
1160 |
+
|
1161 |
+
$( this.currentForm )
|
1162 |
+
.off( ".validate" )
|
1163 |
+
.removeData( "validator" )
|
1164 |
+
.find( ".validate-equalTo-blur" )
|
1165 |
+
.off( ".validate-equalTo" )
|
1166 |
+
.removeClass( "validate-equalTo-blur" )
|
1167 |
+
.find( ".validate-lessThan-blur" )
|
1168 |
+
.off( ".validate-lessThan" )
|
1169 |
+
.removeClass( "validate-lessThan-blur" )
|
1170 |
+
.find( ".validate-lessThanEqual-blur" )
|
1171 |
+
.off( ".validate-lessThanEqual" )
|
1172 |
+
.removeClass( "validate-lessThanEqual-blur" )
|
1173 |
+
.find( ".validate-greaterThanEqual-blur" )
|
1174 |
+
.off( ".validate-greaterThanEqual" )
|
1175 |
+
.removeClass( "validate-greaterThanEqual-blur" )
|
1176 |
+
.find( ".validate-greaterThan-blur" )
|
1177 |
+
.off( ".validate-greaterThan" )
|
1178 |
+
.removeClass( "validate-greaterThan-blur" );
|
1179 |
+
}
|
1180 |
+
|
1181 |
+
},
|
1182 |
+
|
1183 |
+
classRuleSettings: {
|
1184 |
+
required: { required: true },
|
1185 |
+
email: { email: true },
|
1186 |
+
url: { url: true },
|
1187 |
+
date: { date: true },
|
1188 |
+
dateISO: { dateISO: true },
|
1189 |
+
number: { number: true },
|
1190 |
+
digits: { digits: true },
|
1191 |
+
creditcard: { creditcard: true }
|
1192 |
+
},
|
1193 |
+
|
1194 |
+
addClassRules: function( className, rules ) {
|
1195 |
+
if ( className.constructor === String ) {
|
1196 |
+
this.classRuleSettings[ className ] = rules;
|
1197 |
+
} else {
|
1198 |
+
$.extend( this.classRuleSettings, className );
|
1199 |
+
}
|
1200 |
+
},
|
1201 |
+
|
1202 |
+
classRules: function( element ) {
|
1203 |
+
var rules = {},
|
1204 |
+
classes = $( element ).attr( "class" );
|
1205 |
+
|
1206 |
+
if ( classes ) {
|
1207 |
+
$.each( classes.split( " " ), function() {
|
1208 |
+
if ( this in $.validator.classRuleSettings ) {
|
1209 |
+
$.extend( rules, $.validator.classRuleSettings[ this ] );
|
1210 |
+
}
|
1211 |
+
} );
|
1212 |
+
}
|
1213 |
+
return rules;
|
1214 |
+
},
|
1215 |
+
|
1216 |
+
normalizeAttributeRule: function( rules, type, method, value ) {
|
1217 |
+
|
1218 |
+
// Convert the value to a number for number inputs, and for text for backwards compability
|
1219 |
+
// allows type="date" and others to be compared as strings
|
1220 |
+
if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
|
1221 |
+
value = Number( value );
|
1222 |
+
|
1223 |
+
// Support Opera Mini, which returns NaN for undefined minlength
|
1224 |
+
if ( isNaN( value ) ) {
|
1225 |
+
value = undefined;
|
1226 |
+
}
|
1227 |
+
}
|
1228 |
+
|
1229 |
+
if ( value || value === 0 ) {
|
1230 |
+
rules[ method ] = value;
|
1231 |
+
} else if ( type === method && type !== "range" ) {
|
1232 |
+
|
1233 |
+
// Exception: the jquery validate 'range' method
|
1234 |
+
// does not test for the html5 'range' type
|
1235 |
+
rules[ method ] = true;
|
1236 |
+
}
|
1237 |
+
},
|
1238 |
+
|
1239 |
+
attributeRules: function( element ) {
|
1240 |
+
var rules = {},
|
1241 |
+
$element = $( element ),
|
1242 |
+
type = element.getAttribute( "type" ),
|
1243 |
+
method, value;
|
1244 |
+
|
1245 |
+
for ( method in $.validator.methods ) {
|
1246 |
+
|
1247 |
+
// Support for <input required> in both html5 and older browsers
|
1248 |
+
if ( method === "required" ) {
|
1249 |
+
value = element.getAttribute( method );
|
1250 |
+
|
1251 |
+
// Some browsers return an empty string for the required attribute
|
1252 |
+
// and non-HTML5 browsers might have required="" markup
|
1253 |
+
if ( value === "" ) {
|
1254 |
+
value = true;
|
1255 |
+
}
|
1256 |
+
|
1257 |
+
// Force non-HTML5 browsers to return bool
|
1258 |
+
value = !!value;
|
1259 |
+
} else {
|
1260 |
+
value = $element.attr( method );
|
1261 |
+
}
|
1262 |
+
|
1263 |
+
this.normalizeAttributeRule( rules, type, method, value );
|
1264 |
+
}
|
1265 |
+
|
1266 |
+
// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
|
1267 |
+
if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
|
1268 |
+
delete rules.maxlength;
|
1269 |
+
}
|
1270 |
+
|
1271 |
+
return rules;
|
1272 |
+
},
|
1273 |
+
|
1274 |
+
dataRules: function( element ) {
|
1275 |
+
var rules = {},
|
1276 |
+
$element = $( element ),
|
1277 |
+
type = element.getAttribute( "type" ),
|
1278 |
+
method, value;
|
1279 |
+
|
1280 |
+
for ( method in $.validator.methods ) {
|
1281 |
+
value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
|
1282 |
+
|
1283 |
+
// Cast empty attributes like `data-rule-required` to `true`
|
1284 |
+
if ( value === "" ) {
|
1285 |
+
value = true;
|
1286 |
+
}
|
1287 |
+
|
1288 |
+
this.normalizeAttributeRule( rules, type, method, value );
|
1289 |
+
}
|
1290 |
+
return rules;
|
1291 |
+
},
|
1292 |
+
|
1293 |
+
staticRules: function( element ) {
|
1294 |
+
var rules = {},
|
1295 |
+
validator = $.data( element.form, "validator" );
|
1296 |
+
|
1297 |
+
if ( validator.settings.rules ) {
|
1298 |
+
rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
|
1299 |
+
}
|
1300 |
+
return rules;
|
1301 |
+
},
|
1302 |
+
|
1303 |
+
normalizeRules: function( rules, element ) {
|
1304 |
+
|
1305 |
+
// Handle dependency check
|
1306 |
+
$.each( rules, function( prop, val ) {
|
1307 |
+
|
1308 |
+
// Ignore rule when param is explicitly false, eg. required:false
|
1309 |
+
if ( val === false ) {
|
1310 |
+
delete rules[ prop ];
|
1311 |
+
return;
|
1312 |
+
}
|
1313 |
+
if ( val.param || val.depends ) {
|
1314 |
+
var keepRule = true;
|
1315 |
+
switch ( typeof val.depends ) {
|
1316 |
+
case "string":
|
1317 |
+
keepRule = !!$( val.depends, element.form ).length;
|
1318 |
+
break;
|
1319 |
+
case "function":
|
1320 |
+
keepRule = val.depends.call( element, element );
|
1321 |
+
break;
|
1322 |
+
}
|
1323 |
+
if ( keepRule ) {
|
1324 |
+
rules[ prop ] = val.param !== undefined ? val.param : true;
|
1325 |
+
} else {
|
1326 |
+
$.data( element.form, "validator" ).resetElements( $( element ) );
|
1327 |
+
delete rules[ prop ];
|
1328 |
+
}
|
1329 |
+
}
|
1330 |
+
} );
|
1331 |
+
|
1332 |
+
// Evaluate parameters
|
1333 |
+
$.each( rules, function( rule, parameter ) {
|
1334 |
+
rules[ rule ] = typeof parameter === "function" && rule !== "normalizer" ? parameter( element ) : parameter;
|
1335 |
+
} );
|
1336 |
+
|
1337 |
+
// Clean number parameters
|
1338 |
+
$.each( [ "minlength", "maxlength" ], function() {
|
1339 |
+
if ( rules[ this ] ) {
|
1340 |
+
rules[ this ] = Number( rules[ this ] );
|
1341 |
+
}
|
1342 |
+
} );
|
1343 |
+
$.each( [ "rangelength", "range" ], function() {
|
1344 |
+
var parts;
|
1345 |
+
if ( rules[ this ] ) {
|
1346 |
+
if ( Array.isArray( rules[ this ] ) ) {
|
1347 |
+
rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
|
1348 |
+
} else if ( typeof rules[ this ] === "string" ) {
|
1349 |
+
parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
|
1350 |
+
rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
|
1351 |
+
}
|
1352 |
+
}
|
1353 |
+
} );
|
1354 |
+
|
1355 |
+
if ( $.validator.autoCreateRanges ) {
|
1356 |
+
|
1357 |
+
// Auto-create ranges
|
1358 |
+
if ( rules.min != null && rules.max != null ) {
|
1359 |
+
rules.range = [ rules.min, rules.max ];
|
1360 |
+
delete rules.min;
|
1361 |
+
delete rules.max;
|
1362 |
+
}
|
1363 |
+
if ( rules.minlength != null && rules.maxlength != null ) {
|
1364 |
+
rules.rangelength = [ rules.minlength, rules.maxlength ];
|
1365 |
+
delete rules.minlength;
|
1366 |
+
delete rules.maxlength;
|
1367 |
+
}
|
1368 |
+
}
|
1369 |
+
|
1370 |
+
return rules;
|
1371 |
+
},
|
1372 |
+
|
1373 |
+
// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
|
1374 |
+
normalizeRule: function( data ) {
|
1375 |
+
if ( typeof data === "string" ) {
|
1376 |
+
var transformed = {};
|
1377 |
+
$.each( data.split( /\s/ ), function() {
|
1378 |
+
transformed[ this ] = true;
|
1379 |
+
} );
|
1380 |
+
data = transformed;
|
1381 |
+
}
|
1382 |
+
return data;
|
1383 |
+
},
|
1384 |
+
|
1385 |
+
// https://jqueryvalidation.org/jQuery.validator.addMethod/
|
1386 |
+
addMethod: function( name, method, message ) {
|
1387 |
+
$.validator.methods[ name ] = method;
|
1388 |
+
$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
|
1389 |
+
if ( method.length < 3 ) {
|
1390 |
+
$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
|
1391 |
+
}
|
1392 |
+
},
|
1393 |
+
|
1394 |
+
// https://jqueryvalidation.org/jQuery.validator.methods/
|
1395 |
+
methods: {
|
1396 |
+
|
1397 |
+
// https://jqueryvalidation.org/required-method/
|
1398 |
+
required: function( value, element, param ) {
|
1399 |
+
|
1400 |
+
// Check if dependency is met
|
1401 |
+
if ( !this.depend( param, element ) ) {
|
1402 |
+
return "dependency-mismatch";
|
1403 |
+
}
|
1404 |
+
if ( element.nodeName.toLowerCase() === "select" ) {
|
1405 |
+
|
1406 |
+
// Could be an array for select-multiple or a string, both are fine this way
|
1407 |
+
var val = $( element ).val();
|
1408 |
+
return val && val.length > 0;
|
1409 |
+
}
|
1410 |
+
if ( this.checkable( element ) ) {
|
1411 |
+
return this.getLength( value, element ) > 0;
|
1412 |
+
}
|
1413 |
+
return value !== undefined && value !== null && value.length > 0;
|
1414 |
+
},
|
1415 |
+
|
1416 |
+
// https://jqueryvalidation.org/email-method/
|
1417 |
+
email: function( value, element ) {
|
1418 |
+
|
1419 |
+
// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
|
1420 |
+
// Retrieved 2014-01-14
|
1421 |
+
// If you have a problem with this implementation, report a bug against the above spec
|
1422 |
+
// Or use custom methods to implement your own email validation
|
1423 |
+
return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
|
1424 |
+
},
|
1425 |
+
|
1426 |
+
// https://jqueryvalidation.org/url-method/
|
1427 |
+
url: function( value, element ) {
|
1428 |
+
|
1429 |
+
// Copyright (c) 2010-2013 Diego Perini, MIT licensed
|
1430 |
+
// https://gist.github.com/dperini/729294
|
1431 |
+
// see also https://mathiasbynens.be/demo/url-regex
|
1432 |
+
// modified to allow protocol-relative URLs
|
1433 |
+
return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
|
1434 |
+
},
|
1435 |
+
|
1436 |
+
// https://jqueryvalidation.org/date-method/
|
1437 |
+
date: ( function() {
|
1438 |
+
var called = false;
|
1439 |
+
|
1440 |
+
return function( value, element ) {
|
1441 |
+
if ( !called ) {
|
1442 |
+
called = true;
|
1443 |
+
if ( this.settings.debug && window.console ) {
|
1444 |
+
console.warn(
|
1445 |
+
"The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
|
1446 |
+
"Please don't use it, since it relies on the Date constructor, which\n" +
|
1447 |
+
"behaves very differently across browsers and locales. Use `dateISO`\n" +
|
1448 |
+
"instead or one of the locale specific methods in `localizations/`\n" +
|
1449 |
+
"and `additional-methods.js`."
|
1450 |
+
);
|
1451 |
+
}
|
1452 |
+
}
|
1453 |
+
|
1454 |
+
return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
|
1455 |
+
};
|
1456 |
+
}() ),
|
1457 |
+
|
1458 |
+
// https://jqueryvalidation.org/dateISO-method/
|
1459 |
+
dateISO: function( value, element ) {
|
1460 |
+
return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
|
1461 |
+
},
|
1462 |
+
|
1463 |
+
// https://jqueryvalidation.org/number-method/
|
1464 |
+
number: function( value, element ) {
|
1465 |
+
return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
|
1466 |
+
},
|
1467 |
+
|
1468 |
+
// https://jqueryvalidation.org/digits-method/
|
1469 |
+
digits: function( value, element ) {
|
1470 |
+
return this.optional( element ) || /^\d+$/.test( value );
|
1471 |
+
},
|
1472 |
+
|
1473 |
+
// https://jqueryvalidation.org/minlength-method/
|
1474 |
+
minlength: function( value, element, param ) {
|
1475 |
+
var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
|
1476 |
+
return this.optional( element ) || length >= param;
|
1477 |
+
},
|
1478 |
+
|
1479 |
+
// https://jqueryvalidation.org/maxlength-method/
|
1480 |
+
maxlength: function( value, element, param ) {
|
1481 |
+
var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
|
1482 |
+
return this.optional( element ) || length <= param;
|
1483 |
+
},
|
1484 |
+
|
1485 |
+
// https://jqueryvalidation.org/rangelength-method/
|
1486 |
+
rangelength: function( value, element, param ) {
|
1487 |
+
var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
|
1488 |
+
return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
|
1489 |
+
},
|
1490 |
+
|
1491 |
+
// https://jqueryvalidation.org/min-method/
|
1492 |
+
min: function( value, element, param ) {
|
1493 |
+
return this.optional( element ) || value >= param;
|
1494 |
+
},
|
1495 |
+
|
1496 |
+
// https://jqueryvalidation.org/max-method/
|
1497 |
+
max: function( value, element, param ) {
|
1498 |
+
return this.optional( element ) || value <= param;
|
1499 |
+
},
|
1500 |
+
|
1501 |
+
// https://jqueryvalidation.org/range-method/
|
1502 |
+
range: function( value, element, param ) {
|
1503 |
+
return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
|
1504 |
+
},
|
1505 |
+
|
1506 |
+
// https://jqueryvalidation.org/step-method/
|
1507 |
+
step: function( value, element, param ) {
|
1508 |
+
var type = $( element ).attr( "type" ),
|
1509 |
+
errorMessage = "Step attribute on input type " + type + " is not supported.",
|
1510 |
+
supportedTypes = [ "text", "number", "range" ],
|
1511 |
+
re = new RegExp( "\\b" + type + "\\b" ),
|
1512 |
+
notSupported = type && !re.test( supportedTypes.join() ),
|
1513 |
+
decimalPlaces = function( num ) {
|
1514 |
+
var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
|
1515 |
+
if ( !match ) {
|
1516 |
+
return 0;
|
1517 |
+
}
|
1518 |
+
|
1519 |
+
// Number of digits right of decimal point.
|
1520 |
+
return match[ 1 ] ? match[ 1 ].length : 0;
|
1521 |
+
},
|
1522 |
+
toInt = function( num ) {
|
1523 |
+
return Math.round( num * Math.pow( 10, decimals ) );
|
1524 |
+
},
|
1525 |
+
valid = true,
|
1526 |
+
decimals;
|
1527 |
+
|
1528 |
+
// Works only for text, number and range input types
|
1529 |
+
// TODO find a way to support input types date, datetime, datetime-local, month, time and week
|
1530 |
+
if ( notSupported ) {
|
1531 |
+
throw new Error( errorMessage );
|
1532 |
+
}
|
1533 |
+
|
1534 |
+
decimals = decimalPlaces( param );
|
1535 |
+
|
1536 |
+
// Value can't have too many decimals
|
1537 |
+
if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
|
1538 |
+
valid = false;
|
1539 |
+
}
|
1540 |
+
|
1541 |
+
return this.optional( element ) || valid;
|
1542 |
+
},
|
1543 |
+
|
1544 |
+
// https://jqueryvalidation.org/equalTo-method/
|
1545 |
+
equalTo: function( value, element, param ) {
|
1546 |
+
|
1547 |
+
// Bind to the blur event of the target in order to revalidate whenever the target field is updated
|
1548 |
+
var target = $( param );
|
1549 |
+
if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
|
1550 |
+
target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
|
1551 |
+
$( element ).valid();
|
1552 |
+
} );
|
1553 |
+
}
|
1554 |
+
return value === target.val();
|
1555 |
+
},
|
1556 |
+
|
1557 |
+
// https://jqueryvalidation.org/remote-method/
|
1558 |
+
remote: function( value, element, param, method ) {
|
1559 |
+
if ( this.optional( element ) ) {
|
1560 |
+
return "dependency-mismatch";
|
1561 |
+
}
|
1562 |
+
|
1563 |
+
method = typeof method === "string" && method || "remote";
|
1564 |
+
|
1565 |
+
var previous = this.previousValue( element, method ),
|
1566 |
+
validator, data, optionDataString;
|
1567 |
+
|
1568 |
+
if ( !this.settings.messages[ element.name ] ) {
|
1569 |
+
this.settings.messages[ element.name ] = {};
|
1570 |
+
}
|
1571 |
+
previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
|
1572 |
+
this.settings.messages[ element.name ][ method ] = previous.message;
|
1573 |
+
|
1574 |
+
param = typeof param === "string" && { url: param } || param;
|
1575 |
+
optionDataString = $.param( $.extend( { data: value }, param.data ) );
|
1576 |
+
if ( previous.old === optionDataString ) {
|
1577 |
+
return previous.valid;
|
1578 |
+
}
|
1579 |
+
|
1580 |
+
previous.old = optionDataString;
|
1581 |
+
validator = this;
|
1582 |
+
this.startRequest( element );
|
1583 |
+
data = {};
|
1584 |
+
data[ element.name ] = value;
|
1585 |
+
$.ajax( $.extend( true, {
|
1586 |
+
mode: "abort",
|
1587 |
+
port: "validate" + element.name,
|
1588 |
+
dataType: "json",
|
1589 |
+
data: data,
|
1590 |
+
context: validator.currentForm,
|
1591 |
+
success: function( response ) {
|
1592 |
+
var valid = response === true || response === "true",
|
1593 |
+
errors, message, submitted;
|
1594 |
+
|
1595 |
+
validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
|
1596 |
+
if ( valid ) {
|
1597 |
+
submitted = validator.formSubmitted;
|
1598 |
+
validator.resetInternals();
|
1599 |
+
validator.toHide = validator.errorsFor( element );
|
1600 |
+
validator.formSubmitted = submitted;
|
1601 |
+
validator.successList.push( element );
|
1602 |
+
validator.invalid[ element.name ] = false;
|
1603 |
+
validator.showErrors();
|
1604 |
+
} else {
|
1605 |
+
errors = {};
|
1606 |
+
message = response || validator.defaultMessage( element, { method: method, parameters: value } );
|
1607 |
+
errors[ element.name ] = previous.message = message;
|
1608 |
+
validator.invalid[ element.name ] = true;
|
1609 |
+
validator.showErrors( errors );
|
1610 |
+
}
|
1611 |
+
previous.valid = valid;
|
1612 |
+
validator.stopRequest( element, valid );
|
1613 |
+
}
|
1614 |
+
}, param ) );
|
1615 |
+
return "pending";
|
1616 |
+
}
|
1617 |
+
}
|
1618 |
+
|
1619 |
+
} );
|
1620 |
+
|
1621 |
+
// Ajax mode: abort
|
1622 |
+
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
|
1623 |
+
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
|
1624 |
+
|
1625 |
+
var pendingRequests = {},
|
1626 |
+
ajax;
|
1627 |
+
|
1628 |
+
// Use a prefilter if available (1.5+)
|
1629 |
+
if ( $.ajaxPrefilter ) {
|
1630 |
+
$.ajaxPrefilter( function( settings, _, xhr ) {
|
1631 |
+
var port = settings.port;
|
1632 |
+
if ( settings.mode === "abort" ) {
|
1633 |
+
if ( pendingRequests[ port ] ) {
|
1634 |
+
pendingRequests[ port ].abort();
|
1635 |
+
}
|
1636 |
+
pendingRequests[ port ] = xhr;
|
1637 |
+
}
|
1638 |
+
} );
|
1639 |
+
} else {
|
1640 |
+
|
1641 |
+
// Proxy ajax
|
1642 |
+
ajax = $.ajax;
|
1643 |
+
$.ajax = function( settings ) {
|
1644 |
+
var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
|
1645 |
+
port = ( "port" in settings ? settings : $.ajaxSettings ).port;
|
1646 |
+
if ( mode === "abort" ) {
|
1647 |
+
if ( pendingRequests[ port ] ) {
|
1648 |
+
pendingRequests[ port ].abort();
|
1649 |
+
}
|
1650 |
+
pendingRequests[ port ] = ajax.apply( this, arguments );
|
1651 |
+
return pendingRequests[ port ];
|
1652 |
+
}
|
1653 |
+
return ajax.apply( this, arguments );
|
1654 |
+
};
|
1655 |
+
}
|
1656 |
+
return $;
|
1657 |
+
}));
|
js/src/jquery-validation/dist/jquery.validate.min.js
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
1 |
+
/*! jQuery Validation Plugin - v1.19.3 - 1/9/2021
|
2 |
+
* https://jqueryvalidation.org/
|
3 |
+
* Copyright (c) 2021 Jörn Zaefferer; Licensed MIT */
|
4 |
+
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;"abort"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a});
|
js/src/jquery-validation/package.json
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_args": [
|
3 |
+
[
|
4 |
+
"jquery-validation@1.19.3",
|
5 |
+
"/Users/sdobreff/MyProjects/WpWhiteSecurity/ActivityLog/wp-content/plugins/wp-security-audit-log-premium"
|
6 |
+
]
|
7 |
+
],
|
8 |
+
"_from": "jquery-validation@1.19.3",
|
9 |
+
"_id": "jquery-validation@1.19.3",
|
10 |
+
"_inBundle": false,
|
11 |
+
"_integrity": "sha512-iXxCS5W7STthSTMFX/NDZfWHBLbJ1behVK3eAgHXAV8/0vRa9M4tiqHvJMr39VGWHMGdlkhrtrkBuaL2UlE8yw==",
|
12 |
+
"_location": "/jquery-validation",
|
13 |
+
"_phantomChildren": {},
|
14 |
+
"_requested": {
|
15 |
+
"type": "version",
|
16 |
+
"registry": true,
|
17 |
+
"raw": "jquery-validation@1.19.3",
|
18 |
+
"name": "jquery-validation",
|
19 |
+
"escapedName": "jquery-validation",
|
20 |
+
"rawSpec": "1.19.3",
|
21 |
+
"saveSpec": null,
|
22 |
+
"fetchSpec": "1.19.3"
|
23 |
+
},
|
24 |
+
"_requiredBy": [
|
25 |
+
"/"
|
26 |
+
],
|
27 |
+
"_resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.19.3.tgz",
|
28 |
+
"_spec": "1.19.3",
|
29 |
+
"_where": "/Users/sdobreff/MyProjects/WpWhiteSecurity/ActivityLog/wp-content/plugins/wp-security-audit-log-premium",
|
30 |
+
"author": {
|
31 |
+
"name": "Jörn Zaefferer",
|
32 |
+
"email": "joern.zaefferer@gmail.com",
|
33 |
+
"url": "http://bassistance.de"
|
34 |
+
},
|
35 |
+
"bugs": {
|
36 |
+
"url": "https://github.com/jquery-validation/jquery-validation/issues"
|
37 |
+
},
|
38 |
+
"description": "Client-side form validation made easy",
|
39 |
+
"devDependencies": {
|
40 |
+
"commitplease": "2.3.1",
|
41 |
+
"grunt": "1.0.1",
|
42 |
+
"grunt-contrib-compress": "1.2.0",
|
43 |
+
"grunt-contrib-concat": "1.0.1",
|
44 |
+
"grunt-contrib-copy": "1.0.0",
|
45 |
+
"grunt-contrib-jshint": "1.0.0",
|
46 |
+
"grunt-contrib-qunit": "1.2.0",
|
47 |
+
"grunt-contrib-uglify": "1.0.1",
|
48 |
+
"grunt-contrib-watch": "1.0.0",
|
49 |
+
"grunt-jscs": "2.8.0",
|
50 |
+
"grunt-sri": "0.2.0",
|
51 |
+
"grunt-text-replace": "0.4.0",
|
52 |
+
"qunitjs": "2.3.3"
|
53 |
+
},
|
54 |
+
"files": [
|
55 |
+
"dist/localization/",
|
56 |
+
"dist/additional-methods.js",
|
57 |
+
"dist/additional-methods.min.js",
|
58 |
+
"dist/jquery.validate.js",
|
59 |
+
"dist/jquery.validate.min.js"
|
60 |
+
],
|
61 |
+
"homepage": "https://jqueryvalidation.org/",
|
62 |
+
"keywords": [
|
63 |
+
"jquery",
|
64 |
+
"jquery-plugin",
|
65 |
+
"forms",
|
66 |
+
"validation",
|
67 |
+
"validate"
|
68 |
+
],
|
69 |
+
"license": "MIT",
|
70 |
+
"licenses": [
|
71 |
+
{
|
72 |
+
"type": "MIT",
|
73 |
+
"url": "https://www.opensource.org/licenses/MIT"
|
74 |
+
}
|
75 |
+
],
|
76 |
+
"main": "dist/jquery.validate.js",
|
77 |
+
"name": "jquery-validation",
|
78 |
+
"peerDependencies": {
|
79 |
+
"jquery": "^1.7 || ^2.0 || ^3.1"
|
80 |
+
},
|
81 |
+
"repository": {
|
82 |
+
"type": "git",
|
83 |
+
"url": "git://github.com/jquery-validation/jquery-validation.git"
|
84 |
+
},
|
85 |
+
"scripts": {
|
86 |
+
"prepublish": "grunt",
|
87 |
+
"test": "grunt"
|
88 |
+
},
|
89 |
+
"title": "jQuery Validation Plugin",
|
90 |
+
"version": "1.19.3"
|
91 |
+
}
|
js/src/simple-lightbox.jquery.js
ADDED
@@ -0,0 +1,1662 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
By André Rinas, www.andrerinas.de
|
3 |
+
Documentation, www.simplelightbox.de
|
4 |
+
Available for use under the MIT License
|
5 |
+
Version 2.7.0
|
6 |
+
*/
|
7 |
+
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
8 |
+
"use strict";
|
9 |
+
|
10 |
+
require('./simple-lightbox');
|
11 |
+
|
12 |
+
(function ($, window, document, undefined) {
|
13 |
+
'use strict';
|
14 |
+
|
15 |
+
$.fn.simpleLightbox = function (options) {
|
16 |
+
return this.length ? new SimpleLightbox(this.get(), options) : null;
|
17 |
+
};
|
18 |
+
})(jQuery, window, document);
|
19 |
+
|
20 |
+
},{"./simple-lightbox":2}],2:[function(require,module,exports){
|
21 |
+
(function (global){(function (){
|
22 |
+
"use strict";
|
23 |
+
|
24 |
+
Object.defineProperty(exports, "__esModule", {
|
25 |
+
value: true
|
26 |
+
});
|
27 |
+
exports["default"] = void 0;
|
28 |
+
|
29 |
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
30 |
+
|
31 |
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
32 |
+
|
33 |
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
34 |
+
|
35 |
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
36 |
+
|
37 |
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
38 |
+
|
39 |
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
40 |
+
|
41 |
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
42 |
+
|
43 |
+
var SimpleLightbox = /*#__PURE__*/function () {
|
44 |
+
function SimpleLightbox(elements, options) {
|
45 |
+
var _this = this;
|
46 |
+
|
47 |
+
_classCallCheck(this, SimpleLightbox);
|
48 |
+
|
49 |
+
_defineProperty(this, "defaultOptions", {
|
50 |
+
sourceAttr: 'href',
|
51 |
+
overlay: true,
|
52 |
+
spinner: true,
|
53 |
+
nav: true,
|
54 |
+
navText: ['‹', '›'],
|
55 |
+
captions: true,
|
56 |
+
captionDelay: 0,
|
57 |
+
captionSelector: 'img',
|
58 |
+
captionType: 'attr',
|
59 |
+
captionsData: 'title',
|
60 |
+
captionPosition: 'bottom',
|
61 |
+
captionClass: '',
|
62 |
+
close: true,
|
63 |
+
closeText: '×',
|
64 |
+
swipeClose: true,
|
65 |
+
showCounter: true,
|
66 |
+
fileExt: 'png|jpg|jpeg|gif|webp',
|
67 |
+
animationSlide: true,
|
68 |
+
animationSpeed: 250,
|
69 |
+
preloading: true,
|
70 |
+
enableKeyboard: true,
|
71 |
+
loop: true,
|
72 |
+
rel: false,
|
73 |
+
docClose: true,
|
74 |
+
swipeTolerance: 50,
|
75 |
+
className: 'simple-lightbox',
|
76 |
+
widthRatio: 0.8,
|
77 |
+
heightRatio: 0.9,
|
78 |
+
scaleImageToRatio: false,
|
79 |
+
disableRightClick: false,
|
80 |
+
disableScroll: true,
|
81 |
+
alertError: true,
|
82 |
+
alertErrorMessage: 'Image not found, next image will be loaded',
|
83 |
+
additionalHtml: false,
|
84 |
+
history: true,
|
85 |
+
throttleInterval: 0,
|
86 |
+
doubleTapZoom: 2,
|
87 |
+
maxZoom: 10,
|
88 |
+
htmlClass: 'has-lightbox',
|
89 |
+
rtl: false,
|
90 |
+
fixedClass: 'sl-fixed',
|
91 |
+
fadeSpeed: 300,
|
92 |
+
uniqueImages: true,
|
93 |
+
focus: true
|
94 |
+
});
|
95 |
+
|
96 |
+
_defineProperty(this, "transitionPrefix", void 0);
|
97 |
+
|
98 |
+
_defineProperty(this, "transitionCapable", false);
|
99 |
+
|
100 |
+
_defineProperty(this, "isTouchDevice", 'ontouchstart' in window);
|
101 |
+
|
102 |
+
_defineProperty(this, "initialLocationHash", void 0);
|
103 |
+
|
104 |
+
_defineProperty(this, "pushStateSupport", 'pushState' in history);
|
105 |
+
|
106 |
+
_defineProperty(this, "isOpen", false);
|
107 |
+
|
108 |
+
_defineProperty(this, "isAnimating", false);
|
109 |
+
|
110 |
+
_defineProperty(this, "isClosing", false);
|
111 |
+
|
112 |
+
_defineProperty(this, "isFadeIn", false);
|
113 |
+
|
114 |
+
_defineProperty(this, "urlChangedOnce", false);
|
115 |
+
|
116 |
+
_defineProperty(this, "hashReseted", false);
|
117 |
+
|
118 |
+
_defineProperty(this, "historyHasChanges", false);
|
119 |
+
|
120 |
+
_defineProperty(this, "historyUpdateTimeout", null);
|
121 |
+
|
122 |
+
_defineProperty(this, "currentImage", void 0);
|
123 |
+
|
124 |
+
_defineProperty(this, "eventNamespace", 'simplelightbox');
|
125 |
+
|
126 |
+
_defineProperty(this, "domNodes", {});
|
127 |
+
|
128 |
+
_defineProperty(this, "loadedImages", []);
|
129 |
+
|
130 |
+
_defineProperty(this, "initialImageIndex", 0);
|
131 |
+
|
132 |
+
_defineProperty(this, "currentImageIndex", 0);
|
133 |
+
|
134 |
+
_defineProperty(this, "initialSelector", null);
|
135 |
+
|
136 |
+
_defineProperty(this, "globalScrollbarWidth", 0);
|
137 |
+
|
138 |
+
_defineProperty(this, "controlCoordinates", {
|
139 |
+
swipeDiff: 0,
|
140 |
+
swipeYDiff: 0,
|
141 |
+
swipeStart: 0,
|
142 |
+
swipeEnd: 0,
|
143 |
+
swipeYStart: 0,
|
144 |
+
swipeYEnd: 0,
|
145 |
+
mousedown: false,
|
146 |
+
imageLeft: 0,
|
147 |
+
zoomed: false,
|
148 |
+
containerHeight: 0,
|
149 |
+
containerWidth: 0,
|
150 |
+
containerOffsetX: 0,
|
151 |
+
containerOffsetY: 0,
|
152 |
+
imgHeight: 0,
|
153 |
+
imgWidth: 0,
|
154 |
+
capture: false,
|
155 |
+
initialOffsetX: 0,
|
156 |
+
initialOffsetY: 0,
|
157 |
+
initialPointerOffsetX: 0,
|
158 |
+
initialPointerOffsetY: 0,
|
159 |
+
initialPointerOffsetX2: 0,
|
160 |
+
initialPointerOffsetY2: 0,
|
161 |
+
initialScale: 1,
|
162 |
+
initialPinchDistance: 0,
|
163 |
+
pointerOffsetX: 0,
|
164 |
+
pointerOffsetY: 0,
|
165 |
+
pointerOffsetX2: 0,
|
166 |
+
pointerOffsetY2: 0,
|
167 |
+
targetOffsetX: 0,
|
168 |
+
targetOffsetY: 0,
|
169 |
+
targetScale: 0,
|
170 |
+
pinchOffsetX: 0,
|
171 |
+
pinchOffsetY: 0,
|
172 |
+
limitOffsetX: 0,
|
173 |
+
limitOffsetY: 0,
|
174 |
+
scaleDifference: 0,
|
175 |
+
targetPinchDistance: 0,
|
176 |
+
touchCount: 0,
|
177 |
+
doubleTapped: false,
|
178 |
+
touchmoveCount: 0
|
179 |
+
});
|
180 |
+
|
181 |
+
this.options = Object.assign(this.defaultOptions, options);
|
182 |
+
|
183 |
+
if (typeof elements === 'string') {
|
184 |
+
this.initialSelector = elements;
|
185 |
+
this.elements = Array.from(document.querySelectorAll(elements));
|
186 |
+
} else {
|
187 |
+
this.elements = typeof elements.length !== 'undefined' && elements.length > 0 ? Array.from(elements) : [elements];
|
188 |
+
}
|
189 |
+
|
190 |
+
this.relatedElements = [];
|
191 |
+
this.transitionPrefix = this.calculateTransitionPrefix();
|
192 |
+
this.transitionCapable = this.transitionPrefix !== false;
|
193 |
+
this.initialLocationHash = this.hash; // this should be handled by attribute selector IMHO! => 'a[rel=bla]'...
|
194 |
+
|
195 |
+
if (this.options.rel) {
|
196 |
+
this.elements = this.getRelated(this.options.rel);
|
197 |
+
}
|
198 |
+
|
199 |
+
if (this.options.uniqueImages) {
|
200 |
+
var imgArr = [];
|
201 |
+
this.elements = Array.from(this.elements).filter(function (element) {
|
202 |
+
var src = element.getAttribute(_this.options.sourceAttr);
|
203 |
+
|
204 |
+
if (imgArr.indexOf(src) === -1) {
|
205 |
+
imgArr.push(src);
|
206 |
+
return true;
|
207 |
+
}
|
208 |
+
|
209 |
+
return false;
|
210 |
+
});
|
211 |
+
}
|
212 |
+
|
213 |
+
this.createDomNodes();
|
214 |
+
|
215 |
+
if (this.options.close) {
|
216 |
+
this.domNodes.wrapper.appendChild(this.domNodes.closeButton);
|
217 |
+
}
|
218 |
+
|
219 |
+
if (this.options.nav) {
|
220 |
+
this.domNodes.wrapper.appendChild(this.domNodes.navigation);
|
221 |
+
}
|
222 |
+
|
223 |
+
if (this.options.spinner) {
|
224 |
+
this.domNodes.wrapper.appendChild(this.domNodes.spinner);
|
225 |
+
}
|
226 |
+
|
227 |
+
this.addEventListener(this.elements, 'click.' + this.eventNamespace, function (event) {
|
228 |
+
if (_this.isValidLink(event.currentTarget)) {
|
229 |
+
event.preventDefault();
|
230 |
+
|
231 |
+
if (_this.isAnimating) {
|
232 |
+
return false;
|
233 |
+
}
|
234 |
+
|
235 |
+
_this.initialImageIndex = _this.elements.indexOf(event.currentTarget);
|
236 |
+
|
237 |
+
_this.openImage(event.currentTarget);
|
238 |
+
}
|
239 |
+
}); // close addEventListener click addEventListener doc
|
240 |
+
|
241 |
+
if (this.options.docClose) {
|
242 |
+
this.addEventListener(this.domNodes.wrapper, ['click.' + this.eventNamespace, 'touchstart.' + this.eventNamespace], function (event) {
|
243 |
+
if (_this.isOpen && event.target === event.currentTarget) {
|
244 |
+
_this.close();
|
245 |
+
}
|
246 |
+
});
|
247 |
+
} // disable rightclick
|
248 |
+
|
249 |
+
|
250 |
+
if (this.options.disableRightClick) {
|
251 |
+
this.addEventListener(document.body, 'contextmenu.' + this.eventNamespace, function (event) {
|
252 |
+
if (event.target.classList.contains('sl-overlay')) {
|
253 |
+
event.preventDefault();
|
254 |
+
}
|
255 |
+
});
|
256 |
+
} // keyboard-control
|
257 |
+
|
258 |
+
|
259 |
+
if (this.options.enableKeyboard) {
|
260 |
+
this.addEventListener(document.body, 'keyup.' + this.eventNamespace, this.throttle(function (event) {
|
261 |
+
_this.controlCoordinates.swipeDiff = 0; // keyboard control only if lightbox is open
|
262 |
+
|
263 |
+
if (_this.isAnimating && event.key === 'Escape') {
|
264 |
+
_this.currentImage.setAttribute('src', '');
|
265 |
+
|
266 |
+
_this.isAnimating = false;
|
267 |
+
return _this.close();
|
268 |
+
}
|
269 |
+
|
270 |
+
if (_this.isOpen) {
|
271 |
+
event.preventDefault();
|
272 |
+
|
273 |
+
if (event.key === 'Escape') {
|
274 |
+
_this.close();
|
275 |
+
}
|
276 |
+
|
277 |
+
if (!_this.isAnimating && ['ArrowLeft', 'ArrowRight'].indexOf(event.key) > -1) {
|
278 |
+
_this.loadImage(event.key === 'ArrowRight' ? 1 : -1);
|
279 |
+
}
|
280 |
+
}
|
281 |
+
}, this.options.throttleInterval));
|
282 |
+
}
|
283 |
+
|
284 |
+
this.addEvents();
|
285 |
+
}
|
286 |
+
|
287 |
+
_createClass(SimpleLightbox, [{
|
288 |
+
key: "createDomNodes",
|
289 |
+
value: function createDomNodes() {
|
290 |
+
this.domNodes.overlay = document.createElement('div');
|
291 |
+
this.domNodes.overlay.classList.add('sl-overlay');
|
292 |
+
this.domNodes.overlay.dataset.opacityTarget = ".7";
|
293 |
+
this.domNodes.closeButton = document.createElement('button');
|
294 |
+
this.domNodes.closeButton.classList.add('sl-close');
|
295 |
+
this.domNodes.closeButton.innerHTML = this.options.closeText;
|
296 |
+
this.domNodes.spinner = document.createElement('div');
|
297 |
+
this.domNodes.spinner.classList.add('sl-spinner');
|
298 |
+
this.domNodes.spinner.innerHTML = '<div></div>';
|
299 |
+
this.domNodes.navigation = document.createElement('div');
|
300 |
+
this.domNodes.navigation.classList.add('sl-navigation');
|
301 |
+
this.domNodes.navigation.innerHTML = "<button class=\"sl-prev\">".concat(this.options.navText[0], "</button><button class=\"sl-next\">").concat(this.options.navText[1], "</button>");
|
302 |
+
this.domNodes.counter = document.createElement('div');
|
303 |
+
this.domNodes.counter.classList.add('sl-counter');
|
304 |
+
this.domNodes.counter.innerHTML = '<span class="sl-current"></span>/<span class="sl-total"></span>';
|
305 |
+
this.domNodes.caption = document.createElement('div');
|
306 |
+
this.domNodes.caption.classList.add('sl-caption', 'pos-' + this.options.captionPosition);
|
307 |
+
|
308 |
+
if (this.options.captionClass) {
|
309 |
+
this.domNodes.caption.classList.add(this.options.captionClass);
|
310 |
+
}
|
311 |
+
|
312 |
+
this.domNodes.image = document.createElement('div');
|
313 |
+
this.domNodes.image.classList.add('sl-image');
|
314 |
+
this.domNodes.wrapper = document.createElement('div');
|
315 |
+
this.domNodes.wrapper.classList.add('sl-wrapper');
|
316 |
+
this.domNodes.wrapper.setAttribute('tabindex', -1);
|
317 |
+
this.domNodes.wrapper.setAttribute('role', 'dialog');
|
318 |
+
this.domNodes.wrapper.setAttribute('aria-hidden', false);
|
319 |
+
|
320 |
+
if (this.options.className) {
|
321 |
+
this.domNodes.wrapper.classList.add(this.options.className);
|
322 |
+
}
|
323 |
+
|
324 |
+
if (this.options.rtl) {
|
325 |
+
this.domNodes.wrapper.classList.add('sl-dir-rtl');
|
326 |
+
}
|
327 |
+
}
|
328 |
+
}, {
|
329 |
+
key: "throttle",
|
330 |
+
value: function throttle(func, limit) {
|
331 |
+
var inThrottle;
|
332 |
+
return function () {
|
333 |
+
if (!inThrottle) {
|
334 |
+
func.apply(this, arguments);
|
335 |
+
inThrottle = true;
|
336 |
+
setTimeout(function () {
|
337 |
+
return inThrottle = false;
|
338 |
+
}, limit);
|
339 |
+
}
|
340 |
+
};
|
341 |
+
}
|
342 |
+
}, {
|
343 |
+
key: "isValidLink",
|
344 |
+
value: function isValidLink(element) {
|
345 |
+
return !this.options.fileExt || 'pathname' in element && new RegExp('(' + this.options.fileExt + ')$', 'i').test(element.pathname);
|
346 |
+
}
|
347 |
+
}, {
|
348 |
+
key: "calculateTransitionPrefix",
|
349 |
+
value: function calculateTransitionPrefix() {
|
350 |
+
var s = (document.body || document.documentElement).style;
|
351 |
+
return 'transition' in s ? '' : 'WebkitTransition' in s ? '-webkit-' : 'MozTransition' in s ? '-moz-' : 'OTransition' in s ? '-o' : false;
|
352 |
+
}
|
353 |
+
}, {
|
354 |
+
key: "toggleScrollbar",
|
355 |
+
value: function toggleScrollbar(type) {
|
356 |
+
var scrollbarWidth = 0;
|
357 |
+
var fixedElements = [].slice.call(document.querySelectorAll('.' + this.options.fixedClass));
|
358 |
+
|
359 |
+
if (type === 'hide') {
|
360 |
+
var fullWindowWidth = window.innerWidth;
|
361 |
+
|
362 |
+
if (!fullWindowWidth) {
|
363 |
+
var documentElementRect = document.documentElement.getBoundingClientRect();
|
364 |
+
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
|
365 |
+
}
|
366 |
+
|
367 |
+
if (document.body.clientWidth < fullWindowWidth) {
|
368 |
+
var scrollDiv = document.createElement('div'),
|
369 |
+
paddingRight = parseInt(document.body.style.paddingRight || 0, 10);
|
370 |
+
scrollDiv.classList.add('sl-scrollbar-measure');
|
371 |
+
document.body.appendChild(scrollDiv);
|
372 |
+
scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
373 |
+
document.body.removeChild(scrollDiv);
|
374 |
+
document.body.dataset.originalPaddingRight = paddingRight;
|
375 |
+
|
376 |
+
if (scrollbarWidth > 0) {
|
377 |
+
document.body.classList.add('hidden-scroll');
|
378 |
+
document.body.style.paddingRight = paddingRight + scrollbarWidth + 'px';
|
379 |
+
fixedElements.forEach(function (element) {
|
380 |
+
var actualPadding = element.style.paddingRight;
|
381 |
+
var calculatedPadding = window.getComputedStyle(element)['padding-right'];
|
382 |
+
element.dataset.originalPaddingRight = actualPadding;
|
383 |
+
element.style.paddingRight = "".concat(parseFloat(calculatedPadding) + scrollbarWidth, "px");
|
384 |
+
});
|
385 |
+
}
|
386 |
+
}
|
387 |
+
} else {
|
388 |
+
document.body.classList.remove('hidden-scroll');
|
389 |
+
document.body.style.paddingRight = document.body.dataset.originalPaddingRight;
|
390 |
+
fixedElements.forEach(function (element) {
|
391 |
+
var padding = element.dataset.originalPaddingRight;
|
392 |
+
|
393 |
+
if (typeof padding !== 'undefined') {
|
394 |
+
element.style.paddingRight = padding;
|
395 |
+
}
|
396 |
+
});
|
397 |
+
}
|
398 |
+
|
399 |
+
return scrollbarWidth;
|
400 |
+
}
|
401 |
+
}, {
|
402 |
+
key: "close",
|
403 |
+
value: function close() {
|
404 |
+
var _this2 = this;
|
405 |
+
|
406 |
+
if (!this.isOpen || this.isAnimating || this.isClosing) {
|
407 |
+
return false;
|
408 |
+
}
|
409 |
+
|
410 |
+
this.isClosing = true;
|
411 |
+
var element = this.relatedElements[this.currentImageIndex];
|
412 |
+
element.dispatchEvent(new Event('close.simplelightbox'));
|
413 |
+
|
414 |
+
if (this.options.history) {
|
415 |
+
this.historyHasChanges = false;
|
416 |
+
|
417 |
+
if (!this.hashReseted) {
|
418 |
+
this.resetHash();
|
419 |
+
}
|
420 |
+
}
|
421 |
+
|
422 |
+
this.removeEventListener(document, 'focusin.' + this.eventNamespace);
|
423 |
+
this.fadeOut(document.querySelectorAll('.sl-image img, .sl-overlay, .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter'), this.options.fadeSpeed, function () {
|
424 |
+
if (_this2.options.disableScroll) {
|
425 |
+
_this2.toggleScrollbar('show');
|
426 |
+
}
|
427 |
+
|
428 |
+
if (_this2.options.htmlClass && _this2.options.htmlClass !== '') {
|
429 |
+
document.querySelector('html').classList.remove(_this2.options.htmlClass);
|
430 |
+
}
|
431 |
+
|
432 |
+
document.body.removeChild(_this2.domNodes.wrapper);
|
433 |
+
document.body.removeChild(_this2.domNodes.overlay);
|
434 |
+
_this2.domNodes.additionalHtml = null;
|
435 |
+
element.dispatchEvent(new Event('closed.simplelightbox'));
|
436 |
+
_this2.isClosing = false;
|
437 |
+
});
|
438 |
+
this.currentImage = null;
|
439 |
+
this.isOpen = false;
|
440 |
+
this.isAnimating = false; // reset touchcontrol coordinates
|
441 |
+
|
442 |
+
for (var key in this.controlCoordinates) {
|
443 |
+
this.controlCoordinates[key] = 0;
|
444 |
+
}
|
445 |
+
|
446 |
+
this.controlCoordinates.mousedown = false;
|
447 |
+
this.controlCoordinates.zoomed = false;
|
448 |
+
this.controlCoordinates.capture = false;
|
449 |
+
this.controlCoordinates.initialScale = this.minMax(1, 1, this.options.maxZoom);
|
450 |
+
this.controlCoordinates.doubleTapped = false;
|
451 |
+
}
|
452 |
+
}, {
|
453 |
+
key: "preload",
|
454 |
+
value: function preload() {
|
455 |
+
var _this3 = this;
|
456 |
+
|
457 |
+
var index = this.currentImageIndex,
|
458 |
+
length = this.relatedElements.length,
|
459 |
+
next = index + 1 < 0 ? length - 1 : index + 1 >= length - 1 ? 0 : index + 1,
|
460 |
+
prev = index - 1 < 0 ? length - 1 : index - 1 >= length - 1 ? 0 : index - 1,
|
461 |
+
nextImage = new Image(),
|
462 |
+
prevImage = new Image();
|
463 |
+
nextImage.addEventListener('load', function (event) {
|
464 |
+
var src = event.target.getAttribute('src');
|
465 |
+
|
466 |
+
if (_this3.loadedImages.indexOf(src) === -1) {
|
467 |
+
//is this condition even required... setting multiple times will not change usage...
|
468 |
+
_this3.loadedImages.push(src);
|
469 |
+
}
|
470 |
+
|
471 |
+
_this3.relatedElements[index].dispatchEvent(new Event('nextImageLoaded.' + _this3.eventNamespace));
|
472 |
+
});
|
473 |
+
nextImage.setAttribute('src', this.relatedElements[next].getAttribute(this.options.sourceAttr));
|
474 |
+
prevImage.addEventListener('load', function (event) {
|
475 |
+
var src = event.target.getAttribute('src');
|
476 |
+
|
477 |
+
if (_this3.loadedImages.indexOf(src) === -1) {
|
478 |
+
_this3.loadedImages.push(src);
|
479 |
+
}
|
480 |
+
|
481 |
+
_this3.relatedElements[index].dispatchEvent(new Event('prevImageLoaded.' + _this3.eventNamespace));
|
482 |
+
});
|
483 |
+
prevImage.setAttribute('src', this.relatedElements[prev].getAttribute(this.options.sourceAttr));
|
484 |
+
}
|
485 |
+
}, {
|
486 |
+
key: "loadImage",
|
487 |
+
value: function loadImage(direction) {
|
488 |
+
var _this4 = this;
|
489 |
+
|
490 |
+
var slideDirection = direction;
|
491 |
+
|
492 |
+
if (this.options.rtl) {
|
493 |
+
direction = -direction;
|
494 |
+
}
|
495 |
+
|
496 |
+
this.relatedElements[this.currentImageIndex].dispatchEvent(new Event('change.' + this.eventNamespace));
|
497 |
+
this.relatedElements[this.currentImageIndex].dispatchEvent(new Event((direction === 1 ? 'next' : 'prev') + '.' + this.eventNamespace));
|
498 |
+
var newIndex = this.currentImageIndex + direction;
|
499 |
+
|
500 |
+
if (this.isAnimating || (newIndex < 0 || newIndex >= this.relatedElements.length) && this.options.loop === false) {
|
501 |
+
return false;
|
502 |
+
}
|
503 |
+
|
504 |
+
this.currentImageIndex = newIndex < 0 ? this.relatedElements.length - 1 : newIndex > this.relatedElements.length - 1 ? 0 : newIndex;
|
505 |
+
this.domNodes.counter.querySelector('.sl-current').innerHTML = this.currentImageIndex + 1;
|
506 |
+
|
507 |
+
if (this.options.animationSlide) {
|
508 |
+
this.slide(this.options.animationSpeed / 1000, -100 * slideDirection - this.controlCoordinates.swipeDiff + 'px');
|
509 |
+
}
|
510 |
+
|
511 |
+
this.fadeOut(this.domNodes.image, this.options.fadeSpeed, function () {
|
512 |
+
_this4.isAnimating = true;
|
513 |
+
|
514 |
+
if (!_this4.isClosing) {
|
515 |
+
setTimeout(function () {
|
516 |
+
var element = _this4.relatedElements[_this4.currentImageIndex];
|
517 |
+
|
518 |
+
_this4.currentImage.setAttribute('src', element.getAttribute(_this4.options.sourceAttr));
|
519 |
+
|
520 |
+
if (_this4.loadedImages.indexOf(element.getAttribute(_this4.options.sourceAttr)) === -1) {
|
521 |
+
_this4.show(_this4.domNodes.spinner);
|
522 |
+
}
|
523 |
+
|
524 |
+
if (_this4.domNodes.image.contains(_this4.domNodes.caption)) {
|
525 |
+
_this4.domNodes.image.removeChild(_this4.domNodes.caption);
|
526 |
+
}
|
527 |
+
|
528 |
+
_this4.adjustImage(slideDirection);
|
529 |
+
|
530 |
+
if (_this4.options.preloading) _this4.preload();
|
531 |
+
}, 100);
|
532 |
+
} else {
|
533 |
+
_this4.isAnimating = false;
|
534 |
+
}
|
535 |
+
});
|
536 |
+
}
|
537 |
+
}, {
|
538 |
+
key: "adjustImage",
|
539 |
+
value: function adjustImage(direction) {
|
540 |
+
var _this5 = this;
|
541 |
+
|
542 |
+
if (!this.currentImage) {
|
543 |
+
return false;
|
544 |
+
}
|
545 |
+
|
546 |
+
var tmpImage = new Image(),
|
547 |
+
windowWidth = window.innerWidth * this.options.widthRatio,
|
548 |
+
windowHeight = window.innerHeight * this.options.heightRatio;
|
549 |
+
tmpImage.setAttribute('src', this.currentImage.getAttribute('src'));
|
550 |
+
this.currentImage.dataset.scale = 1;
|
551 |
+
this.currentImage.dataset.translateX = 0;
|
552 |
+
this.currentImage.dataset.translateY = 0;
|
553 |
+
this.zoomPanElement(0, 0, 1);
|
554 |
+
tmpImage.addEventListener('error', function (event) {
|
555 |
+
_this5.relatedElements[_this5.currentImageIndex].dispatchEvent(new Event('error.' + _this5.eventNamespace));
|
556 |
+
|
557 |
+
_this5.isAnimating = false;
|
558 |
+
_this5.isOpen = false;
|
559 |
+
_this5.domNodes.spinner.style.display = 'none';
|
560 |
+
var dirIsDefined = direction === 1 || direction === -1;
|
561 |
+
|
562 |
+
if (_this5.initialImageIndex === _this5.currentImageIndex && dirIsDefined) {
|
563 |
+
return _this5.close();
|
564 |
+
}
|
565 |
+
|
566 |
+
if (_this5.options.alertError) {
|
567 |
+
alert(_this5.options.alertErrorMessage);
|
568 |
+
}
|
569 |
+
|
570 |
+
_this5.loadImage(dirIsDefined ? direction : 1);
|
571 |
+
});
|
572 |
+
tmpImage.addEventListener('load', function (event) {
|
573 |
+
if (typeof direction !== 'undefined') {
|
574 |
+
_this5.relatedElements[_this5.currentImageIndex].dispatchEvent(new Event('changed.' + _this5.eventNamespace));
|
575 |
+
|
576 |
+
_this5.relatedElements[_this5.currentImageIndex].dispatchEvent(new Event((direction === 1 ? 'nextDone' : 'prevDone') + '.' + _this5.eventNamespace));
|
577 |
+
} // history
|
578 |
+
|
579 |
+
|
580 |
+
if (_this5.options.history) {
|
581 |
+
_this5.updateURL();
|
582 |
+
}
|
583 |
+
|
584 |
+
if (_this5.loadedImages.indexOf(_this5.currentImage.getAttribute('src')) === -1) {
|
585 |
+
_this5.loadedImages.push(_this5.currentImage.getAttribute('src'));
|
586 |
+
}
|
587 |
+
|
588 |
+
var imageWidth = event.target.width,
|
589 |
+
imageHeight = event.target.height;
|
590 |
+
|
591 |
+
if (_this5.options.scaleImageToRatio || imageWidth > windowWidth || imageHeight > windowHeight) {
|
592 |
+
var ratio = imageWidth / imageHeight > windowWidth / windowHeight ? imageWidth / windowWidth : imageHeight / windowHeight;
|
593 |
+
imageWidth /= ratio;
|
594 |
+
imageHeight /= ratio;
|
595 |
+
}
|
596 |
+
|
597 |
+
_this5.domNodes.image.style.top = (window.innerHeight - imageHeight) / 2 + 'px';
|
598 |
+
_this5.domNodes.image.style.left = (window.innerWidth - imageWidth - _this5.globalScrollbarWidth) / 2 + 'px';
|
599 |
+
_this5.domNodes.image.style.width = imageWidth + 'px';
|
600 |
+
_this5.domNodes.image.style.height = imageHeight + 'px';
|
601 |
+
_this5.domNodes.spinner.style.display = 'none';
|
602 |
+
|
603 |
+
if (_this5.options.focus) {
|
604 |
+
_this5.forceFocus();
|
605 |
+
}
|
606 |
+
|
607 |
+
_this5.fadeIn(_this5.currentImage, _this5.options.fadeSpeed, function () {
|
608 |
+
if (_this5.options.focus) {
|
609 |
+
_this5.domNodes.wrapper.focus();
|
610 |
+
}
|
611 |
+
});
|
612 |
+
|
613 |
+
_this5.isOpen = true;
|
614 |
+
var captionContainer, captionText;
|
615 |
+
|
616 |
+
if (typeof _this5.options.captionSelector === 'string') {
|
617 |
+
captionContainer = _this5.options.captionSelector === 'self' ? _this5.relatedElements[_this5.currentImageIndex] : _this5.relatedElements[_this5.currentImageIndex].querySelector(_this5.options.captionSelector);
|
618 |
+
} else if (typeof _this5.options.captionSelector === 'function') {
|
619 |
+
captionContainer = _this5.options.captionSelector(_this5.relatedElements[_this5.currentImageIndex]);
|
620 |
+
}
|
621 |
+
|
622 |
+
if (_this5.options.captions && captionContainer) {
|
623 |
+
if (_this5.options.captionType === 'data') {
|
624 |
+
captionText = captionContainer.dataset[_this5.options.captionsData];
|
625 |
+
} else if (_this5.options.captionType === 'text') {
|
626 |
+
captionText = captionContainer.innerHTML;
|
627 |
+
} else {
|
628 |
+
captionText = captionContainer.getAttribute(_this5.options.captionsData);
|
629 |
+
}
|
630 |
+
}
|
631 |
+
|
632 |
+
if (!_this5.options.loop) {
|
633 |
+
if (_this5.currentImageIndex === 0) {
|
634 |
+
_this5.hide(_this5.domNodes.navigation.querySelector('.sl-prev'));
|
635 |
+
}
|
636 |
+
|
637 |
+
if (_this5.currentImageIndex >= _this5.relatedElements.length - 1) {
|
638 |
+
_this5.hide(_this5.domNodes.navigation.querySelector('.sl-next'));
|
639 |
+
}
|
640 |
+
|
641 |
+
if (_this5.currentImageIndex > 0) {
|
642 |
+
_this5.show(_this5.domNodes.navigation.querySelector('.sl-prev'));
|
643 |
+
}
|
644 |
+
|
645 |
+
if (_this5.currentImageIndex < _this5.relatedElements.length - 1) {
|
646 |
+
_this5.show(_this5.domNodes.navigation.querySelector('.sl-next'));
|
647 |
+
}
|
648 |
+
}
|
649 |
+
|
650 |
+
if (_this5.relatedElements.length === 1) {
|
651 |
+
_this5.hide(_this5.domNodes.navigation.querySelectorAll('.sl-prev, .sl-next'));
|
652 |
+
} else {
|
653 |
+
_this5.show(_this5.domNodes.navigation.querySelectorAll('.sl-prev, .sl-next'));
|
654 |
+
}
|
655 |
+
|
656 |
+
if (direction === 1 || direction === -1) {
|
657 |
+
if (_this5.options.animationSlide) {
|
658 |
+
_this5.slide(0, 100 * direction + 'px');
|
659 |
+
|
660 |
+
setTimeout(function () {
|
661 |
+
_this5.slide(_this5.options.animationSpeed / 1000, 0 + 'px');
|
662 |
+
}, 50);
|
663 |
+
}
|
664 |
+
|
665 |
+
_this5.fadeIn(_this5.domNodes.image, _this5.options.fadeSpeed, function () {
|
666 |
+
_this5.isAnimating = false;
|
667 |
+
|
668 |
+
_this5.setCaption(captionText, imageWidth);
|
669 |
+
});
|
670 |
+
} else {
|
671 |
+
_this5.isAnimating = false;
|
672 |
+
|
673 |
+
_this5.setCaption(captionText, imageWidth);
|
674 |
+
}
|
675 |
+
|
676 |
+
if (_this5.options.additionalHtml && !_this5.domNodes.additionalHtml) {
|
677 |
+
_this5.domNodes.additionalHtml = document.createElement('div');
|
678 |
+
|
679 |
+
_this5.domNodes.additionalHtml.classList.add('sl-additional-html');
|
680 |
+
|
681 |
+
_this5.domNodes.additionalHtml.innerHTML = _this5.options.additionalHtml;
|
682 |
+
|
683 |
+
_this5.domNodes.image.appendChild(_this5.domNodes.additionalHtml);
|
684 |
+
}
|
685 |
+
});
|
686 |
+
}
|
687 |
+
}, {
|
688 |
+
key: "zoomPanElement",
|
689 |
+
value: function zoomPanElement(targetOffsetX, targetOffsetY, targetScale) {
|
690 |
+
this.currentImage.style[this.transitionPrefix + 'transform'] = 'translate(' + targetOffsetX + ',' + targetOffsetY + ') scale(' + targetScale + ')';
|
691 |
+
}
|
692 |
+
}, {
|
693 |
+
key: "minMax",
|
694 |
+
value: function minMax(value, min, max) {
|
695 |
+
return value < min ? min : value > max ? max : value;
|
696 |
+
}
|
697 |
+
}, {
|
698 |
+
key: "setZoomData",
|
699 |
+
value: function setZoomData(initialScale, targetOffsetX, targetOffsetY) {
|
700 |
+
this.currentImage.dataset.scale = initialScale;
|
701 |
+
this.currentImage.dataset.translateX = targetOffsetX;
|
702 |
+
this.currentImage.dataset.translateY = targetOffsetY;
|
703 |
+
}
|
704 |
+
}, {
|
705 |
+
key: "hashchangeHandler",
|
706 |
+
value: function hashchangeHandler() {
|
707 |
+
if (this.isOpen && this.hash === this.initialLocationHash) {
|
708 |
+
this.hashReseted = true;
|
709 |
+
this.close();
|
710 |
+
}
|
711 |
+
}
|
712 |
+
}, {
|
713 |
+
key: "addEvents",
|
714 |
+
value: function addEvents() {
|
715 |
+
var _this6 = this;
|
716 |
+
|
717 |
+
// resize/responsive
|
718 |
+
this.addEventListener(window, 'resize.' + this.eventNamespace, function (event) {
|
719 |
+
//this.adjustImage.bind(this)
|
720 |
+
if (_this6.isOpen) {
|
721 |
+
_this6.adjustImage();
|
722 |
+
}
|
723 |
+
});
|
724 |
+
this.addEventListener(this.domNodes.closeButton, ['click.' + this.eventNamespace, 'touchstart.' + this.eventNamespace], this.close.bind(this));
|
725 |
+
|
726 |
+
if (this.options.history) {
|
727 |
+
setTimeout(function () {
|
728 |
+
_this6.addEventListener(window, 'hashchange.' + _this6.eventNamespace, function (event) {
|
729 |
+
if (_this6.isOpen) {
|
730 |
+
_this6.hashchangeHandler();
|
731 |
+
}
|
732 |
+
});
|
733 |
+
}, 40);
|
734 |
+
}
|
735 |
+
|
736 |
+
this.addEventListener(this.domNodes.navigation.getElementsByTagName('button'), 'click.' + this.eventNamespace, function (event) {
|
737 |
+
if (!event.currentTarget.tagName.match(/button/i)) {
|
738 |
+
return true;
|
739 |
+
}
|
740 |
+
|
741 |
+
event.preventDefault();
|
742 |
+
_this6.controlCoordinates.swipeDiff = 0;
|
743 |
+
|
744 |
+
_this6.loadImage(event.currentTarget.classList.contains('sl-next') ? 1 : -1);
|
745 |
+
});
|
746 |
+
this.addEventListener(this.domNodes.image, ['touchstart.' + this.eventNamespace, 'mousedown.' + this.eventNamespace], function (event) {
|
747 |
+
if (event.target.tagName === 'A' && event.type === 'touchstart') {
|
748 |
+
return true;
|
749 |
+
}
|
750 |
+
|
751 |
+
if (event.type === 'mousedown') {
|
752 |
+
_this6.controlCoordinates.initialPointerOffsetX = event.clientX;
|
753 |
+
_this6.controlCoordinates.initialPointerOffsetY = event.clientY;
|
754 |
+
_this6.controlCoordinates.containerHeight = _this6.getDimensions(_this6.domNodes.image).height;
|
755 |
+
_this6.controlCoordinates.containerWidth = _this6.getDimensions(_this6.domNodes.image).width;
|
756 |
+
_this6.controlCoordinates.imgHeight = _this6.getDimensions(_this6.currentImage).height;
|
757 |
+
_this6.controlCoordinates.imgWidth = _this6.getDimensions(_this6.currentImage).width;
|
758 |
+
_this6.controlCoordinates.containerOffsetX = _this6.domNodes.image.offsetLeft;
|
759 |
+
_this6.controlCoordinates.containerOffsetY = _this6.domNodes.image.offsetTop;
|
760 |
+
_this6.controlCoordinates.initialOffsetX = parseFloat(_this6.currentImage.dataset.translateX);
|
761 |
+
_this6.controlCoordinates.initialOffsetY = parseFloat(_this6.currentImage.dataset.translateY);
|
762 |
+
_this6.controlCoordinates.capture = true;
|
763 |
+
} else {
|
764 |
+
_this6.controlCoordinates.touchCount = event.touches.length;
|
765 |
+
_this6.controlCoordinates.initialPointerOffsetX = event.touches[0].clientX;
|
766 |
+
_this6.controlCoordinates.initialPointerOffsetY = event.touches[0].clientY;
|
767 |
+
_this6.controlCoordinates.containerHeight = _this6.getDimensions(_this6.domNodes.image).height;
|
768 |
+
_this6.controlCoordinates.containerWidth = _this6.getDimensions(_this6.domNodes.image).width;
|
769 |
+
_this6.controlCoordinates.imgHeight = _this6.getDimensions(_this6.currentImage).height;
|
770 |
+
_this6.controlCoordinates.imgWidth = _this6.getDimensions(_this6.currentImage).width;
|
771 |
+
_this6.controlCoordinates.containerOffsetX = _this6.domNodes.image.offsetLeft;
|
772 |
+
_this6.controlCoordinates.containerOffsetY = _this6.domNodes.image.offsetTop;
|
773 |
+
|
774 |
+
if (_this6.controlCoordinates.touchCount === 1)
|
775 |
+
/* Single touch */
|
776 |
+
{
|
777 |
+
if (!_this6.controlCoordinates.doubleTapped) {
|
778 |
+
_this6.controlCoordinates.doubleTapped = true;
|
779 |
+
setTimeout(function () {
|
780 |
+
_this6.controlCoordinates.doubleTapped = false;
|
781 |
+
}, 300);
|
782 |
+
} else {
|
783 |
+
_this6.currentImage.classList.add('sl-transition');
|
784 |
+
|
785 |
+
if (!_this6.controlCoordinates.zoomed) {
|
786 |
+
_this6.controlCoordinates.initialScale = _this6.options.doubleTapZoom;
|
787 |
+
|
788 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, 0, 0);
|
789 |
+
|
790 |
+
_this6.zoomPanElement(0 + "px", 0 + "px", _this6.controlCoordinates.initialScale);
|
791 |
+
|
792 |
+
if (!_this6.domNodes.caption.style.opacity && _this6.domNodes.caption.style.display !== 'none') {
|
793 |
+
_this6.fadeOut(_this6.domNodes.caption, _this6.options.fadeSpeed);
|
794 |
+
}
|
795 |
+
|
796 |
+
_this6.controlCoordinates.zoomed = true;
|
797 |
+
} else {
|
798 |
+
_this6.controlCoordinates.initialScale = 1;
|
799 |
+
|
800 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, 0, 0);
|
801 |
+
|
802 |
+
_this6.zoomPanElement(0 + "px", 0 + "px", _this6.controlCoordinates.initialScale);
|
803 |
+
|
804 |
+
_this6.controlCoordinates.zoomed = false;
|
805 |
+
}
|
806 |
+
|
807 |
+
setTimeout(function () {
|
808 |
+
if (_this6.currentImage) {
|
809 |
+
_this6.currentImage.classList.remove('sl-transition');
|
810 |
+
}
|
811 |
+
}, 200);
|
812 |
+
return false;
|
813 |
+
}
|
814 |
+
|
815 |
+
_this6.controlCoordinates.initialOffsetX = parseFloat(_this6.currentImage.dataset.translateX);
|
816 |
+
_this6.controlCoordinates.initialOffsetY = parseFloat(_this6.currentImage.dataset.translateY);
|
817 |
+
} else if (_this6.controlCoordinates.touchCount === 2)
|
818 |
+
/* Pinch */
|
819 |
+
{
|
820 |
+
_this6.controlCoordinates.initialPointerOffsetX2 = event.touches[1].clientX;
|
821 |
+
_this6.controlCoordinates.initialPointerOffsetY2 = event.touches[1].clientY;
|
822 |
+
_this6.controlCoordinates.initialOffsetX = parseFloat(_this6.currentImage.dataset.translateX);
|
823 |
+
_this6.controlCoordinates.initialOffsetY = parseFloat(_this6.currentImage.dataset.translateY);
|
824 |
+
_this6.controlCoordinates.pinchOffsetX = (_this6.controlCoordinates.initialPointerOffsetX + _this6.controlCoordinates.initialPointerOffsetX2) / 2;
|
825 |
+
_this6.controlCoordinates.pinchOffsetY = (_this6.controlCoordinates.initialPointerOffsetY + _this6.controlCoordinates.initialPointerOffsetY2) / 2;
|
826 |
+
_this6.controlCoordinates.initialPinchDistance = Math.sqrt((_this6.controlCoordinates.initialPointerOffsetX - _this6.controlCoordinates.initialPointerOffsetX2) * (_this6.controlCoordinates.initialPointerOffsetX - _this6.controlCoordinates.initialPointerOffsetX2) + (_this6.controlCoordinates.initialPointerOffsetY - _this6.controlCoordinates.initialPointerOffsetY2) * (_this6.controlCoordinates.initialPointerOffsetY - _this6.controlCoordinates.initialPointerOffsetY2));
|
827 |
+
}
|
828 |
+
|
829 |
+
_this6.controlCoordinates.capture = true;
|
830 |
+
}
|
831 |
+
|
832 |
+
if (_this6.controlCoordinates.mousedown) return true;
|
833 |
+
|
834 |
+
if (_this6.transitionCapable) {
|
835 |
+
_this6.controlCoordinates.imageLeft = parseInt(_this6.domNodes.image.style.left, 10);
|
836 |
+
}
|
837 |
+
|
838 |
+
_this6.controlCoordinates.mousedown = true;
|
839 |
+
_this6.controlCoordinates.swipeDiff = 0;
|
840 |
+
_this6.controlCoordinates.swipeYDiff = 0;
|
841 |
+
_this6.controlCoordinates.swipeStart = event.pageX || event.touches[0].pageX;
|
842 |
+
_this6.controlCoordinates.swipeYStart = event.pageY || event.touches[0].pageY;
|
843 |
+
return false;
|
844 |
+
});
|
845 |
+
this.addEventListener(this.domNodes.image, ['touchmove.' + this.eventNamespace, 'mousemove.' + this.eventNamespace, 'MSPointerMove'], function (event) {
|
846 |
+
if (!_this6.controlCoordinates.mousedown) {
|
847 |
+
return true;
|
848 |
+
}
|
849 |
+
|
850 |
+
event.preventDefault();
|
851 |
+
|
852 |
+
if (event.type === 'touchmove') {
|
853 |
+
if (_this6.controlCoordinates.capture === false) {
|
854 |
+
return false;
|
855 |
+
}
|
856 |
+
|
857 |
+
_this6.controlCoordinates.pointerOffsetX = event.touches[0].clientX;
|
858 |
+
_this6.controlCoordinates.pointerOffsetY = event.touches[0].clientY;
|
859 |
+
_this6.controlCoordinates.touchCount = event.touches.length;
|
860 |
+
_this6.controlCoordinates.touchmoveCount++;
|
861 |
+
|
862 |
+
if (_this6.controlCoordinates.touchCount > 1)
|
863 |
+
/* Pinch */
|
864 |
+
{
|
865 |
+
_this6.controlCoordinates.pointerOffsetX2 = event.touches[1].clientX;
|
866 |
+
_this6.controlCoordinates.pointerOffsetY2 = event.touches[1].clientY;
|
867 |
+
_this6.controlCoordinates.targetPinchDistance = Math.sqrt((_this6.controlCoordinates.pointerOffsetX - _this6.controlCoordinates.pointerOffsetX2) * (_this6.controlCoordinates.pointerOffsetX - _this6.controlCoordinates.pointerOffsetX2) + (_this6.controlCoordinates.pointerOffsetY - _this6.controlCoordinates.pointerOffsetY2) * (_this6.controlCoordinates.pointerOffsetY - _this6.controlCoordinates.pointerOffsetY2));
|
868 |
+
|
869 |
+
if (_this6.controlCoordinates.initialPinchDistance === null) {
|
870 |
+
_this6.controlCoordinates.initialPinchDistance = _this6.controlCoordinates.targetPinchDistance;
|
871 |
+
}
|
872 |
+
|
873 |
+
if (Math.abs(_this6.controlCoordinates.initialPinchDistance - _this6.controlCoordinates.targetPinchDistance) >= 1) {
|
874 |
+
/* Initialize helpers */
|
875 |
+
_this6.controlCoordinates.targetScale = _this6.minMax(_this6.controlCoordinates.targetPinchDistance / _this6.controlCoordinates.initialPinchDistance * _this6.controlCoordinates.initialScale, 1, _this6.options.maxZoom);
|
876 |
+
_this6.controlCoordinates.limitOffsetX = (_this6.controlCoordinates.imgWidth * _this6.controlCoordinates.targetScale - _this6.controlCoordinates.containerWidth) / 2;
|
877 |
+
_this6.controlCoordinates.limitOffsetY = (_this6.controlCoordinates.imgHeight * _this6.controlCoordinates.targetScale - _this6.controlCoordinates.containerHeight) / 2;
|
878 |
+
_this6.controlCoordinates.scaleDifference = _this6.controlCoordinates.targetScale - _this6.controlCoordinates.initialScale;
|
879 |
+
_this6.controlCoordinates.targetOffsetX = _this6.controlCoordinates.imgWidth * _this6.controlCoordinates.targetScale <= _this6.controlCoordinates.containerWidth ? 0 : _this6.minMax(_this6.controlCoordinates.initialOffsetX - (_this6.controlCoordinates.pinchOffsetX - _this6.controlCoordinates.containerOffsetX - _this6.controlCoordinates.containerWidth / 2 - _this6.controlCoordinates.initialOffsetX) / (_this6.controlCoordinates.targetScale - _this6.controlCoordinates.scaleDifference) * _this6.controlCoordinates.scaleDifference, _this6.controlCoordinates.limitOffsetX * -1, _this6.controlCoordinates.limitOffsetX);
|
880 |
+
_this6.controlCoordinates.targetOffsetY = _this6.controlCoordinates.imgHeight * _this6.controlCoordinates.targetScale <= _this6.controlCoordinates.containerHeight ? 0 : _this6.minMax(_this6.controlCoordinates.initialOffsetY - (_this6.controlCoordinates.pinchOffsetY - _this6.controlCoordinates.containerOffsetY - _this6.controlCoordinates.containerHeight / 2 - _this6.controlCoordinates.initialOffsetY) / (_this6.controlCoordinates.targetScale - _this6.controlCoordinates.scaleDifference) * _this6.controlCoordinates.scaleDifference, _this6.controlCoordinates.limitOffsetY * -1, _this6.controlCoordinates.limitOffsetY);
|
881 |
+
|
882 |
+
_this6.zoomPanElement(_this6.controlCoordinates.targetOffsetX + "px", _this6.controlCoordinates.targetOffsetY + "px", _this6.controlCoordinates.targetScale);
|
883 |
+
|
884 |
+
if (_this6.controlCoordinates.targetScale > 1) {
|
885 |
+
_this6.controlCoordinates.zoomed = true;
|
886 |
+
|
887 |
+
if (!_this6.domNodes.caption.style.opacity && _this6.domNodes.caption.style.display !== 'none') {
|
888 |
+
_this6.fadeOut(_this6.domNodes.caption, _this6.options.fadeSpeed);
|
889 |
+
}
|
890 |
+
}
|
891 |
+
|
892 |
+
_this6.controlCoordinates.initialPinchDistance = _this6.controlCoordinates.targetPinchDistance;
|
893 |
+
_this6.controlCoordinates.initialScale = _this6.controlCoordinates.targetScale;
|
894 |
+
_this6.controlCoordinates.initialOffsetX = _this6.controlCoordinates.targetOffsetX;
|
895 |
+
_this6.controlCoordinates.initialOffsetY = _this6.controlCoordinates.targetOffsetY;
|
896 |
+
}
|
897 |
+
} else {
|
898 |
+
_this6.controlCoordinates.targetScale = _this6.controlCoordinates.initialScale;
|
899 |
+
_this6.controlCoordinates.limitOffsetX = (_this6.controlCoordinates.imgWidth * _this6.controlCoordinates.targetScale - _this6.controlCoordinates.containerWidth) / 2;
|
900 |
+
_this6.controlCoordinates.limitOffsetY = (_this6.controlCoordinates.imgHeight * _this6.controlCoordinates.targetScale - _this6.controlCoordinates.containerHeight) / 2;
|
901 |
+
_this6.controlCoordinates.targetOffsetX = _this6.controlCoordinates.imgWidth * _this6.controlCoordinates.targetScale <= _this6.controlCoordinates.containerWidth ? 0 : _this6.minMax(_this6.controlCoordinates.pointerOffsetX - (_this6.controlCoordinates.initialPointerOffsetX - _this6.controlCoordinates.initialOffsetX), _this6.controlCoordinates.limitOffsetX * -1, _this6.controlCoordinates.limitOffsetX);
|
902 |
+
_this6.controlCoordinates.targetOffsetY = _this6.controlCoordinates.imgHeight * _this6.controlCoordinates.targetScale <= _this6.controlCoordinates.containerHeight ? 0 : _this6.minMax(_this6.controlCoordinates.pointerOffsetY - (_this6.controlCoordinates.initialPointerOffsetY - _this6.controlCoordinates.initialOffsetY), _this6.controlCoordinates.limitOffsetY * -1, _this6.controlCoordinates.limitOffsetY);
|
903 |
+
|
904 |
+
if (Math.abs(_this6.controlCoordinates.targetOffsetX) === Math.abs(_this6.controlCoordinates.limitOffsetX)) {
|
905 |
+
_this6.controlCoordinates.initialOffsetX = _this6.controlCoordinates.targetOffsetX;
|
906 |
+
_this6.controlCoordinates.initialPointerOffsetX = _this6.controlCoordinates.pointerOffsetX;
|
907 |
+
}
|
908 |
+
|
909 |
+
if (Math.abs(_this6.controlCoordinates.targetOffsetY) === Math.abs(_this6.controlCoordinates.limitOffsetY)) {
|
910 |
+
_this6.controlCoordinates.initialOffsetY = _this6.controlCoordinates.targetOffsetY;
|
911 |
+
_this6.controlCoordinates.initialPointerOffsetY = _this6.controlCoordinates.pointerOffsetY;
|
912 |
+
}
|
913 |
+
|
914 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, _this6.controlCoordinates.targetOffsetX, _this6.controlCoordinates.targetOffsetY);
|
915 |
+
|
916 |
+
_this6.zoomPanElement(_this6.controlCoordinates.targetOffsetX + "px", _this6.controlCoordinates.targetOffsetY + "px", _this6.controlCoordinates.targetScale);
|
917 |
+
}
|
918 |
+
}
|
919 |
+
/* Mouse Move implementation */
|
920 |
+
|
921 |
+
|
922 |
+
if (event.type === 'mousemove' && _this6.controlCoordinates.mousedown) {
|
923 |
+
if (event.type == 'touchmove') return true;
|
924 |
+
if (_this6.controlCoordinates.capture === false) return false;
|
925 |
+
_this6.controlCoordinates.pointerOffsetX = event.clientX;
|
926 |
+
_this6.controlCoordinates.pointerOffsetY = event.clientY;
|
927 |
+
_this6.controlCoordinates.targetScale = _this6.controlCoordinates.initialScale;
|
928 |
+
_this6.controlCoordinates.limitOffsetX = (_this6.controlCoordinates.imgWidth * _this6.controlCoordinates.targetScale - _this6.controlCoordinates.containerWidth) / 2;
|
929 |
+
_this6.controlCoordinates.limitOffsetY = (_this6.controlCoordinates.imgHeight * _this6.controlCoordinates.targetScale - _this6.controlCoordinates.containerHeight) / 2;
|
930 |
+
_this6.controlCoordinates.targetOffsetX = _this6.controlCoordinates.imgWidth * _this6.controlCoordinates.targetScale <= _this6.controlCoordinates.containerWidth ? 0 : _this6.minMax(_this6.controlCoordinates.pointerOffsetX - (_this6.controlCoordinates.initialPointerOffsetX - _this6.controlCoordinates.initialOffsetX), _this6.controlCoordinates.limitOffsetX * -1, _this6.controlCoordinates.limitOffsetX);
|
931 |
+
_this6.controlCoordinates.targetOffsetY = _this6.controlCoordinates.imgHeight * _this6.controlCoordinates.targetScale <= _this6.controlCoordinates.containerHeight ? 0 : _this6.minMax(_this6.controlCoordinates.pointerOffsetY - (_this6.controlCoordinates.initialPointerOffsetY - _this6.controlCoordinates.initialOffsetY), _this6.controlCoordinates.limitOffsetY * -1, _this6.controlCoordinates.limitOffsetY);
|
932 |
+
|
933 |
+
if (Math.abs(_this6.controlCoordinates.targetOffsetX) === Math.abs(_this6.controlCoordinates.limitOffsetX)) {
|
934 |
+
_this6.controlCoordinates.initialOffsetX = _this6.controlCoordinates.targetOffsetX;
|
935 |
+
_this6.controlCoordinates.initialPointerOffsetX = _this6.controlCoordinates.pointerOffsetX;
|
936 |
+
}
|
937 |
+
|
938 |
+
if (Math.abs(_this6.controlCoordinates.targetOffsetY) === Math.abs(_this6.controlCoordinates.limitOffsetY)) {
|
939 |
+
_this6.controlCoordinates.initialOffsetY = _this6.controlCoordinates.targetOffsetY;
|
940 |
+
_this6.controlCoordinates.initialPointerOffsetY = _this6.controlCoordinates.pointerOffsetY;
|
941 |
+
}
|
942 |
+
|
943 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, _this6.controlCoordinates.targetOffsetX, _this6.controlCoordinates.targetOffsetY);
|
944 |
+
|
945 |
+
_this6.zoomPanElement(_this6.controlCoordinates.targetOffsetX + "px", _this6.controlCoordinates.targetOffsetY + "px", _this6.controlCoordinates.targetScale);
|
946 |
+
}
|
947 |
+
|
948 |
+
if (!_this6.controlCoordinates.zoomed) {
|
949 |
+
_this6.controlCoordinates.swipeEnd = event.pageX || event.touches[0].pageX;
|
950 |
+
_this6.controlCoordinates.swipeYEnd = event.pageY || event.touches[0].pageY;
|
951 |
+
_this6.controlCoordinates.swipeDiff = _this6.controlCoordinates.swipeStart - _this6.controlCoordinates.swipeEnd;
|
952 |
+
_this6.controlCoordinates.swipeYDiff = _this6.controlCoordinates.swipeYStart - _this6.controlCoordinates.swipeYEnd;
|
953 |
+
|
954 |
+
if (_this6.options.animationSlide) {
|
955 |
+
_this6.slide(0, -_this6.controlCoordinates.swipeDiff + 'px');
|
956 |
+
}
|
957 |
+
}
|
958 |
+
});
|
959 |
+
this.addEventListener(this.domNodes.image, ['touchend.' + this.eventNamespace, 'mouseup.' + this.eventNamespace, 'touchcancel.' + this.eventNamespace, 'mouseleave.' + this.eventNamespace, 'pointerup', 'pointercancel', 'MSPointerUp', 'MSPointerCancel'], function (event) {
|
960 |
+
if (_this6.isTouchDevice && event.type === 'touchend') {
|
961 |
+
_this6.controlCoordinates.touchCount = event.touches.length;
|
962 |
+
|
963 |
+
if (_this6.controlCoordinates.touchCount === 0)
|
964 |
+
/* No touch */
|
965 |
+
{
|
966 |
+
/* Set attributes */
|
967 |
+
if (_this6.currentImage) {
|
968 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, _this6.controlCoordinates.targetOffsetX, _this6.controlCoordinates.targetOffsetY);
|
969 |
+
}
|
970 |
+
|
971 |
+
if (_this6.controlCoordinates.initialScale === 1) {
|
972 |
+
_this6.controlCoordinates.zoomed = false;
|
973 |
+
|
974 |
+
if (_this6.domNodes.caption.style.display === 'none') {
|
975 |
+
_this6.fadeIn(_this6.domNodes.caption, _this6.options.fadeSpeed);
|
976 |
+
}
|
977 |
+
}
|
978 |
+
|
979 |
+
_this6.controlCoordinates.initialPinchDistance = null;
|
980 |
+
_this6.controlCoordinates.capture = false;
|
981 |
+
} else if (_this6.controlCoordinates.touchCount === 1)
|
982 |
+
/* Single touch */
|
983 |
+
{
|
984 |
+
_this6.controlCoordinates.initialPointerOffsetX = event.touches[0].clientX;
|
985 |
+
_this6.controlCoordinates.initialPointerOffsetY = event.touches[0].clientY;
|
986 |
+
} else if (_this6.controlCoordinates.touchCount > 1)
|
987 |
+
/* Pinch */
|
988 |
+
{
|
989 |
+
_this6.controlCoordinates.initialPinchDistance = null;
|
990 |
+
}
|
991 |
+
}
|
992 |
+
|
993 |
+
if (_this6.controlCoordinates.mousedown) {
|
994 |
+
_this6.controlCoordinates.mousedown = false;
|
995 |
+
var possibleDir = true;
|
996 |
+
|
997 |
+
if (!_this6.options.loop) {
|
998 |
+
if (_this6.currentImageIndex === 0 && _this6.controlCoordinates.swipeDiff < 0) {
|
999 |
+
possibleDir = false;
|
1000 |
+
}
|
1001 |
+
|
1002 |
+
if (_this6.currentImageIndex >= _this6.relatedElements.length - 1 && _this6.controlCoordinates.swipeDiff > 0) {
|
1003 |
+
possibleDir = false;
|
1004 |
+
}
|
1005 |
+
}
|
1006 |
+
|
1007 |
+
if (Math.abs(_this6.controlCoordinates.swipeDiff) > _this6.options.swipeTolerance && possibleDir) {
|
1008 |
+
_this6.loadImage(_this6.controlCoordinates.swipeDiff > 0 ? 1 : -1);
|
1009 |
+
} else if (_this6.options.animationSlide) {
|
1010 |
+
_this6.slide(_this6.options.animationSpeed / 1000, 0 + 'px');
|
1011 |
+
}
|
1012 |
+
|
1013 |
+
if (_this6.options.swipeClose && Math.abs(_this6.controlCoordinates.swipeYDiff) > 50 && Math.abs(_this6.controlCoordinates.swipeDiff) < _this6.options.swipeTolerance) {
|
1014 |
+
_this6.close();
|
1015 |
+
}
|
1016 |
+
}
|
1017 |
+
});
|
1018 |
+
this.addEventListener(this.domNodes.image, ['dblclick'], function (event) {
|
1019 |
+
if (_this6.isTouchDevice) return;
|
1020 |
+
_this6.controlCoordinates.initialPointerOffsetX = event.clientX;
|
1021 |
+
_this6.controlCoordinates.initialPointerOffsetY = event.clientY;
|
1022 |
+
_this6.controlCoordinates.containerHeight = _this6.getDimensions(_this6.domNodes.image).height;
|
1023 |
+
_this6.controlCoordinates.containerWidth = _this6.getDimensions(_this6.domNodes.image).width;
|
1024 |
+
_this6.controlCoordinates.imgHeight = _this6.getDimensions(_this6.currentImage).height;
|
1025 |
+
_this6.controlCoordinates.imgWidth = _this6.getDimensions(_this6.currentImage).width;
|
1026 |
+
_this6.controlCoordinates.containerOffsetX = _this6.domNodes.image.offsetLeft;
|
1027 |
+
_this6.controlCoordinates.containerOffsetY = _this6.domNodes.image.offsetTop;
|
1028 |
+
|
1029 |
+
_this6.currentImage.classList.add('sl-transition');
|
1030 |
+
|
1031 |
+
if (!_this6.controlCoordinates.zoomed) {
|
1032 |
+
_this6.controlCoordinates.initialScale = _this6.options.doubleTapZoom;
|
1033 |
+
|
1034 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, 0, 0);
|
1035 |
+
|
1036 |
+
_this6.zoomPanElement(0 + "px", 0 + "px", _this6.controlCoordinates.initialScale);
|
1037 |
+
|
1038 |
+
if (!_this6.domNodes.caption.style.opacity && _this6.domNodes.caption.style.display !== 'none') {
|
1039 |
+
_this6.fadeOut(_this6.domNodes.caption, _this6.options.fadeSpeed);
|
1040 |
+
}
|
1041 |
+
|
1042 |
+
_this6.controlCoordinates.zoomed = true;
|
1043 |
+
} else {
|
1044 |
+
_this6.controlCoordinates.initialScale = 1;
|
1045 |
+
|
1046 |
+
_this6.setZoomData(_this6.controlCoordinates.initialScale, 0, 0);
|
1047 |
+
|
1048 |
+
_this6.zoomPanElement(0 + "px", 0 + "px", _this6.controlCoordinates.initialScale);
|
1049 |
+
|
1050 |
+
_this6.controlCoordinates.zoomed = false;
|
1051 |
+
|
1052 |
+
if (_this6.domNodes.caption.style.display === 'none') {
|
1053 |
+
_this6.fadeIn(_this6.domNodes.caption, _this6.options.fadeSpeed);
|
1054 |
+
}
|
1055 |
+
}
|
1056 |
+
|
1057 |
+
setTimeout(function () {
|
1058 |
+
if (_this6.currentImage) {
|
1059 |
+
_this6.currentImage.classList.remove('sl-transition');
|
1060 |
+
}
|
1061 |
+
}, 200);
|
1062 |
+
_this6.controlCoordinates.capture = true;
|
1063 |
+
return false;
|
1064 |
+
});
|
1065 |
+
}
|
1066 |
+
}, {
|
1067 |
+
key: "getDimensions",
|
1068 |
+
value: function getDimensions(element) {
|
1069 |
+
var styles = window.getComputedStyle(element),
|
1070 |
+
height = element.offsetHeight,
|
1071 |
+
width = element.offsetWidth,
|
1072 |
+
borderTopWidth = parseFloat(styles.borderTopWidth),
|
1073 |
+
borderBottomWidth = parseFloat(styles.borderBottomWidth),
|
1074 |
+
paddingTop = parseFloat(styles.paddingTop),
|
1075 |
+
paddingBottom = parseFloat(styles.paddingBottom),
|
1076 |
+
borderLeftWidth = parseFloat(styles.borderLeftWidth),
|
1077 |
+
borderRightWidth = parseFloat(styles.borderRightWidth),
|
1078 |
+
paddingLeft = parseFloat(styles.paddingLeft),
|
1079 |
+
paddingRight = parseFloat(styles.paddingRight);
|
1080 |
+
return {
|
1081 |
+
height: height - borderBottomWidth - borderTopWidth - paddingTop - paddingBottom,
|
1082 |
+
width: width - borderLeftWidth - borderRightWidth - paddingLeft - paddingRight
|
1083 |
+
};
|
1084 |
+
}
|
1085 |
+
}, {
|
1086 |
+
key: "updateHash",
|
1087 |
+
value: function updateHash() {
|
1088 |
+
var newHash = 'pid=' + (this.currentImageIndex + 1),
|
1089 |
+
newURL = window.location.href.split('#')[0] + '#' + newHash;
|
1090 |
+
this.hashReseted = false;
|
1091 |
+
|
1092 |
+
if (this.pushStateSupport) {
|
1093 |
+
window.history[this.historyHasChanges ? 'replaceState' : 'pushState']('', document.title, newURL);
|
1094 |
+
} else {
|
1095 |
+
// what is the browser target of this?
|
1096 |
+
if (this.historyHasChanges) {
|
1097 |
+
window.location.replace(newURL);
|
1098 |
+
} else {
|
1099 |
+
window.location.hash = newHash;
|
1100 |
+
}
|
1101 |
+
}
|
1102 |
+
|
1103 |
+
if (!this.historyHasChanges) {
|
1104 |
+
this.urlChangedOnce = true;
|
1105 |
+
}
|
1106 |
+
|
1107 |
+
this.historyHasChanges = true;
|
1108 |
+
}
|
1109 |
+
}, {
|
1110 |
+
key: "resetHash",
|
1111 |
+
value: function resetHash() {
|
1112 |
+
this.hashReseted = true;
|
1113 |
+
|
1114 |
+
if (this.urlChangedOnce) {
|
1115 |
+
history.back();
|
1116 |
+
} else {
|
1117 |
+
if (this.pushStateSupport) {
|
1118 |
+
history.pushState('', document.title, window.location.pathname + window.location.search);
|
1119 |
+
} else {
|
1120 |
+
window.location.hash = '';
|
1121 |
+
}
|
1122 |
+
} //
|
1123 |
+
//in case an history operation is still pending
|
1124 |
+
|
1125 |
+
|
1126 |
+
clearTimeout(this.historyUpdateTimeout);
|
1127 |
+
}
|
1128 |
+
}, {
|
1129 |
+
key: "updateURL",
|
1130 |
+
value: function updateURL() {
|
1131 |
+
clearTimeout(this.historyUpdateTimeout);
|
1132 |
+
|
1133 |
+
if (!this.historyHasChanges) {
|
1134 |
+
this.updateHash(); // first time
|
1135 |
+
} else {
|
1136 |
+
this.historyUpdateTimeout = setTimeout(this.updateHash.bind(this), 800);
|
1137 |
+
}
|
1138 |
+
}
|
1139 |
+
}, {
|
1140 |
+
key: "setCaption",
|
1141 |
+
value: function setCaption(captionText, imageWidth) {
|
1142 |
+
var _this7 = this;
|
1143 |
+
|
1144 |
+
if (this.options.captions && captionText && captionText !== '' && typeof captionText !== "undefined") {
|
1145 |
+
this.hide(this.domNodes.caption);
|
1146 |
+
this.domNodes.caption.style.width = imageWidth + 'px';
|
1147 |
+
this.domNodes.caption.innerHTML = captionText;
|
1148 |
+
this.domNodes.image.appendChild(this.domNodes.caption);
|
1149 |
+
setTimeout(function () {
|
1150 |
+
_this7.fadeIn(_this7.domNodes.caption, _this7.options.fadeSpeed);
|
1151 |
+
}, this.options.captionDelay);
|
1152 |
+
}
|
1153 |
+
}
|
1154 |
+
}, {
|
1155 |
+
key: "slide",
|
1156 |
+
value: function slide(speed, pos) {
|
1157 |
+
if (!this.transitionCapable) {
|
1158 |
+
return this.domNodes.image.style.left = pos;
|
1159 |
+
}
|
1160 |
+
|
1161 |
+
this.domNodes.image.style[this.transitionPrefix + 'transform'] = 'translateX(' + pos + ')';
|
1162 |
+
this.domNodes.image.style[this.transitionPrefix + 'transition'] = this.transitionPrefix + 'transform ' + speed + 's linear';
|
1163 |
+
}
|
1164 |
+
}, {
|
1165 |
+
key: "getRelated",
|
1166 |
+
value: function getRelated(rel) {
|
1167 |
+
var elems;
|
1168 |
+
|
1169 |
+
if (rel && rel !== false && rel !== 'nofollow') {
|
1170 |
+
elems = Array.from(this.elements).filter(function (element) {
|
1171 |
+
return element.getAttribute('rel') === rel;
|
1172 |
+
});
|
1173 |
+
} else {
|
1174 |
+
elems = this.elements;
|
1175 |
+
}
|
1176 |
+
|
1177 |
+
return elems;
|
1178 |
+
}
|
1179 |
+
}, {
|
1180 |
+
key: "openImage",
|
1181 |
+
value: function openImage(element) {
|
1182 |
+
var _this8 = this;
|
1183 |
+
|
1184 |
+
element.dispatchEvent(new Event('show.' + this.eventNamespace));
|
1185 |
+
|
1186 |
+
if (this.options.disableScroll) {
|
1187 |
+
this.globalScrollbarWidth = this.toggleScrollbar('hide');
|
1188 |
+
}
|
1189 |
+
|
1190 |
+
if (this.options.htmlClass && this.options.htmlClass !== '') {
|
1191 |
+
document.querySelector('html').classList.add(this.options.htmlClass);
|
1192 |
+
}
|
1193 |
+
|
1194 |
+
document.body.appendChild(this.domNodes.wrapper);
|
1195 |
+
this.domNodes.wrapper.appendChild(this.domNodes.image);
|
1196 |
+
|
1197 |
+
if (this.options.overlay) {
|
1198 |
+
document.body.appendChild(this.domNodes.overlay);
|
1199 |
+
}
|
1200 |
+
|
1201 |
+
this.relatedElements = this.getRelated(element.rel);
|
1202 |
+
|
1203 |
+
if (this.options.showCounter) {
|
1204 |
+
if (this.relatedElements.length == 1 && this.domNodes.wrapper.contains(this.domNodes.counter)) {
|
1205 |
+
this.domNodes.wrapper.removeChild(this.domNodes.counter);
|
1206 |
+
} else if (this.relatedElements.length > 1 && !this.domNodes.wrapper.contains(this.domNodes.counter)) {
|
1207 |
+
this.domNodes.wrapper.appendChild(this.domNodes.counter);
|
1208 |
+
}
|
1209 |
+
}
|
1210 |
+
|
1211 |
+
this.isAnimating = true;
|
1212 |
+
this.currentImageIndex = this.relatedElements.indexOf(element);
|
1213 |
+
var targetURL = element.getAttribute(this.options.sourceAttr);
|
1214 |
+
this.currentImage = document.createElement('img');
|
1215 |
+
this.currentImage.style.display = 'none';
|
1216 |
+
this.currentImage.setAttribute('src', targetURL);
|
1217 |
+
this.currentImage.dataset.scale = 1;
|
1218 |
+
this.currentImage.dataset.translateX = 0;
|
1219 |
+
this.currentImage.dataset.translateY = 0;
|
1220 |
+
|
1221 |
+
if (this.loadedImages.indexOf(targetURL) === -1) {
|
1222 |
+
this.loadedImages.push(targetURL);
|
1223 |
+
}
|
1224 |
+
|
1225 |
+
this.domNodes.image.innerHTML = '';
|
1226 |
+
this.domNodes.image.setAttribute('style', '');
|
1227 |
+
this.domNodes.image.appendChild(this.currentImage);
|
1228 |
+
this.fadeIn(this.domNodes.overlay, this.options.fadeSpeed);
|
1229 |
+
this.fadeIn([this.domNodes.counter, this.domNodes.navigation, this.domNodes.closeButton], this.options.fadeSpeed);
|
1230 |
+
this.show(this.domNodes.spinner);
|
1231 |
+
this.domNodes.counter.querySelector('.sl-current').innerHTML = this.currentImageIndex + 1;
|
1232 |
+
this.domNodes.counter.querySelector('.sl-total').innerHTML = this.relatedElements.length;
|
1233 |
+
this.adjustImage();
|
1234 |
+
|
1235 |
+
if (this.options.preloading) {
|
1236 |
+
this.preload();
|
1237 |
+
}
|
1238 |
+
|
1239 |
+
setTimeout(function () {
|
1240 |
+
element.dispatchEvent(new Event('shown.' + _this8.eventNamespace));
|
1241 |
+
}, this.options.animationSpeed);
|
1242 |
+
}
|
1243 |
+
}, {
|
1244 |
+
key: "forceFocus",
|
1245 |
+
value: function forceFocus() {
|
1246 |
+
var _this9 = this;
|
1247 |
+
|
1248 |
+
this.removeEventListener(document, 'focusin.' + this.eventNamespace);
|
1249 |
+
this.addEventListener(document, 'focusin.' + this.eventNamespace, function (event) {
|
1250 |
+
if (document !== event.target && _this9.domNodes.wrapper !== event.target && !_this9.domNodes.wrapper.contains(event.target)) {
|
1251 |
+
_this9.domNodes.wrapper.focus();
|
1252 |
+
}
|
1253 |
+
});
|
1254 |
+
} // utility
|
1255 |
+
|
1256 |
+
}, {
|
1257 |
+
key: "addEventListener",
|
1258 |
+
value: function addEventListener(elements, events, callback, opts) {
|
1259 |
+
elements = this.wrap(elements);
|
1260 |
+
events = this.wrap(events);
|
1261 |
+
|
1262 |
+
var _iterator = _createForOfIteratorHelper(elements),
|
1263 |
+
_step;
|
1264 |
+
|
1265 |
+
try {
|
1266 |
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
1267 |
+
var element = _step.value;
|
1268 |
+
|
1269 |
+
if (!element.namespaces) {
|
1270 |
+
element.namespaces = {};
|
1271 |
+
} // save the namespaces addEventListener the DOM element itself
|
1272 |
+
|
1273 |
+
|
1274 |
+
var _iterator2 = _createForOfIteratorHelper(events),
|
1275 |
+
_step2;
|
1276 |
+
|
1277 |
+
try {
|
1278 |
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
1279 |
+
var event = _step2.value;
|
1280 |
+
var options = opts || false;
|
1281 |
+
element.namespaces[event] = callback;
|
1282 |
+
element.addEventListener(event.split('.')[0], callback, options);
|
1283 |
+
}
|
1284 |
+
} catch (err) {
|
1285 |
+
_iterator2.e(err);
|
1286 |
+
} finally {
|
1287 |
+
_iterator2.f();
|
1288 |
+
}
|
1289 |
+
}
|
1290 |
+
} catch (err) {
|
1291 |
+
_iterator.e(err);
|
1292 |
+
} finally {
|
1293 |
+
_iterator.f();
|
1294 |
+
}
|
1295 |
+
}
|
1296 |
+
}, {
|
1297 |
+
key: "removeEventListener",
|
1298 |
+
value: function removeEventListener(elements, events) {
|
1299 |
+
elements = this.wrap(elements);
|
1300 |
+
events = this.wrap(events);
|
1301 |
+
|
1302 |
+
var _iterator3 = _createForOfIteratorHelper(elements),
|
1303 |
+
_step3;
|
1304 |
+
|
1305 |
+
try {
|
1306 |
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
1307 |
+
var element = _step3.value;
|
1308 |
+
|
1309 |
+
var _iterator4 = _createForOfIteratorHelper(events),
|
1310 |
+
_step4;
|
1311 |
+
|
1312 |
+
try {
|
1313 |
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
1314 |
+
var event = _step4.value;
|
1315 |
+
|
1316 |
+
if (element.namespaces && element.namespaces[event]) {
|
1317 |
+
element.removeEventListener(event.split('.')[0], element.namespaces[event]);
|
1318 |
+
delete element.namespaces[event];
|
1319 |
+
}
|
1320 |
+
}
|
1321 |
+
} catch (err) {
|
1322 |
+
_iterator4.e(err);
|
1323 |
+
} finally {
|
1324 |
+
_iterator4.f();
|
1325 |
+
}
|
1326 |
+
}
|
1327 |
+
} catch (err) {
|
1328 |
+
_iterator3.e(err);
|
1329 |
+
} finally {
|
1330 |
+
_iterator3.f();
|
1331 |
+
}
|
1332 |
+
}
|
1333 |
+
}, {
|
1334 |
+
key: "fadeOut",
|
1335 |
+
value: function fadeOut(elements, duration, callback) {
|
1336 |
+
var _this10 = this;
|
1337 |
+
|
1338 |
+
elements = this.wrap(elements);
|
1339 |
+
|
1340 |
+
var _iterator5 = _createForOfIteratorHelper(elements),
|
1341 |
+
_step5;
|
1342 |
+
|
1343 |
+
try {
|
1344 |
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
1345 |
+
var element = _step5.value;
|
1346 |
+
element.style.opacity = 1;
|
1347 |
+
}
|
1348 |
+
} catch (err) {
|
1349 |
+
_iterator5.e(err);
|
1350 |
+
} finally {
|
1351 |
+
_iterator5.f();
|
1352 |
+
}
|
1353 |
+
|
1354 |
+
this.isFadeIn = false;
|
1355 |
+
|
1356 |
+
var step = 16.66666 / (duration || this.options.fadeSpeed),
|
1357 |
+
fade = function fade() {
|
1358 |
+
var currentOpacity = parseFloat(elements[0].style.opacity);
|
1359 |
+
|
1360 |
+
if ((currentOpacity -= step) < 0) {
|
1361 |
+
var _iterator6 = _createForOfIteratorHelper(elements),
|
1362 |
+
_step6;
|
1363 |
+
|
1364 |
+
try {
|
1365 |
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
1366 |
+
var element = _step6.value;
|
1367 |
+
element.style.display = "none";
|
1368 |
+
element.style.opacity = '';
|
1369 |
+
}
|
1370 |
+
} catch (err) {
|
1371 |
+
_iterator6.e(err);
|
1372 |
+
} finally {
|
1373 |
+
_iterator6.f();
|
1374 |
+
}
|
1375 |
+
|
1376 |
+
callback && callback.call(_this10, elements);
|
1377 |
+
} else {
|
1378 |
+
var _iterator7 = _createForOfIteratorHelper(elements),
|
1379 |
+
_step7;
|
1380 |
+
|
1381 |
+
try {
|
1382 |
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
1383 |
+
var _element = _step7.value;
|
1384 |
+
_element.style.opacity = currentOpacity;
|
1385 |
+
}
|
1386 |
+
} catch (err) {
|
1387 |
+
_iterator7.e(err);
|
1388 |
+
} finally {
|
1389 |
+
_iterator7.f();
|
1390 |
+
}
|
1391 |
+
|
1392 |
+
requestAnimationFrame(fade);
|
1393 |
+
}
|
1394 |
+
};
|
1395 |
+
|
1396 |
+
fade();
|
1397 |
+
}
|
1398 |
+
}, {
|
1399 |
+
key: "fadeIn",
|
1400 |
+
value: function fadeIn(elements, duration, callback, display) {
|
1401 |
+
var _this11 = this;
|
1402 |
+
|
1403 |
+
elements = this.wrap(elements);
|
1404 |
+
|
1405 |
+
var _iterator8 = _createForOfIteratorHelper(elements),
|
1406 |
+
_step8;
|
1407 |
+
|
1408 |
+
try {
|
1409 |
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
1410 |
+
var element = _step8.value;
|
1411 |
+
element.style.opacity = 0;
|
1412 |
+
element.style.display = display || "block";
|
1413 |
+
}
|
1414 |
+
} catch (err) {
|
1415 |
+
_iterator8.e(err);
|
1416 |
+
} finally {
|
1417 |
+
_iterator8.f();
|
1418 |
+
}
|
1419 |
+
|
1420 |
+
this.isFadeIn = true;
|
1421 |
+
|
1422 |
+
var opacityTarget = parseFloat(elements[0].dataset.opacityTarget || 1),
|
1423 |
+
step = 16.66666 * opacityTarget / (duration || this.options.fadeSpeed),
|
1424 |
+
fade = function fade() {
|
1425 |
+
var currentOpacity = parseFloat(elements[0].style.opacity);
|
1426 |
+
|
1427 |
+
if (!((currentOpacity += step) > opacityTarget)) {
|
1428 |
+
var _iterator9 = _createForOfIteratorHelper(elements),
|
1429 |
+
_step9;
|
1430 |
+
|
1431 |
+
try {
|
1432 |
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
1433 |
+
var element = _step9.value;
|
1434 |
+
element.style.opacity = currentOpacity;
|
1435 |
+
}
|
1436 |
+
} catch (err) {
|
1437 |
+
_iterator9.e(err);
|
1438 |
+
} finally {
|
1439 |
+
_iterator9.f();
|
1440 |
+
}
|
1441 |
+
|
1442 |
+
if (!_this11.isFadeIn) return;
|
1443 |
+
requestAnimationFrame(fade);
|
1444 |
+
} else {
|
1445 |
+
var _iterator10 = _createForOfIteratorHelper(elements),
|
1446 |
+
_step10;
|
1447 |
+
|
1448 |
+
try {
|
1449 |
+
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
|
1450 |
+
var _element2 = _step10.value;
|
1451 |
+
_element2.style.opacity = '';
|
1452 |
+
}
|
1453 |
+
} catch (err) {
|
1454 |
+
_iterator10.e(err);
|
1455 |
+
} finally {
|
1456 |
+
_iterator10.f();
|
1457 |
+
}
|
1458 |
+
|
1459 |
+
callback && callback.call(_this11, elements);
|
1460 |
+
}
|
1461 |
+
};
|
1462 |
+
|
1463 |
+
fade();
|
1464 |
+
}
|
1465 |
+
}, {
|
1466 |
+
key: "hide",
|
1467 |
+
value: function hide(elements) {
|
1468 |
+
elements = this.wrap(elements);
|
1469 |
+
|
1470 |
+
var _iterator11 = _createForOfIteratorHelper(elements),
|
1471 |
+
_step11;
|
1472 |
+
|
1473 |
+
try {
|
1474 |
+
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
|
1475 |
+
var element = _step11.value;
|
1476 |
+
element.dataset.initialDisplay = element.style.display;
|
1477 |
+
element.style.display = 'none';
|
1478 |
+
}
|
1479 |
+
} catch (err) {
|
1480 |
+
_iterator11.e(err);
|
1481 |
+
} finally {
|
1482 |
+
_iterator11.f();
|
1483 |
+
}
|
1484 |
+
}
|
1485 |
+
}, {
|
1486 |
+
key: "show",
|
1487 |
+
value: function show(elements, display) {
|
1488 |
+
elements = this.wrap(elements);
|
1489 |
+
|
1490 |
+
var _iterator12 = _createForOfIteratorHelper(elements),
|
1491 |
+
_step12;
|
1492 |
+
|
1493 |
+
try {
|
1494 |
+
for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
|
1495 |
+
var element = _step12.value;
|
1496 |
+
element.style.display = element.dataset.initialDisplay || display || 'block';
|
1497 |
+
}
|
1498 |
+
} catch (err) {
|
1499 |
+
_iterator12.e(err);
|
1500 |
+
} finally {
|
1501 |
+
_iterator12.f();
|
1502 |
+
}
|
1503 |
+
}
|
1504 |
+
}, {
|
1505 |
+
key: "wrap",
|
1506 |
+
value: function wrap(input) {
|
1507 |
+
return typeof input[Symbol.iterator] === 'function' && typeof input !== 'string' ? input : [input];
|
1508 |
+
}
|
1509 |
+
}, {
|
1510 |
+
key: "on",
|
1511 |
+
value: function on(events, callback) {
|
1512 |
+
events = this.wrap(events);
|
1513 |
+
|
1514 |
+
var _iterator13 = _createForOfIteratorHelper(this.elements),
|
1515 |
+
_step13;
|
1516 |
+
|
1517 |
+
try {
|
1518 |
+
for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
|
1519 |
+
var element = _step13.value;
|
1520 |
+
|
1521 |
+
if (!element.fullyNamespacedEvents) {
|
1522 |
+
element.fullyNamespacedEvents = {};
|
1523 |
+
}
|
1524 |
+
|
1525 |
+
var _iterator14 = _createForOfIteratorHelper(events),
|
1526 |
+
_step14;
|
1527 |
+
|
1528 |
+
try {
|
1529 |
+
for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
|
1530 |
+
var event = _step14.value;
|
1531 |
+
element.fullyNamespacedEvents[event] = callback;
|
1532 |
+
element.addEventListener(event, callback);
|
1533 |
+
}
|
1534 |
+
} catch (err) {
|
1535 |
+
_iterator14.e(err);
|
1536 |
+
} finally {
|
1537 |
+
_iterator14.f();
|
1538 |
+
}
|
1539 |
+
}
|
1540 |
+
} catch (err) {
|
1541 |
+
_iterator13.e(err);
|
1542 |
+
} finally {
|
1543 |
+
_iterator13.f();
|
1544 |
+
}
|
1545 |
+
|
1546 |
+
return this;
|
1547 |
+
}
|
1548 |
+
}, {
|
1549 |
+
key: "off",
|
1550 |
+
value: function off(events) {
|
1551 |
+
events = this.wrap(events);
|
1552 |
+
|
1553 |
+
var _iterator15 = _createForOfIteratorHelper(this.elements),
|
1554 |
+
_step15;
|
1555 |
+
|
1556 |
+
try {
|
1557 |
+
for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
|
1558 |
+
var element = _step15.value;
|
1559 |
+
|
1560 |
+
var _iterator16 = _createForOfIteratorHelper(events),
|
1561 |
+
_step16;
|
1562 |
+
|
1563 |
+
try {
|
1564 |
+
for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
|
1565 |
+
var event = _step16.value;
|
1566 |
+
|
1567 |
+
if (typeof element.fullyNamespacedEvents !== 'undefined' && event in element.fullyNamespacedEvents) {
|
1568 |
+
element.removeEventListener(event, element.fullyNamespacedEvents[event]);
|
1569 |
+
}
|
1570 |
+
}
|
1571 |
+
} catch (err) {
|
1572 |
+
_iterator16.e(err);
|
1573 |
+
} finally {
|
1574 |
+
_iterator16.f();
|
1575 |
+
}
|
1576 |
+
}
|
1577 |
+
} catch (err) {
|
1578 |
+
_iterator15.e(err);
|
1579 |
+
} finally {
|
1580 |
+
_iterator15.f();
|
1581 |
+
}
|
1582 |
+
|
1583 |
+
return this;
|
1584 |
+
} // api
|
1585 |
+
|
1586 |
+
}, {
|
1587 |
+
key: "open",
|
1588 |
+
value: function open(elem) {
|
1589 |
+
elem = elem || this.elements[0];
|
1590 |
+
|
1591 |
+
if (typeof jQuery !== "undefined" && elem instanceof jQuery) {
|
1592 |
+
elem = elem.get(0);
|
1593 |
+
}
|
1594 |
+
|
1595 |
+
this.initialImageIndex = this.elements.indexOf(elem);
|
1596 |
+
|
1597 |
+
if (this.initialImageIndex > -1) {
|
1598 |
+
this.openImage(elem);
|
1599 |
+
}
|
1600 |
+
}
|
1601 |
+
}, {
|
1602 |
+
key: "next",
|
1603 |
+
value: function next() {
|
1604 |
+
this.loadImage(1);
|
1605 |
+
}
|
1606 |
+
}, {
|
1607 |
+
key: "prev",
|
1608 |
+
value: function prev() {
|
1609 |
+
this.loadImage(-1);
|
1610 |
+
} //close is exposed anyways..
|
1611 |
+
|
1612 |
+
}, {
|
1613 |
+
key: "destroy",
|
1614 |
+
value: function destroy() {
|
1615 |
+
//remove all custom event listeners from elements
|
1616 |
+
this.off(['close.' + this.eventNamespace, 'closed.' + this.eventNamespace, 'nextImageLoaded.' + this.eventNamespace, 'prevImageLoaded.' + this.eventNamespace, 'change.' + this.eventNamespace, 'nextDone.' + this.eventNamespace, 'prevDone.' + this.eventNamespace, 'error.' + this.eventNamespace, 'changed.' + this.eventNamespace, 'next.' + this.eventNamespace, 'prev.' + this.eventNamespace, 'show.' + this.eventNamespace, 'shown.' + this.eventNamespace]);
|
1617 |
+
this.removeEventListener(this.elements, 'click.' + this.eventNamespace);
|
1618 |
+
this.removeEventListener(document, 'focusin.' + this.eventNamespace);
|
1619 |
+
this.removeEventListener(document.body, 'contextmenu.' + this.eventNamespace);
|
1620 |
+
this.removeEventListener(document.body, 'keyup.' + this.eventNamespace);
|
1621 |
+
this.removeEventListener(this.domNodes.navigation.getElementsByTagName('button'), 'click.' + this.eventNamespace);
|
1622 |
+
this.removeEventListener(this.domNodes.closeButton, 'click.' + this.eventNamespace);
|
1623 |
+
this.removeEventListener(window, 'resize.' + this.eventNamespace);
|
1624 |
+
this.removeEventListener(window, 'hashchange.' + this.eventNamespace);
|
1625 |
+
this.close();
|
1626 |
+
|
1627 |
+
if (this.isOpen) {
|
1628 |
+
document.body.removeChild(this.domNodes.wrapper);
|
1629 |
+
document.body.removeChild(this.domNodes.overlay);
|
1630 |
+
}
|
1631 |
+
|
1632 |
+
this.elements = null;
|
1633 |
+
}
|
1634 |
+
}, {
|
1635 |
+
key: "refresh",
|
1636 |
+
value: function refresh() {
|
1637 |
+
if (!this.initialSelector) {
|
1638 |
+
throw 'refreshing only works when you initialize using a selector!';
|
1639 |
+
}
|
1640 |
+
|
1641 |
+
var options = this.options,
|
1642 |
+
selector = this.initialSelector;
|
1643 |
+
this.destroy();
|
1644 |
+
this.constructor(selector, options);
|
1645 |
+
return this;
|
1646 |
+
}
|
1647 |
+
}, {
|
1648 |
+
key: "hash",
|
1649 |
+
get: function get() {
|
1650 |
+
return window.location.hash.substring(1);
|
1651 |
+
}
|
1652 |
+
}]);
|
1653 |
+
|
1654 |
+
return SimpleLightbox;
|
1655 |
+
}();
|
1656 |
+
|
1657 |
+
var _default = SimpleLightbox;
|
1658 |
+
exports["default"] = _default;
|
1659 |
+
global.SimpleLightbox = SimpleLightbox;
|
1660 |
+
|
1661 |
+
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1662 |
+
},{}]},{},[1]);
|
js/src/simple-lightbox.jquery.min.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function s(a,r,l){function d(e,t){if(!r[e]){if(!a[e]){var o="function"==typeof require&&require;if(!t&&o)return o(e,!0);if(c)return c(e,!0);var i=new Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}var n=r[e]={exports:{}};a[e][0].call(n.exports,function(t){return d(a[e][1][t]||t)},n,n.exports,s,a,r,l)}return r[e].exports}for(var c="function"==typeof require&&require,t=0;t<l.length;t++)d(l[t]);return d}({1:[function(t,e,o){"use strict";var i;t("./simple-lightbox"),i=jQuery,window,document,i.fn.simpleLightbox=function(t){return this.length?new SimpleLightbox(this.get(),t):null}},{"./simple-lightbox":2}],2:[function(t,e,n){(function(o){(function(){"use strict";function h(t,e){var o;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(o=function(t,e){if(!t)return;if("string"==typeof t)return l(t,e);var o=Object.prototype.toString.call(t).slice(8,-1);"Object"===o&&t.constructor&&(o=t.constructor.name);if("Map"===o||"Set"===o)return Array.from(t);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return l(t,e)}(t))||e&&t&&"number"==typeof t.length){o&&(t=o);var i=0,n=function(){};return{s:n,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,r=!1;return{s:function(){o=t[Symbol.iterator]()},n:function(){var t=o.next();return a=t.done,t},e:function(t){r=!0,s=t},f:function(){try{a||null==o.return||o.return()}finally{if(r)throw s}}}}function l(t,e){(null==e||e>t.length)&&(e=t.length);for(var o=0,i=new Array(e);o<e;o++)i[o]=t[o];return i}function i(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var t=function(){function n(t,e){var o=this;if(!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),s(this,"defaultOptions",{sourceAttr:"href",overlay:!0,spinner:!0,nav:!0,navText:["‹","›"],captions:!0,captionDelay:0,captionSelector:"img",captionType:"attr",captionsData:"title",captionPosition:"bottom",captionClass:"",close:!0,closeText:"×",swipeClose:!0,showCounter:!0,fileExt:"png|jpg|jpeg|gif|webp",animationSlide:!0,animationSpeed:250,preloading:!0,enableKeyboard:!0,loop:!0,rel:!1,docClose:!0,swipeTolerance:50,className:"simple-lightbox",widthRatio:.8,heightRatio:.9,scaleImageToRatio:!1,disableRightClick:!1,disableScroll:!0,alertError:!0,alertErrorMessage:"Image not found, next image will be loaded",additionalHtml:!1,history:!0,throttleInterval:0,doubleTapZoom:2,maxZoom:10,htmlClass:"has-lightbox",rtl:!1,fixedClass:"sl-fixed",fadeSpeed:300,uniqueImages:!0,focus:!0}),s(this,"transitionPrefix",void 0),s(this,"transitionCapable",!1),s(this,"isTouchDevice","ontouchstart"in window),s(this,"initialLocationHash",void 0),s(this,"pushStateSupport","pushState"in history),s(this,"isOpen",!1),s(this,"isAnimating",!1),s(this,"isClosing",!1),s(this,"isFadeIn",!1),s(this,"urlChangedOnce",!1),s(this,"hashReseted",!1),s(this,"historyHasChanges",!1),s(this,"historyUpdateTimeout",null),s(this,"currentImage",void 0),s(this,"eventNamespace","simplelightbox"),s(this,"domNodes",{}),s(this,"loadedImages",[]),s(this,"initialImageIndex",0),s(this,"currentImageIndex",0),s(this,"initialSelector",null),s(this,"globalScrollbarWidth",0),s(this,"controlCoordinates",{swipeDiff:0,swipeYDiff:0,swipeStart:0,swipeEnd:0,swipeYStart:0,swipeYEnd:0,mousedown:!1,imageLeft:0,zoomed:!1,containerHeight:0,containerWidth:0,containerOffsetX:0,containerOffsetY:0,imgHeight:0,imgWidth:0,capture:!1,initialOffsetX:0,initialOffsetY:0,initialPointerOffsetX:0,initialPointerOffsetY:0,initialPointerOffsetX2:0,initialPointerOffsetY2:0,initialScale:1,initialPinchDistance:0,pointerOffsetX:0,pointerOffsetY:0,pointerOffsetX2:0,pointerOffsetY2:0,targetOffsetX:0,targetOffsetY:0,targetScale:0,pinchOffsetX:0,pinchOffsetY:0,limitOffsetX:0,limitOffsetY:0,scaleDifference:0,targetPinchDistance:0,touchCount:0,doubleTapped:!1,touchmoveCount:0}),this.options=Object.assign(this.defaultOptions,e),"string"==typeof t?(this.initialSelector=t,this.elements=Array.from(document.querySelectorAll(t))):this.elements=void 0!==t.length&&0<t.length?Array.from(t):[t],this.relatedElements=[],this.transitionPrefix=this.calculateTransitionPrefix(),this.transitionCapable=!1!==this.transitionPrefix,this.initialLocationHash=this.hash,this.options.rel&&(this.elements=this.getRelated(this.options.rel)),this.options.uniqueImages){var i=[];this.elements=Array.from(this.elements).filter(function(t){var e=t.getAttribute(o.options.sourceAttr);return-1===i.indexOf(e)&&(i.push(e),!0)})}this.createDomNodes(),this.options.close&&this.domNodes.wrapper.appendChild(this.domNodes.closeButton),this.options.nav&&this.domNodes.wrapper.appendChild(this.domNodes.navigation),this.options.spinner&&this.domNodes.wrapper.appendChild(this.domNodes.spinner),this.addEventListener(this.elements,"click."+this.eventNamespace,function(t){if(o.isValidLink(t.currentTarget)){if(t.preventDefault(),o.isAnimating)return!1;o.initialImageIndex=o.elements.indexOf(t.currentTarget),o.openImage(t.currentTarget)}}),this.options.docClose&&this.addEventListener(this.domNodes.wrapper,["click."+this.eventNamespace,"touchstart."+this.eventNamespace],function(t){o.isOpen&&t.target===t.currentTarget&&o.close()}),this.options.disableRightClick&&this.addEventListener(document.body,"contextmenu."+this.eventNamespace,function(t){t.target.classList.contains("sl-overlay")&&t.preventDefault()}),this.options.enableKeyboard&&this.addEventListener(document.body,"keyup."+this.eventNamespace,this.throttle(function(t){if(o.controlCoordinates.swipeDiff=0,o.isAnimating&&"Escape"===t.key)return o.currentImage.setAttribute("src",""),o.isAnimating=!1,o.close();o.isOpen&&(t.preventDefault(),"Escape"===t.key&&o.close(),!o.isAnimating&&-1<["ArrowLeft","ArrowRight"].indexOf(t.key)&&o.loadImage("ArrowRight"===t.key?1:-1))},this.options.throttleInterval)),this.addEvents()}var t,e,o;return t=n,(e=[{key:"createDomNodes",value:function(){this.domNodes.overlay=document.createElement("div"),this.domNodes.overlay.classList.add("sl-overlay"),this.domNodes.overlay.dataset.opacityTarget=".7",this.domNodes.closeButton=document.createElement("button"),this.domNodes.closeButton.classList.add("sl-close"),this.domNodes.closeButton.innerHTML=this.options.closeText,this.domNodes.spinner=document.createElement("div"),this.domNodes.spinner.classList.add("sl-spinner"),this.domNodes.spinner.innerHTML="<div></div>",this.domNodes.navigation=document.createElement("div"),this.domNodes.navigation.classList.add("sl-navigation"),this.domNodes.navigation.innerHTML='<button class="sl-prev">'.concat(this.options.navText[0],'</button><button class="sl-next">').concat(this.options.navText[1],"</button>"),this.domNodes.counter=document.createElement("div"),this.domNodes.counter.classList.add("sl-counter"),this.domNodes.counter.innerHTML='<span class="sl-current"></span>/<span class="sl-total"></span>',this.domNodes.caption=document.createElement("div"),this.domNodes.caption.classList.add("sl-caption","pos-"+this.options.captionPosition),this.options.captionClass&&this.domNodes.caption.classList.add(this.options.captionClass),this.domNodes.image=document.createElement("div"),this.domNodes.image.classList.add("sl-image"),this.domNodes.wrapper=document.createElement("div"),this.domNodes.wrapper.classList.add("sl-wrapper"),this.domNodes.wrapper.setAttribute("tabindex",-1),this.domNodes.wrapper.setAttribute("role","dialog"),this.domNodes.wrapper.setAttribute("aria-hidden",!1),this.options.className&&this.domNodes.wrapper.classList.add(this.options.className),this.options.rtl&&this.domNodes.wrapper.classList.add("sl-dir-rtl")}},{key:"throttle",value:function(t,e){var o;return function(){o||(t.apply(this,arguments),o=!0,setTimeout(function(){return o=!1},e))}}},{key:"isValidLink",value:function(t){return!this.options.fileExt||"pathname"in t&&new RegExp("("+this.options.fileExt+")$","i").test(t.pathname)}},{key:"calculateTransitionPrefix",value:function(){var t=(document.body||document.documentElement).style;return"transition"in t?"":"WebkitTransition"in t?"-webkit-":"MozTransition"in t?"-moz-":"OTransition"in t&&"-o"}},{key:"toggleScrollbar",value:function(t){var i=0,e=[].slice.call(document.querySelectorAll("."+this.options.fixedClass));if("hide"===t){var o=window.innerWidth;if(!o){var n=document.documentElement.getBoundingClientRect();o=n.right-Math.abs(n.left)}if(document.body.clientWidth<o){var s=document.createElement("div"),a=parseInt(document.body.style.paddingRight||0,10);s.classList.add("sl-scrollbar-measure"),document.body.appendChild(s),i=s.offsetWidth-s.clientWidth,document.body.removeChild(s),document.body.dataset.originalPaddingRight=a,0<i&&(document.body.classList.add("hidden-scroll"),document.body.style.paddingRight=a+i+"px",e.forEach(function(t){var e=t.style.paddingRight,o=window.getComputedStyle(t)["padding-right"];t.dataset.originalPaddingRight=e,t.style.paddingRight="".concat(parseFloat(o)+i,"px")}))}}else document.body.classList.remove("hidden-scroll"),document.body.style.paddingRight=document.body.dataset.originalPaddingRight,e.forEach(function(t){var e=t.dataset.originalPaddingRight;void 0!==e&&(t.style.paddingRight=e)});return i}},{key:"close",value:function(){var t=this;if(!this.isOpen||this.isAnimating||this.isClosing)return!1;this.isClosing=!0;var e=this.relatedElements[this.currentImageIndex];for(var o in e.dispatchEvent(new Event("close.simplelightbox")),this.options.history&&(this.historyHasChanges=!1,this.hashReseted||this.resetHash()),this.removeEventListener(document,"focusin."+this.eventNamespace),this.fadeOut(document.querySelectorAll(".sl-image img, .sl-overlay, .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter"),this.options.fadeSpeed,function(){t.options.disableScroll&&t.toggleScrollbar("show"),t.options.htmlClass&&""!==t.options.htmlClass&&document.querySelector("html").classList.remove(t.options.htmlClass),document.body.removeChild(t.domNodes.wrapper),document.body.removeChild(t.domNodes.overlay),t.domNodes.additionalHtml=null,e.dispatchEvent(new Event("closed.simplelightbox")),t.isClosing=!1}),this.currentImage=null,this.isOpen=!1,this.isAnimating=!1,this.controlCoordinates)this.controlCoordinates[o]=0;this.controlCoordinates.mousedown=!1,this.controlCoordinates.zoomed=!1,this.controlCoordinates.capture=!1,this.controlCoordinates.initialScale=this.minMax(1,1,this.options.maxZoom),this.controlCoordinates.doubleTapped=!1}},{key:"preload",value:function(){var o=this,i=this.currentImageIndex,t=this.relatedElements.length,e=i+1<0?t-1:t-1<=i+1?0:i+1,n=i-1<0?t-1:t-1<=i-1?0:i-1,s=new Image,a=new Image;s.addEventListener("load",function(t){var e=t.target.getAttribute("src");-1===o.loadedImages.indexOf(e)&&o.loadedImages.push(e),o.relatedElements[i].dispatchEvent(new Event("nextImageLoaded."+o.eventNamespace))}),s.setAttribute("src",this.relatedElements[e].getAttribute(this.options.sourceAttr)),a.addEventListener("load",function(t){var e=t.target.getAttribute("src");-1===o.loadedImages.indexOf(e)&&o.loadedImages.push(e),o.relatedElements[i].dispatchEvent(new Event("prevImageLoaded."+o.eventNamespace))}),a.setAttribute("src",this.relatedElements[n].getAttribute(this.options.sourceAttr))}},{key:"loadImage",value:function(t){var e=this,o=t;this.options.rtl&&(t=-t),this.relatedElements[this.currentImageIndex].dispatchEvent(new Event("change."+this.eventNamespace)),this.relatedElements[this.currentImageIndex].dispatchEvent(new Event((1===t?"next":"prev")+"."+this.eventNamespace));var i=this.currentImageIndex+t;if(this.isAnimating||(i<0||i>=this.relatedElements.length)&&!1===this.options.loop)return!1;this.currentImageIndex=i<0?this.relatedElements.length-1:i>this.relatedElements.length-1?0:i,this.domNodes.counter.querySelector(".sl-current").innerHTML=this.currentImageIndex+1,this.options.animationSlide&&this.slide(this.options.animationSpeed/1e3,-100*o-this.controlCoordinates.swipeDiff+"px"),this.fadeOut(this.domNodes.image,this.options.fadeSpeed,function(){e.isAnimating=!0,e.isClosing?e.isAnimating=!1:setTimeout(function(){var t=e.relatedElements[e.currentImageIndex];e.currentImage.setAttribute("src",t.getAttribute(e.options.sourceAttr)),-1===e.loadedImages.indexOf(t.getAttribute(e.options.sourceAttr))&&e.show(e.domNodes.spinner),e.domNodes.image.contains(e.domNodes.caption)&&e.domNodes.image.removeChild(e.domNodes.caption),e.adjustImage(o),e.options.preloading&&e.preload()},100)})}},{key:"adjustImage",value:function(a){var r=this;if(!this.currentImage)return!1;var t=new Image,l=window.innerWidth*this.options.widthRatio,d=window.innerHeight*this.options.heightRatio;t.setAttribute("src",this.currentImage.getAttribute("src")),this.currentImage.dataset.scale=1,this.currentImage.dataset.translateX=0,this.currentImage.dataset.translateY=0,this.zoomPanElement(0,0,1),t.addEventListener("error",function(t){r.relatedElements[r.currentImageIndex].dispatchEvent(new Event("error."+r.eventNamespace)),r.isAnimating=!1,r.isOpen=!1,r.domNodes.spinner.style.display="none";var e=1===a||-1===a;if(r.initialImageIndex===r.currentImageIndex&&e)return r.close();r.options.alertError&&alert(r.options.alertErrorMessage),r.loadImage(e?a:1)}),t.addEventListener("load",function(t){void 0!==a&&(r.relatedElements[r.currentImageIndex].dispatchEvent(new Event("changed."+r.eventNamespace)),r.relatedElements[r.currentImageIndex].dispatchEvent(new Event((1===a?"nextDone":"prevDone")+"."+r.eventNamespace))),r.options.history&&r.updateURL(),-1===r.loadedImages.indexOf(r.currentImage.getAttribute("src"))&&r.loadedImages.push(r.currentImage.getAttribute("src"));var e,o,i=t.target.width,n=t.target.height;if(r.options.scaleImageToRatio||l<i||d<n){var s=l/d<i/n?i/l:n/d;i/=s,n/=s}r.domNodes.image.style.top=(window.innerHeight-n)/2+"px",r.domNodes.image.style.left=(window.innerWidth-i-r.globalScrollbarWidth)/2+"px",r.domNodes.image.style.width=i+"px",r.domNodes.image.style.height=n+"px",r.domNodes.spinner.style.display="none",r.options.focus&&r.forceFocus(),r.fadeIn(r.currentImage,r.options.fadeSpeed,function(){r.options.focus&&r.domNodes.wrapper.focus()}),r.isOpen=!0,"string"==typeof r.options.captionSelector?e="self"===r.options.captionSelector?r.relatedElements[r.currentImageIndex]:r.relatedElements[r.currentImageIndex].querySelector(r.options.captionSelector):"function"==typeof r.options.captionSelector&&(e=r.options.captionSelector(r.relatedElements[r.currentImageIndex])),r.options.captions&&e&&(o="data"===r.options.captionType?e.dataset[r.options.captionsData]:"text"===r.options.captionType?e.innerHTML:e.getAttribute(r.options.captionsData)),r.options.loop||(0===r.currentImageIndex&&r.hide(r.domNodes.navigation.querySelector(".sl-prev")),r.currentImageIndex>=r.relatedElements.length-1&&r.hide(r.domNodes.navigation.querySelector(".sl-next")),0<r.currentImageIndex&&r.show(r.domNodes.navigation.querySelector(".sl-prev")),r.currentImageIndex<r.relatedElements.length-1&&r.show(r.domNodes.navigation.querySelector(".sl-next"))),1===r.relatedElements.length?r.hide(r.domNodes.navigation.querySelectorAll(".sl-prev, .sl-next")):r.show(r.domNodes.navigation.querySelectorAll(".sl-prev, .sl-next")),1===a||-1===a?(r.options.animationSlide&&(r.slide(0,100*a+"px"),setTimeout(function(){r.slide(r.options.animationSpeed/1e3,"0px")},50)),r.fadeIn(r.domNodes.image,r.options.fadeSpeed,function(){r.isAnimating=!1,r.setCaption(o,i)})):(r.isAnimating=!1,r.setCaption(o,i)),r.options.additionalHtml&&!r.domNodes.additionalHtml&&(r.domNodes.additionalHtml=document.createElement("div"),r.domNodes.additionalHtml.classList.add("sl-additional-html"),r.domNodes.additionalHtml.innerHTML=r.options.additionalHtml,r.domNodes.image.appendChild(r.domNodes.additionalHtml))})}},{key:"zoomPanElement",value:function(t,e,o){this.currentImage.style[this.transitionPrefix+"transform"]="translate("+t+","+e+") scale("+o+")"}},{key:"minMax",value:function(t,e,o){return t<e?e:o<t?o:t}},{key:"setZoomData",value:function(t,e,o){this.currentImage.dataset.scale=t,this.currentImage.dataset.translateX=e,this.currentImage.dataset.translateY=o}},{key:"hashchangeHandler",value:function(){this.isOpen&&this.hash===this.initialLocationHash&&(this.hashReseted=!0,this.close())}},{key:"addEvents",value:function(){var o=this;this.addEventListener(window,"resize."+this.eventNamespace,function(t){o.isOpen&&o.adjustImage()}),this.addEventListener(this.domNodes.closeButton,["click."+this.eventNamespace,"touchstart."+this.eventNamespace],this.close.bind(this)),this.options.history&&setTimeout(function(){o.addEventListener(window,"hashchange."+o.eventNamespace,function(t){o.isOpen&&o.hashchangeHandler()})},40),this.addEventListener(this.domNodes.navigation.getElementsByTagName("button"),"click."+this.eventNamespace,function(t){if(!t.currentTarget.tagName.match(/button/i))return!0;t.preventDefault(),o.controlCoordinates.swipeDiff=0,o.loadImage(t.currentTarget.classList.contains("sl-next")?1:-1)}),this.addEventListener(this.domNodes.image,["touchstart."+this.eventNamespace,"mousedown."+this.eventNamespace],function(t){if("A"===t.target.tagName&&"touchstart"===t.type)return!0;if("mousedown"===t.type)o.controlCoordinates.initialPointerOffsetX=t.clientX,o.controlCoordinates.initialPointerOffsetY=t.clientY,o.controlCoordinates.containerHeight=o.getDimensions(o.domNodes.image).height,o.controlCoordinates.containerWidth=o.getDimensions(o.domNodes.image).width,o.controlCoordinates.imgHeight=o.getDimensions(o.currentImage).height,o.controlCoordinates.imgWidth=o.getDimensions(o.currentImage).width,o.controlCoordinates.containerOffsetX=o.domNodes.image.offsetLeft,o.controlCoordinates.containerOffsetY=o.domNodes.image.offsetTop,o.controlCoordinates.initialOffsetX=parseFloat(o.currentImage.dataset.translateX),o.controlCoordinates.initialOffsetY=parseFloat(o.currentImage.dataset.translateY),o.controlCoordinates.capture=!0;else{if(o.controlCoordinates.touchCount=t.touches.length,o.controlCoordinates.initialPointerOffsetX=t.touches[0].clientX,o.controlCoordinates.initialPointerOffsetY=t.touches[0].clientY,o.controlCoordinates.containerHeight=o.getDimensions(o.domNodes.image).height,o.controlCoordinates.containerWidth=o.getDimensions(o.domNodes.image).width,o.controlCoordinates.imgHeight=o.getDimensions(o.currentImage).height,o.controlCoordinates.imgWidth=o.getDimensions(o.currentImage).width,o.controlCoordinates.containerOffsetX=o.domNodes.image.offsetLeft,o.controlCoordinates.containerOffsetY=o.domNodes.image.offsetTop,1===o.controlCoordinates.touchCount){if(o.controlCoordinates.doubleTapped)return o.currentImage.classList.add("sl-transition"),o.controlCoordinates.zoomed?(o.controlCoordinates.initialScale=1,o.setZoomData(o.controlCoordinates.initialScale,0,0),o.zoomPanElement("0px","0px",o.controlCoordinates.initialScale),o.controlCoordinates.zoomed=!1):(o.controlCoordinates.initialScale=o.options.doubleTapZoom,o.setZoomData(o.controlCoordinates.initialScale,0,0),o.zoomPanElement("0px","0px",o.controlCoordinates.initialScale),o.domNodes.caption.style.opacity||"none"===o.domNodes.caption.style.display||o.fadeOut(o.domNodes.caption,o.options.fadeSpeed),o.controlCoordinates.zoomed=!0),setTimeout(function(){o.currentImage&&o.currentImage.classList.remove("sl-transition")},200),!1;o.controlCoordinates.doubleTapped=!0,setTimeout(function(){o.controlCoordinates.doubleTapped=!1},300),o.controlCoordinates.initialOffsetX=parseFloat(o.currentImage.dataset.translateX),o.controlCoordinates.initialOffsetY=parseFloat(o.currentImage.dataset.translateY)}else 2===o.controlCoordinates.touchCount&&(o.controlCoordinates.initialPointerOffsetX2=t.touches[1].clientX,o.controlCoordinates.initialPointerOffsetY2=t.touches[1].clientY,o.controlCoordinates.initialOffsetX=parseFloat(o.currentImage.dataset.translateX),o.controlCoordinates.initialOffsetY=parseFloat(o.currentImage.dataset.translateY),o.controlCoordinates.pinchOffsetX=(o.controlCoordinates.initialPointerOffsetX+o.controlCoordinates.initialPointerOffsetX2)/2,o.controlCoordinates.pinchOffsetY=(o.controlCoordinates.initialPointerOffsetY+o.controlCoordinates.initialPointerOffsetY2)/2,o.controlCoordinates.initialPinchDistance=Math.sqrt((o.controlCoordinates.initialPointerOffsetX-o.controlCoordinates.initialPointerOffsetX2)*(o.controlCoordinates.initialPointerOffsetX-o.controlCoordinates.initialPointerOffsetX2)+(o.controlCoordinates.initialPointerOffsetY-o.controlCoordinates.initialPointerOffsetY2)*(o.controlCoordinates.initialPointerOffsetY-o.controlCoordinates.initialPointerOffsetY2)));o.controlCoordinates.capture=!0}return!!o.controlCoordinates.mousedown||(o.transitionCapable&&(o.controlCoordinates.imageLeft=parseInt(o.domNodes.image.style.left,10)),o.controlCoordinates.mousedown=!0,o.controlCoordinates.swipeDiff=0,o.controlCoordinates.swipeYDiff=0,o.controlCoordinates.swipeStart=t.pageX||t.touches[0].pageX,o.controlCoordinates.swipeYStart=t.pageY||t.touches[0].pageY,!1)}),this.addEventListener(this.domNodes.image,["touchmove."+this.eventNamespace,"mousemove."+this.eventNamespace,"MSPointerMove"],function(t){if(!o.controlCoordinates.mousedown)return!0;if(t.preventDefault(),"touchmove"===t.type){if(!1===o.controlCoordinates.capture)return!1;o.controlCoordinates.pointerOffsetX=t.touches[0].clientX,o.controlCoordinates.pointerOffsetY=t.touches[0].clientY,o.controlCoordinates.touchCount=t.touches.length,o.controlCoordinates.touchmoveCount++,1<o.controlCoordinates.touchCount?(o.controlCoordinates.pointerOffsetX2=t.touches[1].clientX,o.controlCoordinates.pointerOffsetY2=t.touches[1].clientY,o.controlCoordinates.targetPinchDistance=Math.sqrt((o.controlCoordinates.pointerOffsetX-o.controlCoordinates.pointerOffsetX2)*(o.controlCoordinates.pointerOffsetX-o.controlCoordinates.pointerOffsetX2)+(o.controlCoordinates.pointerOffsetY-o.controlCoordinates.pointerOffsetY2)*(o.controlCoordinates.pointerOffsetY-o.controlCoordinates.pointerOffsetY2)),null===o.controlCoordinates.initialPinchDistance&&(o.controlCoordinates.initialPinchDistance=o.controlCoordinates.targetPinchDistance),1<=Math.abs(o.controlCoordinates.initialPinchDistance-o.controlCoordinates.targetPinchDistance)&&(o.controlCoordinates.targetScale=o.minMax(o.controlCoordinates.targetPinchDistance/o.controlCoordinates.initialPinchDistance*o.controlCoordinates.initialScale,1,o.options.maxZoom),o.controlCoordinates.limitOffsetX=(o.controlCoordinates.imgWidth*o.controlCoordinates.targetScale-o.controlCoordinates.containerWidth)/2,o.controlCoordinates.limitOffsetY=(o.controlCoordinates.imgHeight*o.controlCoordinates.targetScale-o.controlCoordinates.containerHeight)/2,o.controlCoordinates.scaleDifference=o.controlCoordinates.targetScale-o.controlCoordinates.initialScale,o.controlCoordinates.targetOffsetX=o.controlCoordinates.imgWidth*o.controlCoordinates.targetScale<=o.controlCoordinates.containerWidth?0:o.minMax(o.controlCoordinates.initialOffsetX-(o.controlCoordinates.pinchOffsetX-o.controlCoordinates.containerOffsetX-o.controlCoordinates.containerWidth/2-o.controlCoordinates.initialOffsetX)/(o.controlCoordinates.targetScale-o.controlCoordinates.scaleDifference)*o.controlCoordinates.scaleDifference,-1*o.controlCoordinates.limitOffsetX,o.controlCoordinates.limitOffsetX),o.controlCoordinates.targetOffsetY=o.controlCoordinates.imgHeight*o.controlCoordinates.targetScale<=o.controlCoordinates.containerHeight?0:o.minMax(o.controlCoordinates.initialOffsetY-(o.controlCoordinates.pinchOffsetY-o.controlCoordinates.containerOffsetY-o.controlCoordinates.containerHeight/2-o.controlCoordinates.initialOffsetY)/(o.controlCoordinates.targetScale-o.controlCoordinates.scaleDifference)*o.controlCoordinates.scaleDifference,-1*o.controlCoordinates.limitOffsetY,o.controlCoordinates.limitOffsetY),o.zoomPanElement(o.controlCoordinates.targetOffsetX+"px",o.controlCoordinates.targetOffsetY+"px",o.controlCoordinates.targetScale),1<o.controlCoordinates.targetScale&&(o.controlCoordinates.zoomed=!0,o.domNodes.caption.style.opacity||"none"===o.domNodes.caption.style.display||o.fadeOut(o.domNodes.caption,o.options.fadeSpeed)),o.controlCoordinates.initialPinchDistance=o.controlCoordinates.targetPinchDistance,o.controlCoordinates.initialScale=o.controlCoordinates.targetScale,o.controlCoordinates.initialOffsetX=o.controlCoordinates.targetOffsetX,o.controlCoordinates.initialOffsetY=o.controlCoordinates.targetOffsetY)):(o.controlCoordinates.targetScale=o.controlCoordinates.initialScale,o.controlCoordinates.limitOffsetX=(o.controlCoordinates.imgWidth*o.controlCoordinates.targetScale-o.controlCoordinates.containerWidth)/2,o.controlCoordinates.limitOffsetY=(o.controlCoordinates.imgHeight*o.controlCoordinates.targetScale-o.controlCoordinates.containerHeight)/2,o.controlCoordinates.targetOffsetX=o.controlCoordinates.imgWidth*o.controlCoordinates.targetScale<=o.controlCoordinates.containerWidth?0:o.minMax(o.controlCoordinates.pointerOffsetX-(o.controlCoordinates.initialPointerOffsetX-o.controlCoordinates.initialOffsetX),-1*o.controlCoordinates.limitOffsetX,o.controlCoordinates.limitOffsetX),o.controlCoordinates.targetOffsetY=o.controlCoordinates.imgHeight*o.controlCoordinates.targetScale<=o.controlCoordinates.containerHeight?0:o.minMax(o.controlCoordinates.pointerOffsetY-(o.controlCoordinates.initialPointerOffsetY-o.controlCoordinates.initialOffsetY),-1*o.controlCoordinates.limitOffsetY,o.controlCoordinates.limitOffsetY),Math.abs(o.controlCoordinates.targetOffsetX)===Math.abs(o.controlCoordinates.limitOffsetX)&&(o.controlCoordinates.initialOffsetX=o.controlCoordinates.targetOffsetX,o.controlCoordinates.initialPointerOffsetX=o.controlCoordinates.pointerOffsetX),Math.abs(o.controlCoordinates.targetOffsetY)===Math.abs(o.controlCoordinates.limitOffsetY)&&(o.controlCoordinates.initialOffsetY=o.controlCoordinates.targetOffsetY,o.controlCoordinates.initialPointerOffsetY=o.controlCoordinates.pointerOffsetY),o.setZoomData(o.controlCoordinates.initialScale,o.controlCoordinates.targetOffsetX,o.controlCoordinates.targetOffsetY),o.zoomPanElement(o.controlCoordinates.targetOffsetX+"px",o.controlCoordinates.targetOffsetY+"px",o.controlCoordinates.targetScale))}if("mousemove"===t.type&&o.controlCoordinates.mousedown){if("touchmove"==t.type)return!0;if(!1===o.controlCoordinates.capture)return!1;o.controlCoordinates.pointerOffsetX=t.clientX,o.controlCoordinates.pointerOffsetY=t.clientY,o.controlCoordinates.targetScale=o.controlCoordinates.initialScale,o.controlCoordinates.limitOffsetX=(o.controlCoordinates.imgWidth*o.controlCoordinates.targetScale-o.controlCoordinates.containerWidth)/2,o.controlCoordinates.limitOffsetY=(o.controlCoordinates.imgHeight*o.controlCoordinates.targetScale-o.controlCoordinates.containerHeight)/2,o.controlCoordinates.targetOffsetX=o.controlCoordinates.imgWidth*o.controlCoordinates.targetScale<=o.controlCoordinates.containerWidth?0:o.minMax(o.controlCoordinates.pointerOffsetX-(o.controlCoordinates.initialPointerOffsetX-o.controlCoordinates.initialOffsetX),-1*o.controlCoordinates.limitOffsetX,o.controlCoordinates.limitOffsetX),o.controlCoordinates.targetOffsetY=o.controlCoordinates.imgHeight*o.controlCoordinates.targetScale<=o.controlCoordinates.containerHeight?0:o.minMax(o.controlCoordinates.pointerOffsetY-(o.controlCoordinates.initialPointerOffsetY-o.controlCoordinates.initialOffsetY),-1*o.controlCoordinates.limitOffsetY,o.controlCoordinates.limitOffsetY),Math.abs(o.controlCoordinates.targetOffsetX)===Math.abs(o.controlCoordinates.limitOffsetX)&&(o.controlCoordinates.initialOffsetX=o.controlCoordinates.targetOffsetX,o.controlCoordinates.initialPointerOffsetX=o.controlCoordinates.pointerOffsetX),Math.abs(o.controlCoordinates.targetOffsetY)===Math.abs(o.controlCoordinates.limitOffsetY)&&(o.controlCoordinates.initialOffsetY=o.controlCoordinates.targetOffsetY,o.controlCoordinates.initialPointerOffsetY=o.controlCoordinates.pointerOffsetY),o.setZoomData(o.controlCoordinates.initialScale,o.controlCoordinates.targetOffsetX,o.controlCoordinates.targetOffsetY),o.zoomPanElement(o.controlCoordinates.targetOffsetX+"px",o.controlCoordinates.targetOffsetY+"px",o.controlCoordinates.targetScale)}o.controlCoordinates.zoomed||(o.controlCoordinates.swipeEnd=t.pageX||t.touches[0].pageX,o.controlCoordinates.swipeYEnd=t.pageY||t.touches[0].pageY,o.controlCoordinates.swipeDiff=o.controlCoordinates.swipeStart-o.controlCoordinates.swipeEnd,o.controlCoordinates.swipeYDiff=o.controlCoordinates.swipeYStart-o.controlCoordinates.swipeYEnd,o.options.animationSlide&&o.slide(0,-o.controlCoordinates.swipeDiff+"px"))}),this.addEventListener(this.domNodes.image,["touchend."+this.eventNamespace,"mouseup."+this.eventNamespace,"touchcancel."+this.eventNamespace,"mouseleave."+this.eventNamespace,"pointerup","pointercancel","MSPointerUp","MSPointerCancel"],function(t){if(o.isTouchDevice&&"touchend"===t.type&&(o.controlCoordinates.touchCount=t.touches.length,0===o.controlCoordinates.touchCount?(o.currentImage&&o.setZoomData(o.controlCoordinates.initialScale,o.controlCoordinates.targetOffsetX,o.controlCoordinates.targetOffsetY),1===o.controlCoordinates.initialScale&&(o.controlCoordinates.zoomed=!1,"none"===o.domNodes.caption.style.display&&o.fadeIn(o.domNodes.caption,o.options.fadeSpeed)),o.controlCoordinates.initialPinchDistance=null,o.controlCoordinates.capture=!1):1===o.controlCoordinates.touchCount?(o.controlCoordinates.initialPointerOffsetX=t.touches[0].clientX,o.controlCoordinates.initialPointerOffsetY=t.touches[0].clientY):1<o.controlCoordinates.touchCount&&(o.controlCoordinates.initialPinchDistance=null)),o.controlCoordinates.mousedown){var e=!(o.controlCoordinates.mousedown=!1);o.options.loop||(0===o.currentImageIndex&&o.controlCoordinates.swipeDiff<0&&(e=!1),o.currentImageIndex>=o.relatedElements.length-1&&0<o.controlCoordinates.swipeDiff&&(e=!1)),Math.abs(o.controlCoordinates.swipeDiff)>o.options.swipeTolerance&&e?o.loadImage(0<o.controlCoordinates.swipeDiff?1:-1):o.options.animationSlide&&o.slide(o.options.animationSpeed/1e3,"0px"),o.options.swipeClose&&50<Math.abs(o.controlCoordinates.swipeYDiff)&&Math.abs(o.controlCoordinates.swipeDiff)<o.options.swipeTolerance&&o.close()}}),this.addEventListener(this.domNodes.image,["dblclick"],function(t){if(!o.isTouchDevice)return o.controlCoordinates.initialPointerOffsetX=t.clientX,o.controlCoordinates.initialPointerOffsetY=t.clientY,o.controlCoordinates.containerHeight=o.getDimensions(o.domNodes.image).height,o.controlCoordinates.containerWidth=o.getDimensions(o.domNodes.image).width,o.controlCoordinates.imgHeight=o.getDimensions(o.currentImage).height,o.controlCoordinates.imgWidth=o.getDimensions(o.currentImage).width,o.controlCoordinates.containerOffsetX=o.domNodes.image.offsetLeft,o.controlCoordinates.containerOffsetY=o.domNodes.image.offsetTop,o.currentImage.classList.add("sl-transition"),o.controlCoordinates.zoomed?(o.controlCoordinates.initialScale=1,o.setZoomData(o.controlCoordinates.initialScale,0,0),o.zoomPanElement("0px","0px",o.controlCoordinates.initialScale),o.controlCoordinates.zoomed=!1,"none"===o.domNodes.caption.style.display&&o.fadeIn(o.domNodes.caption,o.options.fadeSpeed)):(o.controlCoordinates.initialScale=o.options.doubleTapZoom,o.setZoomData(o.controlCoordinates.initialScale,0,0),o.zoomPanElement("0px","0px",o.controlCoordinates.initialScale),o.domNodes.caption.style.opacity||"none"===o.domNodes.caption.style.display||o.fadeOut(o.domNodes.caption,o.options.fadeSpeed),o.controlCoordinates.zoomed=!0),setTimeout(function(){o.currentImage&&o.currentImage.classList.remove("sl-transition")},200),!(o.controlCoordinates.capture=!0)})}},{key:"getDimensions",value:function(t){var e=window.getComputedStyle(t),o=t.offsetHeight,i=t.offsetWidth,n=parseFloat(e.borderTopWidth);return{height:o-parseFloat(e.borderBottomWidth)-n-parseFloat(e.paddingTop)-parseFloat(e.paddingBottom),width:i-parseFloat(e.borderLeftWidth)-parseFloat(e.borderRightWidth)-parseFloat(e.paddingLeft)-parseFloat(e.paddingRight)}}},{key:"updateHash",value:function(){var t="pid="+(this.currentImageIndex+1),e=window.location.href.split("#")[0]+"#"+t;this.hashReseted=!1,this.pushStateSupport?window.history[this.historyHasChanges?"replaceState":"pushState"]("",document.title,e):this.historyHasChanges?window.location.replace(e):window.location.hash=t,this.historyHasChanges||(this.urlChangedOnce=!0),this.historyHasChanges=!0}},{key:"resetHash",value:function(){this.hashReseted=!0,this.urlChangedOnce?history.back():this.pushStateSupport?history.pushState("",document.title,window.location.pathname+window.location.search):window.location.hash="",clearTimeout(this.historyUpdateTimeout)}},{key:"updateURL",value:function(){clearTimeout(this.historyUpdateTimeout),this.historyHasChanges?this.historyUpdateTimeout=setTimeout(this.updateHash.bind(this),800):this.updateHash()}},{key:"setCaption",value:function(t,e){var o=this;this.options.captions&&t&&""!==t&&void 0!==t&&(this.hide(this.domNodes.caption),this.domNodes.caption.style.width=e+"px",this.domNodes.caption.innerHTML=t,this.domNodes.image.appendChild(this.domNodes.caption),setTimeout(function(){o.fadeIn(o.domNodes.caption,o.options.fadeSpeed)},this.options.captionDelay))}},{key:"slide",value:function(t,e){if(!this.transitionCapable)return this.domNodes.image.style.left=e;this.domNodes.image.style[this.transitionPrefix+"transform"]="translateX("+e+")",this.domNodes.image.style[this.transitionPrefix+"transition"]=this.transitionPrefix+"transform "+t+"s linear"}},{key:"getRelated",value:function(e){return e&&!1!==e&&"nofollow"!==e?Array.from(this.elements).filter(function(t){return t.getAttribute("rel")===e}):this.elements}},{key:"openImage",value:function(t){var e=this;t.dispatchEvent(new Event("show."+this.eventNamespace)),this.options.disableScroll&&(this.globalScrollbarWidth=this.toggleScrollbar("hide")),this.options.htmlClass&&""!==this.options.htmlClass&&document.querySelector("html").classList.add(this.options.htmlClass),document.body.appendChild(this.domNodes.wrapper),this.domNodes.wrapper.appendChild(this.domNodes.image),this.options.overlay&&document.body.appendChild(this.domNodes.overlay),this.relatedElements=this.getRelated(t.rel),this.options.showCounter&&(1==this.relatedElements.length&&this.domNodes.wrapper.contains(this.domNodes.counter)?this.domNodes.wrapper.removeChild(this.domNodes.counter):1<this.relatedElements.length&&!this.domNodes.wrapper.contains(this.domNodes.counter)&&this.domNodes.wrapper.appendChild(this.domNodes.counter)),this.isAnimating=!0,this.currentImageIndex=this.relatedElements.indexOf(t);var o=t.getAttribute(this.options.sourceAttr);this.currentImage=document.createElement("img"),this.currentImage.style.display="none",this.currentImage.setAttribute("src",o),this.currentImage.dataset.scale=1,this.currentImage.dataset.translateX=0,this.currentImage.dataset.translateY=0,-1===this.loadedImages.indexOf(o)&&this.loadedImages.push(o),this.domNodes.image.innerHTML="",this.domNodes.image.setAttribute("style",""),this.domNodes.image.appendChild(this.currentImage),this.fadeIn(this.domNodes.overlay,this.options.fadeSpeed),this.fadeIn([this.domNodes.counter,this.domNodes.navigation,this.domNodes.closeButton],this.options.fadeSpeed),this.show(this.domNodes.spinner),this.domNodes.counter.querySelector(".sl-current").innerHTML=this.currentImageIndex+1,this.domNodes.counter.querySelector(".sl-total").innerHTML=this.relatedElements.length,this.adjustImage(),this.options.preloading&&this.preload(),setTimeout(function(){t.dispatchEvent(new Event("shown."+e.eventNamespace))},this.options.animationSpeed)}},{key:"forceFocus",value:function(){var e=this;this.removeEventListener(document,"focusin."+this.eventNamespace),this.addEventListener(document,"focusin."+this.eventNamespace,function(t){document===t.target||e.domNodes.wrapper===t.target||e.domNodes.wrapper.contains(t.target)||e.domNodes.wrapper.focus()})}},{key:"addEventListener",value:function(t,e,o,i){t=this.wrap(t),e=this.wrap(e);var n,s=h(t);try{for(s.s();!(n=s.n()).done;){var a=n.value;a.namespaces||(a.namespaces={});var r,l=h(e);try{for(l.s();!(r=l.n()).done;){var d=r.value,c=i||!1;a.namespaces[d]=o,a.addEventListener(d.split(".")[0],o,c)}}catch(t){l.e(t)}finally{l.f()}}}catch(t){s.e(t)}finally{s.f()}}},{key:"removeEventListener",value:function(t,e){t=this.wrap(t),e=this.wrap(e);var o,i=h(t);try{for(i.s();!(o=i.n()).done;){var n,s=o.value,a=h(e);try{for(a.s();!(n=a.n()).done;){var r=n.value;s.namespaces&&s.namespaces[r]&&(s.removeEventListener(r.split(".")[0],s.namespaces[r]),delete s.namespaces[r])}}catch(t){a.e(t)}finally{a.f()}}}catch(t){i.e(t)}finally{i.f()}}},{key:"fadeOut",value:function(r,t,l){var e,d=this,o=h(r=this.wrap(r));try{for(o.s();!(e=o.n()).done;){e.value.style.opacity=1}}catch(t){o.e(t)}finally{o.f()}this.isFadeIn=!1;var c=16.66666/(t||this.options.fadeSpeed);!function t(){var e=parseFloat(r[0].style.opacity);if((e-=c)<0){var o,i=h(r);try{for(i.s();!(o=i.n()).done;){var n=o.value;n.style.display="none",n.style.opacity=""}}catch(t){i.e(t)}finally{i.f()}l&&l.call(d,r)}else{var s,a=h(r);try{for(a.s();!(s=a.n()).done;){s.value.style.opacity=e}}catch(t){a.e(t)}finally{a.f()}requestAnimationFrame(t)}}()}},{key:"fadeIn",value:function(a,t,r,e){var o,l=this,i=h(a=this.wrap(a));try{for(i.s();!(o=i.n()).done;){var n=o.value;n.style.opacity=0,n.style.display=e||"block"}}catch(t){i.e(t)}finally{i.f()}this.isFadeIn=!0;var d=parseFloat(a[0].dataset.opacityTarget||1),c=16.66666*d/(t||this.options.fadeSpeed);!function t(){var e=parseFloat(a[0].style.opacity);if((e+=c)>d){var o,i=h(a);try{for(i.s();!(o=i.n()).done;){o.value.style.opacity=""}}catch(t){i.e(t)}finally{i.f()}r&&r.call(l,a)}else{var n,s=h(a);try{for(s.s();!(n=s.n()).done;){n.value.style.opacity=e}}catch(t){s.e(t)}finally{s.f()}if(!l.isFadeIn)return;requestAnimationFrame(t)}}()}},{key:"hide",value:function(t){var e,o=h(t=this.wrap(t));try{for(o.s();!(e=o.n()).done;){var i=e.value;i.dataset.initialDisplay=i.style.display,i.style.display="none"}}catch(t){o.e(t)}finally{o.f()}}},{key:"show",value:function(t,e){var o,i=h(t=this.wrap(t));try{for(i.s();!(o=i.n()).done;){var n=o.value;n.style.display=n.dataset.initialDisplay||e||"block"}}catch(t){i.e(t)}finally{i.f()}}},{key:"wrap",value:function(t){return"function"==typeof t[Symbol.iterator]&&"string"!=typeof t?t:[t]}},{key:"on",value:function(t,e){t=this.wrap(t);var o,i=h(this.elements);try{for(i.s();!(o=i.n()).done;){var n=o.value;n.fullyNamespacedEvents||(n.fullyNamespacedEvents={});var s,a=h(t);try{for(a.s();!(s=a.n()).done;){var r=s.value;n.fullyNamespacedEvents[r]=e,n.addEventListener(r,e)}}catch(t){a.e(t)}finally{a.f()}}}catch(t){i.e(t)}finally{i.f()}return this}},{key:"off",value:function(t){t=this.wrap(t);var e,o=h(this.elements);try{for(o.s();!(e=o.n()).done;){var i,n=e.value,s=h(t);try{for(s.s();!(i=s.n()).done;){var a=i.value;void 0!==n.fullyNamespacedEvents&&a in n.fullyNamespacedEvents&&n.removeEventListener(a,n.fullyNamespacedEvents[a])}}catch(t){s.e(t)}finally{s.f()}}}catch(t){o.e(t)}finally{o.f()}return this}},{key:"open",value:function(t){t=t||this.elements[0],"undefined"!=typeof jQuery&&t instanceof jQuery&&(t=t.get(0)),this.initialImageIndex=this.elements.indexOf(t),-1<this.initialImageIndex&&this.openImage(t)}},{key:"next",value:function(){this.loadImage(1)}},{key:"prev",value:function(){this.loadImage(-1)}},{key:"destroy",value:function(){this.off(["close."+this.eventNamespace,"closed."+this.eventNamespace,"nextImageLoaded."+this.eventNamespace,"prevImageLoaded."+this.eventNamespace,"change."+this.eventNamespace,"nextDone."+this.eventNamespace,"prevDone."+this.eventNamespace,"error."+this.eventNamespace,"changed."+this.eventNamespace,"next."+this.eventNamespace,"prev."+this.eventNamespace,"show."+this.eventNamespace,"shown."+this.eventNamespace]),this.removeEventListener(this.elements,"click."+this.eventNamespace),this.removeEventListener(document,"focusin."+this.eventNamespace),this.removeEventListener(document.body,"contextmenu."+this.eventNamespace),this.removeEventListener(document.body,"keyup."+this.eventNamespace),this.removeEventListener(this.domNodes.navigation.getElementsByTagName("button"),"click."+this.eventNamespace),this.removeEventListener(this.domNodes.closeButton,"click."+this.eventNamespace),this.removeEventListener(window,"resize."+this.eventNamespace),this.removeEventListener(window,"hashchange."+this.eventNamespace),this.close(),this.isOpen&&(document.body.removeChild(this.domNodes.wrapper),document.body.removeChild(this.domNodes.overlay)),this.elements=null}},{key:"refresh",value:function(){if(!this.initialSelector)throw"refreshing only works when you initialize using a selector!";var t=this.options,e=this.initialSelector;return this.destroy(),this.constructor(e,t),this}},{key:"hash",get:function(){return window.location.hash.substring(1)}}])&&i(t.prototype,e),o&&i(t,o),n}(),e=t;n.default=e,o.SimpleLightbox=t}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1]);
|
languages/wp-security-audit-log-de_DE.po
ADDED
@@ -0,0 +1,2178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: WP Security Audit Log 1.2.2\n"
|
4 |
+
"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-security-audit-log\n"
|
5 |
+
"POT-Creation-Date: 2015-01-21 08:46:06+00:00\n"
|
6 |
+
"PO-Revision-Date: 2017-09-20 09:02-0400\n"
|
7 |
+
"Last-Translator: Mourad Louha <translation@maninweb.de>\n"
|
8 |
+
"Language-Team: Mourad Louha <info@maninweb.de>\n"
|
9 |
+
"Language: de_DE\n"
|
10 |
+
"MIME-Version: 1.0\n"
|
11 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
12 |
+
"Content-Transfer-Encoding: 8bit\n"
|
13 |
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
14 |
+
"X-Generator: Poedit 2.0.3\n"
|
15 |
+
|
16 |
+
#: classes/AuditLogListView.php:29
|
17 |
+
msgid "No events so far."
|
18 |
+
msgstr "Es sind bislang keine Ereignisse aufgetreten."
|
19 |
+
|
20 |
+
#: classes/AuditLogListView.php:34
|
21 |
+
msgid "Other"
|
22 |
+
msgstr "Sonstige"
|
23 |
+
|
24 |
+
#: classes/AuditLogListView.php:41
|
25 |
+
msgid "Show "
|
26 |
+
msgstr "Anzeigen"
|
27 |
+
|
28 |
+
#: classes/AuditLogListView.php:51
|
29 |
+
msgid " Items"
|
30 |
+
msgstr "Einträge"
|
31 |
+
|
32 |
+
#: classes/AuditLogListView.php:64 classes/Views/AuditLog.php:85
|
33 |
+
msgid "All Sites"
|
34 |
+
msgstr "Alle Websites des Netzwerks"
|
35 |
+
|
36 |
+
#: classes/AuditLogListView.php:113 classes/Views/ToggleAlerts.php:70
|
37 |
+
msgid "Code"
|
38 |
+
msgstr "Code"
|
39 |
+
|
40 |
+
#: classes/AuditLogListView.php:114 classes/Views/ToggleAlerts.php:71
|
41 |
+
msgid "Type"
|
42 |
+
msgstr "Typ"
|
43 |
+
|
44 |
+
#: classes/AuditLogListView.php:115
|
45 |
+
msgid "Date"
|
46 |
+
msgstr "Datum"
|
47 |
+
|
48 |
+
#: classes/AuditLogListView.php:116
|
49 |
+
msgid "Username"
|
50 |
+
msgstr "Benutzername"
|
51 |
+
|
52 |
+
#: classes/AuditLogListView.php:117
|
53 |
+
msgid "Source IP"
|
54 |
+
msgstr "Quell-IP"
|
55 |
+
|
56 |
+
#: classes/AuditLogListView.php:120
|
57 |
+
msgid "Site"
|
58 |
+
msgstr "Website"
|
59 |
+
|
60 |
+
#: classes/AuditLogListView.php:122
|
61 |
+
msgid "Message"
|
62 |
+
msgstr "Benachrichtigung"
|
63 |
+
|
64 |
+
#: classes/AuditLogListView.php:151
|
65 |
+
msgid "Click to toggle."
|
66 |
+
msgstr "Klicken zum Umschalten"
|
67 |
+
|
68 |
+
#: classes/AuditLogListView.php:157
|
69 |
+
msgid "Unknown error code."
|
70 |
+
msgstr "Unbekannter Fehlercode."
|
71 |
+
|
72 |
+
#: classes/AuditLogListView.php:178 classes/AuditLogListView.php:181
|
73 |
+
msgid "Unknown"
|
74 |
+
msgstr "Unbekannt"
|
75 |
+
|
76 |
+
#: classes/AuditLogListView.php:182
|
77 |
+
msgid "System"
|
78 |
+
msgstr "System"
|
79 |
+
|
80 |
+
#: classes/AuditLogListView.php:205
|
81 |
+
msgid "Alert Data Inspector"
|
82 |
+
msgstr "Daten-Inspektor für Meldungen"
|
83 |
+
|
84 |
+
#: classes/Sensors/Content.php:326 classes/Sensors/Content.php:334
|
85 |
+
msgid "Password Protected"
|
86 |
+
msgstr "Kennwortgeschützt"
|
87 |
+
|
88 |
+
#: classes/Sensors/Content.php:328 classes/Sensors/Content.php:336
|
89 |
+
msgid "Public"
|
90 |
+
msgstr "Öffentlich"
|
91 |
+
|
92 |
+
#: classes/Sensors/Content.php:330 classes/Sensors/Content.php:338
|
93 |
+
msgid "Private"
|
94 |
+
msgstr "Nicht öffentlich"
|
95 |
+
|
96 |
+
#: classes/Views/About.php:6
|
97 |
+
msgid "About WP Security Audit Log"
|
98 |
+
msgstr "Infos zu WP Security Audit Log"
|
99 |
+
|
100 |
+
#: classes/Views/About.php:14
|
101 |
+
msgid "About"
|
102 |
+
msgstr "Infos"
|
103 |
+
|
104 |
+
#: classes/Views/About.php:28
|
105 |
+
msgid ""
|
106 |
+
"WP Security Audit Log enables WordPress administrators and owners to "
|
107 |
+
"identify WordPress security issues before they become a security problem by "
|
108 |
+
"keeping a security audit log. WP Security Audit Log is developed by "
|
109 |
+
"WordPress security professionals WP White Security."
|
110 |
+
msgstr ""
|
111 |
+
"Mit dem WordPress Plugin WP Security Audit können Administratoren anhand "
|
112 |
+
"eines Protokolls eventuelle Sicherheitsprobleme im Vorfeld identifizieren. "
|
113 |
+
"WP Security Audit Log wurde von den WordPress Sicherheitsexperten bei WP "
|
114 |
+
"White Security entwickelt."
|
115 |
+
|
116 |
+
#: classes/Views/About.php:30
|
117 |
+
msgid ""
|
118 |
+
"Keep A WordPress Security Audit Log & Identify WordPress Security Issues"
|
119 |
+
msgstr ""
|
120 |
+
"WordPress-Ereignisprotokoll erstellen & WordPress-Sicherheit im Blick haben."
|
121 |
+
|
122 |
+
#: classes/Views/About.php:32
|
123 |
+
msgid ""
|
124 |
+
"WP Security Audit Log logs everything happening on your WordPress blog or "
|
125 |
+
"website and WordPress multisite network. By using WP Security Audit Log "
|
126 |
+
"security plugin it is very easy to track suspicious user activity before it "
|
127 |
+
"becomes a problem or a security issue. A WordPress security alert is "
|
128 |
+
"generated by the plugin when:"
|
129 |
+
msgstr ""
|
130 |
+
"WP Security Audit Log protokolliert alle WordPress-Ereignisse in Deinem Blog "
|
131 |
+
"oder Deinem Netzwerk (WordPress Multisite). Mit dem Plugin ist es sehr "
|
132 |
+
"einfach, ungewöhnliche Aktivitäten nachzuverfolgen, bevor diese zum "
|
133 |
+
"Sicherheitsproblem werden. Ein Protokolleintrag wird dann erstellt, wenn:"
|
134 |
+
|
135 |
+
#: classes/Views/About.php:35
|
136 |
+
msgid "User creates a new user or a new user is registered"
|
137 |
+
msgstr "ein Benutzer einen neuen Benutzer hinzufügt oder diesen registriert,"
|
138 |
+
|
139 |
+
#: classes/Views/About.php:36
|
140 |
+
msgid ""
|
141 |
+
"Existing user changes the role, password or other properties of another user"
|
142 |
+
msgstr ""
|
143 |
+
"ein bestehender Benutzer die Rolle, das Kennwort oder weitere Eigenschaften "
|
144 |
+
"eines anderen Benutzers verändert,"
|
145 |
+
|
146 |
+
#: classes/Views/About.php:37
|
147 |
+
msgid "Existing user on a WordPress multisite network is added to a site"
|
148 |
+
msgstr ""
|
149 |
+
"ein bestehender Benutzer einer Website des Netzwerks (WordPress Multisite) "
|
150 |
+
"hinzugefügt wird,"
|
151 |
+
|
152 |
+
#: classes/Views/About.php:38
|
153 |
+
msgid "User uploads or deletes a file, changes a password or email address"
|
154 |
+
msgstr ""
|
155 |
+
"ein Benutzer eine Datei hochlädt oder löscht oder ein Benutzer ein Kennwort "
|
156 |
+
"oder eine E-Mail-Adresse ändert,"
|
157 |
+
|
158 |
+
#: classes/Views/About.php:39
|
159 |
+
msgid "User installs, activates, deactivates, upgrades or uninstalls a plugin"
|
160 |
+
msgstr ""
|
161 |
+
"ein Benutzer ein Plugin installiert, aktiviert, deaktiviert oder "
|
162 |
+
"aktualisiert,"
|
163 |
+
|
164 |
+
#: classes/Views/About.php:40
|
165 |
+
msgid ""
|
166 |
+
"User creates, modifies or deletes a new post, page, category or a custom "
|
167 |
+
"post type"
|
168 |
+
msgstr ""
|
169 |
+
"ein Benutzer einen Blog-Beitrag, eine Seite, eine Kategorie oder einen "
|
170 |
+
"benutzerdefinerten Typ erstellt, ändert oder löscht,"
|
171 |
+
|
172 |
+
#: classes/Views/About.php:41
|
173 |
+
msgid "User installs or activates a WordPress theme"
|
174 |
+
msgstr "ein Benutzer ein WordPress Theme installiert oder aktiviert,"
|
175 |
+
|
176 |
+
#: classes/Views/About.php:42
|
177 |
+
msgid "User adds, modifies or deletes a widget"
|
178 |
+
msgstr "ein Benutzer ein Widget hinzufügt, ändert oder löscht,"
|
179 |
+
|
180 |
+
#: classes/Views/About.php:43
|
181 |
+
msgid "User uses the dashboard file editor"
|
182 |
+
msgstr "ein Benutzer den Datei-Editor im Dashboard verwendet,"
|
183 |
+
|
184 |
+
#: classes/Views/About.php:44
|
185 |
+
msgid "WordPress settings are changed"
|
186 |
+
msgstr "WordPress Einstellungen verändert werden,"
|
187 |
+
|
188 |
+
#: classes/Views/About.php:45
|
189 |
+
msgid "Failed login attempts"
|
190 |
+
msgstr "fehlgeschlagene Login-Versuche stattgefunden haben,"
|
191 |
+
|
192 |
+
#: classes/Views/About.php:46
|
193 |
+
msgid "and much more…"
|
194 |
+
msgstr "und vieles mehr…"
|
195 |
+
|
196 |
+
#: classes/Views/About.php:56 classes/Views/Help.php:79
|
197 |
+
msgid "WP Password Policy Manager"
|
198 |
+
msgstr "WP Password Policy Manager"
|
199 |
+
|
200 |
+
#: classes/Views/About.php:59 classes/Views/Help.php:82
|
201 |
+
msgid ""
|
202 |
+
"Easily configure WordPress password policies and ensure users use strong "
|
203 |
+
"passwords with our plugin WP Password Policy Manager."
|
204 |
+
msgstr ""
|
205 |
+
"Das Plugin WP Password Policy Manager ermöglicht es, auf einfache Weise "
|
206 |
+
"Kennwortrichtlinien zu erstellen und sicherzustellen, dass die Benutzer "
|
207 |
+
"sichere Kennwörter verwenden."
|
208 |
+
|
209 |
+
#: classes/Views/About.php:61 classes/Views/Help.php:84
|
210 |
+
msgid "Download"
|
211 |
+
msgstr "Download"
|
212 |
+
|
213 |
+
#: classes/Views/About.php:65 classes/Views/Help.php:88
|
214 |
+
msgid "WP Security Audit Log in your Language!"
|
215 |
+
msgstr "WP Security Audit Log in Deiner Sprache!"
|
216 |
+
|
217 |
+
#: classes/Views/About.php:67 classes/Views/Help.php:90
|
218 |
+
msgid ""
|
219 |
+
"If you are interested in translating our plugin please drop us an email on"
|
220 |
+
msgstr ""
|
221 |
+
"Wenn Du interessiert bist, uns bei der Übersetzung zu unterstützen, dann "
|
222 |
+
"sende uns eine E-Mail an"
|
223 |
+
|
224 |
+
#: classes/Views/About.php:72
|
225 |
+
msgid "WordPress Security Services"
|
226 |
+
msgstr "WordPress Security Services"
|
227 |
+
|
228 |
+
#: classes/Views/About.php:74
|
229 |
+
msgid "Professional WordPress security services provided by WP White Security"
|
230 |
+
msgstr ""
|
231 |
+
"WP White Security - Professionelle Dienstleistungen rund um "
|
232 |
+
"Sicherheitsfragen in WordPress."
|
233 |
+
|
234 |
+
#: classes/Views/AuditLog.php:25
|
235 |
+
msgid "Get notified instantly via email of important changes on your WordPress"
|
236 |
+
msgstr ""
|
237 |
+
"Bei wichtigen Änderungen in Deiner WordPress-Installation eine sofortige E-"
|
238 |
+
"Mail-Benachrichtigung versenden"
|
239 |
+
|
240 |
+
#: classes/Views/AuditLog.php:28
|
241 |
+
msgid "Learn More"
|
242 |
+
msgstr "Mehr erfahren"
|
243 |
+
|
244 |
+
#: classes/Views/AuditLog.php:29
|
245 |
+
msgid "Dismiss this notice"
|
246 |
+
msgstr "Diese Benachrichtigung nicht mehr anzeigen"
|
247 |
+
|
248 |
+
#: classes/Views/AuditLog.php:40 classes/Views/AuditLog.php:50
|
249 |
+
msgid "Audit Log Viewer"
|
250 |
+
msgstr "WP Security Audit Protokoll"
|
251 |
+
|
252 |
+
#: classes/Views/AuditLog.php:64 classes/Views/Licensing.php:34
|
253 |
+
#: classes/Views/Settings.php:82 classes/Views/ToggleAlerts.php:29
|
254 |
+
msgid "You do not have sufficient permissions to access this page."
|
255 |
+
msgstr "Du hast nicht genügend Rechte, um diese Seite anzuschauen."
|
256 |
+
|
257 |
+
#: classes/Views/AuditLog.php:84
|
258 |
+
msgid "Please enter the number of alerts you would like to see on one page:"
|
259 |
+
msgstr "Ereignisanzahl pro Seite:"
|
260 |
+
|
261 |
+
#: classes/Views/AuditLog.php:86
|
262 |
+
msgid "No Results"
|
263 |
+
msgstr "Keine Ereignisse"
|
264 |
+
|
265 |
+
#: classes/Views/Extensions.php:6
|
266 |
+
msgid "WP Security Audit Log Functionality Extensions"
|
267 |
+
msgstr "WP Security Audit Log Erweiterungen"
|
268 |
+
|
269 |
+
#: classes/Views/Extensions.php:14
|
270 |
+
msgid "Extensions"
|
271 |
+
msgstr "Erweiterungen"
|
272 |
+
|
273 |
+
#: classes/Views/Extensions.php:27
|
274 |
+
msgid ""
|
275 |
+
"The below extensions allow you to extend the functionality of WP Security "
|
276 |
+
"Audit Log plugin thus enabling you to get more benefits out of the WordPress "
|
277 |
+
"security audit, such as configurable WordPress email alerts, WordPress "
|
278 |
+
"security alerts search and user activity reports."
|
279 |
+
msgstr ""
|
280 |
+
"Die nachfolgenden Erweiterungen ermöglichen es, die Funktionalität von WP "
|
281 |
+
"Security Audit Log zu erweitern. Dies sind beispielsweise konfigurierbare E-"
|
282 |
+
"Mail-Benachrichtigungen, eine Suche nach Meldungen zu Ereignissen oder "
|
283 |
+
"Berichte zu den Aktivitäten von Benutzern."
|
284 |
+
|
285 |
+
#: classes/Views/Extensions.php:31
|
286 |
+
msgid "WordPress Email Notifications Extension"
|
287 |
+
msgstr "E-Mail-Benachrichtigungen"
|
288 |
+
|
289 |
+
#: classes/Views/Extensions.php:32
|
290 |
+
msgid ""
|
291 |
+
"Get notified instantly via email when important changes are made on your "
|
292 |
+
"WordPress!"
|
293 |
+
msgstr ""
|
294 |
+
"Erhalte eine sofortige E-Mail-Benachrichtigung, wenn wichtige Änderungen an "
|
295 |
+
"Deiner WordPress-Installation bzw. -Konfiguration vorgenommen wurden."
|
296 |
+
|
297 |
+
#: classes/Views/Extensions.php:33
|
298 |
+
msgid ""
|
299 |
+
"With the Notifications Extension you can easily configure monitoring rules "
|
300 |
+
"so when a specific change happens on your WordPress you are alerted via "
|
301 |
+
"email. For example you can configure rules to receive an email when existing "
|
302 |
+
"content is changed, when a new user is created or when someone logs in to "
|
303 |
+
"WordPress outside normal office hours or from an odd location."
|
304 |
+
msgstr ""
|
305 |
+
"Mit dieser Erweiterung lassen sich regelbasierte E-Mail-Benachrichtigungen "
|
306 |
+
"versenden, sobald bestimmte Änderungen an Deiner WordPress-Installation bzw. "
|
307 |
+
"-Konfiguration vorgenommen wurden. Beispielsweise kann eine E-Mail versendet "
|
308 |
+
"werden, sobald ein bereits existierender Blog-Beitrag geändert wurde. Oder "
|
309 |
+
"wenn ein neuer Benutzer erstellt wurde. Oder jemand sich in Deinem WordPress "
|
310 |
+
"zu ungewöhnlichen Zeiten einloggt."
|
311 |
+
|
312 |
+
#: classes/Views/Extensions.php:34 classes/Views/Extensions.php:41
|
313 |
+
#: classes/Views/Extensions.php:48
|
314 |
+
msgid "More Information"
|
315 |
+
msgstr "Weitere Informationen"
|
316 |
+
|
317 |
+
#: classes/Views/Extensions.php:38
|
318 |
+
msgid "Security Alerts Search Extension"
|
319 |
+
msgstr "Suchfunktion zu Ereignissen"
|
320 |
+
|
321 |
+
#: classes/Views/Extensions.php:39
|
322 |
+
msgid ""
|
323 |
+
"Automatically Search for specific WordPress user and site activity in "
|
324 |
+
"WordPress Security Audit Log."
|
325 |
+
msgstr ""
|
326 |
+
"Suchen nach bestimmten Benutzern und deren protokollierten Aktivitäten in "
|
327 |
+
"WordPress Security Audit Log."
|
328 |
+
|
329 |
+
#: classes/Views/Extensions.php:40
|
330 |
+
msgid ""
|
331 |
+
"The Search Extension enables you to easily find specific WordPress activity "
|
332 |
+
"in the Audit Log with free text based searches. Filters can also be used in "
|
333 |
+
"conjunction with free text based searches to further narrow down and have "
|
334 |
+
"more accurate search results."
|
335 |
+
msgstr ""
|
336 |
+
"Diese Erweiterung ermöglicht das Suchen nach bestimmten Aktivitäten im "
|
337 |
+
"WordPress Security Audit Log Protokoll. Die Freitextsuche lässt sich zudem "
|
338 |
+
"mit Filtern kombinieren, um zutreffendere und bessere Suchergebnisse zu "
|
339 |
+
"erhalten."
|
340 |
+
|
341 |
+
#: classes/Views/Extensions.php:45
|
342 |
+
msgid "Reporting Extension"
|
343 |
+
msgstr "Berichte"
|
344 |
+
|
345 |
+
#: classes/Views/Extensions.php:46
|
346 |
+
msgid "Generate User, Site and Other Types of Reports from the Audit Log."
|
347 |
+
msgstr ""
|
348 |
+
"Erstellen von Berichten zu den Protokollen der Benutzer, Websites und "
|
349 |
+
"weiteren Typen."
|
350 |
+
|
351 |
+
#: classes/Views/Extensions.php:47
|
352 |
+
msgid ""
|
353 |
+
"The Reporting Extension allows you to generate reports to keep track and "
|
354 |
+
"record of the productivity, and to meet any legal and regulatory compliance "
|
355 |
+
"your business need to adhere to. Unlike other reporting plugins WSAL "
|
356 |
+
"Reporting Extension does not have any built-in templates that restrict you "
|
357 |
+
"to specific type of reports, you can generate any type of report using all "
|
358 |
+
"of the available data."
|
359 |
+
msgstr ""
|
360 |
+
"Diese Erweiterung ermöglich das Erstellen von Berichten, um beispielsweise "
|
361 |
+
"Nachverfolgungen durchzuführen oder die Einhaltung bestimmter Regeln "
|
362 |
+
"sicherzustellen. Anders als andere Plugins, benötigt diese Erweiterung keine "
|
363 |
+
"vordefinierten Vorlagen zur Erzeugung der Berichte und ist nicht auf diese "
|
364 |
+
"Vorlagen beschränkt. Es können mit dem Plugin Berichte zu allen Daten "
|
365 |
+
"generiert werden."
|
366 |
+
|
367 |
+
#: classes/Views/Help.php:6 classes/Views/Help.php:14
|
368 |
+
msgid "Help"
|
369 |
+
msgstr "Hilfe"
|
370 |
+
|
371 |
+
#: classes/Views/Help.php:27
|
372 |
+
msgid "Plugin Support"
|
373 |
+
msgstr "Support zum Plugin"
|
374 |
+
|
375 |
+
#: classes/Views/Help.php:29
|
376 |
+
msgid ""
|
377 |
+
"Have you encountered or noticed any issues while using WP Security Audit Log "
|
378 |
+
"plugin?"
|
379 |
+
msgstr ""
|
380 |
+
"Hast Du Probleme bei der Verwendung des Plugins WP Security Audit Log "
|
381 |
+
"festgestellt?"
|
382 |
+
|
383 |
+
#: classes/Views/Help.php:30
|
384 |
+
msgid ""
|
385 |
+
"Or you want to report something to us? Click any of the options below to "
|
386 |
+
"post on the plugin's forum or contact our support directly."
|
387 |
+
msgstr ""
|
388 |
+
"Oder möchtest Du uns etwas mitteilen? Wähle eine der folgenden Optionen, um "
|
389 |
+
"uns im Support Forum oder direkt zu kontaktieren."
|
390 |
+
|
391 |
+
#: classes/Views/Help.php:32
|
392 |
+
msgid "Free Support Forum"
|
393 |
+
msgstr "Kostenloses Support Forum"
|
394 |
+
|
395 |
+
#: classes/Views/Help.php:34
|
396 |
+
msgid "Free Support Email"
|
397 |
+
msgstr "Kostenlose Support E-Mail"
|
398 |
+
|
399 |
+
#: classes/Views/Help.php:39
|
400 |
+
msgid "Plugin Documentation"
|
401 |
+
msgstr "Dokumentation zum Plugin"
|
402 |
+
|
403 |
+
#: classes/Views/Help.php:41
|
404 |
+
msgid ""
|
405 |
+
"For more detailed information about WP Security Audit Log you can visit the "
|
406 |
+
"official plugin page."
|
407 |
+
msgstr ""
|
408 |
+
"Für weitere detailliertere Informationen zum Plugin kannst Du unsere "
|
409 |
+
"offizielle Website besuchen."
|
410 |
+
|
411 |
+
#: classes/Views/Help.php:42
|
412 |
+
msgid ""
|
413 |
+
"You can also visit the official list of WordPress Security Alerts for more "
|
414 |
+
"information about all of the activity you can monitor with WP Security Audit "
|
415 |
+
"Log."
|
416 |
+
msgstr ""
|
417 |
+
"Eine Liste sowie eine Dokumentation der vom Plugin unterstützten Ereignisse "
|
418 |
+
"findest Du ebenfalls auf der offiziellen Plugin-Website."
|
419 |
+
|
420 |
+
#: classes/Views/Help.php:44
|
421 |
+
msgid "Official Plugin Page"
|
422 |
+
msgstr "Offizielle Plugin-Website"
|
423 |
+
|
424 |
+
#: classes/Views/Help.php:46
|
425 |
+
msgid "List of WordPress Security Alerts"
|
426 |
+
msgstr "Liste der Ereignisse"
|
427 |
+
|
428 |
+
#: classes/Views/Help.php:51
|
429 |
+
msgid "Need Help Securing WordPress?"
|
430 |
+
msgstr "Benötigst Du Hilfe zu Sicherheitsfragen in WordPress?"
|
431 |
+
|
432 |
+
#: classes/Views/Help.php:53
|
433 |
+
msgid "Is your WordPress website hackable?"
|
434 |
+
msgstr "Kann Deine WordPress Website gehackt werden?"
|
435 |
+
|
436 |
+
#: classes/Views/Help.php:54
|
437 |
+
msgid ""
|
438 |
+
"If you are not sure contact our WordPress security professionals to audit "
|
439 |
+
"your WordPress or to simply secure your WordPress website."
|
440 |
+
msgstr ""
|
441 |
+
"Wenn Du nicht sicher bist, kontaktiere unsere Profis für eine Auditierung "
|
442 |
+
"Deiner Website oder einfach nur zur Verbesserung der Sicherheit Deiner "
|
443 |
+
"Website. "
|
444 |
+
|
445 |
+
#: classes/Views/Help.php:55
|
446 |
+
msgid "Click on any of the below service buttons for more information."
|
447 |
+
msgstr "Klicke auf einen der Service-Schaltflächen für weitere Informationen."
|
448 |
+
|
449 |
+
#: classes/Views/Help.php:57
|
450 |
+
msgid "WordPress Security Hardening"
|
451 |
+
msgstr "WordPress Sicherheit verstärken"
|
452 |
+
|
453 |
+
#: classes/Views/Help.php:59
|
454 |
+
msgid "WordPress Security Audit"
|
455 |
+
msgstr "WordPress Sicherheit auditieren"
|
456 |
+
|
457 |
+
#: classes/Views/Help.php:64
|
458 |
+
msgid "WordPress Security Readings"
|
459 |
+
msgstr "WordPress Sicherheit Leseempfehlungen"
|
460 |
+
|
461 |
+
#: classes/Views/Help.php:66
|
462 |
+
msgid "New to WordPress security?"
|
463 |
+
msgstr "Neu im Thema Sicherheit für WordPress?"
|
464 |
+
|
465 |
+
#: classes/Views/Help.php:67
|
466 |
+
msgid "Do not know from where to start or which is the best services for you?"
|
467 |
+
msgstr ""
|
468 |
+
"Du weisst nicht, wo Du anfangen sollst oder welcher Dienst der beste ist?"
|
469 |
+
|
470 |
+
#: classes/Views/Help.php:68
|
471 |
+
msgid ""
|
472 |
+
"Visit our WordPress security blog or the WordPress Security category "
|
473 |
+
"directly for more information and a number of tips and tricks about "
|
474 |
+
"WordPress security."
|
475 |
+
msgstr ""
|
476 |
+
"Besuche unseren (englischen) Blog bzw. die Auflistung der Blog-Kategorien "
|
477 |
+
"mit weiteren Informationen zur WordPress Sicherheit sowie Tipps & Tricks zu "
|
478 |
+
"Sicherheitsfragen."
|
479 |
+
|
480 |
+
#: classes/Views/Help.php:70
|
481 |
+
msgid "WP White Security Blog"
|
482 |
+
msgstr "WP White Security Blog"
|
483 |
+
|
484 |
+
#: classes/Views/Help.php:72
|
485 |
+
msgid "WordPress Security Category"
|
486 |
+
msgstr "WP White Security Kategorien"
|
487 |
+
|
488 |
+
#: classes/Views/Licensing.php:6 classes/Views/Licensing.php:14
|
489 |
+
msgid "Licensing"
|
490 |
+
msgstr "Lizensierung"
|
491 |
+
|
492 |
+
#: classes/Views/Licensing.php:39 classes/Views/Settings.php:87
|
493 |
+
#: classes/Views/ToggleAlerts.php:44
|
494 |
+
msgid "Settings have been saved."
|
495 |
+
msgstr "Die Einstellungen wurden gesichert."
|
496 |
+
|
497 |
+
#: classes/Views/Licensing.php:41 classes/Views/Settings.php:89
|
498 |
+
#: classes/Views/ToggleAlerts.php:46
|
499 |
+
msgid "Error: "
|
500 |
+
msgstr "Fehler:"
|
501 |
+
|
502 |
+
#: classes/Views/Licensing.php:61
|
503 |
+
msgid "Version"
|
504 |
+
msgstr "Version"
|
505 |
+
|
506 |
+
#: classes/Views/Licensing.php:71
|
507 |
+
msgid "Active"
|
508 |
+
msgstr "Aktiv"
|
509 |
+
|
510 |
+
#: classes/Views/Licensing.php:73
|
511 |
+
msgid "Inactive"
|
512 |
+
msgstr "Inaktiv"
|
513 |
+
|
514 |
+
#: classes/Views/Settings.php:18 classes/Views/Settings.php:26
|
515 |
+
msgid "Settings"
|
516 |
+
msgstr "Einstellungen"
|
517 |
+
|
518 |
+
#: classes/Views/Settings.php:112
|
519 |
+
msgid "Security Alerts Pruning"
|
520 |
+
msgstr "Ereignisprotokoll aufräumen"
|
521 |
+
|
522 |
+
#: classes/Views/Settings.php:115 classes/Views/Settings.php:123
|
523 |
+
msgid "(eg: 1 month)"
|
524 |
+
msgstr "(z.B.: 1 Monat)"
|
525 |
+
|
526 |
+
#: classes/Views/Settings.php:119
|
527 |
+
msgid "None"
|
528 |
+
msgstr "Keine"
|
529 |
+
|
530 |
+
#: classes/Views/Settings.php:127
|
531 |
+
msgid "Delete alerts older than"
|
532 |
+
msgstr "Lösche Ereignisse älter als"
|
533 |
+
|
534 |
+
#: classes/Views/Settings.php:135
|
535 |
+
msgid "(eg: 80)"
|
536 |
+
msgstr "(z.B. 80)"
|
537 |
+
|
538 |
+
#: classes/Views/Settings.php:139
|
539 |
+
msgid "Keep up to"
|
540 |
+
msgstr "Behalte bis zu"
|
541 |
+
|
542 |
+
#: classes/Views/Settings.php:144
|
543 |
+
msgid "alerts"
|
544 |
+
msgstr "Ereignisse"
|
545 |
+
|
546 |
+
#: classes/Views/Settings.php:148
|
547 |
+
msgid "Next Scheduled Cleanup is in "
|
548 |
+
msgstr "Nächste geplante Bereinigung am"
|
549 |
+
|
550 |
+
#: classes/Views/Settings.php:152
|
551 |
+
msgid "(or %s)"
|
552 |
+
msgstr "(oder %s)"
|
553 |
+
|
554 |
+
#: classes/Views/Settings.php:153
|
555 |
+
msgid "Run Manually"
|
556 |
+
msgstr "Manuell ausführen"
|
557 |
+
|
558 |
+
#: classes/Views/Settings.php:159
|
559 |
+
msgid "Alerts Dashboard Widget"
|
560 |
+
msgstr "Dashboard Widget für Ereignisse"
|
561 |
+
|
562 |
+
#: classes/Views/Settings.php:165
|
563 |
+
msgid "On"
|
564 |
+
msgstr "An"
|
565 |
+
|
566 |
+
#: classes/Views/Settings.php:170
|
567 |
+
msgid "Off"
|
568 |
+
msgstr "Aus"
|
569 |
+
|
570 |
+
#: classes/Views/Settings.php:175
|
571 |
+
msgid "Display a dashboard widget with the latest %d security alerts."
|
572 |
+
msgstr "Dashboard Widget mit den letzten %d Ereignissen anzeigen"
|
573 |
+
|
574 |
+
#: classes/Views/Settings.php:183
|
575 |
+
msgid "Reverse Proxy / Firewall Options"
|
576 |
+
msgstr "Optionen für den Proxy-Server bzw. Firewall"
|
577 |
+
|
578 |
+
#: classes/Views/Settings.php:189
|
579 |
+
msgid "WordPress running behind firewall or proxy"
|
580 |
+
msgstr "WordPress befindet sich hinter einem Proxy-Server bzw. Firewall"
|
581 |
+
|
582 |
+
#: classes/Views/Settings.php:190
|
583 |
+
msgid ""
|
584 |
+
"Enable this option if your WordPress is running behind a firewall or reverse "
|
585 |
+
"proxy. When this option is enabled the plugin will retrieve the user's IP "
|
586 |
+
"address from the proxy header."
|
587 |
+
msgstr ""
|
588 |
+
"Setzen Sie diese Option, falls sich WordPress hinter einem Proxy-Server bzw. "
|
589 |
+
"Firewall befindet. Wenn diese Option gesetzt ist, wird das Plugin die IP aus "
|
590 |
+
"dem Header des Proxy-Servers auslesen."
|
591 |
+
|
592 |
+
#: classes/Views/Settings.php:196
|
593 |
+
msgid "Filter Internal IP Addresses"
|
594 |
+
msgstr "Interne IP-Adressen herausfiltern"
|
595 |
+
|
596 |
+
#: classes/Views/Settings.php:197
|
597 |
+
msgid ""
|
598 |
+
"Enable this option to filter internal IP addresses from the proxy headers."
|
599 |
+
msgstr ""
|
600 |
+
"Setzen Sie die Option, um interne IP-Adressen aus den Proxy-Server-Headern "
|
601 |
+
"herauszufiltern."
|
602 |
+
|
603 |
+
#: classes/Views/Settings.php:203
|
604 |
+
msgid "Can View Alerts"
|
605 |
+
msgstr "Darf Ereignisse sehen"
|
606 |
+
|
607 |
+
#: classes/Views/Settings.php:210
|
608 |
+
msgid "Users and Roles in this list can view the security alerts"
|
609 |
+
msgstr "Benutzer und Rollen in dieser Liste dürfen die Ereignisse sehen"
|
610 |
+
|
611 |
+
#: classes/Views/Settings.php:225
|
612 |
+
msgid "Can Manage Plugin"
|
613 |
+
msgstr "Darf das Plugin verwalten"
|
614 |
+
|
615 |
+
#: classes/Views/Settings.php:232
|
616 |
+
msgid "Users and Roles in this list can manage the plugin settings"
|
617 |
+
msgstr ""
|
618 |
+
"Benutzer und Rollen in dieser Liste dürfen die Plugin-Einstellungen verwalten"
|
619 |
+
|
620 |
+
#: classes/Views/Settings.php:247
|
621 |
+
msgid "Restrict Plugin Access"
|
622 |
+
msgstr "Zugriff auf das Plugin beschränken"
|
623 |
+
|
624 |
+
#: classes/Views/Settings.php:255
|
625 |
+
msgid ""
|
626 |
+
"By default all the administrators on this WordPress have access to manage "
|
627 |
+
"this plugin.<br/>By enabling this option only the users specified in the two "
|
628 |
+
"options above and your username will have access to view alerts and manage "
|
629 |
+
"this plugin."
|
630 |
+
msgstr ""
|
631 |
+
"Standardmäßig haben alle Administratoren Deiner WordPress-Installation "
|
632 |
+
"Zugriff auf das Plugin.<br />Wenn die Option zur Zugriffsbeschränkung "
|
633 |
+
"aktiviert wird, erhalten nur die angegebenen Benutzernamen sowie Dein "
|
634 |
+
"Benutzername Zugriff auf das Ereignisprotokoll und die Einstellungen zum "
|
635 |
+
"Plugin. "
|
636 |
+
|
637 |
+
#: classes/Views/Settings.php:262
|
638 |
+
msgid "Refresh Audit View"
|
639 |
+
msgstr "Ereignisprotokoll aktualisieren"
|
640 |
+
|
641 |
+
#: classes/Views/Settings.php:268
|
642 |
+
msgid "Automatic"
|
643 |
+
msgstr "Automatisch"
|
644 |
+
|
645 |
+
#: classes/Views/Settings.php:270
|
646 |
+
msgid "Refresh Audit View as soon as there are new events."
|
647 |
+
msgstr "Ereignisprotokoll aktualisieren sobald neue Ereignisse auftreten"
|
648 |
+
|
649 |
+
#: classes/Views/Settings.php:274
|
650 |
+
msgid "Manual"
|
651 |
+
msgstr "Manuell"
|
652 |
+
|
653 |
+
#: classes/Views/Settings.php:276
|
654 |
+
msgid "Refresh Audit View only when page is reloaded."
|
655 |
+
msgstr ""
|
656 |
+
"Ereignisprotokoll nur dann aktualisieren, wenn die Seite neue geladen wird."
|
657 |
+
|
658 |
+
#: classes/Views/Settings.php:282
|
659 |
+
msgid "Developer Options"
|
660 |
+
msgstr "Entwickler-Einstellungen"
|
661 |
+
|
662 |
+
#: classes/Views/Settings.php:290
|
663 |
+
msgid ""
|
664 |
+
"Only enable these options on testing, staging and development websites. "
|
665 |
+
"Enabling any of the settings below on LIVE websites may cause unintended "
|
666 |
+
"side-effects including degraded performance."
|
667 |
+
msgstr ""
|
668 |
+
"Diese Einstellungen sollten nur auf Testinstallationen bzw. "
|
669 |
+
"Entwicklerinstallationen aktiviert werden. Wenn eine der folgenden Optionen "
|
670 |
+
"auf einem Produktivsystem aktiviert wird, sind Nebeneffekte zu erwarten, wie "
|
671 |
+
"eine deutlich schlechtere Performance."
|
672 |
+
|
673 |
+
#: classes/Views/Settings.php:294
|
674 |
+
msgid "Data Inspector"
|
675 |
+
msgstr "Daten-Inspektor"
|
676 |
+
|
677 |
+
#: classes/Views/Settings.php:295
|
678 |
+
msgid "View data logged for each triggered alert."
|
679 |
+
msgstr "Details zu den Daten für jedes Ereignis einsehen"
|
680 |
+
|
681 |
+
#: classes/Views/Settings.php:298
|
682 |
+
msgid "PHP Errors"
|
683 |
+
msgstr "PHP-Fehler"
|
684 |
+
|
685 |
+
#: classes/Views/Settings.php:299
|
686 |
+
msgid "Enables sensor for alerts generated from PHP."
|
687 |
+
msgstr "Aktiviert einen Sensor für durch PHP generierte Ereignisse"
|
688 |
+
|
689 |
+
#: classes/Views/Settings.php:302
|
690 |
+
msgid "Request Log"
|
691 |
+
msgstr "Protokolldatei"
|
692 |
+
|
693 |
+
#: classes/Views/Settings.php:303
|
694 |
+
msgid "Enables logging request to file."
|
695 |
+
msgstr "Aktiviert das Schreiben der Ereignisse in eine Protokolldatei"
|
696 |
+
|
697 |
+
#: classes/Views/Settings.php:306
|
698 |
+
msgid "Backtrace"
|
699 |
+
msgstr "Nachverfolgung"
|
700 |
+
|
701 |
+
#: classes/Views/Settings.php:307
|
702 |
+
msgid "Log full backtrace for PHP-generated alerts."
|
703 |
+
msgstr ""
|
704 |
+
"Nachverfolgung (Backtrace) für durch PHP generierte Ereignisse aktivieren."
|
705 |
+
|
706 |
+
#: classes/Views/Settings.php:325
|
707 |
+
msgid "Hide Plugin in Plugins Page"
|
708 |
+
msgstr "Plugin auf der Plugin-Seite verstecken"
|
709 |
+
|
710 |
+
#: classes/Views/Settings.php:331
|
711 |
+
msgid "Hide"
|
712 |
+
msgstr "Verbergen"
|
713 |
+
|
714 |
+
#: classes/Views/Settings.php:335
|
715 |
+
msgid ""
|
716 |
+
"To manually revert this setting set the value of option wsal-hide-plugin to "
|
717 |
+
"0 in the wp_options table."
|
718 |
+
msgstr ""
|
719 |
+
"Um diese Einstellung manuell zurückzusetzen, setzen Sie in der "
|
720 |
+
"Datenbanktabelle wp_options die Option wsal-hide-plugin auf 0."
|
721 |
+
|
722 |
+
#: classes/Views/ToggleAlerts.php:6 classes/Views/ToggleAlerts.php:14
|
723 |
+
msgid "Enable/Disable Alerts"
|
724 |
+
msgstr "Ereignisse anzeigen/verbergen"
|
725 |
+
|
726 |
+
#: classes/Views/ToggleAlerts.php:72 classes/WidgetManager.php:38
|
727 |
+
msgid "Description"
|
728 |
+
msgstr "Beschreibung"
|
729 |
+
|
730 |
+
#: classes/Views/ToggleAlerts.php:81
|
731 |
+
msgid "Not Implemented"
|
732 |
+
msgstr "Nicht implementiert"
|
733 |
+
|
734 |
+
#: classes/Views/ToggleAlerts.php:84
|
735 |
+
msgid "Not Available"
|
736 |
+
msgstr "Nicht verfügbar"
|
737 |
+
|
738 |
+
#: classes/Views/ToggleAlerts.php:98
|
739 |
+
msgid "Save Changes"
|
740 |
+
msgstr "Änderungen speichern"
|
741 |
+
|
742 |
+
#: classes/WidgetManager.php:19
|
743 |
+
msgid "Latest Alerts"
|
744 |
+
msgstr "Letzte Ereignisse"
|
745 |
+
|
746 |
+
#: classes/WidgetManager.php:32
|
747 |
+
msgid "No alerts found."
|
748 |
+
msgstr "Keine Ereignisse gefunden."
|
749 |
+
|
750 |
+
#: classes/WidgetManager.php:37
|
751 |
+
msgid "User"
|
752 |
+
msgstr "Benutzer"
|
753 |
+
|
754 |
+
#: defaults.php:16
|
755 |
+
msgid "Fatal run-time error."
|
756 |
+
msgstr "Fataler Laufzeitfehler (Fatal run-time error)."
|
757 |
+
|
758 |
+
#: defaults.php:17
|
759 |
+
msgid "Run-time warning (non-fatal error)."
|
760 |
+
msgstr "Warnung zu einem Laufzeitfehler (Run-time warning)."
|
761 |
+
|
762 |
+
#: defaults.php:18
|
763 |
+
msgid "Compile-time parse error."
|
764 |
+
msgstr "Kompilierungsfehler (Compile-time parse error)."
|
765 |
+
|
766 |
+
#: defaults.php:19
|
767 |
+
msgid "Run-time notice."
|
768 |
+
msgstr "Benachrichtigung zur Laufzeit (Run-time notice)."
|
769 |
+
|
770 |
+
#: defaults.php:20
|
771 |
+
msgid "Fatal error that occurred during startup."
|
772 |
+
msgstr "Fatale Fehler während des Starts (Fatal error during startup)."
|
773 |
+
|
774 |
+
#: defaults.php:21
|
775 |
+
msgid "Warnings that occurred during startup."
|
776 |
+
msgstr "Warnungen während des Starts (Warnings during startup)."
|
777 |
+
|
778 |
+
#: defaults.php:22
|
779 |
+
msgid "Fatal compile-time error."
|
780 |
+
msgstr "Fateler Kompilierungsfehler (Fatal compile-time error)."
|
781 |
+
|
782 |
+
#: defaults.php:23
|
783 |
+
msgid "Compile-time warning."
|
784 |
+
msgstr "Kompiler-Warnung (Compile-time warning)."
|
785 |
+
|
786 |
+
#: defaults.php:24
|
787 |
+
msgid "User-generated error message."
|
788 |
+
msgstr "Benutzergenerierte Fehlermeldung."
|
789 |
+
|
790 |
+
#: defaults.php:25
|
791 |
+
msgid "User-generated warning message."
|
792 |
+
msgstr "Benutzergenerierte Warnmeldung."
|
793 |
+
|
794 |
+
#: defaults.php:26
|
795 |
+
msgid "User-generated notice message."
|
796 |
+
msgstr "Benutzergenerierte Benachrichtigung."
|
797 |
+
|
798 |
+
#: defaults.php:27
|
799 |
+
msgid "Non-standard/optimal code warning."
|
800 |
+
msgstr "Warnung zu nicht standardisiertem bzw. nicht optimiertem Code."
|
801 |
+
|
802 |
+
#: defaults.php:28
|
803 |
+
msgid "Catchable fatal error."
|
804 |
+
msgstr "Abfangbarer fataler Fehler (catchable fatal error)."
|
805 |
+
|
806 |
+
#: defaults.php:29
|
807 |
+
msgid "Run-time deprecation notices."
|
808 |
+
msgstr "Laufzeit-Benachrichtigungen zu veraltetem Code."
|
809 |
+
|
810 |
+
#: defaults.php:30
|
811 |
+
msgid "Run-time user deprecation notices."
|
812 |
+
msgstr "Laufzeit-Benachrichtigungen zu veraltetem Code."
|
813 |
+
|
814 |
+
#: defaults.php:32
|
815 |
+
msgid "Critical, high-impact messages."
|
816 |
+
msgstr "Kritische, schwerwiegende Benachrichtigungen"
|
817 |
+
|
818 |
+
#: defaults.php:33
|
819 |
+
msgid "Debug informational messages."
|
820 |
+
msgstr "Informelle Benachrichtigungen vom Debugger"
|
821 |
+
|
822 |
+
#: defaults.php:38
|
823 |
+
msgid "Other User Activity"
|
824 |
+
msgstr "Sonstiges"
|
825 |
+
|
826 |
+
#: defaults.php:39
|
827 |
+
msgid "User logs in"
|
828 |
+
msgstr "Ein Benutzer hat sich angemeldet."
|
829 |
+
|
830 |
+
#: defaults.php:39
|
831 |
+
msgid "Successfully logged in"
|
832 |
+
msgstr "Eine Benutzer-Anmeldung war erfolgreich."
|
833 |
+
|
834 |
+
#: defaults.php:40
|
835 |
+
msgid "User logs out"
|
836 |
+
msgstr "Ein Benutzer hat sich abgemeldet."
|
837 |
+
|
838 |
+
#: defaults.php:40
|
839 |
+
msgid "Successfully logged out"
|
840 |
+
msgstr "Eine Benutzer-Abmeldung war erfolgreich."
|
841 |
+
|
842 |
+
#: defaults.php:41
|
843 |
+
msgid "Login failed"
|
844 |
+
msgstr "Eine Benutzer-Anmeldung ist fehlgeschlagen."
|
845 |
+
|
846 |
+
#: defaults.php:41
|
847 |
+
msgid "%Attempts% failed login(s) detected"
|
848 |
+
msgstr "%Attempts% fehlgeschlagene Anmeldung(en)."
|
849 |
+
|
850 |
+
#: defaults.php:42
|
851 |
+
msgid "User uploaded file from Uploads directory"
|
852 |
+
msgstr "Ein Benutzer hat eine Datei aus dem Upload-Verzeichnis hochgeladen."
|
853 |
+
|
854 |
+
#: defaults.php:42
|
855 |
+
msgid "Uploaded the file %FileName% in %FilePath%"
|
856 |
+
msgstr "Die Datei %FileName% wurde in das Verzeichnis %FilePath% hochgeladen."
|
857 |
+
|
858 |
+
#: defaults.php:43
|
859 |
+
msgid "User deleted file from Uploads directory"
|
860 |
+
msgstr "Ein Benutzer hat eine Datei aus dem Upload-Verzeichnis gelöscht."
|
861 |
+
|
862 |
+
#: defaults.php:43
|
863 |
+
msgid "Deleted the file %FileName% from %FilePath%"
|
864 |
+
msgstr "Die Datei %FileName% wurde aus dem Verzeichnis %FilePath% gelöscht."
|
865 |
+
|
866 |
+
#: defaults.php:44
|
867 |
+
msgid "User changed a file using the theme editor"
|
868 |
+
msgstr ""
|
869 |
+
"Ein Benutzer hat eine Datei im WordPress-Datei-Editor für Themes geändert."
|
870 |
+
|
871 |
+
#: defaults.php:44
|
872 |
+
msgid "Modified %File% with the Theme Editor"
|
873 |
+
msgstr "Die Datei %File% wurde im WordPress-Datei-Editor für Themes geändert."
|
874 |
+
|
875 |
+
#: defaults.php:45
|
876 |
+
msgid "User changed a file using the plugin editor"
|
877 |
+
msgstr ""
|
878 |
+
"Ein Benutzer hat eine Datei im WordPress-Datei-Editor für Plugins geändert."
|
879 |
+
|
880 |
+
#: defaults.php:45
|
881 |
+
msgid "Modified %File% with the Plugin Editor"
|
882 |
+
msgstr "Die Datei %File% wurde im WordPress-Datei-Editor für Plugins geändert."
|
883 |
+
|
884 |
+
#: defaults.php:47
|
885 |
+
msgid "Blog Posts"
|
886 |
+
msgstr "Beiträge"
|
887 |
+
|
888 |
+
#: defaults.php:48
|
889 |
+
msgid "User created a new blog post and saved it as draft"
|
890 |
+
msgstr ""
|
891 |
+
"Ein Benutzer hat einen neuen Beitrag erstellt und diesen als Entwurf "
|
892 |
+
"gespeichert."
|
893 |
+
|
894 |
+
#: defaults.php:48
|
895 |
+
msgid "Created a new blog post called %PostTitle%. Blog post ID is %PostID%"
|
896 |
+
msgstr ""
|
897 |
+
"Ein neuer Beitrag mit dem Titel %PostTitle% wurde erstellt. Die ID des "
|
898 |
+
"Beitrags ist %PostID%."
|
899 |
+
|
900 |
+
#: defaults.php:49
|
901 |
+
msgid "User published a blog post"
|
902 |
+
msgstr "Ein Benutzer hat einen Beitrag publiziert."
|
903 |
+
|
904 |
+
#: defaults.php:49
|
905 |
+
msgid "Published a blog post called %PostTitle%. Blog post URL is %PostUrl%"
|
906 |
+
msgstr ""
|
907 |
+
"Der Beitrag mit dem Titel %PostTitle% wurde veröffentlicht. Die URL des "
|
908 |
+
"Beitrags ist %PostUrl%."
|
909 |
+
|
910 |
+
#: defaults.php:50
|
911 |
+
msgid "User modified a published blog post"
|
912 |
+
msgstr "Ein Benutzer hat einen veröffentlichten Beitrag modifiziert."
|
913 |
+
|
914 |
+
#: defaults.php:50
|
915 |
+
msgid ""
|
916 |
+
"Modified the published blog post %PostTitle%. Blog post URL is %PostUrl%"
|
917 |
+
msgstr ""
|
918 |
+
"Der veröffentlichte Beitrag mit dem Titel %PostTitle% wurde geändert. Die "
|
919 |
+
"URL des Beitrags ist %PostUrl%."
|
920 |
+
|
921 |
+
#: defaults.php:51
|
922 |
+
msgid "User modified a draft blog post"
|
923 |
+
msgstr "Ein Benutzer hat den Entwurf eines Beitrags geändert."
|
924 |
+
|
925 |
+
#: defaults.php:51
|
926 |
+
msgid "Modified the draft blog post %PostTitle%. Blog post ID is %PostID%"
|
927 |
+
msgstr ""
|
928 |
+
"Der Entwurf zum Beitrag mit dem Titel %PostTitle% wurde geändert. Die ID des "
|
929 |
+
"Beitrags ist %PostID%."
|
930 |
+
|
931 |
+
#: defaults.php:52
|
932 |
+
msgid "User permanently deleted a blog post from the trash"
|
933 |
+
msgstr "Ein Benutzer hat einen Beitrag im Papierkorb endgültig gelöscht."
|
934 |
+
|
935 |
+
#: defaults.php:52
|
936 |
+
msgid "Permanently deleted the post %PostTitle%. Blog post ID is %PostID%"
|
937 |
+
msgstr ""
|
938 |
+
"Der Beitrag mit dem Titel %PostTitle% und der ID %PostID% wurde dauerhaft "
|
939 |
+
"entfernt."
|
940 |
+
|
941 |
+
#: defaults.php:53
|
942 |
+
msgid "User moved a blog post to the trash"
|
943 |
+
msgstr "Ein Benutzer hat einen Beitrag in den Papierkorb verschoben."
|
944 |
+
|
945 |
+
#: defaults.php:53
|
946 |
+
msgid "Moved the blog post %PostTitle% to trash"
|
947 |
+
msgstr ""
|
948 |
+
"Der Beitrag mit dem Titel %PostTitle% wurde in den Papierkorb verschoben."
|
949 |
+
|
950 |
+
#: defaults.php:54
|
951 |
+
msgid "User restored a blog post from trash"
|
952 |
+
msgstr "Ein Benutzer hat einen Beitrag aus dem Papierkorb wiederhergestellt."
|
953 |
+
|
954 |
+
#: defaults.php:54
|
955 |
+
msgid "Restored post %PostTitle% from trash"
|
956 |
+
msgstr ""
|
957 |
+
"Der Beitrag mit dem Titel %PostTitle% wurde aus dem Papierkorb "
|
958 |
+
"wiederhergestellt."
|
959 |
+
|
960 |
+
#: defaults.php:55
|
961 |
+
msgid "User changed blog post category"
|
962 |
+
msgstr "Ein Benutzer hat eine Kategorie zu einem Beitrag geändert."
|
963 |
+
|
964 |
+
#: defaults.php:55
|
965 |
+
msgid ""
|
966 |
+
"Changed the category of the post %PostTitle% from %OldCategories% to "
|
967 |
+
"%NewCategories%"
|
968 |
+
msgstr ""
|
969 |
+
"Die Kategorie %OldCategories% zum Beitrag mit dem Titel %PostTitle% wurde "
|
970 |
+
"auf die Kategorie %NewCategories% geändert."
|
971 |
+
|
972 |
+
#: defaults.php:56
|
973 |
+
msgid "User changed blog post URL"
|
974 |
+
msgstr "Ein Benutzer hat die URL zum Beitrag geändert."
|
975 |
+
|
976 |
+
#: defaults.php:56
|
977 |
+
msgid "Changed the URL of the post %PostTitle% from %OldUrl% to %NewUrl%"
|
978 |
+
msgstr ""
|
979 |
+
"Die URL des Beitrags mit dem Titel %PostTitle% wurde von %OldUrl% zu %NewUrl"
|
980 |
+
"% geändert."
|
981 |
+
|
982 |
+
#: defaults.php:57
|
983 |
+
msgid "User changed blog post author"
|
984 |
+
msgstr "Ein Benutzer hat den Autor eines Beitrags geändert."
|
985 |
+
|
986 |
+
#: defaults.php:57
|
987 |
+
msgid "Changed the author of %PostTitle% post from %OldAuthor% to %NewAuthor%"
|
988 |
+
msgstr ""
|
989 |
+
"Der Autor des Beitrags mit dem Titel %PostTitle% wurde von %OldAuthor% zu "
|
990 |
+
"%NewAuthor% geändert."
|
991 |
+
|
992 |
+
#: defaults.php:58
|
993 |
+
msgid "User changed blog post status"
|
994 |
+
msgstr "Ein Benutzer hat den Status eines Beitrags geändert."
|
995 |
+
|
996 |
+
#: defaults.php:58
|
997 |
+
msgid "Changed the status of %PostTitle% post from %OldStatus% to %NewStatus%"
|
998 |
+
msgstr ""
|
999 |
+
"Der Status vom Beitrag mit dem Titel %PostTitle% wurde von %OldStatus% auf "
|
1000 |
+
"%NewStatus% gesetzt."
|
1001 |
+
|
1002 |
+
#: defaults.php:59
|
1003 |
+
msgid "User created new category"
|
1004 |
+
msgstr "Ein Benutzer hat eine neue Kategorie erstellt."
|
1005 |
+
|
1006 |
+
#: defaults.php:59
|
1007 |
+
msgid "Created a new category called %CategoryName%"
|
1008 |
+
msgstr "Die Kategorie %CategoryName% wurde neu angelegt."
|
1009 |
+
|
1010 |
+
#: defaults.php:60
|
1011 |
+
msgid "User deleted category"
|
1012 |
+
msgstr "Ein Benutzer hat eine Kategorie gelöscht."
|
1013 |
+
|
1014 |
+
#: defaults.php:60
|
1015 |
+
msgid "Deleted the %CategoryName% category"
|
1016 |
+
msgstr "Die Kategorie %CategoryName% wurde gelöscht."
|
1017 |
+
|
1018 |
+
#: defaults.php:61
|
1019 |
+
msgid "User changed the visibility of a blog post"
|
1020 |
+
msgstr "Ein Benutzer hat die Sichtbarkeit eines Beitrags geändert."
|
1021 |
+
|
1022 |
+
#: defaults.php:61
|
1023 |
+
msgid ""
|
1024 |
+
"Changed the visibility of %PostTitle% blog post from %OldVisibility% to "
|
1025 |
+
"%NewVisibility%"
|
1026 |
+
msgstr ""
|
1027 |
+
"Die Sichtbarkeit zu dem Beitrag mit dem Titel %PostTitle% wurde von "
|
1028 |
+
"%OldVisibility% auf %NewVisibility% gesetzt."
|
1029 |
+
|
1030 |
+
#: defaults.php:62
|
1031 |
+
msgid "User changed the date of a blog post"
|
1032 |
+
msgstr "Ein Benutzer hat das Datum eines Beitrags geändert."
|
1033 |
+
|
1034 |
+
#: defaults.php:62
|
1035 |
+
msgid "Changed the date of %PostTitle% blog post from %OldDate% to %NewDate%"
|
1036 |
+
msgstr ""
|
1037 |
+
"Das Datum des Beitrags mit dem Titel %PostTitle% wurde von %OldDate% auf "
|
1038 |
+
"%NewDate% gesetzt."
|
1039 |
+
|
1040 |
+
#: defaults.php:63
|
1041 |
+
msgid "User sets a post as sticky"
|
1042 |
+
msgstr "Ein Benutzer hat einen Beitrag als Sticky gesetzt (oben halten)."
|
1043 |
+
|
1044 |
+
#: defaults.php:63
|
1045 |
+
msgid "Set the post %PostTitle% as Sticky"
|
1046 |
+
msgstr ""
|
1047 |
+
"Der Beitrag mit dem Titel %PostTitle% wurde in den Sticky-Modus gesetzt "
|
1048 |
+
"(oben halten)."
|
1049 |
+
|
1050 |
+
#: defaults.php:64
|
1051 |
+
msgid "User removes post from sticky"
|
1052 |
+
msgstr ""
|
1053 |
+
"Ein Benutzer hat den Sticky-Modus (oben halten) eines Beitrags aufgehoben."
|
1054 |
+
|
1055 |
+
#: defaults.php:64
|
1056 |
+
msgid "Removed the post %PostTitle% from Sticky"
|
1057 |
+
msgstr ""
|
1058 |
+
"Der Sticky-Modus (oben halten) des Beitrag mit dem Titel %PostTitle% wurde "
|
1059 |
+
"aufgehoben."
|
1060 |
+
|
1061 |
+
#: defaults.php:65
|
1062 |
+
msgid "User creates a custom field for a post"
|
1063 |
+
msgstr ""
|
1064 |
+
"Ein Benutzer hat ein benutzerdefiniertes Feld in einem Beitrag erstellt."
|
1065 |
+
|
1066 |
+
#: defaults.php:65
|
1067 |
+
msgid ""
|
1068 |
+
"Created custom field %MetaKey% with value %MetaValue% in post %PostTitle%"
|
1069 |
+
msgstr ""
|
1070 |
+
"Das benutzerdefinierte Feld %MetaKey% mit dem Wert %MetaValue% wurde im "
|
1071 |
+
"Beitrag mit dem Titel %PostTitle% erstellt."
|
1072 |
+
|
1073 |
+
#: defaults.php:66
|
1074 |
+
msgid "User updates a custom field value for a post"
|
1075 |
+
msgstr ""
|
1076 |
+
"Ein Benutzer hat den Wert eines benutzerdefinierten Feldes in einem Beitrag "
|
1077 |
+
"aktualisiert."
|
1078 |
+
|
1079 |
+
#: defaults.php:66
|
1080 |
+
msgid ""
|
1081 |
+
"Modified the value of custom field %MetaKey% from %MetaValueOld% to "
|
1082 |
+
"%MetaValueNew% in post %PostTitle%"
|
1083 |
+
msgstr ""
|
1084 |
+
"Der Wert vom benutzerdefinierten Feld %MetaKey% im Beitrag mit dem Titel "
|
1085 |
+
"%PostTitle% wurde von %MetaValueOld% auf %MetaValueNew% geändert."
|
1086 |
+
|
1087 |
+
#: defaults.php:67
|
1088 |
+
msgid "User deletes a custom field from a post"
|
1089 |
+
msgstr ""
|
1090 |
+
"Ein Benutzer hat ein benutzerdefiniertes Feld in einem Beitrag gelöscht."
|
1091 |
+
|
1092 |
+
#: defaults.php:67
|
1093 |
+
msgid ""
|
1094 |
+
"Deleted custom field %MetaKey% with value %MetaValue% from post %PostTitle%"
|
1095 |
+
msgstr ""
|
1096 |
+
"Das benutzerdefinierte Feld %MetaKey% mit dem Wert %MetaValue% im Beitrag "
|
1097 |
+
"mit dem Titel %PostTitle% wurde gelöscht."
|
1098 |
+
|
1099 |
+
#: defaults.php:68
|
1100 |
+
msgid "User updates a custom field name for a post"
|
1101 |
+
msgstr ""
|
1102 |
+
"Ein Benutzer hat den Namen eines benutzerdefinierten Feldes in einem Beitrag "
|
1103 |
+
"aktualisiert."
|
1104 |
+
|
1105 |
+
#: defaults.php:68
|
1106 |
+
msgid ""
|
1107 |
+
"Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in post "
|
1108 |
+
"%PostTitle%"
|
1109 |
+
msgstr ""
|
1110 |
+
"Der Name des benutzerdefinierten Feldes %MetaKeyOld% in dem Beitrag mit dem "
|
1111 |
+
"Titel %PostTitle% wurde auf %MetaKeyNew% geändert."
|
1112 |
+
|
1113 |
+
#: defaults.php:69
|
1114 |
+
msgid "User modifies content for a published post"
|
1115 |
+
msgstr "Ein Benutzer hat den Inhalt eines publizierten Beitrags verändert."
|
1116 |
+
|
1117 |
+
#: defaults.php:69
|
1118 |
+
msgid "Modified the content of published post %PostTitle%"
|
1119 |
+
msgstr ""
|
1120 |
+
"Der Inhalt des publizierten Beitrags mit dem Titel %PostTitle% wurde "
|
1121 |
+
"geändert."
|
1122 |
+
|
1123 |
+
#: defaults.php:70
|
1124 |
+
msgid "User modifies content for a draft post"
|
1125 |
+
msgstr "Ein Benutzer hat den Inhalt eines Beitragentwurfs verändert."
|
1126 |
+
|
1127 |
+
#: defaults.php:70
|
1128 |
+
msgid "Modified the content of draft post %PostTitle%"
|
1129 |
+
msgstr ""
|
1130 |
+
"Der Inhalt des Beitragentwurfs mit dem Titel %PostTitle% wurde geändert."
|
1131 |
+
|
1132 |
+
#: defaults.php:72
|
1133 |
+
msgid "Pages"
|
1134 |
+
msgstr "Seiten"
|
1135 |
+
|
1136 |
+
#: defaults.php:73
|
1137 |
+
msgid "User created a new WordPress page and saved it as draft"
|
1138 |
+
msgstr ""
|
1139 |
+
"Ein Benutzer hat eine neue Seite angelegt und diese als Entwurf gespeichert."
|
1140 |
+
|
1141 |
+
#: defaults.php:73
|
1142 |
+
msgid "Created a new page called %PostTitle%. Page ID is %PostID%"
|
1143 |
+
msgstr ""
|
1144 |
+
"Eine neue Seite mit dem Titel %PostTitle% wurde angelegt. Die ID der Seite "
|
1145 |
+
"ist %PostID%."
|
1146 |
+
|
1147 |
+
#: defaults.php:74
|
1148 |
+
msgid "User published a WorPress page"
|
1149 |
+
msgstr "Ein Benutzer hat eine veröffentlichte Seite geändert."
|
1150 |
+
|
1151 |
+
#: defaults.php:74
|
1152 |
+
msgid "Published a page called %PostTitle%. Page URL is %PostUrl%"
|
1153 |
+
msgstr ""
|
1154 |
+
"Eine Seite mit dem Titel %PostTitle% wurde veröffentlicht. Die URL der Seite "
|
1155 |
+
"ist %PostUrl%."
|
1156 |
+
|
1157 |
+
#: defaults.php:75
|
1158 |
+
msgid "User modified a published WordPress page"
|
1159 |
+
msgstr "Ein Benutzer hat eine veröffentlichte Seite geändert."
|
1160 |
+
|
1161 |
+
#: defaults.php:75
|
1162 |
+
msgid "Modified the published page %PostTitle%. Page URL is %PostUrl%"
|
1163 |
+
msgstr ""
|
1164 |
+
"Die veröffentlichte Seite mit dem Titel %PostTitle% wurde geändert. Die URL "
|
1165 |
+
"der Seite ist %PostUrl%."
|
1166 |
+
|
1167 |
+
#: defaults.php:76
|
1168 |
+
msgid "User modified a draft WordPress page"
|
1169 |
+
msgstr "Ein Benutzer hat den Entwurf zu einer Seite geändert."
|
1170 |
+
|
1171 |
+
#: defaults.php:76
|
1172 |
+
msgid "Modified the draft page %PostTitle%. Page ID is %PostID%"
|
1173 |
+
msgstr ""
|
1174 |
+
"Der Entwurf zu der Seite mit dem Titel %PostTitle% wurde geändert. Die ID "
|
1175 |
+
"der Seite ist %PostID%."
|
1176 |
+
|
1177 |
+
#: defaults.php:77
|
1178 |
+
msgid "User permanently deleted a page from the trash"
|
1179 |
+
msgstr "Ein Benutzer hat eine Seite aus dem Papierkorb endgültig gelöscht."
|
1180 |
+
|
1181 |
+
#: defaults.php:77
|
1182 |
+
msgid "Permanently deleted the page %PostTitle%. Page ID is %PostID%"
|
1183 |
+
msgstr ""
|
1184 |
+
"Die Seite mit dem Titel %PostTitle% und der ID %PostID% wurde dauerhaft "
|
1185 |
+
"entfernt"
|
1186 |
+
|
1187 |
+
#: defaults.php:78
|
1188 |
+
msgid "User moved WordPress page to the trash"
|
1189 |
+
msgstr "Ein Benutzer hat eine Seite in den Papierkorb verschoben."
|
1190 |
+
|
1191 |
+
#: defaults.php:78
|
1192 |
+
msgid "Moved the page %PostTitle% to trash"
|
1193 |
+
msgstr ""
|
1194 |
+
"Die Seite mit dem Titel %PostTitle% wurde in den Papierkorb verschoben."
|
1195 |
+
|
1196 |
+
#: defaults.php:79
|
1197 |
+
msgid "User restored a WordPress page from trash"
|
1198 |
+
msgstr "Ein Benutzer hat eine Seite aus dem Papierkorb wiederhergestellt."
|
1199 |
+
|
1200 |
+
#: defaults.php:79
|
1201 |
+
msgid "Restored page %PostTitle% from trash"
|
1202 |
+
msgstr ""
|
1203 |
+
"Die Seite mit dem Titel %PostTitle% wurde aus dem Papierkorb "
|
1204 |
+
"wiederhergestellt."
|
1205 |
+
|
1206 |
+
#: defaults.php:80
|
1207 |
+
msgid "User changed page URL"
|
1208 |
+
msgstr "Ein Benutzer hat die URL einer Seite geändert."
|
1209 |
+
|
1210 |
+
#: defaults.php:80
|
1211 |
+
msgid "Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%"
|
1212 |
+
msgstr ""
|
1213 |
+
"Die URL zu der Seite mit dem Titel %PostTitle% wurde von %OldUrl% auf %NewUrl"
|
1214 |
+
"% geändert."
|
1215 |
+
|
1216 |
+
#: defaults.php:81
|
1217 |
+
msgid "User changed page author"
|
1218 |
+
msgstr "Ein Benutzer hat den Autor einer Seite geändert."
|
1219 |
+
|
1220 |
+
#: defaults.php:81
|
1221 |
+
msgid "Changed the author of %PostTitle% page from %OldAuthor% to %NewAuthor%"
|
1222 |
+
msgstr ""
|
1223 |
+
"Der Autor der Seite mit dem Titel %PostTitle% wurde von %OldAuthor% zu "
|
1224 |
+
"%NewAuthor% geändert."
|
1225 |
+
|
1226 |
+
#: defaults.php:82
|
1227 |
+
msgid "User changed page status"
|
1228 |
+
msgstr "Ein Benutzer hat den Status einer Seite geändert."
|
1229 |
+
|
1230 |
+
#: defaults.php:82
|
1231 |
+
msgid "Changed the status of %PostTitle% page from %OldStatus% to %NewStatus%"
|
1232 |
+
msgstr ""
|
1233 |
+
"Der Status zu der Seite mit dem Titel %PostTitle% wurde von %OldStatus% zu "
|
1234 |
+
"%NewStatus% geändert."
|
1235 |
+
|
1236 |
+
#: defaults.php:83
|
1237 |
+
msgid "User changed the visibility of a page post"
|
1238 |
+
msgstr "Ein Benutzer hat die Sichtbarkeit einer Seite geändert."
|
1239 |
+
|
1240 |
+
#: defaults.php:83
|
1241 |
+
msgid ""
|
1242 |
+
"Changed the visibility of %PostTitle% page from %OldVisibility% to "
|
1243 |
+
"%NewVisibility%"
|
1244 |
+
msgstr ""
|
1245 |
+
"Die Sichtbarkeit der Seite mit dem Titel %PostTitle% wurde von %OldVisibility"
|
1246 |
+
"% zu %NewVisibility% geändert."
|
1247 |
+
|
1248 |
+
#: defaults.php:84
|
1249 |
+
msgid "User changed the date of a page post"
|
1250 |
+
msgstr "Ein Benutzer hat das Datum einer Seite geändert."
|
1251 |
+
|
1252 |
+
#: defaults.php:84
|
1253 |
+
msgid "Changed the date of %PostTitle% page from %OldDate% to %NewDate%"
|
1254 |
+
msgstr ""
|
1255 |
+
"Das Datum der Seite mit dem Titel %PostTitle% wurde von %OldDate% auf "
|
1256 |
+
"%NewDate% geändert."
|
1257 |
+
|
1258 |
+
#: defaults.php:85
|
1259 |
+
msgid "User changed the parent of a page"
|
1260 |
+
msgstr "Ein Benutzer hat die Eltern-Seite zu einer Seite geändert."
|
1261 |
+
|
1262 |
+
#: defaults.php:85
|
1263 |
+
msgid ""
|
1264 |
+
"Changed the parent of %PostTitle% page from %OldParentName% to %NewParentName"
|
1265 |
+
"%"
|
1266 |
+
msgstr ""
|
1267 |
+
"Die Eltern-Seite zu der Seite mit dem Titel %PostTitle% wurde von "
|
1268 |
+
"%OldParentName% auf %NewParentName% geändert."
|
1269 |
+
|
1270 |
+
#: defaults.php:86
|
1271 |
+
msgid "User changes the template of a page"
|
1272 |
+
msgstr "Ein Benutzer hat die Vorlage zu einer Seite geändert."
|
1273 |
+
|
1274 |
+
#: defaults.php:86
|
1275 |
+
msgid ""
|
1276 |
+
"Changed the template of %PostTitle% page from %OldTemplate% to %NewTemplate%"
|
1277 |
+
msgstr ""
|
1278 |
+
"Die Vorlage zu der Seite mit dem Titel %PostTitle% wurde von %OldTemplate% "
|
1279 |
+
"auf %NewTemplate% geändert."
|
1280 |
+
|
1281 |
+
#: defaults.php:87
|
1282 |
+
msgid "User creates a custom field for a page"
|
1283 |
+
msgstr "Ein Benutzer hat ein benutzerdefiniertes Feld in einer Seite erstellt."
|
1284 |
+
|
1285 |
+
#: defaults.php:87
|
1286 |
+
msgid ""
|
1287 |
+
"Created custom field %MetaKey% with value %MetaValue% in page %PostTitle%"
|
1288 |
+
msgstr ""
|
1289 |
+
"Das benutzerdefinierte Feld %MetaKey% mit dem Wert %MetaValue% wurde in der "
|
1290 |
+
"Seite mit dem Titel %PostTitle% erstellt."
|
1291 |
+
|
1292 |
+
#: defaults.php:88
|
1293 |
+
msgid "User updates a custom field value for a page"
|
1294 |
+
msgstr ""
|
1295 |
+
"Ein Benutzer hat den Wert eines benutzerdefinierten Feldes in einer Seite "
|
1296 |
+
"aktualisiert."
|
1297 |
+
|
1298 |
+
#: defaults.php:88
|
1299 |
+
msgid ""
|
1300 |
+
"Modified the value of custom field %MetaKey% from %MetaValueOld% to "
|
1301 |
+
"%MetaValueNew% in page %PostTitle%"
|
1302 |
+
msgstr ""
|
1303 |
+
"Der Wert vom benutzerdefinierten Feld %MetaKey% in der Seite mit dem Titel "
|
1304 |
+
"%PostTitle% wurde von %MetaValueOld% auf %MetaValueNew% geändert."
|
1305 |
+
|
1306 |
+
#: defaults.php:89
|
1307 |
+
msgid "User deletes a custom field from a page"
|
1308 |
+
msgstr "Ein Benutzer hat ein benutzerdefiniertes Feld in einer Seite gelöscht."
|
1309 |
+
|
1310 |
+
#: defaults.php:89
|
1311 |
+
msgid ""
|
1312 |
+
"Deleted custom field %MetaKey% with value %MetaValue% from page %PostTitle%"
|
1313 |
+
msgstr ""
|
1314 |
+
"Das benutzerdefinierte Feld %MetaKey% mit dem Wert %MetaValue% in der Seite "
|
1315 |
+
"mit dem Titel %PostTitle% wurde gelöscht."
|
1316 |
+
|
1317 |
+
#: defaults.php:90
|
1318 |
+
msgid "User updates a custom field name for a page"
|
1319 |
+
msgstr ""
|
1320 |
+
"Ein Benutzer hat den Namen eines benutzerdefinierten Feldes in einer Seite "
|
1321 |
+
"aktualisiert"
|
1322 |
+
|
1323 |
+
#: defaults.php:90
|
1324 |
+
msgid ""
|
1325 |
+
"Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in page "
|
1326 |
+
"%PostTitle%"
|
1327 |
+
msgstr ""
|
1328 |
+
"Der Name des benutzerdefinierten Feldes %MetaKeyOld% in der Seite mit dem "
|
1329 |
+
"Titel %PostTitle% wurde auf %MetaKeyNew% geändert."
|
1330 |
+
|
1331 |
+
#: defaults.php:91
|
1332 |
+
msgid "User modifies content for a published page"
|
1333 |
+
msgstr "Ein Benutzer hat den Inhalt einer publizierten Seite verändert."
|
1334 |
+
|
1335 |
+
#: defaults.php:91
|
1336 |
+
msgid "Modified the content of published page %PostTitle%"
|
1337 |
+
msgstr ""
|
1338 |
+
"Der Inhalt der publizierten Seite mit dem Titel %PostTitle% wurde geändert."
|
1339 |
+
|
1340 |
+
#: defaults.php:92
|
1341 |
+
msgid "User modifies content for a draft page"
|
1342 |
+
msgstr "Ein Benutzer hat den Inhalt eines Seitenentwurfs verändert."
|
1343 |
+
|
1344 |
+
#: defaults.php:92
|
1345 |
+
msgid "Modified the content of draft page %PostTitle%"
|
1346 |
+
msgstr ""
|
1347 |
+
"Der Inhalt des Seitenentwurfs mit dem Titel %PostTitle% wurde geändert."
|
1348 |
+
|
1349 |
+
#: defaults.php:94
|
1350 |
+
msgid "Custom Posts"
|
1351 |
+
msgstr "Benutzerdefinierte Inhaltstypen"
|
1352 |
+
|
1353 |
+
#: defaults.php:95
|
1354 |
+
msgid "User created a new post with custom post type and saved it as draft"
|
1355 |
+
msgstr ""
|
1356 |
+
"Ein Benutzer hat einen auf einem Custom Post Type bzw. benutzerdefinierten "
|
1357 |
+
"Inhaltstyp basierten Beitrag erstellt und als Entwurf gespeichert."
|
1358 |
+
|
1359 |
+
#: defaults.php:95
|
1360 |
+
msgid ""
|
1361 |
+
"Created a new custom post called %PostTitle% of type %PostType%. Post ID is "
|
1362 |
+
"%PostID%"
|
1363 |
+
msgstr ""
|
1364 |
+
"Ein neuer Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
1365 |
+
"benutzerdefinierten Inhaltstyp %PostType% wurde erstellt. Die ID des "
|
1366 |
+
"Beitrags ist %PostID%."
|
1367 |
+
|
1368 |
+
#: defaults.php:96
|
1369 |
+
msgid "User published a post with custom post type"
|
1370 |
+
msgstr ""
|
1371 |
+
"Ein Benutzer hat einen auf einem Custom Post Type bzw. benutzerdefinierten "
|
1372 |
+
"Inhaltstyp basierten Beitrag veröffentlicht."
|
1373 |
+
|
1374 |
+
#: defaults.php:96
|
1375 |
+
msgid ""
|
1376 |
+
"Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl%"
|
1377 |
+
msgstr ""
|
1378 |
+
"Der Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
1379 |
+
"benutzerdefinierten Inhaltstyp %PostType% wurde veröffentlicht. Die URL des "
|
1380 |
+
"Beitrags ist %PostUrl%."
|
1381 |
+
|
1382 |
+
#: defaults.php:97
|
1383 |
+
msgid "User modified a post with custom post type"
|
1384 |
+
msgstr ""
|
1385 |
+
"Ein Benutzer hat einen auf einem Custom Post Type bzw. benutzerdefinierten "
|
1386 |
+
"Inhaltstyp basierten Beitrag geändert."
|
1387 |
+
|
1388 |
+
#: defaults.php:97
|
1389 |
+
msgid ""
|
1390 |
+
"Modified custom post %PostTitle% of type %PostType%. Post URL is %PostUrl%"
|
1391 |
+
msgstr ""
|
1392 |
+
"Der Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
1393 |
+
"benutzerdefinierten Inhaltstyp %PostType% wurde geändert. Die URL des "
|
1394 |
+
"Beitrags ist %PostUrl%."
|
1395 |
+
|
1396 |
+
#: defaults.php:98
|
1397 |
+
msgid "User modified a draft post with custom post type"
|
1398 |
+
msgstr ""
|
1399 |
+
"Ein Benutzer hat den Entwurf eines auf einem Custom Post Type bzw. "
|
1400 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1401 |
+
|
1402 |
+
#: defaults.php:98
|
1403 |
+
msgid ""
|
1404 |
+
"Modified draft custom post %PostTitle% of type is %PostType%. Post URL is "
|
1405 |
+
"%PostUrl%"
|
1406 |
+
msgstr ""
|
1407 |
+
"Der Entwurf zum Beitrag mit dem Titel %PostTitle% und dem Custom Post Type "
|
1408 |
+
"bzw. benutzerdefinierten Inhaltstyp %PostType% wurde geändert. Die URL des "
|
1409 |
+
"Beitrags ist %PostUrl%."
|
1410 |
+
|
1411 |
+
#: defaults.php:99
|
1412 |
+
msgid "User permanently deleted post with custom post type"
|
1413 |
+
msgstr ""
|
1414 |
+
"Ein Benutzer hat einen auf einem Custom Post Type bzw. benutzerdefinierten "
|
1415 |
+
"Inhaltstyp basierten Beitrag endgültig gelöscht."
|
1416 |
+
|
1417 |
+
#: defaults.php:99
|
1418 |
+
msgid "Permanently Deleted custom post %PostTitle% of type %PostType%"
|
1419 |
+
msgstr ""
|
1420 |
+
"Der auf einem Custom Post Type bzw. benutzerdefinierten Inhaltstyp "
|
1421 |
+
"basierende Beitrag mit dem Titel %PostTitle% vom Typ %PostType% wurde "
|
1422 |
+
"dauerhaft entfernt"
|
1423 |
+
|
1424 |
+
#: defaults.php:100
|
1425 |
+
msgid "User moved post with custom post type to trash"
|
1426 |
+
msgstr ""
|
1427 |
+
"Ein Benutzer hat einen auf einem Custom Post Type bzw. benutzerdefinierten "
|
1428 |
+
"Inhaltstyp basierten Beitrag in den Papierkorb verschoben."
|
1429 |
+
|
1430 |
+
#: defaults.php:100
|
1431 |
+
msgid "Moved custom post %PostTitle% to trash. Post type is %PostType%"
|
1432 |
+
msgstr ""
|
1433 |
+
"Der Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
1434 |
+
"benutzerdefinierten Inhaltstyp %PostType% wurde in den Papierkorb verschoben."
|
1435 |
+
|
1436 |
+
#: defaults.php:101
|
1437 |
+
msgid "User restored post with custom post type from trash"
|
1438 |
+
msgstr ""
|
1439 |
+
"Ein Benutzer hat einen auf einem Custom Post Type bzw. benutzerdefinierten "
|
1440 |
+
"Inhaltstyp basierten Beitrag aus dem Papierkorb wiederhergestellt."
|
1441 |
+
|
1442 |
+
#: defaults.php:101
|
1443 |
+
msgid "Restored custom post %PostTitle% of type %PostType% from trash"
|
1444 |
+
msgstr ""
|
1445 |
+
"Der Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
1446 |
+
"benutzerdefinierten Inhaltstyp %PostType% wurde aus dem Papierkorb "
|
1447 |
+
"wiederhergestellt."
|
1448 |
+
|
1449 |
+
#: defaults.php:102
|
1450 |
+
msgid "User changed the category of a post with custom post type"
|
1451 |
+
msgstr ""
|
1452 |
+
"Ein Benutzer hat die Kategorie eines auf einem Custom Post Type bzw. "
|
1453 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1454 |
+
|
1455 |
+
#: defaults.php:102
|
1456 |
+
msgid ""
|
1457 |
+
"Changed the category(ies) of custom post %PostTitle% of type %PostType% from "
|
1458 |
+
"%OldCategories% to %NewCategories%"
|
1459 |
+
msgstr ""
|
1460 |
+
"Die Kategorie zum Beitrag mit dem Titel %PostTitle% und dem Custom Post Type "
|
1461 |
+
"bzw. benutzerdefinierten Inhaltstyp %PostType% wurde von %OldCategories% auf "
|
1462 |
+
"%NewCategories% geändert."
|
1463 |
+
|
1464 |
+
#: defaults.php:103
|
1465 |
+
msgid "User changed the URL of a post with custom post type"
|
1466 |
+
msgstr ""
|
1467 |
+
"Ein Benutzer hat die URL eines auf einem Custom Post Type bzw. "
|
1468 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1469 |
+
|
1470 |
+
#: defaults.php:103
|
1471 |
+
msgid ""
|
1472 |
+
"Changed the URL of custom post %PostTitle% of type %PostType% from %OldUrl% "
|
1473 |
+
"to %NewUrl%"
|
1474 |
+
msgstr ""
|
1475 |
+
"Die URL zum Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
1476 |
+
"benutzerdefinierten Inhaltstyp %PostType% wurde von %OldUrl% auf %NewUrl% "
|
1477 |
+
"geändert."
|
1478 |
+
|
1479 |
+
#: defaults.php:104
|
1480 |
+
msgid "User changed the author or post with custom post type"
|
1481 |
+
msgstr ""
|
1482 |
+
"Ein Benutzer hat den Autor eines auf einem Custom Post Type bzw. "
|
1483 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1484 |
+
|
1485 |
+
#: defaults.php:104
|
1486 |
+
msgid ""
|
1487 |
+
"Changed the author of custom post %PostTitle% of type %PostType% from "
|
1488 |
+
"%OldAuthor% to %NewAuthor%"
|
1489 |
+
msgstr ""
|
1490 |
+
"Der Autor zum Beitrag mit dem Titel %PostTitle% und dem Custom Post Type "
|
1491 |
+
"bzw. benutzerdefinierten Inhaltstyp %PostType% wurde von %OldAuthor% auf "
|
1492 |
+
"%NewAuthor% geändert."
|
1493 |
+
|
1494 |
+
#: defaults.php:105
|
1495 |
+
msgid "User changed the status of post with custom post type"
|
1496 |
+
msgstr ""
|
1497 |
+
"Ein Benutzer hat den Status eines auf einem Custom Post Type bzw. "
|
1498 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1499 |
+
|
1500 |
+
#: defaults.php:105
|
1501 |
+
msgid ""
|
1502 |
+
"Changed the status of custom post %PostTitle% of type %PostType% from "
|
1503 |
+
"%OldStatus% to %NewStatus%"
|
1504 |
+
msgstr ""
|
1505 |
+
"Der Status zum Beitrag mit dem Titel %PostTitle% und dem Custom Post Type "
|
1506 |
+
"bzw. benutzerdefinierten Inhaltstyp %PostType% wurde von %OldStatus% auf "
|
1507 |
+
"%NewStatus% geändert."
|
1508 |
+
|
1509 |
+
#: defaults.php:106
|
1510 |
+
msgid "User changed the visibility of a post with custom post type"
|
1511 |
+
msgstr ""
|
1512 |
+
"Ein Benutzer hat die Sichtbarkeit eines auf einem Custom Post Type bzw. "
|
1513 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1514 |
+
|
1515 |
+
#: defaults.php:106
|
1516 |
+
msgid ""
|
1517 |
+
"Changed the visibility of custom post %PostTitle% of type %PostType% from "
|
1518 |
+
"%OldVisibility% to %NewVisibility%"
|
1519 |
+
msgstr ""
|
1520 |
+
"Die Sichtbarkeit zum Beitrag mit dem Titel %PostTitle% und dem Custom Post "
|
1521 |
+
"Type bzw. benutzerdefinierten Inhaltstyp %PostType% wurde von %OldVisibility"
|
1522 |
+
"% auf %NewVisibility% geändert."
|
1523 |
+
|
1524 |
+
#: defaults.php:107
|
1525 |
+
msgid "User changed the date of post with custom post type"
|
1526 |
+
msgstr ""
|
1527 |
+
"Ein Benutzer hat das Datum eines auf einem Custom Post Type bzw. "
|
1528 |
+
"benutzerdefinierten Inhaltstyp basierten Beitrags geändert."
|
1529 |
+
|
1530 |
+
#: defaults.php:107
|
1531 |
+
msgid ""
|
1532 |
+
"Changed the date of custom post %PostTitle% of type %PostType% from %OldDate"
|
1533 |
+
"% to %NewDate%"
|
1534 |
+
msgstr ""
|
1535 |
+
"Das Datum zum Beitrag mit dem Titel %PostTitle% und dem Custom Post Type "
|
1536 |
+
"bzw. benutzerdefinierten Inhaltstyp %PostType% wurde von %OldDate% auf "
|
1537 |
+
"%NewDate% geändert."
|
1538 |
+
|
1539 |
+
#: defaults.php:108
|
1540 |
+
msgid "User creates a custom field for a custom post"
|
1541 |
+
msgstr ""
|
1542 |
+
"Ein Benutzer hat ein benutzerdefiniertes Feld in auf einem Custom Post Type "
|
1543 |
+
"bzw. benutzerdefinierten Inhaltstyp basierenden Beitrag erstellt."
|
1544 |
+
|
1545 |
+
#: defaults.php:108
|
1546 |
+
msgid ""
|
1547 |
+
"Created custom field %MetaKey% with value %MetaValue% in custom post "
|
1548 |
+
"%PostTitle% of type %PostType%"
|
1549 |
+
msgstr ""
|
1550 |
+
"Das benutzerdefinierte Feld %MetaKey% mit dem Wert %MetaValue% wurde in dem "
|
1551 |
+
"Beitrag mit dem Titel %PostTitle% erstellt. Der Beitrag basiert auf dem "
|
1552 |
+
"Custom Post Type bzw. benutzerdefinierten Inhaltstyp %PostType%."
|
1553 |
+
|
1554 |
+
#: defaults.php:109
|
1555 |
+
msgid "User updates a custom field for a custom post"
|
1556 |
+
msgstr ""
|
1557 |
+
"Ein Benutzer hat ein benutzerdefiniertes Feld in auf einem Custom Post Type "
|
1558 |
+
"bzw. benutzerdefinierten Inhaltstyp basierenden Beitrag aktualisiert."
|
1559 |
+
|
1560 |
+
#: defaults.php:109
|
1561 |
+
msgid ""
|
1562 |
+
"Modified the value of custom field %MetaKey% from %MetaValueOld% to "
|
1563 |
+
"%MetaValueNew% in custom post %PostTitle% of type %PostType%"
|
1564 |
+
msgstr ""
|
1565 |
+
"Der Wert des benutzerdefinierten Feldes %MetaKey% in dem Beitrag mit dem "
|
1566 |
+
"Titel %PostTitle% wurde von %MetaValueOld% auf %MetaValueNew% geändert. Der "
|
1567 |
+
"Beitrag basiert auf dem Custom Post Type bzw. benutzerdefinierten Inhaltstyp "
|
1568 |
+
"%PostType%."
|
1569 |
+
|
1570 |
+
#: defaults.php:110
|
1571 |
+
msgid "User deletes a custom field from a custom post"
|
1572 |
+
msgstr ""
|
1573 |
+
"Ein Benutzer hat ein benutzerdefiniertes Feld in auf einem Custom Post Type "
|
1574 |
+
"bzw. benutzerdefinierten Inhaltstyp basierenden Beitrag gelöscht."
|
1575 |
+
|
1576 |
+
#: defaults.php:110
|
1577 |
+
msgid ""
|
1578 |
+
"Deleted custom field %MetaKey% with value %MetaValue% from custom post "
|
1579 |
+
"%PostTitle% of type %PostType%"
|
1580 |
+
msgstr ""
|
1581 |
+
"Das benutzerdefinierte Feld %MetaKey% mit dem Wert %MetaValue% wurde in dem "
|
1582 |
+
"Beitrag mit dem Titel %PostTitle% gelöscht. Der Beitrag basiert auf dem "
|
1583 |
+
"Custom Post Type bzw. benutzerdefinierten Inhaltstyp %PostType%."
|
1584 |
+
|
1585 |
+
#: defaults.php:111
|
1586 |
+
msgid "User updates a custom field name for a custom post"
|
1587 |
+
msgstr ""
|
1588 |
+
"Ein Benutzer hat den Namen eines benutzerdefinierten Feldes in auf einem "
|
1589 |
+
"Custom Post Type bzw. benutzerdefinierten Inhaltstyp basierenden Beitrag "
|
1590 |
+
"aktualisiert."
|
1591 |
+
|
1592 |
+
#: defaults.php:111
|
1593 |
+
msgid ""
|
1594 |
+
"Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in custom "
|
1595 |
+
"post %PostTitle% of type %PostType%"
|
1596 |
+
msgstr ""
|
1597 |
+
"Der Name des benutzerdefinierten Feldes %MetaKeyOld% wurde in dem Beitrag "
|
1598 |
+
"mit dem Titel %PostTitle% auf %MetaKeyNew% geändert. Der Beitrag basiert auf "
|
1599 |
+
"dem Custom Post Type bzw. benutzerdefinierten Inhaltstyp %PostType%."
|
1600 |
+
|
1601 |
+
#: defaults.php:112
|
1602 |
+
msgid "User modifies content for a published custom post"
|
1603 |
+
msgstr ""
|
1604 |
+
"Ein Benutzer hat den Inhalt eines auf einem benutzerdefinierten Inhaltstyp "
|
1605 |
+
"basierenden und publizierten Beitrags verändert."
|
1606 |
+
|
1607 |
+
#: defaults.php:112
|
1608 |
+
msgid "Modified the content of published custom post type %PostTitle%"
|
1609 |
+
msgstr ""
|
1610 |
+
"Der Inhalt eines auf einem benutzerdefinierten Inhaltstyp basierenden und "
|
1611 |
+
"publizierten Beitrag mit dem Titel %PostTitle% wurde verändert."
|
1612 |
+
|
1613 |
+
#: defaults.php:113
|
1614 |
+
msgid "User modifies content for a draft custom post"
|
1615 |
+
msgstr ""
|
1616 |
+
"Ein Benutzer hat den Inhalt eines auf einem benutzerdefinierten Inhaltstyp "
|
1617 |
+
"basierenden Beitragentwurfs verändert."
|
1618 |
+
|
1619 |
+
#: defaults.php:113
|
1620 |
+
msgid "Modified the content of draft custom post type %PostTitle%"
|
1621 |
+
msgstr ""
|
1622 |
+
"Der Inhalt eines auf einem benutzerdefinierten Inhaltstyp basierenden "
|
1623 |
+
"Beitragentwurfs mit dem Titel %PostTitle% wurde verändert."
|
1624 |
+
|
1625 |
+
#: defaults.php:115
|
1626 |
+
msgid "Widgets"
|
1627 |
+
msgstr "Widgets"
|
1628 |
+
|
1629 |
+
#: defaults.php:116
|
1630 |
+
msgid "User added a new widget"
|
1631 |
+
msgstr "Ein Benutzer hat ein neues Widget hinzugefügt."
|
1632 |
+
|
1633 |
+
#: defaults.php:116
|
1634 |
+
msgid "Added a new %WidgetName% widget in %Sidebar%"
|
1635 |
+
msgstr ""
|
1636 |
+
"Das Widget mit dem Namen %WidgetName% wurde der Sidebar %Sidebar% "
|
1637 |
+
"hinzugefügt."
|
1638 |
+
|
1639 |
+
#: defaults.php:117
|
1640 |
+
msgid "User modified a widget"
|
1641 |
+
msgstr "Ein Benutzer hat ein Widget geändert."
|
1642 |
+
|
1643 |
+
#: defaults.php:117
|
1644 |
+
msgid "Modified the %WidgetName% widget in %Sidebar%"
|
1645 |
+
msgstr ""
|
1646 |
+
"Das Widget mit dem Namen %WidgetName% in der Sidebar %Sidebar% wurde "
|
1647 |
+
"geändert."
|
1648 |
+
|
1649 |
+
#: defaults.php:118
|
1650 |
+
msgid "User deleted widget"
|
1651 |
+
msgstr "Ein Benutzer hat ein Widget gelöscht."
|
1652 |
+
|
1653 |
+
#: defaults.php:118
|
1654 |
+
msgid "Deleted the %WidgetName% widget from %Sidebar%"
|
1655 |
+
msgstr ""
|
1656 |
+
"Das Widget mit dem Namen %WidgetName% wurde aus der Sidebar %Sidebar% "
|
1657 |
+
"entfernt."
|
1658 |
+
|
1659 |
+
#: defaults.php:119
|
1660 |
+
msgid "User moved widget"
|
1661 |
+
msgstr "Ein Benutzer hat ein Widget verschoben."
|
1662 |
+
|
1663 |
+
#: defaults.php:119
|
1664 |
+
msgid "Moved the %WidgetName% widget from %OldSidebar% to %NewSidebar%"
|
1665 |
+
msgstr ""
|
1666 |
+
"Das Widget mit dem Namen %WidgetName% wurde von der Sidebar %OldSidebar% in "
|
1667 |
+
"die Sidebar %NewSidebar% verschoben."
|
1668 |
+
|
1669 |
+
#: defaults.php:120
|
1670 |
+
msgid "User changed widget position"
|
1671 |
+
msgstr "Ein Benutzer hat die Position eines Widgets verändert."
|
1672 |
+
|
1673 |
+
#: defaults.php:120
|
1674 |
+
msgid ""
|
1675 |
+
"Moved the %WidgetName% widget from position %OldPosition% to position "
|
1676 |
+
"%NewPosition% in sidebar %Sidebar%"
|
1677 |
+
msgstr ""
|
1678 |
+
"Das Widget mit dem Namen %WidgetName% wurde von der Position %OldPosition% "
|
1679 |
+
"auf die neue Position %NewPosition% in der Sidebar %Sidebar% verschoben."
|
1680 |
+
|
1681 |
+
#: defaults.php:122
|
1682 |
+
msgid "User Profiles"
|
1683 |
+
msgstr "Benutzer"
|
1684 |
+
|
1685 |
+
#: defaults.php:123
|
1686 |
+
msgid "A new user was created on WordPress"
|
1687 |
+
msgstr "Ein neuer Benutzer wurde erstellt."
|
1688 |
+
|
1689 |
+
#: defaults.php:123
|
1690 |
+
msgid ""
|
1691 |
+
"User %NewUserData->Username% subscribed with a role of %NewUserData->Roles%"
|
1692 |
+
msgstr ""
|
1693 |
+
"Der Benutzer %NewUserData->Username% hat die Benutzerrolle %NewUserData-"
|
1694 |
+
">Roles% eingenommen."
|
1695 |
+
|
1696 |
+
#: defaults.php:124
|
1697 |
+
msgid "A user created another WordPress user"
|
1698 |
+
msgstr "Ein Benutzer hat einen neuen Benutzer erstellt."
|
1699 |
+
|
1700 |
+
#: defaults.php:124
|
1701 |
+
msgid ""
|
1702 |
+
"Created a new user %NewUserData->Username% with the role of %NewUserData-"
|
1703 |
+
">Roles%"
|
1704 |
+
msgstr ""
|
1705 |
+
"Ein neuer Benutzer %NewUserData->Username% mit der Benutzerrolle "
|
1706 |
+
"%NewUserData->Roles% wurde erstellt."
|
1707 |
+
|
1708 |
+
#: defaults.php:125
|
1709 |
+
msgid "The role of a user was changed by another WordPress user"
|
1710 |
+
msgstr ""
|
1711 |
+
"Die Benutzerrolle eines Benutzers wurde durch einen anderen Benutzer "
|
1712 |
+
"geändert."
|
1713 |
+
|
1714 |
+
#: defaults.php:125
|
1715 |
+
msgid "Changed the role of user %TargetUsername% from %OldRole% to %NewRole%"
|
1716 |
+
msgstr ""
|
1717 |
+
"Die Benutzerrolle des Benutzers %TargetUsername% wurde von %OldRole% auf "
|
1718 |
+
"%NewRole% geändert."
|
1719 |
+
|
1720 |
+
#: defaults.php:126
|
1721 |
+
msgid "User has changed his or her password"
|
1722 |
+
msgstr "Ein Benutzer hat sein Kennwort geändert."
|
1723 |
+
|
1724 |
+
#: defaults.php:126
|
1725 |
+
msgid "Changed the password"
|
1726 |
+
msgstr "Das Kennwort wurde geändert."
|
1727 |
+
|
1728 |
+
#: defaults.php:127
|
1729 |
+
msgid "A user changed another user's password"
|
1730 |
+
msgstr "Ein Benutzer hat das Kennwort eines anderen Benutzers geändert."
|
1731 |
+
|
1732 |
+
#: defaults.php:127
|
1733 |
+
msgid ""
|
1734 |
+
"Changed the password for user %TargetUserData->Username% with the role of "
|
1735 |
+
"%TargetUserData->Roles%"
|
1736 |
+
msgstr ""
|
1737 |
+
"Das Kennwort vom Benutzer %TargetUserData->Username% mit der Benutzerrolle "
|
1738 |
+
"%TargetUserData->Roles% wurde geändert."
|
1739 |
+
|
1740 |
+
#: defaults.php:128
|
1741 |
+
msgid "User changed his or her email address"
|
1742 |
+
msgstr "Ein Benutzer hat seine E-Mail-Adresse geändert."
|
1743 |
+
|
1744 |
+
#: defaults.php:128
|
1745 |
+
msgid "Changed the email address from %OldEmail% to %NewEmail%"
|
1746 |
+
msgstr "Die E-Mail-Adresse wurde von %OldEmail% auf %NewEmail% geändert."
|
1747 |
+
|
1748 |
+
#: defaults.php:129
|
1749 |
+
msgid "A user changed another user's email address"
|
1750 |
+
msgstr "Ein Benutzer hat die E-Mail-Adresse eines anderen Benutzers geändert."
|
1751 |
+
|
1752 |
+
#: defaults.php:129
|
1753 |
+
msgid ""
|
1754 |
+
"Changed the email address of user account %TargetUsername% from %OldEmail% "
|
1755 |
+
"to %NewEmail%"
|
1756 |
+
msgstr ""
|
1757 |
+
"Die E-Mail-Adresse des Benutzers %TargetUsername% wurde von %OldEmail% auf "
|
1758 |
+
"%NewEmail% geändert."
|
1759 |
+
|
1760 |
+
#: defaults.php:130
|
1761 |
+
msgid "A user was deleted by another user"
|
1762 |
+
msgstr "Ein Benutzer wurde von einem anderen Benutzer gelöscht."
|
1763 |
+
|
1764 |
+
#: defaults.php:130
|
1765 |
+
msgid ""
|
1766 |
+
"Deleted User %TargetUserData->Username% with the role of %TargetUserData-"
|
1767 |
+
">Roles%"
|
1768 |
+
msgstr ""
|
1769 |
+
"Der Benutzer %TargetUserData->Username% mit der Benutzerrolle "
|
1770 |
+
"%TargetUserData->Roles% wurde gelöscht."
|
1771 |
+
|
1772 |
+
#: defaults.php:132
|
1773 |
+
msgid "Plugins & Themes"
|
1774 |
+
msgstr "Plugins & Themes"
|
1775 |
+
|
1776 |
+
#: defaults.php:133
|
1777 |
+
msgid "User installed a plugin"
|
1778 |
+
msgstr "Ein Benutzer hat ein WordPress Plugin installiert."
|
1779 |
+
|
1780 |
+
#: defaults.php:133
|
1781 |
+
msgid "Installed the plugin %Plugin->Name% in %Plugin->plugin_dir_path%"
|
1782 |
+
msgstr ""
|
1783 |
+
"Das WordPress Plugin %Plugin->Name% wurde im Verzeichnis %Plugin-"
|
1784 |
+
">plugin_dir_path% installiert."
|
1785 |
+
|
1786 |
+
#: defaults.php:134
|
1787 |
+
msgid "User activated a WordPress plugin"
|
1788 |
+
msgstr "Ein Benutzer hat ein WordPress Plugin aktiviert."
|
1789 |
+
|
1790 |
+
#: defaults.php:134
|
1791 |
+
msgid "Activated the plugin %PluginData->Name% installed in %PluginFile%"
|
1792 |
+
msgstr ""
|
1793 |
+
"Das WordPress Plugin %PluginData->Name% im Verzeichnis %PluginFile% wurde "
|
1794 |
+
"aktiviert."
|
1795 |
+
|
1796 |
+
#: defaults.php:135
|
1797 |
+
msgid "User deactivated a WordPress plugin"
|
1798 |
+
msgstr "Ein Benutzer hat ein WordPress Plugin deaktiviert."
|
1799 |
+
|
1800 |
+
#: defaults.php:135
|
1801 |
+
msgid "Deactivated the plugin %PluginData->Name% installed in %PluginFile%"
|
1802 |
+
msgstr ""
|
1803 |
+
"Das WordPress Plugin %PluginData->Name% im Verzeichnis %PluginFile% wurde "
|
1804 |
+
"deaktiviert."
|
1805 |
+
|
1806 |
+
#: defaults.php:136
|
1807 |
+
msgid "User uninstalled a plugin"
|
1808 |
+
msgstr "Ein Benutzer hat ein WordPress Plugin deinstalliert."
|
1809 |
+
|
1810 |
+
#: defaults.php:136
|
1811 |
+
msgid ""
|
1812 |
+
"Uninstalled the plugin %PluginData->Name% which was installed in %PluginFile%"
|
1813 |
+
msgstr ""
|
1814 |
+
"Das WordPress Plugin %PluginData->Name% im Verzeichnis %PluginFile% wurde "
|
1815 |
+
"deinstalliert."
|
1816 |
+
|
1817 |
+
#: defaults.php:137
|
1818 |
+
msgid "User upgraded a plugin"
|
1819 |
+
msgstr "Ein Benutzer hat ein WordPress Plugin aktualisiert."
|
1820 |
+
|
1821 |
+
#: defaults.php:137
|
1822 |
+
msgid "Upgraded the plugin %PluginData->Name% installed in %PluginFile%"
|
1823 |
+
msgstr ""
|
1824 |
+
"Das WordPress Plugin %PluginData->Name% im Verzeichnis %PluginFile% wurde "
|
1825 |
+
"aktualisiert."
|
1826 |
+
|
1827 |
+
#: defaults.php:138
|
1828 |
+
msgid "User installed a theme"
|
1829 |
+
msgstr "Ein Benutzer hat ein WordPress Theme installiert."
|
1830 |
+
|
1831 |
+
#: defaults.php:138
|
1832 |
+
msgid "Installed theme \"%Theme->Name%\" in %Theme->get_template_directory%"
|
1833 |
+
msgstr ""
|
1834 |
+
"Das WordPress Theme %Theme->Name% wurde im Verzeichnis %Theme-"
|
1835 |
+
">get_template_directory% installiert."
|
1836 |
+
|
1837 |
+
#: defaults.php:139
|
1838 |
+
msgid "User activated a theme"
|
1839 |
+
msgstr "Ein Benutzer hat ein WordPress Theme aktiviert."
|
1840 |
+
|
1841 |
+
#: defaults.php:139
|
1842 |
+
msgid ""
|
1843 |
+
"Activated theme \"%Theme->Name%\", installed in %Theme-"
|
1844 |
+
">get_template_directory%"
|
1845 |
+
msgstr ""
|
1846 |
+
"Das WordPress Theme %Theme->Name% im Verzeichnis %Theme-"
|
1847 |
+
">get_template_directory% wurde aktualisiert."
|
1848 |
+
|
1849 |
+
#: defaults.php:140
|
1850 |
+
msgid "User uninstalled a theme"
|
1851 |
+
msgstr "Ein Benutzer hat ein WordPress Theme deinstalliert."
|
1852 |
+
|
1853 |
+
#: defaults.php:140
|
1854 |
+
msgid ""
|
1855 |
+
"Deleted theme \"%Theme->Name%\" installed in %Theme->get_template_directory%"
|
1856 |
+
msgstr ""
|
1857 |
+
"Das WordPress Theme %Theme->Name% im Verzeichnis %Theme-"
|
1858 |
+
">get_template_directory% wurde gelöscht."
|
1859 |
+
|
1860 |
+
#: defaults.php:142
|
1861 |
+
msgid "System Activity"
|
1862 |
+
msgstr "System"
|
1863 |
+
|
1864 |
+
#: defaults.php:143
|
1865 |
+
msgid "Unknown Error"
|
1866 |
+
msgstr "Unbekannter Fehler."
|
1867 |
+
|
1868 |
+
#: defaults.php:143
|
1869 |
+
msgid "An unexpected error has occurred"
|
1870 |
+
msgstr "Ein unerwarteter Fehler ist aufgetreten."
|
1871 |
+
|
1872 |
+
#: defaults.php:144
|
1873 |
+
msgid "PHP error"
|
1874 |
+
msgstr "PHP-Fehler."
|
1875 |
+
|
1876 |
+
#: defaults.php:144 defaults.php:145 defaults.php:146 defaults.php:147
|
1877 |
+
#: defaults.php:148
|
1878 |
+
msgid "%Message%"
|
1879 |
+
msgstr "%Message%"
|
1880 |
+
|
1881 |
+
#: defaults.php:145
|
1882 |
+
msgid "PHP warning"
|
1883 |
+
msgstr "PHP-Warnung."
|
1884 |
+
|
1885 |
+
#: defaults.php:146
|
1886 |
+
msgid "PHP notice"
|
1887 |
+
msgstr "PHP-Benachrichtigung."
|
1888 |
+
|
1889 |
+
#: defaults.php:147
|
1890 |
+
msgid "PHP exception"
|
1891 |
+
msgstr "PHP-Ausnahmefehler."
|
1892 |
+
|
1893 |
+
#: defaults.php:148
|
1894 |
+
msgid "PHP shutdown error"
|
1895 |
+
msgstr "PHP-Shutdown-Fehler."
|
1896 |
+
|
1897 |
+
#: defaults.php:149
|
1898 |
+
msgid "Events automatically pruned by system"
|
1899 |
+
msgstr "Die Ereignisse wurden vom System automatisch aufgeräumt."
|
1900 |
+
|
1901 |
+
#: defaults.php:149
|
1902 |
+
msgid "%EventCount% event(s) automatically deleted by system"
|
1903 |
+
msgstr "%EventCount% Ereignis(se) wurde(n) automatisch gelöscht."
|
1904 |
+
|
1905 |
+
#: defaults.php:150
|
1906 |
+
msgid "Option Anyone Can Register in WordPress settings changed"
|
1907 |
+
msgstr ""
|
1908 |
+
"Die WordPress Einstellung zur Mitgliedschaft \"Jeder kann sich registrieren"
|
1909 |
+
"\" wurde geändert."
|
1910 |
+
|
1911 |
+
#: defaults.php:150
|
1912 |
+
msgid "%NewValue% the option \"Anyone can register\""
|
1913 |
+
msgstr ""
|
1914 |
+
"Die WordPress Einstellung zur Mitgliedschaft \"Jeder kann sich registrieren"
|
1915 |
+
"\" hat den Wert %NewValue%."
|
1916 |
+
|
1917 |
+
#: defaults.php:151
|
1918 |
+
msgid "New User Default Role changed"
|
1919 |
+
msgstr "Die Standard-Benutzerrolle für neue Benutzer wurde geändert."
|
1920 |
+
|
1921 |
+
#: defaults.php:151
|
1922 |
+
msgid "Changed the New User Default Role from %OldRole% to %NewRole%"
|
1923 |
+
msgstr ""
|
1924 |
+
"Die Standard-Benutzerrolle für neue Benutzer wurde von %OldRole% auf %NewRole"
|
1925 |
+
"% geändert."
|
1926 |
+
|
1927 |
+
#: defaults.php:152
|
1928 |
+
msgid "WordPress Administrator Notification email changed"
|
1929 |
+
msgstr ""
|
1930 |
+
"Die WordPress Einstellung zur E-Mail-Adresse zur Benachrichtigung von "
|
1931 |
+
"Administratoren wurde geändert."
|
1932 |
+
|
1933 |
+
#: defaults.php:152
|
1934 |
+
msgid ""
|
1935 |
+
"Changed the WordPress administrator notifications email address from "
|
1936 |
+
"%OldEmail% to %NewEmail%"
|
1937 |
+
msgstr ""
|
1938 |
+
"Die WordPress Einstellung zur E-Mail-Adresse zur Benachrichtigung von "
|
1939 |
+
"Administratoren wurde von %OldEmail% auf %NewEmail% geändert."
|
1940 |
+
|
1941 |
+
#: defaults.php:153
|
1942 |
+
msgid "WordPress was updated"
|
1943 |
+
msgstr "WordPress wurde aktualisiert."
|
1944 |
+
|
1945 |
+
#: defaults.php:153
|
1946 |
+
msgid "Updated WordPress from version %OldVersion% to %NewVersion%"
|
1947 |
+
msgstr "WordPress wurde von %OldVersion% auf %NewVersion% aktualisiert."
|
1948 |
+
|
1949 |
+
#: defaults.php:154
|
1950 |
+
msgid "User changes the WordPress Permalinks"
|
1951 |
+
msgstr "Ein Benutzer hat die Permalink-Einstellungen von WordPress geändert."
|
1952 |
+
|
1953 |
+
#: defaults.php:154
|
1954 |
+
msgid "Changed the WordPress permalinks from %OldPattern% to %NewPattern%"
|
1955 |
+
msgstr ""
|
1956 |
+
"Die Permalink-Einstellungen von WordPress wurden von %OldPattern% auf "
|
1957 |
+
"%NewPattern% geändert."
|
1958 |
+
|
1959 |
+
#: defaults.php:156
|
1960 |
+
msgid "MultiSite"
|
1961 |
+
msgstr "MultiSite"
|
1962 |
+
|
1963 |
+
#: defaults.php:157
|
1964 |
+
msgid "User granted Super Admin privileges"
|
1965 |
+
msgstr "Einem Benutzer wurden Super-Administrator-Rechte zugewiesen."
|
1966 |
+
|
1967 |
+
#: defaults.php:157
|
1968 |
+
msgid "Granted Super Admin privileges to %TargetUsername%"
|
1969 |
+
msgstr ""
|
1970 |
+
"Dem Benutzer %TargetUsername% wurden Super-Administrator-Rechte zugewiesen."
|
1971 |
+
|
1972 |
+
#: defaults.php:158
|
1973 |
+
msgid "User revoked from Super Admin privileges"
|
1974 |
+
msgstr "Einem Benutzer wurden Super-Administrator-Rechte entzogen."
|
1975 |
+
|
1976 |
+
#: defaults.php:158
|
1977 |
+
msgid "Revoked Super Admin privileges from %TargetUsername%"
|
1978 |
+
msgstr ""
|
1979 |
+
"Dem Benutzer %TargetUsername% wurden Super-Administrator-Rechten entzogen."
|
1980 |
+
|
1981 |
+
#: defaults.php:159
|
1982 |
+
msgid "Existing user added to a site"
|
1983 |
+
msgstr ""
|
1984 |
+
"Ein bestehender Benutzer wurde einer Website bzw. Seite des Netzwerks "
|
1985 |
+
"hinzugefügt."
|
1986 |
+
|
1987 |
+
#: defaults.php:159
|
1988 |
+
msgid ""
|
1989 |
+
"Added existing user %TargetUsername% with %TargetUserRole% role to site "
|
1990 |
+
"%SiteName%"
|
1991 |
+
msgstr ""
|
1992 |
+
"Der bestehende Benutzer %TargetUsername% mit der Benutzerrolle "
|
1993 |
+
"%TargetUserRole% wurde der Website bzw. Seite %SiteName% des Netzwerks "
|
1994 |
+
"hinzugefügt."
|
1995 |
+
|
1996 |
+
#: defaults.php:160
|
1997 |
+
msgid "User removed from site"
|
1998 |
+
msgstr ""
|
1999 |
+
"Ein Benutzer wurde aus einer Website bzw. Seite des Netzwerks entfernt."
|
2000 |
+
|
2001 |
+
#: defaults.php:160
|
2002 |
+
msgid ""
|
2003 |
+
"Removed user %TargetUsername% with role %TargetUserRole% from %SiteName% site"
|
2004 |
+
msgstr ""
|
2005 |
+
"Der Benutzer %TargetUsername% mit der Benutzerrolle %TargetUserRole% wurde "
|
2006 |
+
"von der Website bzw. Seite %SiteName% des Netzwerks entfernt."
|
2007 |
+
|
2008 |
+
#: defaults.php:161
|
2009 |
+
msgid "New network user created"
|
2010 |
+
msgstr "Ein neuer Netzwerk-Benutzer wurde erstellt."
|
2011 |
+
|
2012 |
+
#: defaults.php:161
|
2013 |
+
msgid "Created a new network user %NewUserData->Username%"
|
2014 |
+
msgstr "Der neue Netzwerk-Benutzer %NewUserData->Username% wurde erstellt."
|
2015 |
+
|
2016 |
+
#: defaults.php:162
|
2017 |
+
msgid "New site added on network"
|
2018 |
+
msgstr "Eine neue Website bzw. Seite wurde dem Netzwerk hinzugefügt."
|
2019 |
+
|
2020 |
+
#: defaults.php:162
|
2021 |
+
msgid "Added site %SiteName% to the network"
|
2022 |
+
msgstr "Die neue Website bzw. Seite %SiteName% wurde dem Netzwerk hinzugefügt."
|
2023 |
+
|
2024 |
+
#: defaults.php:163
|
2025 |
+
msgid "Existing site archived"
|
2026 |
+
msgstr "Eine bestehende Website bzw. Seite des Netzwerks wurde archiviert."
|
2027 |
+
|
2028 |
+
#: defaults.php:163
|
2029 |
+
msgid "Archived site %SiteName%"
|
2030 |
+
msgstr "Eine Website bzw. Seite %SiteName% des Netzwerks wurde archiviert."
|
2031 |
+
|
2032 |
+
#: defaults.php:164
|
2033 |
+
msgid "Archived site has been unarchived"
|
2034 |
+
msgstr ""
|
2035 |
+
"Die Archvierung einer Website bzw. Seite des Netzwerks wurde aufgehoben."
|
2036 |
+
|
2037 |
+
#: defaults.php:164
|
2038 |
+
msgid "Unarchived site %SiteName%"
|
2039 |
+
msgstr ""
|
2040 |
+
"Die Archvierung der Website bzw. Seite %SiteName% des Netzwerks wurde "
|
2041 |
+
"aufgehoben."
|
2042 |
+
|
2043 |
+
#: defaults.php:165
|
2044 |
+
msgid "Deactivated site has been activated"
|
2045 |
+
msgstr "Eine deaktivierte Website bzw. Seite des Netzwerks wurde aktiviert."
|
2046 |
+
|
2047 |
+
#: defaults.php:165
|
2048 |
+
msgid "Activated site %SiteName%"
|
2049 |
+
msgstr "Die Website bzw. Seite %SiteName% des Netzwerks wurde aktiviert."
|
2050 |
+
|
2051 |
+
#: defaults.php:166
|
2052 |
+
msgid "Site has been deactivated"
|
2053 |
+
msgstr "Eine Website bzw. Seite des Netzwerks wurde deaktiviert."
|
2054 |
+
|
2055 |
+
#: defaults.php:166
|
2056 |
+
msgid "Deactivated site %SiteName%"
|
2057 |
+
msgstr "Die Website bzw. Seite %SiteName% des Netzwerks wurde deaktiviert."
|
2058 |
+
|
2059 |
+
#: defaults.php:167
|
2060 |
+
msgid "Existing site deleted from network"
|
2061 |
+
msgstr "Eine bestehende Website bzw. Seite des Netzwerks wurde gelöscht."
|
2062 |
+
|
2063 |
+
#: defaults.php:167
|
2064 |
+
msgid "Deleted site %SiteName%"
|
2065 |
+
msgstr "Die Website bzw. Seite %SiteName% des Netzwerks wurde gelöscht."
|
2066 |
+
|
2067 |
+
#: defaults.php:168
|
2068 |
+
msgid "Activated theme on network"
|
2069 |
+
msgstr "Ein Theme wurde netzwerkweit aktiviert."
|
2070 |
+
|
2071 |
+
#: defaults.php:168
|
2072 |
+
msgid ""
|
2073 |
+
"Network activated %Theme->Name% theme installed in %Theme-"
|
2074 |
+
">get_template_directory%"
|
2075 |
+
msgstr ""
|
2076 |
+
"Das Theme %Theme->Name%, installiert in %Theme->get_template_directory%,"
|
2077 |
+
"wurde netzwerkweit aktiviert."
|
2078 |
+
|
2079 |
+
#: defaults.php:169
|
2080 |
+
msgid "Deactivated theme from network"
|
2081 |
+
msgstr "Ein Theme wurde netzwerkweit deaktiviert."
|
2082 |
+
|
2083 |
+
#: defaults.php:169
|
2084 |
+
msgid ""
|
2085 |
+
"Network deactivated %Theme->Name% theme installed in %Theme-"
|
2086 |
+
">get_template_directory%"
|
2087 |
+
msgstr ""
|
2088 |
+
"Das Theme %Theme->Name%, installiert in %Theme->get_template_directory%,"
|
2089 |
+
"wurde netzwerkweit deaktiviert."
|
2090 |
+
|
2091 |
+
#: wp-security-audit-log.php:193
|
2092 |
+
msgid ""
|
2093 |
+
"You are using a version of PHP that is older than %s, which is no longer "
|
2094 |
+
"supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
|
2095 |
+
"\">plugins@wpwhitesecurity.com</a> to help you switch the version of PHP you "
|
2096 |
+
"are using."
|
2097 |
+
msgstr ""
|
2098 |
+
"Du verwendest die veraltete PHP-Version älter als %s, die nicht mehr "
|
2099 |
+
"unterstützt wird.<br />Kontaktiere uns via E-Mail an <a href=\"mailto:"
|
2100 |
+
"plugins@wpwhitesecurity.com\">plugins@wpwhitesecurity.com</a>, damit wir "
|
2101 |
+
"Dich bei der Aktualisierung unterstützen können."
|
2102 |
+
|
2103 |
+
#. Plugin Name of the plugin/theme
|
2104 |
+
msgid "WP Security Audit Log"
|
2105 |
+
msgstr "WP Security Audit Log"
|
2106 |
+
|
2107 |
+
#. Plugin URI of the plugin/theme
|
2108 |
+
msgid ""
|
2109 |
+
"http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-"
|
2110 |
+
"log/"
|
2111 |
+
msgstr ""
|
2112 |
+
"http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-"
|
2113 |
+
"log/"
|
2114 |
+
|
2115 |
+
#. Description of the plugin/theme
|
2116 |
+
msgid ""
|
2117 |
+
"Identify WordPress security issues before they become a problem. Keep track "
|
2118 |
+
"of everything happening on your WordPress including WordPress users "
|
2119 |
+
"activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit "
|
2120 |
+
"Log generates a security alert for everything that happens on your WordPress "
|
2121 |
+
"blogs and websites. Use the Audit Log Viewer included in the plugin to see "
|
2122 |
+
"all the security alerts."
|
2123 |
+
msgstr ""
|
2124 |
+
"Erkennen Sie WordPress Sicherheitsprobleme bevor diese zum echten Problem "
|
2125 |
+
"werden. Protokollieren Sie, was in WordPress passiert inklusive der "
|
2126 |
+
"Benutzeraktivitäten. Ähnlich zum Windows-Ereignisprotokoll oder dem Linux-"
|
2127 |
+
"Syslog, erstellt Ihnen WP Security Audit Log Protokolleinträge mit Meldungen "
|
2128 |
+
"z.B. zu Sicherheitsaspekten rund um WordPress Blogs und Websites. Verwenden "
|
2129 |
+
"Sie den Audit Log Viewer, um die Meldungen einzusehen."
|
2130 |
+
|
2131 |
+
#. Author of the plugin/theme
|
2132 |
+
msgid "WP White Security"
|
2133 |
+
msgstr "WP White Security"
|
2134 |
+
|
2135 |
+
#. Author URI of the plugin/theme
|
2136 |
+
msgid "http://www.wpwhitesecurity.com/"
|
2137 |
+
msgstr "http://www.wpwhitesecurity.com/"
|
2138 |
+
|
2139 |
+
#~ msgid "Deleted custom post %PostTitle% of type %PostType%"
|
2140 |
+
#~ msgstr ""
|
2141 |
+
#~ "Der Beitrag mit dem Titel %PostTitle% und dem Custom Post Type bzw. "
|
2142 |
+
#~ "benutzerdefinierten Inhaltstyp %PostType% wurde gelöscht."
|
2143 |
+
|
2144 |
+
#~ msgid "Deleted the page %PostTitle%. Page ID is %PostID%"
|
2145 |
+
#~ msgstr ""
|
2146 |
+
#~ "Die Seite mit dem Titel %PostTitle% wurde gelöscht. Die ID der Seite ist "
|
2147 |
+
#~ "%PostID%."
|
2148 |
+
|
2149 |
+
#~ msgid "Deleted the post %PostTitle%. Blog post ID is %PostID%"
|
2150 |
+
#~ msgstr ""
|
2151 |
+
#~ "Der Beitrag mit dem Titel %PostTitle% wurde gelöscht. Die ID des Beitrags "
|
2152 |
+
#~ "ist %PostID%."
|
2153 |
+
|
2154 |
+
#~ msgid "Enables sandbox for testing PHP code."
|
2155 |
+
#~ msgstr "Aktviert eine Sandbox zum Testen von PHP-Code."
|
2156 |
+
|
2157 |
+
#~ msgid "Hide Plugin from Plugins Page"
|
2158 |
+
#~ msgstr "Verbirgt das Plugin in der WordPress Plugin-Verwaltung"
|
2159 |
+
|
2160 |
+
#~ msgid ""
|
2161 |
+
#~ "Identify WordPress security issues before they become a problem and keep "
|
2162 |
+
#~ "track of everything happening on your WordPress, including WordPress "
|
2163 |
+
#~ "users activity. Similar to Windows Event Log and Linux Syslog, WP "
|
2164 |
+
#~ "Security Audit Log will generate a security alert for everything that "
|
2165 |
+
#~ "happens on your WordPress blog or website. Use the Audit Log Viewer "
|
2166 |
+
#~ "included in the plugin to see all the security alerts."
|
2167 |
+
#~ msgstr ""
|
2168 |
+
#~ "Erkenne im Vorfeld Sicherheitsprobleme und verfolge alle Ereignisse in "
|
2169 |
+
#~ "WordPress, inklusive der Aktivitäten der Benutzer. Ähnlich zum Windows-"
|
2170 |
+
#~ "Ereignisprotokoll oder Linux Syslog, protokolliert das Plugin WP Security "
|
2171 |
+
#~ "Audit Log Ereignisse und erstellt Sicherheitsalarme zu Deinem WordPress "
|
2172 |
+
#~ "Blog. Anhand des Protokolls kannst Du die Ereignisse nachverfolgen."
|
2173 |
+
|
2174 |
+
#~ msgid "Ready."
|
2175 |
+
#~ msgstr "Fertig."
|
2176 |
+
|
2177 |
+
#~ msgid "Sandbox"
|
2178 |
+
#~ msgstr "Sandbox"
|
languages/wp-security-audit-log-es_ES.po
ADDED
@@ -0,0 +1,2917 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Copyright (C) 2016 WP Security Audit Log
|
2 |
+
# This file is distributed under the same license as the WP Security Audit Log package.
|
3 |
+
msgid ""
|
4 |
+
msgstr ""
|
5 |
+
"Project-Id-Version: WP Security Audit Log 2.5.8\n"
|
6 |
+
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-security-audit-"
|
7 |
+
"log\n"
|
8 |
+
"POT-Creation-Date: 2017-01-23 10:08-0500\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"PO-Revision-Date: 2017-09-20 09:02-0400\n"
|
13 |
+
"Language-Team: \n"
|
14 |
+
"X-Generator: Poedit 2.0.3\n"
|
15 |
+
"Last-Translator: \n"
|
16 |
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
17 |
+
"Language: es_ES\n"
|
18 |
+
|
19 |
+
#: classes/AuditLogListView.php:36
|
20 |
+
msgid "No events so far."
|
21 |
+
msgstr "De momento no hay eventos."
|
22 |
+
|
23 |
+
#: classes/AuditLogListView.php:42
|
24 |
+
msgid "Other"
|
25 |
+
msgstr "Otro"
|
26 |
+
|
27 |
+
#: classes/AuditLogListView.php:49
|
28 |
+
msgid "Show "
|
29 |
+
msgstr "Mostrar"
|
30 |
+
|
31 |
+
#: classes/AuditLogListView.php:59
|
32 |
+
msgid " Items"
|
33 |
+
msgstr "Ítems"
|
34 |
+
|
35 |
+
#: classes/AuditLogListView.php:72 classes/Views/AuditLog.php:96
|
36 |
+
msgid "All Sites"
|
37 |
+
msgstr "Todos Sitios"
|
38 |
+
|
39 |
+
#: classes/AuditLogListView.php:123 classes/AuditLogListView.php:140
|
40 |
+
#: classes/Views/ToggleAlerts.php:75
|
41 |
+
msgid "Code"
|
42 |
+
msgstr "Código"
|
43 |
+
|
44 |
+
#: classes/AuditLogListView.php:124 classes/AuditLogListView.php:143
|
45 |
+
#: classes/Views/ToggleAlerts.php:76
|
46 |
+
msgid "Type"
|
47 |
+
msgstr "Tipo"
|
48 |
+
|
49 |
+
#: classes/AuditLogListView.php:125 classes/AuditLogListView.php:146
|
50 |
+
msgid "Date"
|
51 |
+
msgstr "Fecha"
|
52 |
+
|
53 |
+
#: classes/AuditLogListView.php:126 classes/AuditLogListView.php:149
|
54 |
+
msgid "Username"
|
55 |
+
msgstr "Nombre de usuario"
|
56 |
+
|
57 |
+
#: classes/AuditLogListView.php:127 classes/AuditLogListView.php:152
|
58 |
+
msgid "Source IP"
|
59 |
+
msgstr "Fuente IP"
|
60 |
+
|
61 |
+
#: classes/AuditLogListView.php:130 classes/AuditLogListView.php:155
|
62 |
+
msgid "Site"
|
63 |
+
msgstr "Sitio"
|
64 |
+
|
65 |
+
#: classes/AuditLogListView.php:132 classes/AuditLogListView.php:158
|
66 |
+
msgid "Message"
|
67 |
+
msgstr "Mensaje"
|
68 |
+
|
69 |
+
#: classes/AuditLogListView.php:196
|
70 |
+
msgid "Click to toggle."
|
71 |
+
msgstr "Clic para cambiar."
|
72 |
+
|
73 |
+
#: classes/AuditLogListView.php:202
|
74 |
+
msgid "Unknown error code."
|
75 |
+
msgstr "Código de error desconocido."
|
76 |
+
|
77 |
+
#: classes/AuditLogListView.php:226
|
78 |
+
msgid "Unknown"
|
79 |
+
msgstr "Desconocido"
|
80 |
+
|
81 |
+
#: classes/AuditLogListView.php:230
|
82 |
+
msgid "Plugin"
|
83 |
+
msgstr "Plugin"
|
84 |
+
|
85 |
+
#: classes/AuditLogListView.php:234
|
86 |
+
msgid "Plugins"
|
87 |
+
msgstr "Plugins"
|
88 |
+
|
89 |
+
#: classes/AuditLogListView.php:238
|
90 |
+
msgid "Website Visitor"
|
91 |
+
msgstr "Visitante del Sitio"
|
92 |
+
|
93 |
+
#: classes/AuditLogListView.php:242
|
94 |
+
msgid "System"
|
95 |
+
msgstr "Sistema"
|
96 |
+
|
97 |
+
#: classes/AuditLogListView.php:270
|
98 |
+
msgid "Alert Data Inspector"
|
99 |
+
msgstr "Alterar Inspector de Datos"
|
100 |
+
|
101 |
+
#: classes/Sensors/Content.php:424 classes/Sensors/Content.php:432
|
102 |
+
msgid "Password Protected"
|
103 |
+
msgstr "Contraseña Protegida"
|
104 |
+
|
105 |
+
#: classes/Sensors/Content.php:426 classes/Sensors/Content.php:434
|
106 |
+
msgid "Public"
|
107 |
+
msgstr "Público"
|
108 |
+
|
109 |
+
#: classes/Sensors/Content.php:428 classes/Sensors/Content.php:436
|
110 |
+
msgid "Private"
|
111 |
+
msgstr "Privado"
|
112 |
+
|
113 |
+
#: classes/Views/About.php:6
|
114 |
+
msgid "About WP Security Audit Log"
|
115 |
+
msgstr "Sobre WP Security Audit Log"
|
116 |
+
|
117 |
+
#: classes/Views/About.php:14
|
118 |
+
msgid "About"
|
119 |
+
msgstr "Acerca"
|
120 |
+
|
121 |
+
#: classes/Views/About.php:28
|
122 |
+
msgid ""
|
123 |
+
"WP Security Audit Log enables WordPress administrators and owners to "
|
124 |
+
"identify WordPress security issues before they become a security problem by "
|
125 |
+
"keeping a security audit log. WP Security Audit Log is developed by "
|
126 |
+
"WordPress security professionals WP White Security."
|
127 |
+
msgstr ""
|
128 |
+
"WP Security Audit Log permite a los administradores y propietarios "
|
129 |
+
"identificar fallos de seguridad de WordPress antes de convertirse en un "
|
130 |
+
"problema de seguridad al mantener un registro de control de seguridad. WP "
|
131 |
+
"Security Audit Log es desarrollado por profesionales de seguridad de "
|
132 |
+
"WordPress WP White Security."
|
133 |
+
|
134 |
+
#: classes/Views/About.php:30
|
135 |
+
msgid ""
|
136 |
+
"Keep A WordPress Security Audit Log & Identify WordPress Security Issues"
|
137 |
+
msgstr ""
|
138 |
+
"Mantener Un Registro de Control de Seguridad de WordPress e Identifica "
|
139 |
+
"Fallos de Seguridad en WordPress"
|
140 |
+
|
141 |
+
#: classes/Views/About.php:32
|
142 |
+
msgid ""
|
143 |
+
"WP Security Audit Log logs everything happening on your WordPress blog or "
|
144 |
+
"website and WordPress multisite network. By using WP Security Audit Log "
|
145 |
+
"security plugin it is very easy to track suspicious user activity before it "
|
146 |
+
"becomes a problem or a security issue. A WordPress security alert is "
|
147 |
+
"generated by the plugin when:"
|
148 |
+
msgstr ""
|
149 |
+
"WP Security Audit Log registra todo lo que sucede en su blog o sitio web de "
|
150 |
+
"WordPress y en la red multisitio de WordPress. Al utilizar el plugin de "
|
151 |
+
"seguridad WP Security Audit Log, es muy fácil realizar un seguimiento de la "
|
152 |
+
"actividad del usuario sospechosa antes de que se convierta en un problema o "
|
153 |
+
"un fallo de seguridad. Una alerta de seguridad de WordPress es generada por "
|
154 |
+
"el plugin cuando:"
|
155 |
+
|
156 |
+
#: classes/Views/About.php:35
|
157 |
+
msgid "User creates a new user or a new user is registered"
|
158 |
+
msgstr "Usuario crea nuevo usuario o un nuevo usuario es registrado"
|
159 |
+
|
160 |
+
#: classes/Views/About.php:36
|
161 |
+
msgid ""
|
162 |
+
"Existing user changes the role, password or other properties of another user"
|
163 |
+
msgstr ""
|
164 |
+
"Usuario existente cambio el perfil, contraseña u otras propiedades de otro "
|
165 |
+
"usuario"
|
166 |
+
|
167 |
+
#: classes/Views/About.php:37
|
168 |
+
msgid "Existing user on a WordPress multisite network is added to a site"
|
169 |
+
msgstr "Usuario existente en red multisitio de WordPress es añadido al sitio"
|
170 |
+
|
171 |
+
#: classes/Views/About.php:38
|
172 |
+
msgid "User uploads or deletes a file, changes a password or email address"
|
173 |
+
msgstr ""
|
174 |
+
"Usuario sube o borra un archivo, cambia una contraseña o correo electrónico"
|
175 |
+
|
176 |
+
#: classes/Views/About.php:39
|
177 |
+
msgid "User installs, activates, deactivates, upgrades or uninstalls a plugin"
|
178 |
+
msgstr "Usuario instala, activa, desactiva, actualiza o desinstala un plugin"
|
179 |
+
|
180 |
+
#: classes/Views/About.php:40
|
181 |
+
msgid ""
|
182 |
+
"User creates, modifies or deletes a new post, page, category or a custom "
|
183 |
+
"post type"
|
184 |
+
msgstr ""
|
185 |
+
"Usuario crea, modifica o borra una nueva entrada, página, categoría o un "
|
186 |
+
"custom post type"
|
187 |
+
|
188 |
+
#: classes/Views/About.php:41
|
189 |
+
msgid "User installs or activates a WordPress theme"
|
190 |
+
msgstr "Usuario instala o active un tema WordPress"
|
191 |
+
|
192 |
+
#: classes/Views/About.php:42
|
193 |
+
msgid "User adds, modifies or deletes a widget"
|
194 |
+
msgstr "Usuario agrega, modifica o borra un widget"
|
195 |
+
|
196 |
+
#: classes/Views/About.php:43
|
197 |
+
msgid "User uses the dashboard file editor"
|
198 |
+
msgstr "Usuario usa editor de la administración"
|
199 |
+
|
200 |
+
#: classes/Views/About.php:44
|
201 |
+
msgid "WordPress settings are changed"
|
202 |
+
msgstr "Ajustes de WordPress han sido cambiados"
|
203 |
+
|
204 |
+
#: classes/Views/About.php:45
|
205 |
+
msgid "Failed login attempts"
|
206 |
+
msgstr "Intentos de acceso fallido"
|
207 |
+
|
208 |
+
#: classes/Views/About.php:46
|
209 |
+
msgid "and much more…"
|
210 |
+
msgstr "y mucho más…"
|
211 |
+
|
212 |
+
#: classes/Views/About.php:56
|
213 |
+
msgid "Extend the Functionality & Get More Value from WP Security Audit Log"
|
214 |
+
msgstr "Extiende Funcionalidad y Obten Más valor de WP Security Audit Log"
|
215 |
+
|
216 |
+
#: classes/Views/About.php:59
|
217 |
+
msgid ""
|
218 |
+
"Get more value out of WP Security Audit Log by extending the functionality "
|
219 |
+
"of WP Security Audit Log with the premium Add-Ons."
|
220 |
+
msgstr ""
|
221 |
+
"Obten más valor fuera de WP Security Log extendiendo la funcionalidad de WP "
|
222 |
+
"Security Audit Log con Complementos premium."
|
223 |
+
|
224 |
+
#: classes/Views/About.php:61
|
225 |
+
msgid "See Add-Ons"
|
226 |
+
msgstr "Ver Complementos"
|
227 |
+
|
228 |
+
#: classes/Views/About.php:65 classes/Views/Help.php:68
|
229 |
+
msgid "WP Security Audit Log in your Language!"
|
230 |
+
msgstr "WP Security Audit Log en tu idioma!"
|
231 |
+
|
232 |
+
#: classes/Views/About.php:67 classes/Views/Help.php:70
|
233 |
+
msgid ""
|
234 |
+
"If you are interested in translating our plugin please drop us an email on"
|
235 |
+
msgstr ""
|
236 |
+
"Si estás interesado en traducir nuestro plugin, por facor envíanos un correo "
|
237 |
+
"electrónico"
|
238 |
+
|
239 |
+
#: classes/Views/About.php:72
|
240 |
+
msgid "WordPress Security Services"
|
241 |
+
msgstr "Servicios de Seguridad de WordPress"
|
242 |
+
|
243 |
+
#: classes/Views/About.php:74
|
244 |
+
msgid "Professional WordPress security services provided by WP White Security"
|
245 |
+
msgstr ""
|
246 |
+
"Servicios profesionales de seguridad de WordPress ofrecidos por WP White "
|
247 |
+
"Security"
|
248 |
+
|
249 |
+
#: classes/Views/AuditLog.php:34
|
250 |
+
msgid "Upgrade to Premium"
|
251 |
+
msgstr "Actualizar a Premium"
|
252 |
+
|
253 |
+
#: classes/Views/AuditLog.php:35
|
254 |
+
msgid ""
|
255 |
+
"and add Email Alerts, Reports, Search and Users Login and Session Management."
|
256 |
+
msgstr ""
|
257 |
+
"y añadir Alerta Email, Reporte, Búsqueda y Gestión de Sesiones y Acceso de "
|
258 |
+
"Usuarios."
|
259 |
+
|
260 |
+
#: classes/Views/AuditLog.php:36
|
261 |
+
msgid "Upgrade Now!"
|
262 |
+
msgstr "¡Actualiza Ahora!"
|
263 |
+
|
264 |
+
#: classes/Views/AuditLog.php:50 classes/Views/AuditLog.php:60
|
265 |
+
msgid "Audit Log Viewer"
|
266 |
+
msgstr "Visor de Control de Registro"
|
267 |
+
|
268 |
+
#: classes/Views/AuditLog.php:74 classes/Views/Licensing.php:34
|
269 |
+
#: classes/Views/Settings.php:111 classes/Views/ToggleAlerts.php:30
|
270 |
+
msgid "You do not have sufficient permissions to access this page."
|
271 |
+
msgstr "No tienes suficientes permisos para acceder a esta página."
|
272 |
+
|
273 |
+
#: classes/Views/AuditLog.php:95
|
274 |
+
msgid "Please enter the number of alerts you would like to see on one page:"
|
275 |
+
msgstr ""
|
276 |
+
"Por favor insertar el número de alertas que deseas ver en una sola página:"
|
277 |
+
|
278 |
+
#: classes/Views/AuditLog.php:97
|
279 |
+
msgid "No Results"
|
280 |
+
msgstr "No Hay Resultados"
|
281 |
+
|
282 |
+
#: classes/Views/EmailNotifications.php:7
|
283 |
+
msgid "Email Notifications Add-On"
|
284 |
+
msgstr "Complemento de Notificaciones por Email"
|
285 |
+
|
286 |
+
#: classes/Views/EmailNotifications.php:17
|
287 |
+
msgid "Notifications Email"
|
288 |
+
msgstr "Email de Notificaciones"
|
289 |
+
|
290 |
+
#: classes/Views/EmailNotifications.php:39 classes/Views/Extensions.php:69
|
291 |
+
msgid "Email Notifications"
|
292 |
+
msgstr "Notificaciones Email"
|
293 |
+
|
294 |
+
#: classes/Views/EmailNotifications.php:41
|
295 |
+
msgid ""
|
296 |
+
"This premium add-on allows you to configure email alerts so you are "
|
297 |
+
"<br>notified instantly when important changes happen on your WordPress."
|
298 |
+
msgstr ""
|
299 |
+
"Este complemento premium te permite configurar alertas email pues serás "
|
300 |
+
"<br>notificado instantáneamente cuando ocurren cambios importantes en tu "
|
301 |
+
"WordPress."
|
302 |
+
|
303 |
+
#: classes/Views/EmailNotifications.php:45 classes/Views/ExternalDB.php:45
|
304 |
+
#: classes/Views/LogInUsers.php:45 classes/Views/Reports.php:45
|
305 |
+
#: classes/Views/Search.php:45
|
306 |
+
msgid "Learn More"
|
307 |
+
msgstr "Leer Más"
|
308 |
+
|
309 |
+
#: classes/Views/EmailNotifications.php:54 classes/Views/ExternalDB.php:54
|
310 |
+
#: classes/Views/LogInUsers.php:54 classes/Views/Reports.php:54
|
311 |
+
#: classes/Views/Search.php:54
|
312 |
+
msgid "Buy all Add-Ons Bundle"
|
313 |
+
msgstr "Comprar Todo el Paquete de Complementos"
|
314 |
+
|
315 |
+
#: classes/Views/Extensions.php:8
|
316 |
+
msgid "WP Security Audit Log Add-Ons"
|
317 |
+
msgstr "Complementos WP Security Log Audit"
|
318 |
+
|
319 |
+
#: classes/Views/Extensions.php:16
|
320 |
+
msgid " Add Functionality"
|
321 |
+
msgstr "Añadir Funcionalidad"
|
322 |
+
|
323 |
+
#: classes/Views/Extensions.php:35
|
324 |
+
msgid ""
|
325 |
+
"The below add-ons allow you to extend the functionality of WP Security Audit "
|
326 |
+
"Log plugin and enable you to get more benefits out of the WordPress security "
|
327 |
+
"audit, such as configurable email alerts, ability to search using free text "
|
328 |
+
"based searches & filters, and generate user activity reports to meet "
|
329 |
+
"regulatory compliance requirements."
|
330 |
+
msgstr ""
|
331 |
+
"Los complementos siguientes te permiten extender la funcionalidad del plugin "
|
332 |
+
"WP Security Audit Log y permitirle obtener más beneficios de la auditoría de "
|
333 |
+
"seguridad de WordPress, tales como alertas configurables por correo "
|
334 |
+
"electrónico, la capacidad de buscar utilizando búsquedas y filtros de texto "
|
335 |
+
"libre, y generar informes de actividad del usuario para cumplir con los "
|
336 |
+
"requisitos de cumplimiento normativo."
|
337 |
+
|
338 |
+
#: classes/Views/Extensions.php:41
|
339 |
+
msgid "All Add-Ons Bundle"
|
340 |
+
msgstr "Todo el Paquete de Complementos"
|
341 |
+
|
342 |
+
#: classes/Views/Extensions.php:43
|
343 |
+
msgid ""
|
344 |
+
"Benefit from a 60% discount when you purchase all the add-ons as a single "
|
345 |
+
"bundle."
|
346 |
+
msgstr ""
|
347 |
+
"Benefíciate del 60% de descuento cuando compras todos los complementos en un "
|
348 |
+
"solo paquete."
|
349 |
+
|
350 |
+
#: classes/Views/Extensions.php:46
|
351 |
+
msgid "Get this Bundle"
|
352 |
+
msgstr "Consigue este Paquete"
|
353 |
+
|
354 |
+
#: classes/Views/Extensions.php:54
|
355 |
+
msgid "Users Logins and Management"
|
356 |
+
msgstr "Acceso de Usuarios y Gestión"
|
357 |
+
|
358 |
+
#: classes/Views/Extensions.php:56
|
359 |
+
msgid ""
|
360 |
+
"See who is logged in to your WordPress and manage user sessions and logins."
|
361 |
+
msgstr ""
|
362 |
+
"Mira quién ha iniciado sesión en tu WordPress y controla sesiones de "
|
363 |
+
"usuarios y accesos."
|
364 |
+
|
365 |
+
#: classes/Views/Extensions.php:60 classes/Views/Extensions.php:75
|
366 |
+
#: classes/Views/Extensions.php:90 classes/Views/Extensions.php:105
|
367 |
+
#: classes/Views/Extensions.php:120
|
368 |
+
msgid "Get this extension"
|
369 |
+
msgstr "Consigue esta extensión"
|
370 |
+
|
371 |
+
#: classes/Views/Extensions.php:71
|
372 |
+
msgid ""
|
373 |
+
"Get notified instantly via email when important changes are made on your "
|
374 |
+
"WordPress!"
|
375 |
+
msgstr ""
|
376 |
+
"¡Manténte notificado instantáneamente vía email cuando se hacen cambios "
|
377 |
+
"importante en tu WordPress!"
|
378 |
+
|
379 |
+
#: classes/Views/Extensions.php:84 classes/Views/Reports.php:17
|
380 |
+
#: classes/Views/Reports.php:39
|
381 |
+
msgid "Reports"
|
382 |
+
msgstr "Reportes"
|
383 |
+
|
384 |
+
#: classes/Views/Extensions.php:86
|
385 |
+
msgid ""
|
386 |
+
"Generate any type of user,site and activity report to keep track of user "
|
387 |
+
"productivity and to meet regulatory compliance requirements."
|
388 |
+
msgstr ""
|
389 |
+
"Generar cualquier tipo de reporte de usuario, sitio y actividad para "
|
390 |
+
"mantener seguimiento de productividad de usuario y para cumplir con los "
|
391 |
+
"requisitos de cumplimiento normativo."
|
392 |
+
|
393 |
+
#: classes/Views/Extensions.php:99 classes/Views/Search.php:17
|
394 |
+
#: classes/Views/Search.php:39
|
395 |
+
msgid "Search"
|
396 |
+
msgstr "Buscar"
|
397 |
+
|
398 |
+
#: classes/Views/Extensions.php:101
|
399 |
+
msgid ""
|
400 |
+
"Do free-text based searches for specific activity in the WordPress audit "
|
401 |
+
"trail. You can also use filters to fine-tune your searches."
|
402 |
+
msgstr ""
|
403 |
+
"Haz búsquedas basadas en texto libre para actividad específica en la pista "
|
404 |
+
"de auditoría de WordPress. También puedes utilizar filtros para afinar tus "
|
405 |
+
"búsquedas."
|
406 |
+
|
407 |
+
#: classes/Views/Extensions.php:114 classes/Views/ExternalDB.php:39
|
408 |
+
msgid "External DB"
|
409 |
+
msgstr "DB Externo"
|
410 |
+
|
411 |
+
#: classes/Views/Extensions.php:116
|
412 |
+
msgid ""
|
413 |
+
"Store the WordPress audit trial in an external database for a more secure "
|
414 |
+
"and faster WordPress website."
|
415 |
+
msgstr ""
|
416 |
+
"Almacena el rastro de la auditoría de WordPress en una base de datos externa "
|
417 |
+
"para un sitio web de WordPress más seguro y más rápido."
|
418 |
+
|
419 |
+
#: classes/Views/ExternalDB.php:7
|
420 |
+
msgid "External DB Add-On"
|
421 |
+
msgstr "Complemento DB Externo"
|
422 |
+
|
423 |
+
#: classes/Views/ExternalDB.php:17
|
424 |
+
msgid "External DB "
|
425 |
+
msgstr "DB Externo"
|
426 |
+
|
427 |
+
#: classes/Views/ExternalDB.php:41
|
428 |
+
msgid ""
|
429 |
+
"Meet Legal and Regulatory Compliance Requirements, Improve the Security of "
|
430 |
+
"Your WordPress and Boost its Performance by storing the WordPress Audit "
|
431 |
+
"Trail in an external database."
|
432 |
+
msgstr ""
|
433 |
+
"Cumplir con los Requisitos de Cumplimiento Legal y Regulatorio, Mejorar la "
|
434 |
+
"Seguridad de su WordPress y Aumentar su Rendimiento Almacenando el WordPress "
|
435 |
+
"Audit Trail en una Base de Datos Externa."
|
436 |
+
|
437 |
+
#: classes/Views/Help.php:6 classes/Views/Help.php:14
|
438 |
+
msgid "Help"
|
439 |
+
msgstr "Ayuda"
|
440 |
+
|
441 |
+
#: classes/Views/Help.php:27
|
442 |
+
msgid "Plugin Support"
|
443 |
+
msgstr "Soporte del Plugin"
|
444 |
+
|
445 |
+
#: classes/Views/Help.php:29
|
446 |
+
msgid ""
|
447 |
+
"Have you encountered or noticed any issues while using WP Security Audit Log "
|
448 |
+
"plugin?"
|
449 |
+
msgstr ""
|
450 |
+
"Has encontrado o notado algunos porblemas mientras usas plugin WP Security "
|
451 |
+
"Audit Log?"
|
452 |
+
|
453 |
+
#: classes/Views/Help.php:30
|
454 |
+
msgid ""
|
455 |
+
"Or you want to report something to us? Click any of the options below to "
|
456 |
+
"post on the plugin's forum or contact our support directly."
|
457 |
+
msgstr ""
|
458 |
+
"¿O quieres reportarnos algo? Haz clic en cualquiera de las opciones a "
|
459 |
+
"continuación para publicar en el foro del plugin o contacta con nuestro "
|
460 |
+
"soporte directamente."
|
461 |
+
|
462 |
+
#: classes/Views/Help.php:32
|
463 |
+
msgid "Free Support Forum"
|
464 |
+
msgstr "Foro de Soporte Gratuito"
|
465 |
+
|
466 |
+
#: classes/Views/Help.php:34
|
467 |
+
msgid "Free Support Email"
|
468 |
+
msgstr "Email de Soporte Gratuito"
|
469 |
+
|
470 |
+
#: classes/Views/Help.php:39
|
471 |
+
msgid "Plugin Documentation"
|
472 |
+
msgstr "Documentación del Plugin"
|
473 |
+
|
474 |
+
#: classes/Views/Help.php:41
|
475 |
+
msgid ""
|
476 |
+
"For more detailed information about WP Security Audit Log you can visit the "
|
477 |
+
"plugin website."
|
478 |
+
msgstr ""
|
479 |
+
"Para información más detallada sobre WP Security Audit Log puedes visitar el "
|
480 |
+
"sitio web del plugin."
|
481 |
+
|
482 |
+
#: classes/Views/Help.php:42
|
483 |
+
msgid ""
|
484 |
+
"You can also visit the official list of WordPress Security Alerts for more "
|
485 |
+
"information about all of the WordPress activity and changes you can monitor "
|
486 |
+
"with WP Security Audit Log."
|
487 |
+
msgstr ""
|
488 |
+
"Puedes también visitar la lista oficial de Alertas de Seguridad de WordPress "
|
489 |
+
"para más información sobre toda la actividad y cambios que puedes monitorear "
|
490 |
+
"con WP Security Audit Log."
|
491 |
+
|
492 |
+
#: classes/Views/Help.php:44
|
493 |
+
msgid "Plugin Website"
|
494 |
+
msgstr "Sitio Web del Plugin"
|
495 |
+
|
496 |
+
#: classes/Views/Help.php:46
|
497 |
+
msgid "Plugin Documenation"
|
498 |
+
msgstr "Documentación del Plugin"
|
499 |
+
|
500 |
+
#: classes/Views/Help.php:48
|
501 |
+
msgid "FAQs"
|
502 |
+
msgstr "FAQs"
|
503 |
+
|
504 |
+
#: classes/Views/Help.php:50
|
505 |
+
msgid "List of WordPress Security Alerts"
|
506 |
+
msgstr "Lista de Alertas de Serugidad de WordPress"
|
507 |
+
|
508 |
+
#: classes/Views/Help.php:55
|
509 |
+
msgid "Keep Yourself Up-to-Date with WordPress Security"
|
510 |
+
msgstr "Manténte Al Día con Seguridad de WordPress"
|
511 |
+
|
512 |
+
#: classes/Views/Help.php:57
|
513 |
+
msgid ""
|
514 |
+
"Keep yourself informed with what is happening in the WordPress security "
|
515 |
+
"ecosystem, which are the new vulnerabilities, which plugins you need to "
|
516 |
+
"update and what are the latest WordPress security hacks so you can stay one "
|
517 |
+
"step ahead of the hackers."
|
518 |
+
msgstr ""
|
519 |
+
"Manténte informado con lo que está sucediendo en el ecosistema de seguridad "
|
520 |
+
"de WordPress, qué son las nuevas vulnerabilidades, qué plugins necesitas "
|
521 |
+
"actualizar y cuáles son los últimos hacks de seguridad de WordPress para que "
|
522 |
+
"puedas mantenerse un paso por delante de los hackers."
|
523 |
+
|
524 |
+
#: classes/Views/Help.php:59
|
525 |
+
msgid "Read the WP White Security Blog"
|
526 |
+
msgstr "Leer el blog de WP White Security"
|
527 |
+
|
528 |
+
#: classes/Views/Help.php:61
|
529 |
+
msgid ""
|
530 |
+
"Subscribe to WP Security Bloggers (An Aggregate of WordPress Security Blogs)"
|
531 |
+
msgstr ""
|
532 |
+
"Suscríbete a WP Security Bloggers (Un Agregado de Blogs de Seguridad de "
|
533 |
+
"WordPress)"
|
534 |
+
|
535 |
+
#: classes/Views/Licensing.php:6 classes/Views/Licensing.php:14
|
536 |
+
msgid "Licensing"
|
537 |
+
msgstr "Liciencia"
|
538 |
+
|
539 |
+
#: classes/Views/Licensing.php:39 classes/Views/Settings.php:117
|
540 |
+
#: classes/Views/ToggleAlerts.php:45
|
541 |
+
msgid "Settings have been saved."
|
542 |
+
msgstr "Ajustes has sido guardados."
|
543 |
+
|
544 |
+
#: classes/Views/Licensing.php:41 classes/Views/Settings.php:120
|
545 |
+
#: classes/Views/ToggleAlerts.php:47
|
546 |
+
msgid "Error: "
|
547 |
+
msgstr "Error:"
|
548 |
+
|
549 |
+
#: classes/Views/Licensing.php:61
|
550 |
+
msgid "Version"
|
551 |
+
msgstr "Versión"
|
552 |
+
|
553 |
+
#: classes/Views/Licensing.php:71
|
554 |
+
msgid "Active"
|
555 |
+
msgstr "Activo"
|
556 |
+
|
557 |
+
#: classes/Views/Licensing.php:73
|
558 |
+
msgid "Inactive"
|
559 |
+
msgstr "Inactivo"
|
560 |
+
|
561 |
+
#: classes/Views/LogInUsers.php:7
|
562 |
+
msgid "User Sessions Management Add-On"
|
563 |
+
msgstr "Complemento Gestión de Sesiones de Usuario"
|
564 |
+
|
565 |
+
#: classes/Views/LogInUsers.php:17
|
566 |
+
msgid "Logged In Users"
|
567 |
+
msgstr "Usuarios Connectados."
|
568 |
+
|
569 |
+
#: classes/Views/LogInUsers.php:39
|
570 |
+
msgid "Users login and Management"
|
571 |
+
msgstr "Acceso de usuarios y Gestión"
|
572 |
+
|
573 |
+
#: classes/Views/LogInUsers.php:41
|
574 |
+
msgid ""
|
575 |
+
"This premium add-on allows you to see who is logged in to your WordPress,"
|
576 |
+
"<br> block multiple same-user WordPress sessions and more."
|
577 |
+
msgstr ""
|
578 |
+
"Este complemento premium te permite ver quién está conectado a su WordPress,"
|
579 |
+
"<br> bloquear múltiples sesiones del mismo usuario de WordPress y más."
|
580 |
+
|
581 |
+
#: classes/Views/Reports.php:7
|
582 |
+
msgid "Reports Add-On"
|
583 |
+
msgstr "Complemento de Reportes"
|
584 |
+
|
585 |
+
#: classes/Views/Reports.php:41
|
586 |
+
msgid ""
|
587 |
+
"Generate any type of user and site activity report to keep track of user "
|
588 |
+
"productivity<br> and meet regulatory compliance requirements. You can also "
|
589 |
+
"configure automated weekly or monthly email summary reports."
|
590 |
+
msgstr ""
|
591 |
+
"Genera cualquier tipo de usuario y reporte de registro de actividad para "
|
592 |
+
"realizar un seguimiento de la productividad del usuario<br> y cumplir con "
|
593 |
+
"los requisitos de cumplimiento normativo. También puede configurar informes "
|
594 |
+
"de resumen de correo electrónico automatizados semanales o mensuales."
|
595 |
+
|
596 |
+
#: classes/Views/Search.php:7
|
597 |
+
msgid "Search Add-On"
|
598 |
+
msgstr "Complemento de Búsqueda"
|
599 |
+
|
600 |
+
#: classes/Views/Search.php:41
|
601 |
+
msgid ""
|
602 |
+
"Do free-text based searches for specific activity in the WordPress audit "
|
603 |
+
"trail.<br> You can also use the built-in filters to fine-tune your searches."
|
604 |
+
msgstr ""
|
605 |
+
"Haz búsquedas basadas en texto libre para actividad específica en el rastro "
|
606 |
+
"de auditoría de WordPress.<br> También puedes utilizar los filtros "
|
607 |
+
"integrados para afinar sus búsquedas."
|
608 |
+
|
609 |
+
#: classes/Views/Settings.php:22 classes/Views/Settings.php:30
|
610 |
+
msgid "Settings"
|
611 |
+
msgstr "Ajustes"
|
612 |
+
|
613 |
+
#: classes/Views/Settings.php:125
|
614 |
+
msgid "General"
|
615 |
+
msgstr "General"
|
616 |
+
|
617 |
+
#: classes/Views/Settings.php:126
|
618 |
+
msgid "Audit Log"
|
619 |
+
msgstr "Control Registro"
|
620 |
+
|
621 |
+
#: classes/Views/Settings.php:127
|
622 |
+
msgid "Exclude Objects"
|
623 |
+
msgstr "Excluir Objetos"
|
624 |
+
|
625 |
+
#: classes/Views/Settings.php:143
|
626 |
+
msgid "From Email & Name"
|
627 |
+
msgstr "De Email y Nombre"
|
628 |
+
|
629 |
+
#: classes/Views/Settings.php:146
|
630 |
+
msgid "Email Address"
|
631 |
+
msgstr "Correo electrónico"
|
632 |
+
|
633 |
+
#: classes/Views/Settings.php:149
|
634 |
+
msgid "Display Name"
|
635 |
+
msgstr "Nombre Público"
|
636 |
+
|
637 |
+
#: classes/Views/Settings.php:155
|
638 |
+
msgid ""
|
639 |
+
"These email address and display name will be used as From details in the "
|
640 |
+
"emails sent by the %s . Please ensure the mail server can relay emails with "
|
641 |
+
"the domain of the specified email address."
|
642 |
+
msgstr ""
|
643 |
+
"Esta dirección de correo electrónico y el nombre a mostrar se utilizarán "
|
644 |
+
"como detalles de los correos enviados por el %s. Por favor asegúrate de que "
|
645 |
+
"el servidor de correo pueda retransmitir correos electrónicos con el dominio "
|
646 |
+
"de la dirección de correo electrónico especificada."
|
647 |
+
|
648 |
+
#: classes/Views/Settings.php:156
|
649 |
+
msgid "(premium add-ons)"
|
650 |
+
msgstr "(Complemento premium)"
|
651 |
+
|
652 |
+
#: classes/Views/Settings.php:164
|
653 |
+
msgid "Alerts Dashboard Widget"
|
654 |
+
msgstr "Alerta Widget de Administración"
|
655 |
+
|
656 |
+
#: classes/Views/Settings.php:170
|
657 |
+
msgid "On"
|
658 |
+
msgstr "On"
|
659 |
+
|
660 |
+
#: classes/Views/Settings.php:175
|
661 |
+
msgid "Off"
|
662 |
+
msgstr "Off"
|
663 |
+
|
664 |
+
#: classes/Views/Settings.php:180
|
665 |
+
msgid "Display a dashboard widget with the latest %d security alerts."
|
666 |
+
msgstr ""
|
667 |
+
"Mostrar un widget de administraci'on con las últimas %d alertas de seguridad."
|
668 |
+
|
669 |
+
#: classes/Views/Settings.php:189
|
670 |
+
msgid "Reverse Proxy / Firewall Options"
|
671 |
+
msgstr "Revertir Proxy / Opciones de Firewall"
|
672 |
+
|
673 |
+
#: classes/Views/Settings.php:195
|
674 |
+
msgid "WordPress running behind firewall or proxy"
|
675 |
+
msgstr "WordPress funcionando bajo firewall o proxy"
|
676 |
+
|
677 |
+
#: classes/Views/Settings.php:198
|
678 |
+
msgid ""
|
679 |
+
"Enable this option if your WordPress is running behind a firewall or reverse "
|
680 |
+
"proxy. When this option is enabled the plugin will retrieve the user's IP "
|
681 |
+
"address from the proxy header."
|
682 |
+
msgstr ""
|
683 |
+
"Habilita esta opción si tu WordPress se ejecuta detrás de un firewall o "
|
684 |
+
"proxy inverso. Cuando esta opción es habilitada, el plugin recuperará la "
|
685 |
+
"dirección IP del usuario desde el encabezado de proxy."
|
686 |
+
|
687 |
+
#: classes/Views/Settings.php:203
|
688 |
+
msgid "Filter Internal IP Addresses"
|
689 |
+
msgstr "Filtrar Direcciones IP Internas"
|
690 |
+
|
691 |
+
#: classes/Views/Settings.php:206
|
692 |
+
msgid ""
|
693 |
+
"Enable this option to filter internal IP addresses from the proxy headers."
|
694 |
+
msgstr ""
|
695 |
+
"Habilitar esta opción para filtrar direcciones de IP internas de cabeceras "
|
696 |
+
"del proxy."
|
697 |
+
|
698 |
+
#: classes/Views/Settings.php:212
|
699 |
+
msgid "Can Manage Plugin"
|
700 |
+
msgstr "Puede Gestionar Plugin"
|
701 |
+
|
702 |
+
#: classes/Views/Settings.php:219
|
703 |
+
msgid "Users and Roles in this list can manage the plugin settings"
|
704 |
+
msgstr "Usuarios y Roles en esta lista pueden gestionar ajustes del plugin"
|
705 |
+
|
706 |
+
#: classes/Views/Settings.php:237
|
707 |
+
msgid "Restrict Plugin Access"
|
708 |
+
msgstr "Restringir Acceso del Plugin"
|
709 |
+
|
710 |
+
#: classes/Views/Settings.php:247
|
711 |
+
msgid ""
|
712 |
+
"If this option is disabled all the administrators on this WordPress have "
|
713 |
+
"access to manage this plugin."
|
714 |
+
msgstr ""
|
715 |
+
"Si esta opción está deshabilitada, todos los administradores de este "
|
716 |
+
"WordPress tienen acceso para administrar este plugin."
|
717 |
+
|
718 |
+
#: classes/Views/Settings.php:248
|
719 |
+
msgid ""
|
720 |
+
"By enabling this option only <strong>You</strong> and the users specified in "
|
721 |
+
"the <strong>Can Manage Plugin</strong> and <strong>Can View Alerts</strong> "
|
722 |
+
"can configure this plugin or view the alerts in the WordPress audit trail."
|
723 |
+
msgstr ""
|
724 |
+
"Al habilitar esta opción, solo <strong>Tú</ strong> y los usuarios "
|
725 |
+
"especificados en <strong>Puede Gestionar Plugin</ strong> y <strong>Puede "
|
726 |
+
"Ver Alertas</ strong> pueden configurar este plugin o ver las alertas en la "
|
727 |
+
"pista de auditoría de WordPress."
|
728 |
+
|
729 |
+
#: classes/Views/Settings.php:255
|
730 |
+
msgid "Developer Options"
|
731 |
+
msgstr "Opciones del Desarrollador"
|
732 |
+
|
733 |
+
#: classes/Views/Settings.php:263
|
734 |
+
msgid ""
|
735 |
+
"Only enable these options on testing, staging and development websites. "
|
736 |
+
"Enabling any of the settings below on LIVE websites may cause unintended "
|
737 |
+
"side-effects including degraded performance."
|
738 |
+
msgstr ""
|
739 |
+
"Sólo habilita estas opciones en los sitios web de prueba, puesta en escena y "
|
740 |
+
"desarrollo. Habilitar cualquiera de los ajustes siguientes en los sitios web "
|
741 |
+
"en DIRECTO puede causar efectos secundarios no deseados incluyendo un "
|
742 |
+
"rendimiento degradado."
|
743 |
+
|
744 |
+
#: classes/Views/Settings.php:268
|
745 |
+
msgid "Data Inspector"
|
746 |
+
msgstr "Inspector de Datos"
|
747 |
+
|
748 |
+
#: classes/Views/Settings.php:269
|
749 |
+
msgid "View data logged for each triggered alert."
|
750 |
+
msgstr "Ver datos registrados por cada alerta lanzada."
|
751 |
+
|
752 |
+
#: classes/Views/Settings.php:276
|
753 |
+
msgid "Request Log"
|
754 |
+
msgstr "Solicitar Registro"
|
755 |
+
|
756 |
+
#: classes/Views/Settings.php:277
|
757 |
+
msgid "Enables logging request to file."
|
758 |
+
msgstr "Habilita petición de registro al archivo."
|
759 |
+
|
760 |
+
#: classes/Views/Settings.php:295
|
761 |
+
msgid ""
|
762 |
+
"The request log file is saved in the /wp-content/uploads/wp-security-audit-"
|
763 |
+
"log/ directory."
|
764 |
+
msgstr ""
|
765 |
+
"El archivo de registro de la solicitud ha sido guardado en el directorio /wp-"
|
766 |
+
"content/uploads/wp-security-audit-log/."
|
767 |
+
|
768 |
+
#: classes/Views/Settings.php:303
|
769 |
+
msgid "Hide Plugin in Plugins Page"
|
770 |
+
msgstr "Ocultar Plugin en Página de Plugins"
|
771 |
+
|
772 |
+
#: classes/Views/Settings.php:309
|
773 |
+
msgid "Hide"
|
774 |
+
msgstr "Ocultar"
|
775 |
+
|
776 |
+
#: classes/Views/Settings.php:313
|
777 |
+
msgid ""
|
778 |
+
"To manually revert this setting set the value of option wsal-hide-plugin to "
|
779 |
+
"0 in the wp_options table."
|
780 |
+
msgstr ""
|
781 |
+
"Para revertir manualmente esta configuración establece el valor de la opción "
|
782 |
+
"wsal-hide-plugin a 0 en la tabla wp_options."
|
783 |
+
|
784 |
+
#: classes/Views/Settings.php:320
|
785 |
+
msgid "Logging"
|
786 |
+
msgstr "Registros"
|
787 |
+
|
788 |
+
#: classes/Views/Settings.php:334
|
789 |
+
msgid "Disable all plugin logging."
|
790 |
+
msgstr "Deshabilitar todos registros de plugin."
|
791 |
+
|
792 |
+
#: classes/Views/Settings.php:341
|
793 |
+
msgid "Remove Data on Uninstall"
|
794 |
+
msgstr "Borrar Datos al Desinstalar"
|
795 |
+
|
796 |
+
#: classes/Views/Settings.php:359
|
797 |
+
msgid "Security Alerts Pruning"
|
798 |
+
msgstr "Purgar Alertas de Seguridad"
|
799 |
+
|
800 |
+
#: classes/Views/Settings.php:362 classes/Views/Settings.php:370
|
801 |
+
msgid "(eg: 1 month)"
|
802 |
+
msgstr "(ejemplo: 1 mes)"
|
803 |
+
|
804 |
+
#: classes/Views/Settings.php:366
|
805 |
+
msgid "None"
|
806 |
+
msgstr "Ninguno"
|
807 |
+
|
808 |
+
#: classes/Views/Settings.php:374
|
809 |
+
msgid "Delete alerts older than"
|
810 |
+
msgstr "Borrar alertas antiguas de"
|
811 |
+
|
812 |
+
#: classes/Views/Settings.php:382
|
813 |
+
msgid "(eg: 80)"
|
814 |
+
msgstr "(ejemplo: 80)"
|
815 |
+
|
816 |
+
#: classes/Views/Settings.php:386
|
817 |
+
msgid "Keep up to"
|
818 |
+
msgstr "Guardar hasta"
|
819 |
+
|
820 |
+
#: classes/Views/Settings.php:391
|
821 |
+
msgid "alerts"
|
822 |
+
msgstr "alertas"
|
823 |
+
|
824 |
+
#: classes/Views/Settings.php:395
|
825 |
+
msgid "Next Scheduled Cleanup is in "
|
826 |
+
msgstr "Siguiente limpieza programada es en "
|
827 |
+
|
828 |
+
#: classes/Views/Settings.php:399
|
829 |
+
msgid "(or %s)"
|
830 |
+
msgstr "(o %s)"
|
831 |
+
|
832 |
+
#: classes/Views/Settings.php:400
|
833 |
+
msgid "Run Manually"
|
834 |
+
msgstr "Ejecutar Manualmente"
|
835 |
+
|
836 |
+
#: classes/Views/Settings.php:407
|
837 |
+
msgid "Can View Alerts"
|
838 |
+
msgstr "Puede Ver Alertas"
|
839 |
+
|
840 |
+
#: classes/Views/Settings.php:414
|
841 |
+
msgid "Users and Roles in this list can view the security alerts"
|
842 |
+
msgstr ""
|
843 |
+
"Los usuarios y Perfiles en esta lista pueden ver las alertas de seguridad"
|
844 |
+
|
845 |
+
#: classes/Views/Settings.php:430
|
846 |
+
msgid "Refresh Audit Log Viewer"
|
847 |
+
msgstr "Refrescar Visor Control de Registro"
|
848 |
+
|
849 |
+
#: classes/Views/Settings.php:436
|
850 |
+
msgid "Automatic"
|
851 |
+
msgstr "Automático"
|
852 |
+
|
853 |
+
#: classes/Views/Settings.php:438
|
854 |
+
msgid "Refresh Audit Log Viewer as soon as there are new alerts."
|
855 |
+
msgstr ""
|
856 |
+
"Refrescar Visor Control de Registro tan pronto que haya nuevas alertas."
|
857 |
+
|
858 |
+
#: classes/Views/Settings.php:442
|
859 |
+
msgid "Manual"
|
860 |
+
msgstr "Manual"
|
861 |
+
|
862 |
+
#: classes/Views/Settings.php:444
|
863 |
+
msgid "Refresh Audit Log Viewer only when the page is reloaded."
|
864 |
+
msgstr ""
|
865 |
+
"Refrescar Visor Control de Registro sólo cuando la página es recargada."
|
866 |
+
|
867 |
+
#: classes/Views/Settings.php:451
|
868 |
+
msgid "Alerts Timestamp"
|
869 |
+
msgstr "Alertas Timestamp"
|
870 |
+
|
871 |
+
#: classes/Views/Settings.php:457
|
872 |
+
msgid "UTC"
|
873 |
+
msgstr "UTC"
|
874 |
+
|
875 |
+
#: classes/Views/Settings.php:462
|
876 |
+
msgid "WordPress' timezone"
|
877 |
+
msgstr "Zone horaria de WordPress"
|
878 |
+
|
879 |
+
#: classes/Views/Settings.php:465
|
880 |
+
msgid ""
|
881 |
+
"Select which timestamp should the alerts have in the Audit Log viewer. Note "
|
882 |
+
"that the WordPress' timezone might be different from that of the server."
|
883 |
+
msgstr ""
|
884 |
+
"Selecciona el timestamp que deben tener las alertas en el Visor de Registro "
|
885 |
+
"de Auditoría. Ten en cuenta que la zona horaria de WordPress puede ser "
|
886 |
+
"diferente de la del servidor."
|
887 |
+
|
888 |
+
#: classes/Views/Settings.php:471
|
889 |
+
msgid "Audit Log Columns Selection"
|
890 |
+
msgstr "Selección Columnas de Control de Registro"
|
891 |
+
|
892 |
+
#: classes/Views/Settings.php:482
|
893 |
+
msgid ""
|
894 |
+
"When you disable any of the above such details won’t be shown in the Audit "
|
895 |
+
"Log\n"
|
896 |
+
" viewer though the plugin will still record such information in the "
|
897 |
+
"database."
|
898 |
+
msgstr ""
|
899 |
+
"Cuando deshabilites cualquiera de los anteriores, dichos detalles no se "
|
900 |
+
"mostrarán en el registro de auditoría\n"
|
901 |
+
" visitante a través del plugin seguirá grabando dicha información en la "
|
902 |
+
"base de datos."
|
903 |
+
|
904 |
+
#: classes/Views/Settings.php:489
|
905 |
+
msgid "Disable Alerts for WordPress Background Activity"
|
906 |
+
msgstr "Dishabilita Alertas de Actividad de Background de WordPress"
|
907 |
+
|
908 |
+
#: classes/Views/Settings.php:495
|
909 |
+
msgid "Hide activity"
|
910 |
+
msgstr "Ocultar actividad"
|
911 |
+
|
912 |
+
#: classes/Views/Settings.php:499
|
913 |
+
msgid ""
|
914 |
+
"For example do not raise an alert when WordPress deletes the auto drafts."
|
915 |
+
msgstr ""
|
916 |
+
"Por ejemplo, no levantes una alerta cuando WordPress elimine los borradores "
|
917 |
+
"automáticos."
|
918 |
+
|
919 |
+
#: classes/Views/Settings.php:506
|
920 |
+
msgid "Number of 404 Requests to Log"
|
921 |
+
msgstr "Número "
|
922 |
+
|
923 |
+
#: classes/Views/Settings.php:512
|
924 |
+
msgid ""
|
925 |
+
"By default the plugin keeps up to 99 requests to non-existing pages from the "
|
926 |
+
"same IP address. Increase the value in this setting to the desired amount to "
|
927 |
+
"keep a log of more or less requests."
|
928 |
+
msgstr ""
|
929 |
+
"Por defecto el plugin conserva más de 99 solicitudes a páginas no existentes "
|
930 |
+
"de la misma dirección IP. Aumenta el valor en este ajuste a la cantidad "
|
931 |
+
"deseada para conservar un registro de más o menos solicitudes."
|
932 |
+
|
933 |
+
#: classes/Views/Settings.php:513
|
934 |
+
msgid ""
|
935 |
+
"Note that by increasing this value to a high number, should your website be "
|
936 |
+
"scanned the plugin will consume more resources to log all the requests."
|
937 |
+
msgstr ""
|
938 |
+
"Ten en cuenta que al aumentar este valor a un número alto, tu sitio web debe "
|
939 |
+
"ser escaneado el plugin consumirá más recursos para registrar todas las "
|
940 |
+
"solicitudes"
|
941 |
+
|
942 |
+
#: classes/Views/Settings.php:530
|
943 |
+
msgid "Excluded Users"
|
944 |
+
msgstr "Usuarios Excluidos"
|
945 |
+
|
946 |
+
#: classes/Views/Settings.php:550
|
947 |
+
msgid "Excluded Roles"
|
948 |
+
msgstr "Roles Excluidos"
|
949 |
+
|
950 |
+
#: classes/Views/Settings.php:577
|
951 |
+
msgid "Excluded Custom Fields"
|
952 |
+
msgstr "Campos Personalizados Excluidos"
|
953 |
+
|
954 |
+
#: classes/Views/Settings.php:603
|
955 |
+
msgid "Excluded IP Addresses"
|
956 |
+
msgstr "Direcciones IP Excluidas"
|
957 |
+
|
958 |
+
#: classes/Views/ToggleAlerts.php:6 classes/Views/ToggleAlerts.php:14
|
959 |
+
msgid "Enable/Disable Alerts"
|
960 |
+
msgstr "Habilitar/Deshabilitar Alertas"
|
961 |
+
|
962 |
+
#: classes/Views/ToggleAlerts.php:77 classes/WidgetManager.php:48
|
963 |
+
msgid "Description"
|
964 |
+
msgstr "Descripción"
|
965 |
+
|
966 |
+
#: classes/Views/ToggleAlerts.php:87
|
967 |
+
msgid "Not Implemented"
|
968 |
+
msgstr "No está Implementado"
|
969 |
+
|
970 |
+
#: classes/Views/ToggleAlerts.php:90
|
971 |
+
msgid "Not Available"
|
972 |
+
msgstr "No Disponible"
|
973 |
+
|
974 |
+
#: classes/Views/ToggleAlerts.php:105
|
975 |
+
msgid ""
|
976 |
+
"Capture 404 requests to file (the log file are created in the /wp-content/"
|
977 |
+
"uploads/wp-security-audit-log/404s/ directory)"
|
978 |
+
msgstr ""
|
979 |
+
"Capturar peticiones 404 en archivo (el archivo de registro es creado en "
|
980 |
+
"directorio /wp-content/uploads/wp-security-audit-log/404s/)"
|
981 |
+
|
982 |
+
#: classes/Views/ToggleAlerts.php:110
|
983 |
+
msgid "Purge log files older than one month"
|
984 |
+
msgstr "Purgar archivos de registro más antiguos de un mes"
|
985 |
+
|
986 |
+
#: classes/Views/ToggleAlerts.php:118
|
987 |
+
msgid "Save Changes"
|
988 |
+
msgstr "Guardar Cambios"
|
989 |
+
|
990 |
+
#: classes/WidgetManager.php:22
|
991 |
+
msgid "Latest Alerts"
|
992 |
+
msgstr "Últimas Alertas"
|
993 |
+
|
994 |
+
#: classes/WidgetManager.php:42
|
995 |
+
msgid "No alerts found."
|
996 |
+
msgstr "No se han encontrado alertas."
|
997 |
+
|
998 |
+
#: classes/WidgetManager.php:47
|
999 |
+
msgid "User"
|
1000 |
+
msgstr "Usuario"
|
1001 |
+
|
1002 |
+
#: defaults.php:36
|
1003 |
+
msgid "Fatal run-time error."
|
1004 |
+
msgstr "Fatal error en tiempo de ejecución"
|
1005 |
+
|
1006 |
+
#: defaults.php:37
|
1007 |
+
msgid "Run-time warning (non-fatal error)."
|
1008 |
+
msgstr "Advertencia en tiempo de ejecución (no fatal error)."
|
1009 |
+
|
1010 |
+
#: defaults.php:38
|
1011 |
+
msgid "Compile-time parse error."
|
1012 |
+
msgstr "Error de análisis en tiempo de compilación."
|
1013 |
+
|
1014 |
+
#: defaults.php:39
|
1015 |
+
msgid "Run-time notice."
|
1016 |
+
msgstr "Notificación en tiempo de ejecución."
|
1017 |
+
|
1018 |
+
#: defaults.php:40
|
1019 |
+
msgid "Fatal error that occurred during startup."
|
1020 |
+
msgstr "Fatal error que ocurrió durante el inicio."
|
1021 |
+
|
1022 |
+
#: defaults.php:41
|
1023 |
+
msgid "Warnings that occurred during startup."
|
1024 |
+
msgstr "Advertencias que ocurrieron durante el inicio."
|
1025 |
+
|
1026 |
+
#: defaults.php:42
|
1027 |
+
msgid "Fatal compile-time error."
|
1028 |
+
msgstr "Fatal error en tiempo de compilación."
|
1029 |
+
|
1030 |
+
#: defaults.php:43
|
1031 |
+
msgid "Compile-time warning."
|
1032 |
+
msgstr "Advertencia en tiempo de complicación."
|
1033 |
+
|
1034 |
+
#: defaults.php:44
|
1035 |
+
msgid "User-generated error message."
|
1036 |
+
msgstr "Mensaje de error generado por el usuario."
|
1037 |
+
|
1038 |
+
#: defaults.php:45
|
1039 |
+
msgid "User-generated warning message."
|
1040 |
+
msgstr "Mensaje de advertencia generado por el usuario."
|
1041 |
+
|
1042 |
+
#: defaults.php:46
|
1043 |
+
msgid "User-generated notice message."
|
1044 |
+
msgstr "Mensaje de aviso generado por el usuario."
|
1045 |
+
|
1046 |
+
#: defaults.php:47
|
1047 |
+
msgid "Non-standard/optimal code warning."
|
1048 |
+
msgstr "Aviso de código no estándar/óptimo."
|
1049 |
+
|
1050 |
+
#: defaults.php:48
|
1051 |
+
msgid "Catchable fatal error."
|
1052 |
+
msgstr "Fatal error capturable."
|
1053 |
+
|
1054 |
+
#: defaults.php:49
|
1055 |
+
msgid "Run-time deprecation notices."
|
1056 |
+
msgstr "Avisos de depreciación en tiempo de ejecución."
|
1057 |
+
|
1058 |
+
#: defaults.php:50
|
1059 |
+
msgid "Run-time user deprecation notices."
|
1060 |
+
msgstr "Avisos de error de usuario en tiempo de ejecución."
|
1061 |
+
|
1062 |
+
#: defaults.php:52
|
1063 |
+
msgid "Critical, high-impact messages."
|
1064 |
+
msgstr "Mensajes críticos de alto impacto."
|
1065 |
+
|
1066 |
+
#: defaults.php:53
|
1067 |
+
msgid "Debug informational messages."
|
1068 |
+
msgstr "Depurar mensajes informativos."
|
1069 |
+
|
1070 |
+
#: defaults.php:57
|
1071 |
+
msgid "Other User Activity"
|
1072 |
+
msgstr "Otra Actividad de Usuario."
|
1073 |
+
|
1074 |
+
#: defaults.php:58
|
1075 |
+
msgid "User logged in"
|
1076 |
+
msgstr "Usuario inició sesión"
|
1077 |
+
|
1078 |
+
#: defaults.php:58
|
1079 |
+
msgid "Successfully logged in."
|
1080 |
+
msgstr "Inició sesión exitosamente."
|
1081 |
+
|
1082 |
+
#: defaults.php:59
|
1083 |
+
msgid "User logged out"
|
1084 |
+
msgstr "Usuario cerró sesión"
|
1085 |
+
|
1086 |
+
#: defaults.php:59
|
1087 |
+
msgid "Successfully logged out."
|
1088 |
+
msgstr "Cerró sesión exitosamente."
|
1089 |
+
|
1090 |
+
#: defaults.php:60
|
1091 |
+
msgid "Login failed"
|
1092 |
+
msgstr "Acceso fallido"
|
1093 |
+
|
1094 |
+
#: defaults.php:60
|
1095 |
+
msgid "%Attempts% failed login(s) detected."
|
1096 |
+
msgstr "%Attempts% acceso(s) fallidos detectados."
|
1097 |
+
|
1098 |
+
#: defaults.php:61
|
1099 |
+
msgid "Login failed / non existing user"
|
1100 |
+
msgstr "Acceso fallido / usuario no existente"
|
1101 |
+
|
1102 |
+
#: defaults.php:61
|
1103 |
+
msgid "%Attempts% failed login(s) detected using non existing user."
|
1104 |
+
msgstr "%Attempts% acceso(s) fallidos detectados usando usuario inexistente."
|
1105 |
+
|
1106 |
+
#: defaults.php:62
|
1107 |
+
msgid "Login blocked"
|
1108 |
+
msgstr "Acceso bloqueado"
|
1109 |
+
|
1110 |
+
#: defaults.php:62
|
1111 |
+
msgid ""
|
1112 |
+
"Blocked from logging in because the same WordPress user is logged in from "
|
1113 |
+
"%ClientIP%."
|
1114 |
+
msgstr ""
|
1115 |
+
"Bloqueado de iniciar sesión porque el mismo usuario de WordPress ha iniciado "
|
1116 |
+
"sesión desde %ClientIP%."
|
1117 |
+
|
1118 |
+
#: defaults.php:63
|
1119 |
+
msgid "User logged in with existing session(s)"
|
1120 |
+
msgstr "Usuario registró acceso con sesión(es) existentes."
|
1121 |
+
|
1122 |
+
#: defaults.php:63
|
1123 |
+
msgid ""
|
1124 |
+
"Successfully logged in. Another session from %IPAddress% for this user "
|
1125 |
+
"already exist."
|
1126 |
+
msgstr ""
|
1127 |
+
"Se ha iniciado sesión con éxtio. Otra sesión de % IPAddress% para este "
|
1128 |
+
"usuario ya existe."
|
1129 |
+
|
1130 |
+
#: defaults.php:64
|
1131 |
+
msgid "User uploaded file from Uploads directory"
|
1132 |
+
msgstr "Usuario ha subido archivo desde directorio de Subidas"
|
1133 |
+
|
1134 |
+
#: defaults.php:64
|
1135 |
+
msgid "Uploaded the file %FileName% in %FilePath%."
|
1136 |
+
msgstr "Ha subido el archivo %FileName% en %FilePath%."
|
1137 |
+
|
1138 |
+
#: defaults.php:65
|
1139 |
+
msgid "User deleted file from Uploads directory"
|
1140 |
+
msgstr "Usuario ha borrado archivo del directorio de Medios"
|
1141 |
+
|
1142 |
+
#: defaults.php:65
|
1143 |
+
msgid "Deleted the file %FileName% from %FilePath%."
|
1144 |
+
msgstr "Ha borrado el archivo %FileName% de %FilePath%."
|
1145 |
+
|
1146 |
+
#: defaults.php:67
|
1147 |
+
msgid "Blog Posts"
|
1148 |
+
msgstr "Entradas de Blog"
|
1149 |
+
|
1150 |
+
#: defaults.php:68
|
1151 |
+
msgid "User created a new blog post and saved it as draft"
|
1152 |
+
msgstr "Usuario ha creado nueva entrada y la ha guardado como borrador"
|
1153 |
+
|
1154 |
+
#: defaults.php:68
|
1155 |
+
msgid ""
|
1156 |
+
"Created a new post called %PostTitle% and saved it as draft. %EditorLinkPost"
|
1157 |
+
"%."
|
1158 |
+
msgstr ""
|
1159 |
+
"Ha creado una nueva entrada llamada %PostTitle% y la ha guardado como "
|
1160 |
+
"borrador. %EditorLinkPost%."
|
1161 |
+
|
1162 |
+
#: defaults.php:69
|
1163 |
+
msgid "User published a blog post"
|
1164 |
+
msgstr "Usuario ha publicado nueva entrada"
|
1165 |
+
|
1166 |
+
#: defaults.php:69
|
1167 |
+
msgid ""
|
1168 |
+
"Published a post called %PostTitle%. Post URL is %PostUrl%. %EditorLinkPost%."
|
1169 |
+
msgstr ""
|
1170 |
+
"Ha publicado una entrada llamada %PostTitle%. URL de entrada es %PostUrl%. "
|
1171 |
+
"%EditorLinkPost%."
|
1172 |
+
|
1173 |
+
#: defaults.php:70
|
1174 |
+
msgid "User modified a published blog post"
|
1175 |
+
msgstr "Usuario ha modificado un entrada publicada"
|
1176 |
+
|
1177 |
+
#: defaults.php:70
|
1178 |
+
msgid ""
|
1179 |
+
"Modified the published post %PostTitle%. Post URL is %PostUrl%. "
|
1180 |
+
"%EditorLinkPost%."
|
1181 |
+
msgstr ""
|
1182 |
+
"Ha modificado la entrada publicada %PostTitle%. URL de entrada es %PostUrl%. "
|
1183 |
+
"%EditorLinkPost%."
|
1184 |
+
|
1185 |
+
#: defaults.php:71
|
1186 |
+
msgid "User modified a draft blog post"
|
1187 |
+
msgstr "Usuario ha modificado un borrador"
|
1188 |
+
|
1189 |
+
#: defaults.php:71
|
1190 |
+
msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
|
1191 |
+
msgstr "Ha modificado borrador con el %PostTitle%. %EditorLinkPost%."
|
1192 |
+
|
1193 |
+
#: defaults.php:72
|
1194 |
+
msgid "User permanently deleted a blog post from the trash"
|
1195 |
+
msgstr "Usuario ha borrado permanentemente una entrada de la papelera"
|
1196 |
+
|
1197 |
+
#: defaults.php:72
|
1198 |
+
msgid ""
|
1199 |
+
"Permanently deleted the post %PostTitle%. Post URL was %PostUrl%. "
|
1200 |
+
"%EditorLinkPost%."
|
1201 |
+
msgstr ""
|
1202 |
+
"Ha borrado permanentemente la entrada %PostTitle%. URL de entrada era "
|
1203 |
+
"%PostUrl%. %EditorLinkPost%."
|
1204 |
+
|
1205 |
+
#: defaults.php:73
|
1206 |
+
msgid "User moved a blog post to the trash"
|
1207 |
+
msgstr "Usuario ha movido una entrada a la papelera"
|
1208 |
+
|
1209 |
+
#: defaults.php:73
|
1210 |
+
msgid "Moved the post %PostTitle% to trash. Post URL is %PostUrl%."
|
1211 |
+
msgstr ""
|
1212 |
+
"Ha movido la entrada %PostTitle% a la papelera. La URL de entrada es %PostUrl"
|
1213 |
+
"%."
|
1214 |
+
|
1215 |
+
#: defaults.php:74
|
1216 |
+
msgid "User restored a blog post from trash"
|
1217 |
+
msgstr "Usuario ha restaurado una entrada de la papelera"
|
1218 |
+
|
1219 |
+
#: defaults.php:74
|
1220 |
+
msgid "Post %PostTitle% has been restored from trash. %EditorLinkPost%."
|
1221 |
+
msgstr ""
|
1222 |
+
"Entrada %PostTitle% ha sido restaurada de la papelera. %EditorLinkPost%."
|
1223 |
+
|
1224 |
+
#: defaults.php:75
|
1225 |
+
msgid "User changed blog post category"
|
1226 |
+
msgstr "Usuario ha cambiado categoría de la entrada"
|
1227 |
+
|
1228 |
+
#: defaults.php:75
|
1229 |
+
msgid ""
|
1230 |
+
"Changed the category of the post %PostTitle% from %OldCategories% to "
|
1231 |
+
"%NewCategories%. %EditorLinkPost%."
|
1232 |
+
msgstr ""
|
1233 |
+
"Ha cambiado la categoría de la entrada %PostTitle% de %OldCategories% a "
|
1234 |
+
"%NewCategories%. %EditorLinkPost%."
|
1235 |
+
|
1236 |
+
#: defaults.php:76
|
1237 |
+
msgid "User changed blog post URL"
|
1238 |
+
msgstr "Usuario ha cambiado URL de entrada de blog"
|
1239 |
+
|
1240 |
+
#: defaults.php:76
|
1241 |
+
msgid ""
|
1242 |
+
"Changed the URL of the post %PostTitle% from %OldUrl% to %NewUrl%. "
|
1243 |
+
"%EditorLinkPost%."
|
1244 |
+
msgstr ""
|
1245 |
+
"Ha cambiado la URL de la entrada %PostTitle% de %OldUrl% a %NewUrl%. "
|
1246 |
+
"%EditorLinkPost%."
|
1247 |
+
|
1248 |
+
#: defaults.php:77
|
1249 |
+
msgid "User changed blog post author"
|
1250 |
+
msgstr "Usuario ha cambiado autor de entrada"
|
1251 |
+
|
1252 |
+
#: defaults.php:77
|
1253 |
+
msgid ""
|
1254 |
+
"Changed the author of %PostTitle% post from %OldAuthor% to %NewAuthor%. "
|
1255 |
+
"%EditorLinkPost%."
|
1256 |
+
msgstr ""
|
1257 |
+
"Ha cambiado el autor de la entrada %PostTitle% de %OldAuthor% a %NewAuthor%. "
|
1258 |
+
"%EditorLinkPost%."
|
1259 |
+
|
1260 |
+
#: defaults.php:78
|
1261 |
+
msgid "User changed blog post status"
|
1262 |
+
msgstr "Usuario ha cambiado estado de entrada"
|
1263 |
+
|
1264 |
+
#: defaults.php:78
|
1265 |
+
msgid ""
|
1266 |
+
"Changed the status of %PostTitle% post from %OldStatus% to %NewStatus%. "
|
1267 |
+
"%EditorLinkPost%."
|
1268 |
+
msgstr ""
|
1269 |
+
"Ha cambiado el estado de la entrada %PostTitle% de %OldStatus% a %NewStatus"
|
1270 |
+
"%. %EditorLinkPost%."
|
1271 |
+
|
1272 |
+
#: defaults.php:79
|
1273 |
+
msgid "User created new category"
|
1274 |
+
msgstr "Usuario ha creado nueva categoría"
|
1275 |
+
|
1276 |
+
#: defaults.php:79
|
1277 |
+
msgid ""
|
1278 |
+
"Created a new category called %CategoryName% .Category slug is %Slug%. "
|
1279 |
+
"%CategoryLink%."
|
1280 |
+
msgstr ""
|
1281 |
+
"Ha creado una nueva categoría llamada %CategoryName%. Slug de categoría es "
|
1282 |
+
"%Slug%. %CategoryLink%."
|
1283 |
+
|
1284 |
+
#: defaults.php:80
|
1285 |
+
msgid "User deleted category"
|
1286 |
+
msgstr "Usuario ha borrado categoría"
|
1287 |
+
|
1288 |
+
#: defaults.php:80
|
1289 |
+
msgid "Deleted the category %CategoryName%. Category slug was %Slug%."
|
1290 |
+
msgstr "Ha borrado categoría %CategoryName%. Slug de categoría era %Slug%."
|
1291 |
+
|
1292 |
+
#: defaults.php:81
|
1293 |
+
msgid "User changed the visibility of a blog post"
|
1294 |
+
msgstr "Usuario ha cambiado la visibilidad de una entrada"
|
1295 |
+
|
1296 |
+
#: defaults.php:81
|
1297 |
+
msgid ""
|
1298 |
+
"Changed the visibility of the post %PostTitle% from %OldVisibility% to "
|
1299 |
+
"%NewVisibility%. %EditorLinkPost%."
|
1300 |
+
msgstr ""
|
1301 |
+
"Ha cambiado la visibilidad de la entrada %PostTitle% de %OldVisibility% a "
|
1302 |
+
"%NewVisibility%. %EditorLinkPost%."
|
1303 |
+
|
1304 |
+
#: defaults.php:82
|
1305 |
+
msgid "User changed the date of a blog post"
|
1306 |
+
msgstr "Usuario ha cambiado la fecha de una entrada"
|
1307 |
+
|
1308 |
+
#: defaults.php:82
|
1309 |
+
msgid ""
|
1310 |
+
"Changed the date of the post %PostTitle% from %OldDate% to %NewDate%. "
|
1311 |
+
"%EditorLinkPost%."
|
1312 |
+
msgstr ""
|
1313 |
+
"Ha cambiado la fecha de la entrada %PostTitle% de %OldDate% a %NewDate%. "
|
1314 |
+
"%EditorLinkPost%."
|
1315 |
+
|
1316 |
+
#: defaults.php:83
|
1317 |
+
msgid "User set a post as sticky"
|
1318 |
+
msgstr "Usuario establece una entrada como destacada"
|
1319 |
+
|
1320 |
+
#: defaults.php:83
|
1321 |
+
msgid ""
|
1322 |
+
"Set the post %PostTitle% as Sticky. Post URL is %PostUrl%. %EditorLinkPost%."
|
1323 |
+
msgstr ""
|
1324 |
+
"Establece la entrada %PostTitle% como Destacada. URL de entrada es %PostUrl"
|
1325 |
+
"%. %EditorLinkPost%."
|
1326 |
+
|
1327 |
+
#: defaults.php:84
|
1328 |
+
msgid "User removed post from sticky"
|
1329 |
+
msgstr "Usuario ha eliminado entrada de Destacado"
|
1330 |
+
|
1331 |
+
#: defaults.php:84
|
1332 |
+
msgid "Removed the post %PostTitle% from Sticky. %EditorLinkPost%."
|
1333 |
+
msgstr "Ha eliminado la entrada %PostTitle% de Destacado. %EditorLinkPost%."
|
1334 |
+
|
1335 |
+
#: defaults.php:85
|
1336 |
+
msgid "User changed generic tables"
|
1337 |
+
msgstr "Usuario ha cambiado tablas genéricas."
|
1338 |
+
|
1339 |
+
#: defaults.php:85
|
1340 |
+
msgid ""
|
1341 |
+
"Changed the parent of the category %CategoryName% from %OldParent% to "
|
1342 |
+
"%NewParent%. %CategoryLink%."
|
1343 |
+
msgstr ""
|
1344 |
+
"Ha cambiado el padre de la categoría %CategoryName% de %OldParent% a "
|
1345 |
+
"%NewParent%. %CategoryLink%."
|
1346 |
+
|
1347 |
+
#: defaults.php:86
|
1348 |
+
msgid "User created a custom field for a post"
|
1349 |
+
msgstr "Usuario ha creado un campo personalizado para una entrada"
|
1350 |
+
|
1351 |
+
#: defaults.php:87
|
1352 |
+
msgid "User updated a custom field value for a post"
|
1353 |
+
msgstr "Usuario ha actualizado un campo personalizado de una entrada"
|
1354 |
+
|
1355 |
+
#: defaults.php:88
|
1356 |
+
msgid "User deleted a custom field from a post"
|
1357 |
+
msgstr "Usuario ha borrado un campo personalizado de una entrada"
|
1358 |
+
|
1359 |
+
#: defaults.php:89
|
1360 |
+
msgid "User updated a custom field name for a post"
|
1361 |
+
msgstr "Usuario ha actualizado nombre de un campo personalizado de una entrada"
|
1362 |
+
|
1363 |
+
#: defaults.php:90
|
1364 |
+
msgid "User modified content for a published post"
|
1365 |
+
msgstr "Usuario ha modificado contenido de una entrada publicada"
|
1366 |
+
|
1367 |
+
#: defaults.php:91
|
1368 |
+
msgid "User modified content for a draft post"
|
1369 |
+
msgstr "Usuarios ha modificado contenido de borrador de entrada"
|
1370 |
+
|
1371 |
+
#: defaults.php:92
|
1372 |
+
msgid "User modified content of a post"
|
1373 |
+
msgstr "Usuario ha modificado contenido de una entrada"
|
1374 |
+
|
1375 |
+
#: defaults.php:93
|
1376 |
+
msgid "User submitted a post for review"
|
1377 |
+
msgstr "Usuario ha enviado una entrada para revisar"
|
1378 |
+
|
1379 |
+
#: defaults.php:93
|
1380 |
+
msgid "Submitted the post %PostTitle% for review. %EditorLinkPost%."
|
1381 |
+
msgstr "Ha enviado la entrada %PostTitle% para revisar. %EditorLinkPost%."
|
1382 |
+
|
1383 |
+
#: defaults.php:94
|
1384 |
+
msgid "User scheduled a post"
|
1385 |
+
msgstr "Usuario ha programado una entrada"
|
1386 |
+
|
1387 |
+
#: defaults.php:94
|
1388 |
+
msgid ""
|
1389 |
+
"Scheduled the post %PostTitle% to be published %PublishingDate%. "
|
1390 |
+
"%EditorLinkPost%."
|
1391 |
+
msgstr ""
|
1392 |
+
"Ha programado la entrada %PostTitle% para ser publicada %PublishingDate%. "
|
1393 |
+
"%EditorLinkPost%."
|
1394 |
+
|
1395 |
+
#: defaults.php:95
|
1396 |
+
msgid "User changed title of a post"
|
1397 |
+
msgstr "Usuario ha cambiado el título de una entrada"
|
1398 |
+
|
1399 |
+
#: defaults.php:95
|
1400 |
+
msgid ""
|
1401 |
+
"Changed the title of the post %OldTitle% to %NewTitle%. %EditorLinkPost%."
|
1402 |
+
msgstr ""
|
1403 |
+
"Ha cambiado el título de la entrada %OldTitle% a %NewTitle%. %EditorLinkPost"
|
1404 |
+
"%."
|
1405 |
+
|
1406 |
+
#: defaults.php:96
|
1407 |
+
msgid "User opened a post in the editor"
|
1408 |
+
msgstr "Usuario ha abierto una entrada en el editor"
|
1409 |
+
|
1410 |
+
#: defaults.php:96
|
1411 |
+
msgid ""
|
1412 |
+
"Opened the post %PostTitle% in the editor. View the post: %EditorLinkPost%."
|
1413 |
+
msgstr ""
|
1414 |
+
"Ha abierto la entrada %PostTitle% en el editor. Ver la entrada "
|
1415 |
+
"%EditorLinkPost%."
|
1416 |
+
|
1417 |
+
#: defaults.php:97
|
1418 |
+
msgid "User viewed a post"
|
1419 |
+
msgstr "Usuario ha visto una entrada"
|
1420 |
+
|
1421 |
+
#: defaults.php:97
|
1422 |
+
msgid "Viewed the post %PostTitle%. View the post: %PostUrl%."
|
1423 |
+
msgstr "Ha visto la entrada %PostTitle%. Ver la entrada: %PostUrl%."
|
1424 |
+
|
1425 |
+
#: defaults.php:99
|
1426 |
+
msgid "Pages"
|
1427 |
+
msgstr "Páginas"
|
1428 |
+
|
1429 |
+
#: defaults.php:100
|
1430 |
+
msgid "User created a new WordPress page and saved it as draft"
|
1431 |
+
msgstr ""
|
1432 |
+
"Usuario ha creado una nueva página WordPress y la ha guardado como borrador"
|
1433 |
+
|
1434 |
+
#: defaults.php:100
|
1435 |
+
msgid ""
|
1436 |
+
"Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage"
|
1437 |
+
"%."
|
1438 |
+
msgstr ""
|
1439 |
+
"Ha creado una nueva página llamada %PostTitle% y la ha guardado como "
|
1440 |
+
"borrador. %EditorLinkPage%."
|
1441 |
+
|
1442 |
+
#: defaults.php:101
|
1443 |
+
msgid "User published a WordPress page"
|
1444 |
+
msgstr "Usuario ha publicado una página de WordPress"
|
1445 |
+
|
1446 |
+
#: defaults.php:101
|
1447 |
+
msgid ""
|
1448 |
+
"Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
|
1449 |
+
msgstr ""
|
1450 |
+
"Ha publicado una página llamada %PostTitle%. URL de página es %PostUrl%. "
|
1451 |
+
"%EditorLinkPage%."
|
1452 |
+
|
1453 |
+
#: defaults.php:102
|
1454 |
+
msgid "User modified a published WordPress page"
|
1455 |
+
msgstr "Usuario ha modificado una publicada página de WordPress"
|
1456 |
+
|
1457 |
+
#: defaults.php:102
|
1458 |
+
msgid ""
|
1459 |
+
"Modified the published page %PostTitle%. Page URL is %PostUrl%. "
|
1460 |
+
"%EditorLinkPage%."
|
1461 |
+
msgstr ""
|
1462 |
+
"Ha modificado la página publicada %PostTitle%. URL de página es %PostUrl%. "
|
1463 |
+
"%EditorLinkPage%."
|
1464 |
+
|
1465 |
+
#: defaults.php:103
|
1466 |
+
msgid "User modified a draft WordPress page"
|
1467 |
+
msgstr "Usuario ha modificado un borrador de página de WordPress"
|
1468 |
+
|
1469 |
+
#: defaults.php:103
|
1470 |
+
msgid ""
|
1471 |
+
"Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
|
1472 |
+
msgstr ""
|
1473 |
+
"Ha modificado el borrador de página %PostTitle%. ID de página es %PostID%. "
|
1474 |
+
"%EditorLinkPage%."
|
1475 |
+
|
1476 |
+
#: defaults.php:104
|
1477 |
+
msgid "User permanently deleted a page from the trash"
|
1478 |
+
msgstr "Usuario ha borrado permanentemente una página de la papelera"
|
1479 |
+
|
1480 |
+
#: defaults.php:104
|
1481 |
+
msgid ""
|
1482 |
+
"Permanently deleted the page %PostTitle%. Page URL was %PostUrl%. "
|
1483 |
+
"%EditorLinkPage%."
|
1484 |
+
msgstr ""
|
1485 |
+
"Ha borrado permanentemente la página %PostTitle%. URL de página era %PostUrl"
|
1486 |
+
"%. %EditorLinkPage%."
|
1487 |
+
|
1488 |
+
#: defaults.php:105
|
1489 |
+
msgid "User moved WordPress page to the trash"
|
1490 |
+
msgstr "Usuario ha movido página de WordPress a la papelera"
|
1491 |
+
|
1492 |
+
#: defaults.php:105
|
1493 |
+
msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
|
1494 |
+
msgstr ""
|
1495 |
+
"Ha movido la página %PostTitle% a la papelera. URL de página era %PostUrl%."
|
1496 |
+
|
1497 |
+
#: defaults.php:106
|
1498 |
+
msgid "User restored a WordPress page from trash"
|
1499 |
+
msgstr "Usuario ha restaurado una página de WordPress de la papelera"
|
1500 |
+
|
1501 |
+
#: defaults.php:106
|
1502 |
+
msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
|
1503 |
+
msgstr ""
|
1504 |
+
"Página %PostTitle% ha sido restaurada de la papelera. %EditorLinkPage%."
|
1505 |
+
|
1506 |
+
#: defaults.php:107
|
1507 |
+
msgid "User changed page URL"
|
1508 |
+
msgstr "Usuario ha cambiado URL de página"
|
1509 |
+
|
1510 |
+
#: defaults.php:107
|
1511 |
+
msgid ""
|
1512 |
+
"Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. "
|
1513 |
+
"%EditorLinkPage%."
|
1514 |
+
msgstr ""
|
1515 |
+
"Ha cambiado la URL de la página %PostTitle% de %OldUrl% a %NewUrl%. "
|
1516 |
+
"%EditorLinkPage%."
|
1517 |
+
|
1518 |
+
#: defaults.php:108
|
1519 |
+
msgid "User changed page author"
|
1520 |
+
msgstr "Usuario ha cambiado autor de página"
|
1521 |
+
|
1522 |
+
#: defaults.php:108
|
1523 |
+
msgid ""
|
1524 |
+
"Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. "
|
1525 |
+
"%EditorLinkPage%."
|
1526 |
+
msgstr ""
|
1527 |
+
"Ha cambiado el autor de la página %PostTitle% de %OldAuthor% a %NewAuthor%. "
|
1528 |
+
"%EditorLinkPage%."
|
1529 |
+
|
1530 |
+
#: defaults.php:109
|
1531 |
+
msgid "User changed page status"
|
1532 |
+
msgstr "Usuario ha cambiado estado de página"
|
1533 |
+
|
1534 |
+
#: defaults.php:109
|
1535 |
+
msgid ""
|
1536 |
+
"Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. "
|
1537 |
+
"%EditorLinkPage%."
|
1538 |
+
msgstr ""
|
1539 |
+
"Ha cambiado el estado de la página %PostTitle% de %OldStatus% a %NewStatus%. "
|
1540 |
+
"%EditorLinkPage%."
|
1541 |
+
|
1542 |
+
#: defaults.php:110
|
1543 |
+
msgid "User changed the visibility of a page post"
|
1544 |
+
msgstr "Usuario ha cambiado la visibilidad de una página"
|
1545 |
+
|
1546 |
+
#: defaults.php:110
|
1547 |
+
msgid ""
|
1548 |
+
"Changed the visibility of the page %PostTitle% from %OldVisibility% to "
|
1549 |
+
"%NewVisibility%. %EditorLinkPage%."
|
1550 |
+
msgstr ""
|
1551 |
+
"Ha cambiado la visibilidad de la página %PostTitle% de %OldVisibility% a "
|
1552 |
+
"%NewVisibility%. %EditorLinkPage%."
|
1553 |
+
|
1554 |
+
#: defaults.php:111
|
1555 |
+
msgid "User changed the date of a page post"
|
1556 |
+
msgstr "Usuario ha cambiado la fecha de una página"
|
1557 |
+
|
1558 |
+
#: defaults.php:111
|
1559 |
+
msgid ""
|
1560 |
+
"Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. "
|
1561 |
+
"%EditorLinkPage%."
|
1562 |
+
msgstr ""
|
1563 |
+
"Ha cambiado la fecha de la página %PostTitle% de %OldDate% a %NewDate%. "
|
1564 |
+
"%EditorLinkPage%."
|
1565 |
+
|
1566 |
+
#: defaults.php:112
|
1567 |
+
msgid "User changed the parent of a page"
|
1568 |
+
msgstr "Usuario ha cambiado el padre de una página"
|
1569 |
+
|
1570 |
+
#: defaults.php:112
|
1571 |
+
msgid ""
|
1572 |
+
"Changed the parent of the page %PostTitle% from %OldParentName% to "
|
1573 |
+
"%NewParentName%. %EditorLinkPage%."
|
1574 |
+
msgstr ""
|
1575 |
+
"Ha cambiado el padre de la página %PostTitle% de %OldParentName% a "
|
1576 |
+
"%NewParentName%. %EditorLinkPage%."
|
1577 |
+
|
1578 |
+
#: defaults.php:113
|
1579 |
+
msgid "User changed the template of a page"
|
1580 |
+
msgstr "Usuario ha cambiado la plantilla de una página"
|
1581 |
+
|
1582 |
+
#: defaults.php:113
|
1583 |
+
msgid ""
|
1584 |
+
"Changed the template of the page %PostTitle% from %OldTemplate% to "
|
1585 |
+
"%NewTemplate%. %EditorLinkPage%."
|
1586 |
+
msgstr ""
|
1587 |
+
"Ha cambiado la plantilla de la página %PostTitle% de %OldTemplate% a "
|
1588 |
+
"%NewTemplate%. %EditorLinkPage%."
|
1589 |
+
|
1590 |
+
#: defaults.php:114
|
1591 |
+
msgid "User created a custom field for a page"
|
1592 |
+
msgstr "Usuario ha creado un campo personalizado para una página"
|
1593 |
+
|
1594 |
+
#: defaults.php:115
|
1595 |
+
msgid "User updated a custom field value for a page"
|
1596 |
+
msgstr "Usuario ha actualizado valor de campo personalizado de una página"
|
1597 |
+
|
1598 |
+
#: defaults.php:116
|
1599 |
+
msgid "User deleted a custom field from a page"
|
1600 |
+
msgstr "Usuario ha borrado un campo personalizado de una página"
|
1601 |
+
|
1602 |
+
#: defaults.php:117
|
1603 |
+
msgid "User updated a custom field name for a page"
|
1604 |
+
msgstr "Usuario ha actualizado un campo personalizado de una página"
|
1605 |
+
|
1606 |
+
#: defaults.php:118
|
1607 |
+
msgid "User modified content for a published page"
|
1608 |
+
msgstr "Usuario ha modificado contenido de una página publicada"
|
1609 |
+
|
1610 |
+
#: defaults.php:119
|
1611 |
+
msgid "User modified content for a draft page"
|
1612 |
+
msgstr "Usuario ha modificado contenido de un borrador de página"
|
1613 |
+
|
1614 |
+
#: defaults.php:120
|
1615 |
+
msgid "User scheduled a page"
|
1616 |
+
msgstr "Usuario ha programado una página"
|
1617 |
+
|
1618 |
+
#: defaults.php:121
|
1619 |
+
msgid "User changed title of a page"
|
1620 |
+
msgstr "Usuario ha cambiado título de una página"
|
1621 |
+
|
1622 |
+
#: defaults.php:122
|
1623 |
+
msgid "User opened a page in the editor"
|
1624 |
+
msgstr "Usuario ha abierto una página en el editor"
|
1625 |
+
|
1626 |
+
#: defaults.php:122
|
1627 |
+
msgid ""
|
1628 |
+
"Opened the page %PostTitle% in the editor. View the page: %EditorLinkPage%."
|
1629 |
+
msgstr ""
|
1630 |
+
"Ha abierto la página %PostTitle% en el editor. Ver la página: %EditorLinkPage"
|
1631 |
+
"%."
|
1632 |
+
|
1633 |
+
#: defaults.php:123
|
1634 |
+
msgid "User viewed a page"
|
1635 |
+
msgstr "Usuario ha visto una página"
|
1636 |
+
|
1637 |
+
#: defaults.php:123
|
1638 |
+
msgid "Viewed the page %PostTitle%. View the page: %PostUrl%."
|
1639 |
+
msgstr "Ha visto la página %PostTitle%. Ver la página: %PostUrl%."
|
1640 |
+
|
1641 |
+
#: defaults.php:125
|
1642 |
+
msgid "Custom Posts"
|
1643 |
+
msgstr "Entradas Personalizadas"
|
1644 |
+
|
1645 |
+
#: defaults.php:126
|
1646 |
+
msgid "User created a new post with custom post type and saved it as draft"
|
1647 |
+
msgstr ""
|
1648 |
+
"Usuario ha creado una nueva entrada con campo personalizado y lo ha guardado "
|
1649 |
+
"como borrador"
|
1650 |
+
|
1651 |
+
#: defaults.php:126
|
1652 |
+
msgid ""
|
1653 |
+
"Created a new custom post called %PostTitle% of type %PostType%. "
|
1654 |
+
"%EditorLinkPost%."
|
1655 |
+
msgstr ""
|
1656 |
+
"Ha creado una nueva entrada personalizada llamada %PostTitle% de tipo "
|
1657 |
+
"%PostType%. %EditorLinkPost%."
|
1658 |
+
|
1659 |
+
#: defaults.php:127
|
1660 |
+
msgid "User published a post with custom post type"
|
1661 |
+
msgstr "Usuario ha publicado entrada con entrada personalizada"
|
1662 |
+
|
1663 |
+
#: defaults.php:127
|
1664 |
+
msgid ""
|
1665 |
+
"Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
|
1666 |
+
"%. %EditorLinkPost%."
|
1667 |
+
msgstr ""
|
1668 |
+
"Ha pubicado una entrada personalizada %PostTitle% del tipo %PostType%. URL "
|
1669 |
+
"de entrada es %PostUrl%. %EditorLinkPost%."
|
1670 |
+
|
1671 |
+
#: defaults.php:128
|
1672 |
+
msgid "User modified a post with custom post type"
|
1673 |
+
msgstr "Usuario ha modificado una entrada con entrada personalizada"
|
1674 |
+
|
1675 |
+
#: defaults.php:128
|
1676 |
+
msgid ""
|
1677 |
+
"Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
|
1678 |
+
"%. %EditorLinkPost%."
|
1679 |
+
msgstr ""
|
1680 |
+
"Ha modificado la entrada personalizada %PostTitle% del tipo %PostType%. URL "
|
1681 |
+
"de entrada es %PostUrl%. %EditorLinkPost%."
|
1682 |
+
|
1683 |
+
#: defaults.php:129
|
1684 |
+
msgid "User modified a draft post with custom post type"
|
1685 |
+
msgstr "Usuario ha modificado un borrador con entrada personalizada"
|
1686 |
+
|
1687 |
+
#: defaults.php:129
|
1688 |
+
msgid ""
|
1689 |
+
"Modified the draft custom post %PostTitle% of type is %PostType%. "
|
1690 |
+
"%EditorLinkPost%."
|
1691 |
+
msgstr ""
|
1692 |
+
"Ha modificado el borrador personalizado %PostTitle% del tipo %PostType%. "
|
1693 |
+
"%EditorLinkPost%."
|
1694 |
+
|
1695 |
+
#: defaults.php:130
|
1696 |
+
msgid "User permanently deleted post with custom post type"
|
1697 |
+
msgstr "Usuario ha borrado permanentemente entrada de entrada personalizada"
|
1698 |
+
|
1699 |
+
#: defaults.php:130
|
1700 |
+
msgid ""
|
1701 |
+
"Permanently Deleted the custom post %PostTitle% of type %PostType%. The post "
|
1702 |
+
"URL was %PostUrl%. %EditorLinkPost%."
|
1703 |
+
msgstr ""
|
1704 |
+
"Ha borrado la entrada personalizada %PostTitle% del tipo %PostType%. URL de "
|
1705 |
+
"entrada era %PostUrl%. %EditorLinkPost%."
|
1706 |
+
|
1707 |
+
#: defaults.php:131
|
1708 |
+
msgid "User moved post with custom post type to trash"
|
1709 |
+
msgstr "Usuario ha movido entrada del tipo entrada personalizada a la papelera"
|
1710 |
+
|
1711 |
+
#: defaults.php:131
|
1712 |
+
msgid ""
|
1713 |
+
"Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was "
|
1714 |
+
"%PostUrl%."
|
1715 |
+
msgstr ""
|
1716 |
+
"Ha movido la entrada personalizada %PostTitle% del tipo %PostType% a la "
|
1717 |
+
"papelera. URL de entrada era %PostUrl%."
|
1718 |
+
|
1719 |
+
#: defaults.php:132
|
1720 |
+
msgid "User restored post with custom post type from trash"
|
1721 |
+
msgstr ""
|
1722 |
+
"Usuario ha restaurado entrada del tipo entrada personalizada de la papelera"
|
1723 |
+
|
1724 |
+
#: defaults.php:132
|
1725 |
+
msgid ""
|
1726 |
+
"The custom post %PostTitle% of type %PostType% has been restored from trash. "
|
1727 |
+
"%EditorLinkPost%."
|
1728 |
+
msgstr ""
|
1729 |
+
"La entrada personalizada %PostTitle% del tipo %PostType% has been restored "
|
1730 |
+
"from trash. %EditorLinkPost%."
|
1731 |
+
|
1732 |
+
#: defaults.php:133
|
1733 |
+
msgid "User changed the category of a post with custom post type"
|
1734 |
+
msgstr ""
|
1735 |
+
"Usuario ha cambiado la categoría de una entrada del tipo entrada "
|
1736 |
+
"personalizada"
|
1737 |
+
|
1738 |
+
#: defaults.php:133
|
1739 |
+
msgid ""
|
1740 |
+
"Changed the category(ies) of the custom post %PostTitle% of type %PostType% "
|
1741 |
+
"from %OldCategories% to %NewCategories%. %EditorLinkPost%."
|
1742 |
+
msgstr ""
|
1743 |
+
"Ha cambiado la(s) categoría(s) de la entrada personalizada %PostTitle% del "
|
1744 |
+
"tipo %PostType% de %OldCategories% a %NewCategories%. %EditorLinkPost%."
|
1745 |
+
|
1746 |
+
#: defaults.php:134
|
1747 |
+
msgid "User changed the URL of a post with custom post type"
|
1748 |
+
msgstr ""
|
1749 |
+
"Usuario ha cambiado la URL de una entrada de tipo entrada personalizada"
|
1750 |
+
|
1751 |
+
#: defaults.php:134
|
1752 |
+
msgid ""
|
1753 |
+
"Changed the URL of the custom post %PostTitle% of type %PostType% from "
|
1754 |
+
"%OldUrl% to %NewUrl%. %EditorLinkPost%."
|
1755 |
+
msgstr ""
|
1756 |
+
"Ha cambiado la URL de la entrada personalizada %PostTitle% of type %PostType"
|
1757 |
+
"% from %OldUrl% to %NewUrl%. %EditorLinkPost%."
|
1758 |
+
|
1759 |
+
#: defaults.php:135
|
1760 |
+
msgid "User changed the author or post with custom post type"
|
1761 |
+
msgstr "Usuario ha cambiado el autor o entradada de tipo entrada personalizada"
|
1762 |
+
|
1763 |
+
#: defaults.php:135
|
1764 |
+
msgid ""
|
1765 |
+
"Changed the author of custom post %PostTitle% of type %PostType% from "
|
1766 |
+
"%OldAuthor% to %NewAuthor%. %EditorLinkPost%."
|
1767 |
+
msgstr ""
|
1768 |
+
"Ha cambiado el autor de la entrada personalizada %PostTitle% del tipo "
|
1769 |
+
"%PostType% de %OldAuthor% a %NewAuthor%. %EditorLinkPost%."
|
1770 |
+
|
1771 |
+
#: defaults.php:136
|
1772 |
+
msgid "User changed the status of post with custom post type"
|
1773 |
+
msgstr "Ha cambiado el estado de entrada de tipo entrada personalizada"
|
1774 |
+
|
1775 |
+
#: defaults.php:136
|
1776 |
+
msgid ""
|
1777 |
+
"Changed the status of custom post %PostTitle% of type %PostType% from "
|
1778 |
+
"%OldStatus% to %NewStatus%. %EditorLinkPost%."
|
1779 |
+
msgstr ""
|
1780 |
+
"Ha cambiado el estado de la entrada personalizada %PostTitle% del tipo "
|
1781 |
+
"%PostType% de %OldStatus% a %NewStatus%. %EditorLinkPost%."
|
1782 |
+
|
1783 |
+
#: defaults.php:137
|
1784 |
+
msgid "User changed the visibility of a post with custom post type"
|
1785 |
+
msgstr ""
|
1786 |
+
"Usuario ha cambiado visibilidad de una entrada de tipo entrada personalizada"
|
1787 |
+
|
1788 |
+
#: defaults.php:137
|
1789 |
+
msgid ""
|
1790 |
+
"Changed the visibility of the custom post %PostTitle% of type %PostType% "
|
1791 |
+
"from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
|
1792 |
+
msgstr ""
|
1793 |
+
"Ha cambiado visibiidad de la entrada personalizada %PostTitle% del tipo "
|
1794 |
+
"%PostType% de %OldVisibility% a %NewVisibility%. %EditorLinkPost%."
|
1795 |
+
|
1796 |
+
#: defaults.php:138
|
1797 |
+
msgid "User changed the date of post with custom post type"
|
1798 |
+
msgstr "Usuario ha cambiado la fecha de una entrada con entrada personalizada"
|
1799 |
+
|
1800 |
+
#: defaults.php:138
|
1801 |
+
msgid ""
|
1802 |
+
"Changed the date of the custom post %PostTitle% of type %PostType% from "
|
1803 |
+
"%OldDate% to %NewDate%. %EditorLinkPost%."
|
1804 |
+
msgstr ""
|
1805 |
+
"Ha cambiado la fecha de la entrada personalizada %PostTitle% del tipo "
|
1806 |
+
"%PostType% de %OldDate% a %NewDate%. %EditorLinkPost%."
|
1807 |
+
|
1808 |
+
#: defaults.php:139
|
1809 |
+
msgid "User created a custom field for a custom post type"
|
1810 |
+
msgstr "Usuario ha creado un campo personalizado a una entrada personalizada"
|
1811 |
+
|
1812 |
+
#: defaults.php:140
|
1813 |
+
msgid "User updated a custom field for a custom post type"
|
1814 |
+
msgstr ""
|
1815 |
+
"Usuario ha actualizado un campo personalizado de una entrada personalizada"
|
1816 |
+
|
1817 |
+
#: defaults.php:141
|
1818 |
+
msgid "User deleted a custom field from a custom post type"
|
1819 |
+
msgstr "Usuario ha borrado un campo personalizdo de una entrada personalizada"
|
1820 |
+
|
1821 |
+
#: defaults.php:142
|
1822 |
+
msgid "User updated a custom field name for a custom post type"
|
1823 |
+
msgstr ""
|
1824 |
+
"Usuario ha actualizado nombre de campo personalizado de entrada personalizada"
|
1825 |
+
|
1826 |
+
#: defaults.php:143
|
1827 |
+
msgid "User modified content for a published custom post type"
|
1828 |
+
msgstr "Usuario ha modificado contenido de una publicada entrada personalizada"
|
1829 |
+
|
1830 |
+
#: defaults.php:144
|
1831 |
+
msgid "User modified content for a draft custom post type"
|
1832 |
+
msgstr ""
|
1833 |
+
"Usuario ha modificado contenido de un borrador de entrada personalizada"
|
1834 |
+
|
1835 |
+
#: defaults.php:145
|
1836 |
+
msgid "User scheduled a custom post type"
|
1837 |
+
msgstr "Usuario ha programado una entrada personalizada"
|
1838 |
+
|
1839 |
+
#: defaults.php:145
|
1840 |
+
msgid ""
|
1841 |
+
"Scheduled the custom post type %PostTitle% to be published %PublishingDate%. "
|
1842 |
+
"%EditorLinkPost%."
|
1843 |
+
msgstr ""
|
1844 |
+
"Ha programado la entrada personalizada %PostTitle% para ser publicada el "
|
1845 |
+
"%PublishingDate%. %EditorLinkPost%."
|
1846 |
+
|
1847 |
+
#: defaults.php:146
|
1848 |
+
msgid "User changed title of a custom post type"
|
1849 |
+
msgstr "Usuario ha cambiado título de una entrada personalizada"
|
1850 |
+
|
1851 |
+
#: defaults.php:146
|
1852 |
+
msgid ""
|
1853 |
+
"Changed the title of the custom post %OldTitle% to %NewTitle%. "
|
1854 |
+
"%EditorLinkPost%."
|
1855 |
+
msgstr ""
|
1856 |
+
"Ha cambiado el título de la entrada dpersonalizada %OldTitle% a %NewTitle%. "
|
1857 |
+
"%EditorLinkPost%."
|
1858 |
+
|
1859 |
+
#: defaults.php:147
|
1860 |
+
msgid "User opened a custom post type in the editor"
|
1861 |
+
msgstr "Usuario ha abierto una entrada de tipo personalizado en el editor"
|
1862 |
+
|
1863 |
+
#: defaults.php:147
|
1864 |
+
msgid ""
|
1865 |
+
"Opened the custom post %PostTitle% of type %PostType% in the editor. View "
|
1866 |
+
"the post: %EditorLinkPost%."
|
1867 |
+
msgstr ""
|
1868 |
+
"Ha abierto la entrada personalizada %PostTitle% del tipo %PostType% en el "
|
1869 |
+
"editor.Ver la entrada: %EditorLinkPost%."
|
1870 |
+
|
1871 |
+
#: defaults.php:148
|
1872 |
+
msgid "User viewed a custom post type"
|
1873 |
+
msgstr "Usuario ha visto una entrada de tipo personalizado"
|
1874 |
+
|
1875 |
+
#: defaults.php:148
|
1876 |
+
msgid ""
|
1877 |
+
"Viewed the custom post %PostTitle% of type %PostType%. View the post: "
|
1878 |
+
"%PostUrl%."
|
1879 |
+
msgstr ""
|
1880 |
+
"Ha visto la entrada personalizada %PostTitle% del tipo %PostType%. Ver la "
|
1881 |
+
"entrada: %PostUrl%."
|
1882 |
+
|
1883 |
+
#: defaults.php:150
|
1884 |
+
msgid "Widgets"
|
1885 |
+
msgstr "Widgets"
|
1886 |
+
|
1887 |
+
#: defaults.php:151
|
1888 |
+
msgid "User added a new widget"
|
1889 |
+
msgstr "Usuario ha añadido un nuevo widget"
|
1890 |
+
|
1891 |
+
#: defaults.php:151
|
1892 |
+
msgid "Added a new %WidgetName% widget in %Sidebar%."
|
1893 |
+
msgstr "Ha añadido un nuevo widget %WidgetName% en %Sidebar%."
|
1894 |
+
|
1895 |
+
#: defaults.php:152
|
1896 |
+
msgid "User modified a widget"
|
1897 |
+
msgstr "Usuario ha modificado un widget"
|
1898 |
+
|
1899 |
+
#: defaults.php:152
|
1900 |
+
msgid "Modified the %WidgetName% widget in %Sidebar%."
|
1901 |
+
msgstr "Ha modificado el widget %WidgetName% en %Sidebar%."
|
1902 |
+
|
1903 |
+
#: defaults.php:153
|
1904 |
+
msgid "User deleted widget"
|
1905 |
+
msgstr "Usuario ha borrado widget"
|
1906 |
+
|
1907 |
+
#: defaults.php:153
|
1908 |
+
msgid "Deleted the %WidgetName% widget from %Sidebar%."
|
1909 |
+
msgstr "Ha borrado el widget %WidgetName% de %Sidebar%."
|
1910 |
+
|
1911 |
+
#: defaults.php:154
|
1912 |
+
msgid "User moved widget"
|
1913 |
+
msgstr "Usuario ha movido widget"
|
1914 |
+
|
1915 |
+
#: defaults.php:154
|
1916 |
+
msgid "Moved the %WidgetName% widget from %OldSidebar% to %NewSidebar%."
|
1917 |
+
msgstr "Ha movido el widget %WidgetName% de %OldSidebar% a %NewSidebar%."
|
1918 |
+
|
1919 |
+
#: defaults.php:155
|
1920 |
+
msgid "User changed widget position"
|
1921 |
+
msgstr "Usuario ha cambiado posición de widget"
|
1922 |
+
|
1923 |
+
#: defaults.php:155
|
1924 |
+
msgid "Changed the position of the widget %WidgetName% in sidebar %Sidebar%."
|
1925 |
+
msgstr ""
|
1926 |
+
"Ha cambiado la posición de un widget %WidgetName% en barra lateral %Sidebar%."
|
1927 |
+
|
1928 |
+
#: defaults.php:157
|
1929 |
+
msgid "User Profiles"
|
1930 |
+
msgstr "Perfiles de usuarios"
|
1931 |
+
|
1932 |
+
#: defaults.php:158
|
1933 |
+
msgid "New user was created on WordPress"
|
1934 |
+
msgstr "Nuevo usuario ha sido creado en WordPress"
|
1935 |
+
|
1936 |
+
#: defaults.php:158
|
1937 |
+
msgid ""
|
1938 |
+
"A new user %NewUserData->Username% was created with role of %NewUserData-"
|
1939 |
+
">Roles%."
|
1940 |
+
msgstr ""
|
1941 |
+
"Un nuevo usuario %NewUserData->Username% ha sido creado con el rol de "
|
1942 |
+
"%NewUserData->Roles%."
|
1943 |
+
|
1944 |
+
#: defaults.php:159
|
1945 |
+
msgid "User created another WordPress user"
|
1946 |
+
msgstr "Usuario ha creado otro usuario de WordPress"
|
1947 |
+
|
1948 |
+
#: defaults.php:159
|
1949 |
+
msgid ""
|
1950 |
+
"%UserChanger% created a new user %NewUserData->Username% with the role of "
|
1951 |
+
"%NewUserData->Roles%."
|
1952 |
+
msgstr ""
|
1953 |
+
"%UserChanger% ha creado un nuevo usuario %NewUserData->Username% con el rol "
|
1954 |
+
"de %NewUserData->Roles%."
|
1955 |
+
|
1956 |
+
#: defaults.php:160
|
1957 |
+
msgid "The role of a user was changed by another WordPress user"
|
1958 |
+
msgstr "El rol de un usuario ha sido cambiado por otro usuario de WordPress"
|
1959 |
+
|
1960 |
+
#: defaults.php:160
|
1961 |
+
msgid ""
|
1962 |
+
"Changed the role of the user %TargetUsername% from %OldRole% to %NewRole%."
|
1963 |
+
msgstr ""
|
1964 |
+
"Ha cambiado el rol del usuario %TargetUsername% de %OldRole% a %NewRole%."
|
1965 |
+
|
1966 |
+
#: defaults.php:161
|
1967 |
+
msgid "User has changed his or her password"
|
1968 |
+
msgstr "Usuario ha cambiado su contraseña"
|
1969 |
+
|
1970 |
+
#: defaults.php:161
|
1971 |
+
msgid "Changed the password."
|
1972 |
+
msgstr "Ha cambiado la contraseña."
|
1973 |
+
|
1974 |
+
#: defaults.php:162
|
1975 |
+
msgid "User changed another user's password"
|
1976 |
+
msgstr "Usuario ha cambiado contraseña de otro usuario"
|
1977 |
+
|
1978 |
+
#: defaults.php:162
|
1979 |
+
msgid ""
|
1980 |
+
"Changed the password for the user %TargetUserData->Username% with the role "
|
1981 |
+
"of %TargetUserData->Roles%."
|
1982 |
+
msgstr ""
|
1983 |
+
"Ha cambiado la contraseña del usuario %TargetUserData->Username% con el rol "
|
1984 |
+
"de %TargetUserData->Roles%."
|
1985 |
+
|
1986 |
+
#: defaults.php:163
|
1987 |
+
msgid "User changed his or her email address"
|
1988 |
+
msgstr "Usuario ha cambiado su dirección email"
|
1989 |
+
|
1990 |
+
#: defaults.php:163
|
1991 |
+
msgid "Changed the email address from %OldEmail% to %NewEmail%."
|
1992 |
+
msgstr "Ha cambiado la dirección email de %OldEmail% a %NewEmail%."
|
1993 |
+
|
1994 |
+
#: defaults.php:164
|
1995 |
+
msgid "User changed another user's email address"
|
1996 |
+
msgstr "Usuario ha cambiado dirección email de otro usuario"
|
1997 |
+
|
1998 |
+
#: defaults.php:164
|
1999 |
+
msgid ""
|
2000 |
+
"Changed the email address of the user %TargetUsername% from %OldEmail% to "
|
2001 |
+
"%NewEmail%."
|
2002 |
+
msgstr ""
|
2003 |
+
"Ha cambiado la dirección email por el usuario %TargetUsername% de %OldEmail% "
|
2004 |
+
"a %NewEmail%."
|
2005 |
+
|
2006 |
+
#: defaults.php:165
|
2007 |
+
msgid "User was deleted by another user"
|
2008 |
+
msgstr "Usuario ha sido borrado por otro usuario"
|
2009 |
+
|
2010 |
+
#: defaults.php:165
|
2011 |
+
msgid ""
|
2012 |
+
"Deleted the user %TargetUserData->Username% with the role of %TargetUserData-"
|
2013 |
+
">Roles%."
|
2014 |
+
msgstr ""
|
2015 |
+
"Ha borrado el usuario %TargetUserData->Username% con el rol de "
|
2016 |
+
"%TargetUserData->Roles%."
|
2017 |
+
|
2018 |
+
#: defaults.php:167
|
2019 |
+
msgid "Plugins & Themes"
|
2020 |
+
msgstr "Plugins y Temas"
|
2021 |
+
|
2022 |
+
#: defaults.php:168
|
2023 |
+
msgid "User installed a plugin"
|
2024 |
+
msgstr "Usuario ha instalado un plugin"
|
2025 |
+
|
2026 |
+
#: defaults.php:168
|
2027 |
+
msgid "Installed the plugin %Plugin->Name% in %Plugin->plugin_dir_path%."
|
2028 |
+
msgstr "Ha instalado el plugin %Plugin->Name% en %Plugin->plugin_dir_path%."
|
2029 |
+
|
2030 |
+
#: defaults.php:169
|
2031 |
+
msgid "User activated a WordPress plugin"
|
2032 |
+
msgstr "Usuario ha activado un plugin de WordPress"
|
2033 |
+
|
2034 |
+
#: defaults.php:169
|
2035 |
+
msgid "Activated the plugin %PluginData->Name% installed in %PluginFile%."
|
2036 |
+
msgstr "Ha activado el plugin %PluginData->Name% instalado en %PluginFile%."
|
2037 |
+
|
2038 |
+
#: defaults.php:170
|
2039 |
+
msgid "User deactivated a WordPress plugin"
|
2040 |
+
msgstr "Usuario ha desactivado un plugin de WordPress"
|
2041 |
+
|
2042 |
+
#: defaults.php:170
|
2043 |
+
msgid "Deactivated the plugin %PluginData->Name% installed in %PluginFile%."
|
2044 |
+
msgstr "Ha desactivado el plugin %PluginData->Name% instalado en %PluginFile%."
|
2045 |
+
|
2046 |
+
#: defaults.php:171
|
2047 |
+
msgid "User uninstalled a plugin"
|
2048 |
+
msgstr "Usuario ha desinstalado un plugin"
|
2049 |
+
|
2050 |
+
#: defaults.php:171
|
2051 |
+
msgid ""
|
2052 |
+
"Uninstalled the plugin %PluginData->Name% which was installed in %PluginFile"
|
2053 |
+
"%."
|
2054 |
+
msgstr ""
|
2055 |
+
"Ha desinstalado el plugin %PluginData->Name% que estaba instalado en "
|
2056 |
+
"%PluginFile%."
|
2057 |
+
|
2058 |
+
#: defaults.php:172
|
2059 |
+
msgid "User upgraded a plugin"
|
2060 |
+
msgstr "Usuario ha ascendido un plugin"
|
2061 |
+
|
2062 |
+
#: defaults.php:172
|
2063 |
+
msgid "Upgraded the plugin %PluginData->Name% installed in %PluginFile%."
|
2064 |
+
msgstr "Ha ascendido el plugin %PluginData->Name% instalado en %PluginFile%."
|
2065 |
+
|
2066 |
+
#: defaults.php:173
|
2067 |
+
msgid "User installed a theme"
|
2068 |
+
msgstr "Usuario ha instalado un tema"
|
2069 |
+
|
2070 |
+
#: defaults.php:173
|
2071 |
+
msgid ""
|
2072 |
+
"Installed the theme \"%Theme->Name%\" in %Theme->get_template_directory%."
|
2073 |
+
msgstr ""
|
2074 |
+
"Ha instalado el tema \"%Theme->Name%\" en %Theme->get_template_directory%."
|
2075 |
+
|
2076 |
+
#: defaults.php:174
|
2077 |
+
msgid "User activated a theme"
|
2078 |
+
msgstr "Usuario ha activado un tema"
|
2079 |
+
|
2080 |
+
#: defaults.php:174
|
2081 |
+
msgid ""
|
2082 |
+
"Activated the theme \"%Theme->Name%\", installed in %Theme-"
|
2083 |
+
">get_template_directory%."
|
2084 |
+
msgstr ""
|
2085 |
+
"Ha activado el tema \"%Theme->Name%\", instalado en %Theme-"
|
2086 |
+
">get_template_directory%."
|
2087 |
+
|
2088 |
+
#: defaults.php:175
|
2089 |
+
msgid "User uninstalled a theme"
|
2090 |
+
msgstr "Usuario ha desinstalado un tema"
|
2091 |
+
|
2092 |
+
#: defaults.php:175
|
2093 |
+
msgid ""
|
2094 |
+
"Deleted the theme \"%Theme->Name%\" installed in %Theme-"
|
2095 |
+
">get_template_directory%."
|
2096 |
+
msgstr ""
|
2097 |
+
"Ha borrado el tema \"%Theme->Name%\" instalado en %Theme-"
|
2098 |
+
">get_template_directory%."
|
2099 |
+
|
2100 |
+
#: defaults.php:176
|
2101 |
+
msgid "A plugin created a post"
|
2102 |
+
msgstr "Un plugin ha creado una entrada"
|
2103 |
+
|
2104 |
+
#: defaults.php:176
|
2105 |
+
msgid "A plugin automatically created the following post: %PostTitle%."
|
2106 |
+
msgstr "Un plugin ha creado automáticamente la entrada: %PostTitle%."
|
2107 |
+
|
2108 |
+
#: defaults.php:177
|
2109 |
+
msgid "A plugin created a page"
|
2110 |
+
msgstr "Un plugin ha creado una página"
|
2111 |
+
|
2112 |
+
#: defaults.php:177
|
2113 |
+
msgid "A plugin automatically created the following page: %PostTitle%."
|
2114 |
+
msgstr "Un plugin ha creado automáticamente la siguiente página: %PostTitle%."
|
2115 |
+
|
2116 |
+
#: defaults.php:178
|
2117 |
+
msgid "A plugin created a custom post"
|
2118 |
+
msgstr "Un plugin ha creado una entrada personalizada"
|
2119 |
+
|
2120 |
+
#: defaults.php:178
|
2121 |
+
msgid "A plugin automatically created the following custom post: %PostTitle%."
|
2122 |
+
msgstr ""
|
2123 |
+
"Un plugin ha creado automáticamente la siguiente entrada personalizada: "
|
2124 |
+
"%PostTitle%."
|
2125 |
+
|
2126 |
+
#: defaults.php:179
|
2127 |
+
msgid "A plugin deleted a post"
|
2128 |
+
msgstr "Un plugin ha borrado una entrada"
|
2129 |
+
|
2130 |
+
#: defaults.php:179
|
2131 |
+
msgid "A plugin automatically deleted the following post: %PostTitle%."
|
2132 |
+
msgstr ""
|
2133 |
+
"Un plugin ha borrado automáticamente la siguiente entrada: %PostTitle%."
|
2134 |
+
|
2135 |
+
#: defaults.php:180
|
2136 |
+
msgid "A plugin deleted a page"
|
2137 |
+
msgstr "Un plugin ha borrado una página"
|
2138 |
+
|
2139 |
+
#: defaults.php:180
|
2140 |
+
msgid "A plugin automatically deleted the following page: %PostTitle%."
|
2141 |
+
msgstr "Un plugin ha borrado automáticamente la siguiente página: %PostTitle%."
|
2142 |
+
|
2143 |
+
#: defaults.php:181
|
2144 |
+
msgid "A plugin deleted a custom post"
|
2145 |
+
msgstr "Un plugin ha borrado una entrada personalizada"
|
2146 |
+
|
2147 |
+
#: defaults.php:181
|
2148 |
+
msgid "A plugin automatically deleted the following custom post: %PostTitle%."
|
2149 |
+
msgstr ""
|
2150 |
+
"Un plugin ha borrado automáticamente la siguiente entrada personalizada: "
|
2151 |
+
"%PostTitle%."
|
2152 |
+
|
2153 |
+
#: defaults.php:182
|
2154 |
+
msgid "User updated a theme"
|
2155 |
+
msgstr "Usuario ha actualizado un tema"
|
2156 |
+
|
2157 |
+
#: defaults.php:182
|
2158 |
+
msgid ""
|
2159 |
+
"Updated the theme \"%Theme->Name%\" installed in %Theme-"
|
2160 |
+
">get_template_directory%."
|
2161 |
+
msgstr ""
|
2162 |
+
"Ha actualizado el tema \"%Theme->Name%\" instalado en %Theme-"
|
2163 |
+
">get_template_directory%."
|
2164 |
+
|
2165 |
+
#: defaults.php:183
|
2166 |
+
msgid "User changed a file using the theme editor"
|
2167 |
+
msgstr "Usuario ha cambiado un archivo usando el editor de tema"
|
2168 |
+
|
2169 |
+
#: defaults.php:183
|
2170 |
+
msgid "Modified %File% with the Theme Editor."
|
2171 |
+
msgstr "Ha modificado %File% con el Editor de Tema."
|
2172 |
+
|
2173 |
+
#: defaults.php:184
|
2174 |
+
msgid "User changed a file using the plugin editor"
|
2175 |
+
msgstr "Usuario ha cambiado un archivo usando el editor de plugin"
|
2176 |
+
|
2177 |
+
#: defaults.php:184
|
2178 |
+
msgid "Modified %File% with the Plugin Editor."
|
2179 |
+
msgstr "Ha modificado %File% con Editor de Plugin."
|
2180 |
+
|
2181 |
+
#: defaults.php:186
|
2182 |
+
msgid "System Activity"
|
2183 |
+
msgstr "Actividad de Sistema"
|
2184 |
+
|
2185 |
+
#: defaults.php:187
|
2186 |
+
msgid "Unknown Error"
|
2187 |
+
msgstr "Error Desconocido"
|
2188 |
+
|
2189 |
+
#: defaults.php:187
|
2190 |
+
msgid "An unexpected error has occurred ."
|
2191 |
+
msgstr "Ha ocurrido un error inesperado ."
|
2192 |
+
|
2193 |
+
#: defaults.php:188
|
2194 |
+
msgid "PHP error"
|
2195 |
+
msgstr "Error PHP"
|
2196 |
+
|
2197 |
+
#: defaults.php:188 defaults.php:189 defaults.php:190 defaults.php:191
|
2198 |
+
#: defaults.php:192
|
2199 |
+
msgid "%Message%."
|
2200 |
+
msgstr "%Message%."
|
2201 |
+
|
2202 |
+
#: defaults.php:189
|
2203 |
+
msgid "PHP warning"
|
2204 |
+
msgstr "Advertencia PHP"
|
2205 |
+
|
2206 |
+
#: defaults.php:190
|
2207 |
+
msgid "PHP notice"
|
2208 |
+
msgstr "Aviso PHP"
|
2209 |
+
|
2210 |
+
#: defaults.php:191
|
2211 |
+
msgid "PHP exception"
|
2212 |
+
msgstr "Excepciones PHP"
|
2213 |
+
|
2214 |
+
#: defaults.php:192
|
2215 |
+
msgid "PHP shutdown error"
|
2216 |
+
msgstr "Error de cierre de PHP"
|
2217 |
+
|
2218 |
+
#: defaults.php:193
|
2219 |
+
msgid "Events automatically pruned by system"
|
2220 |
+
msgstr "Eventos automáticamente podados por el sistema"
|
2221 |
+
|
2222 |
+
#: defaults.php:193
|
2223 |
+
msgid "System automatically deleted %EventCount% alert(s)."
|
2224 |
+
msgstr "Sistema ha borrado automáticamente %EventCount% alerta(s)."
|
2225 |
+
|
2226 |
+
#: defaults.php:194
|
2227 |
+
msgid "Option Anyone Can Register in WordPress settings changed"
|
2228 |
+
msgstr ""
|
2229 |
+
"Opción Cualquiera Puede Registrarse en Ajustes de WordPress ha sido cambiada"
|
2230 |
+
|
2231 |
+
#: defaults.php:194
|
2232 |
+
msgid "%NewValue% the option \"Anyone can register\"."
|
2233 |
+
msgstr "%NewValue% la opción \"Cualquiera puede registrarse\"."
|
2234 |
+
|
2235 |
+
#: defaults.php:195
|
2236 |
+
msgid "New User Default Role changed"
|
2237 |
+
msgstr "Rol Predeterminado de Nuevo Usuario ha sido cambiado"
|
2238 |
+
|
2239 |
+
#: defaults.php:195
|
2240 |
+
msgid "Changed the New User Default Role from %OldRole% to %NewRole%."
|
2241 |
+
msgstr ""
|
2242 |
+
"Ha cambiado el Rol Predeterminado de Nuevo Usuario de %OldRole% a %NewRole%."
|
2243 |
+
|
2244 |
+
#: defaults.php:196
|
2245 |
+
msgid "WordPress Administrator Notification email changed"
|
2246 |
+
msgstr ""
|
2247 |
+
"Email de notificaciones del administrador de WordPress ha sido cambiada"
|
2248 |
+
|
2249 |
+
#: defaults.php:196
|
2250 |
+
msgid ""
|
2251 |
+
"Changed the WordPress administrator notifications email address from "
|
2252 |
+
"%OldEmail% to %NewEmail%."
|
2253 |
+
msgstr ""
|
2254 |
+
"Ha cambiado dirección email de notificaciones del administrador de %OldEmail"
|
2255 |
+
"% a %NewEmail%."
|
2256 |
+
|
2257 |
+
#: defaults.php:197
|
2258 |
+
msgid "WordPress was updated"
|
2259 |
+
msgstr "WordPress ha sido actualizado"
|
2260 |
+
|
2261 |
+
#: defaults.php:197
|
2262 |
+
msgid "Updated WordPress from version %OldVersion% to %NewVersion%."
|
2263 |
+
msgstr "WordPress actualizado de la versión %OldVersion% a %NewVersion%."
|
2264 |
+
|
2265 |
+
#: defaults.php:198
|
2266 |
+
msgid "User changes the WordPress Permalinks"
|
2267 |
+
msgstr "Usuario cambia Enlaces permanentes de WordPress"
|
2268 |
+
|
2269 |
+
#: defaults.php:198
|
2270 |
+
msgid "Changed the WordPress permalinks from %OldPattern% to %NewPattern%."
|
2271 |
+
msgstr ""
|
2272 |
+
"Ha cambiado los enlaces permanentes de WordPress de %OldPattern% to "
|
2273 |
+
"%NewPattern%."
|
2274 |
+
|
2275 |
+
#: defaults.php:199
|
2276 |
+
msgid "User requests non-existing pages (404 Error Pages)"
|
2277 |
+
msgstr "Usuario solicita páginas no existentes (404 Páginas de Error)"
|
2278 |
+
|
2279 |
+
#: defaults.php:199
|
2280 |
+
msgid ""
|
2281 |
+
"Has requested a non existing page (404 Error Pages) %Attempts% %Msg%. "
|
2282 |
+
"%LinkFile%."
|
2283 |
+
msgstr ""
|
2284 |
+
"Ha solicitado una página no existente (404 Páginas de Error) %Attempts% %Msg"
|
2285 |
+
"%. %LinkFile%."
|
2286 |
+
|
2287 |
+
#: defaults.php:200
|
2288 |
+
msgid "Advertising Add-ons."
|
2289 |
+
msgstr "Complementos publicitarios."
|
2290 |
+
|
2291 |
+
#: defaults.php:200
|
2292 |
+
msgid "%PromoName% %PromoMessage%"
|
2293 |
+
msgstr "%PromoName% %PromoMessage%"
|
2294 |
+
|
2295 |
+
#: defaults.php:202
|
2296 |
+
msgid "MultiSite"
|
2297 |
+
msgstr "MultiSitio"
|
2298 |
+
|
2299 |
+
#: defaults.php:203
|
2300 |
+
msgid "User granted Super Admin privileges"
|
2301 |
+
msgstr "Usuario ha concedido privilegios de Super Administrador"
|
2302 |
+
|
2303 |
+
#: defaults.php:203
|
2304 |
+
msgid "Granted Super Admin privileges to %TargetUsername%."
|
2305 |
+
msgstr "Privilegios de Super Administrador concedidos a %TargetUsername%."
|
2306 |
+
|
2307 |
+
#: defaults.php:204
|
2308 |
+
msgid "User revoked from Super Admin privileges"
|
2309 |
+
msgstr "Usuario revocado de privilegios de Super Administrador"
|
2310 |
+
|
2311 |
+
#: defaults.php:204
|
2312 |
+
msgid "Revoked Super Admin privileges from %TargetUsername%."
|
2313 |
+
msgstr "Privilegios de Super Administrador revocados de %TargetUsername%."
|
2314 |
+
|
2315 |
+
#: defaults.php:205
|
2316 |
+
msgid "Existing user added to a site"
|
2317 |
+
msgstr "Usuario existente añadido a un sitio"
|
2318 |
+
|
2319 |
+
#: defaults.php:205
|
2320 |
+
msgid ""
|
2321 |
+
"Added the existing user %TargetUsername% with %TargetUserRole% role to site "
|
2322 |
+
"%SiteName%."
|
2323 |
+
msgstr ""
|
2324 |
+
"Añadir el usuario existente %TargetUsername% con el rol %TargetUserRole% al "
|
2325 |
+
"sitio %SiteName%."
|
2326 |
+
|
2327 |
+
#: defaults.php:206
|
2328 |
+
msgid "User removed from site"
|
2329 |
+
msgstr "Usuario eliminado del sitio"
|
2330 |
+
|
2331 |
+
#: defaults.php:206
|
2332 |
+
msgid ""
|
2333 |
+
"Removed the user %TargetUsername% with role %TargetUserRole% from %SiteName% "
|
2334 |
+
"site."
|
2335 |
+
msgstr ""
|
2336 |
+
"Ha eliminado el usuario %TargetUsername% con el rol %TargetUserRole% del "
|
2337 |
+
"sitio %SiteName%."
|
2338 |
+
|
2339 |
+
#: defaults.php:207
|
2340 |
+
msgid "New network user created"
|
2341 |
+
msgstr "Nueva red de usuario ha sido creada"
|
2342 |
+
|
2343 |
+
#: defaults.php:207
|
2344 |
+
msgid "Created a new network user %NewUserData->Username%."
|
2345 |
+
msgstr "Ha creado una nueva red de usuario %NewUserData->Username%."
|
2346 |
+
|
2347 |
+
#: defaults.php:208
|
2348 |
+
msgid "The forum role of a user was changed by another WordPress user"
|
2349 |
+
msgstr ""
|
2350 |
+
"El rol de foro de un usuario ha sido camiado por otro usuario de WordPress"
|
2351 |
+
|
2352 |
+
#: defaults.php:208
|
2353 |
+
msgid ""
|
2354 |
+
"Change the forum role of the user %TargetUsername% from %OldRole% to %NewRole"
|
2355 |
+
"% by %UserChanger%."
|
2356 |
+
msgstr ""
|
2357 |
+
"Cambiar el rol de foro del usuario %TargetUsername% de %OldRole% a %NewRole% "
|
2358 |
+
"por %UserChanger%."
|
2359 |
+
|
2360 |
+
#: defaults.php:209
|
2361 |
+
msgid "New site added on the network"
|
2362 |
+
msgstr "Nuevo sitio añadido en la red."
|
2363 |
+
|
2364 |
+
#: defaults.php:209
|
2365 |
+
msgid "Added the site %SiteName% to the network."
|
2366 |
+
msgstr "Ha añadido el sitio %SiteName% a la red."
|
2367 |
+
|
2368 |
+
#: defaults.php:210
|
2369 |
+
msgid "Existing site archived"
|
2370 |
+
msgstr "Sitio existente archivado"
|
2371 |
+
|
2372 |
+
#: defaults.php:210
|
2373 |
+
msgid "Archived the site %SiteName%."
|
2374 |
+
msgstr "Ha archivado el sitio %SiteName%."
|
2375 |
+
|
2376 |
+
#: defaults.php:211
|
2377 |
+
msgid "Archived site has been unarchived"
|
2378 |
+
msgstr "Archivado sitio ha sido desarchivado"
|
2379 |
+
|
2380 |
+
#: defaults.php:211
|
2381 |
+
msgid "Unarchived the site %SiteName%."
|
2382 |
+
msgstr "Desarchivar el sitio %SiteName%."
|
2383 |
+
|
2384 |
+
#: defaults.php:212
|
2385 |
+
msgid "Deactivated site has been activated"
|
2386 |
+
msgstr "Desactivado sitio ha sido activado"
|
2387 |
+
|
2388 |
+
#: defaults.php:212
|
2389 |
+
msgid "Activated the site %SiteName%."
|
2390 |
+
msgstr "Ha desactivado el sitio %SiteName%."
|
2391 |
+
|
2392 |
+
#: defaults.php:213
|
2393 |
+
msgid "Site has been deactivated"
|
2394 |
+
msgstr "Sitio ha sido desactivado"
|
2395 |
+
|
2396 |
+
#: defaults.php:213
|
2397 |
+
msgid "Deactivated the site %SiteName%."
|
2398 |
+
msgstr "Ha desactivado el sitio %SiteName%."
|
2399 |
+
|
2400 |
+
#: defaults.php:214
|
2401 |
+
msgid "Existing site deleted from network"
|
2402 |
+
msgstr "Sitio existente borrado de la red"
|
2403 |
+
|
2404 |
+
#: defaults.php:214
|
2405 |
+
msgid "Deleted the site %SiteName%."
|
2406 |
+
msgstr "Ha borrado el sitio %SiteName%."
|
2407 |
+
|
2408 |
+
#: defaults.php:215
|
2409 |
+
msgid "Activated theme on network"
|
2410 |
+
msgstr "Ha activado tema en la red"
|
2411 |
+
|
2412 |
+
#: defaults.php:215
|
2413 |
+
msgid ""
|
2414 |
+
"Network activated the theme %Theme->Name% installed in %Theme-"
|
2415 |
+
">get_template_directory%."
|
2416 |
+
msgstr ""
|
2417 |
+
"La red ha activado el tema %Theme->Name% instalado en %Theme-"
|
2418 |
+
">get_template_directory%."
|
2419 |
+
|
2420 |
+
#: defaults.php:216
|
2421 |
+
msgid "Deactivated theme from network"
|
2422 |
+
msgstr "Tema desactivado por la red"
|
2423 |
+
|
2424 |
+
#: defaults.php:216
|
2425 |
+
msgid ""
|
2426 |
+
"Network deactivated the theme %Theme->Name% installed in %Theme-"
|
2427 |
+
">get_template_directory%."
|
2428 |
+
msgstr ""
|
2429 |
+
"La red ha desactivado el tema %Theme->Name% instalado en %Theme-"
|
2430 |
+
">get_template_directory%."
|
2431 |
+
|
2432 |
+
#: defaults.php:218
|
2433 |
+
msgid "Database"
|
2434 |
+
msgstr "Base de datos"
|
2435 |
+
|
2436 |
+
#: defaults.php:219
|
2437 |
+
msgid "Plugin created tables"
|
2438 |
+
msgstr "Plugin ha creado tablas"
|
2439 |
+
|
2440 |
+
#: defaults.php:219
|
2441 |
+
msgid ""
|
2442 |
+
"Plugin %Plugin->Name% created these tables in the database: %TableNames%."
|
2443 |
+
msgstr ""
|
2444 |
+
"Plugin %Plugin->Name% ha creado estas tablas en la base de datos: %TableNames"
|
2445 |
+
"%."
|
2446 |
+
|
2447 |
+
#: defaults.php:220
|
2448 |
+
msgid "Plugin modified tables structure"
|
2449 |
+
msgstr "Plugin ha modificado estructura de tablas"
|
2450 |
+
|
2451 |
+
#: defaults.php:220
|
2452 |
+
msgid ""
|
2453 |
+
"Plugin %Plugin->Name% modified the structure of these database tables: "
|
2454 |
+
"%TableNames%."
|
2455 |
+
msgstr ""
|
2456 |
+
"Plugin %Plugin->Name% ha modificado la estructura de estas tablas de la base "
|
2457 |
+
"de datos: %TableNames%."
|
2458 |
+
|
2459 |
+
#: defaults.php:221
|
2460 |
+
msgid "Plugin deleted tables"
|
2461 |
+
msgstr "Plugin ha borrado tablas"
|
2462 |
+
|
2463 |
+
#: defaults.php:221
|
2464 |
+
msgid ""
|
2465 |
+
"Plugin %Plugin->Name% deleted the following tables from the database: "
|
2466 |
+
"%TableNames%."
|
2467 |
+
msgstr ""
|
2468 |
+
"Plugin %Plugin->Name% ha borrado las siguientes tabblas de la base de datos: "
|
2469 |
+
"%TableNames%."
|
2470 |
+
|
2471 |
+
#: defaults.php:222
|
2472 |
+
msgid "Theme created tables"
|
2473 |
+
msgstr "Tema ha creado tablas"
|
2474 |
+
|
2475 |
+
#: defaults.php:222
|
2476 |
+
msgid "Theme %Theme->Name% created these tables in the database: %TableNames%."
|
2477 |
+
msgstr ""
|
2478 |
+
"Tema %Theme->Name% ha creado estas tablas en la base de datos: %TableNames%."
|
2479 |
+
|
2480 |
+
#: defaults.php:223
|
2481 |
+
msgid "Theme modified tables structure"
|
2482 |
+
msgstr "Tema ha modificado estructura de tablas"
|
2483 |
+
|
2484 |
+
#: defaults.php:223
|
2485 |
+
msgid ""
|
2486 |
+
"Theme %Theme->Name% modified the structure of these database tables: "
|
2487 |
+
"%TableNames%."
|
2488 |
+
msgstr ""
|
2489 |
+
"Tema %Theme->Name% ha modificado la estructura de estas tablas de la base de "
|
2490 |
+
"datos: %TableNames%."
|
2491 |
+
|
2492 |
+
#: defaults.php:224
|
2493 |
+
msgid "Theme deleted tables"
|
2494 |
+
msgstr "Tema ha borrado tablas"
|
2495 |
+
|
2496 |
+
#: defaults.php:224
|
2497 |
+
msgid ""
|
2498 |
+
"Theme %Theme->Name% deleted the following tables from the database: "
|
2499 |
+
"%TableNames%."
|
2500 |
+
msgstr ""
|
2501 |
+
"Tema %Theme->Name% ha borrado las siguientes tablas de la base de datos: "
|
2502 |
+
"%TableNames%."
|
2503 |
+
|
2504 |
+
#: defaults.php:225
|
2505 |
+
msgid "Unknown component created tables"
|
2506 |
+
msgstr "Desconocido componente ha creado tablas"
|
2507 |
+
|
2508 |
+
#: defaults.php:225
|
2509 |
+
msgid ""
|
2510 |
+
"An unknown component created these tables in the database: %TableNames%."
|
2511 |
+
msgstr ""
|
2512 |
+
"Un desconocido componente ha creado estas tablas en la base de datos: "
|
2513 |
+
"%TableNames%."
|
2514 |
+
|
2515 |
+
#: defaults.php:226
|
2516 |
+
msgid "Unknown component modified tables structure"
|
2517 |
+
msgstr "Desconocido componente ha modificado estructura de tablas"
|
2518 |
+
|
2519 |
+
#: defaults.php:226
|
2520 |
+
msgid ""
|
2521 |
+
"An unknown component modified the structure of these database tables: "
|
2522 |
+
"%TableNames%."
|
2523 |
+
msgstr ""
|
2524 |
+
"Un desconocido componente ha modificado la estructura de estas tablas de la "
|
2525 |
+
"base de datos: %TableNames%."
|
2526 |
+
|
2527 |
+
#: defaults.php:227
|
2528 |
+
msgid "Unknown component deleted tables"
|
2529 |
+
msgstr "Desconocido componente ha borrado tablas"
|
2530 |
+
|
2531 |
+
#: defaults.php:227
|
2532 |
+
msgid ""
|
2533 |
+
"An unknown component deleted the following tables from the database: "
|
2534 |
+
"%TableNames%."
|
2535 |
+
msgstr ""
|
2536 |
+
"Un desconocido componente ha borrado las siguientes tablas de la base de "
|
2537 |
+
"datos: %TableNames%."
|
2538 |
+
|
2539 |
+
#: defaults.php:229
|
2540 |
+
msgid "BBPress Forum"
|
2541 |
+
msgstr "Foro BBPress"
|
2542 |
+
|
2543 |
+
#: defaults.php:230
|
2544 |
+
msgid "User created new forum"
|
2545 |
+
msgstr "Usuario ha creado nuevo foro"
|
2546 |
+
|
2547 |
+
#: defaults.php:231
|
2548 |
+
msgid "User changed status of a forum"
|
2549 |
+
msgstr "Usuario ha cambiado estado de un foro"
|
2550 |
+
|
2551 |
+
#: defaults.php:232
|
2552 |
+
msgid "User changed visibility of a forum"
|
2553 |
+
msgstr "Usuario ha cambiado visibilidad de un foro"
|
2554 |
+
|
2555 |
+
#: defaults.php:233
|
2556 |
+
msgid "User changed the URL of a forum"
|
2557 |
+
msgstr "Usuario ha cambiado la URL de un foro"
|
2558 |
+
|
2559 |
+
#: defaults.php:234
|
2560 |
+
msgid "User changed order of a forum"
|
2561 |
+
msgstr "Usuario ha cambiado orden de un foro"
|
2562 |
+
|
2563 |
+
#: defaults.php:235
|
2564 |
+
msgid "User moved forum to trash"
|
2565 |
+
msgstr "Usuario ha movido foro a la papelera"
|
2566 |
+
|
2567 |
+
#: defaults.php:235
|
2568 |
+
msgid "Moved the forum %ForumName% to trash."
|
2569 |
+
msgstr "Ha movido el foro %ForumName% a la papelera."
|
2570 |
+
|
2571 |
+
#: defaults.php:236
|
2572 |
+
msgid "User permanently deleted forum"
|
2573 |
+
msgstr "Usuario ha borrado foro permanentemente"
|
2574 |
+
|
2575 |
+
#: defaults.php:236
|
2576 |
+
msgid "Permanently deleted the forum %ForumName%."
|
2577 |
+
msgstr "Ha borrado permanentemente el foro %ForumName%."
|
2578 |
+
|
2579 |
+
#: defaults.php:237
|
2580 |
+
msgid "User restored forum from trash"
|
2581 |
+
msgstr "Usuario ha restaurado foro de la papelera"
|
2582 |
+
|
2583 |
+
#: defaults.php:238
|
2584 |
+
msgid "User changed the parent of a forum"
|
2585 |
+
msgstr "Usuario ha cambiado el padre de un foro"
|
2586 |
+
|
2587 |
+
#: defaults.php:239
|
2588 |
+
msgid "User changed forum's role"
|
2589 |
+
msgstr "Usuario ha cambiado rol de foro"
|
2590 |
+
|
2591 |
+
#: defaults.php:239
|
2592 |
+
msgid "Changed the forum's auto role from %OldRole% to %NewRole%."
|
2593 |
+
msgstr "Ha cambiado el rol automático del foro de %OldRole% a %NewRole%."
|
2594 |
+
|
2595 |
+
#: defaults.php:240
|
2596 |
+
msgid "User changed option of a forum"
|
2597 |
+
msgstr "Usuario ha cambiado opción de un foro"
|
2598 |
+
|
2599 |
+
#: defaults.php:240
|
2600 |
+
msgid "%Status% the option for anonymous posting on forum."
|
2601 |
+
msgstr "%Status% la opción para publicación anónima en el foro."
|
2602 |
+
|
2603 |
+
#: defaults.php:241
|
2604 |
+
msgid "User changed type of a forum"
|
2605 |
+
msgstr "Usuario ha cambiado el tipo de un foro"
|
2606 |
+
|
2607 |
+
#: defaults.php:242
|
2608 |
+
msgid "User changed time to disallow post editing"
|
2609 |
+
msgstr "Usuario ha camiado tiempo para denegar edición de publicación"
|
2610 |
+
|
2611 |
+
#: defaults.php:242
|
2612 |
+
msgid ""
|
2613 |
+
"Changed the time to disallow post editing from %OldTime% to %NewTime% "
|
2614 |
+
"minutes in the forums."
|
2615 |
+
msgstr ""
|
2616 |
+
"Ha cambiado el tiempo para denegar edición de publicación de %OldTime% a "
|
2617 |
+
"%NewTime% minutos en los foros."
|
2618 |
+
|
2619 |
+
#: defaults.php:243
|
2620 |
+
msgid "User changed the forum setting posting throttle time"
|
2621 |
+
msgstr "Usuario ha cambiado los ajustes de acelerador de tiempo de publicación"
|
2622 |
+
|
2623 |
+
#: defaults.php:243
|
2624 |
+
msgid ""
|
2625 |
+
"Changed the posting throttle time from %OldTime% to %NewTime% seconds in the "
|
2626 |
+
"forums."
|
2627 |
+
msgstr ""
|
2628 |
+
"Ha cambiado el acelerador de tiempo de publicación de %OldTime% a %NewTime% "
|
2629 |
+
"segundos en los foros."
|
2630 |
+
|
2631 |
+
#: defaults.php:244
|
2632 |
+
msgid "User created new topic"
|
2633 |
+
msgstr "Usuario ha creado nuevo tópico"
|
2634 |
+
|
2635 |
+
#: defaults.php:245
|
2636 |
+
msgid "User changed status of a topic"
|
2637 |
+
msgstr "Usuario ha cambiado estado de un tópico"
|
2638 |
+
|
2639 |
+
#: defaults.php:246
|
2640 |
+
msgid "User changed type of a topic"
|
2641 |
+
msgstr "Usuario ha cambiado el tipo de un tópico"
|
2642 |
+
|
2643 |
+
#: defaults.php:247
|
2644 |
+
msgid "User changed URL of a topic"
|
2645 |
+
msgstr "Usuario ha cambiado URL de un tópico"
|
2646 |
+
|
2647 |
+
#: defaults.php:247
|
2648 |
+
msgid "Changed the URL of the topic %TopicName% from %OldUrl% to %NewUrl%."
|
2649 |
+
msgstr "Ha cambiado la URL del tópico %TopicName% de %OldUrl% a %NewUrl%."
|
2650 |
+
|
2651 |
+
#: defaults.php:248
|
2652 |
+
msgid "User changed the forum of a topic"
|
2653 |
+
msgstr "Usuario ha cambiado el foro de un tópico"
|
2654 |
+
|
2655 |
+
#: defaults.php:249
|
2656 |
+
msgid "User moved topic to trash"
|
2657 |
+
msgstr "Ha movido tópico a la papelera"
|
2658 |
+
|
2659 |
+
#: defaults.php:249
|
2660 |
+
msgid "Moved the topic %TopicName% to trash."
|
2661 |
+
msgstr "Ha movido el tópico %TopicName% to trash."
|
2662 |
+
|
2663 |
+
#: defaults.php:250
|
2664 |
+
msgid "User permanently deleted topic"
|
2665 |
+
msgstr "Usuario ha borrado permanentemente un tópico"
|
2666 |
+
|
2667 |
+
#: defaults.php:250
|
2668 |
+
msgid "Permanently deleted the topic %TopicName%."
|
2669 |
+
msgstr "Ha borrado permanentemente el tópico %TopicName%."
|
2670 |
+
|
2671 |
+
#: defaults.php:251
|
2672 |
+
msgid "User restored topic from trash"
|
2673 |
+
msgstr "Usuario ha restaurado un tópico de la papelera"
|
2674 |
+
|
2675 |
+
#: defaults.php:252
|
2676 |
+
msgid "User changed visibility of a topic"
|
2677 |
+
msgstr "Usuario ha cambiado visibilidad de un tópico."
|
2678 |
+
|
2679 |
+
#: defaults.php:254
|
2680 |
+
msgid "Menus"
|
2681 |
+
msgstr "Menús"
|
2682 |
+
|
2683 |
+
#: defaults.php:255
|
2684 |
+
msgid "User created new menu"
|
2685 |
+
msgstr "Usuario ha creado nuevo menú"
|
2686 |
+
|
2687 |
+
#: defaults.php:255
|
2688 |
+
msgid "Created a new menu called %MenuName%."
|
2689 |
+
msgstr "Ha creado un nuevo menú llamado %MenuName%."
|
2690 |
+
|
2691 |
+
#: defaults.php:256
|
2692 |
+
msgid "User added content to a menu"
|
2693 |
+
msgstr "Usuario ha añadido contenido a un menú"
|
2694 |
+
|
2695 |
+
#: defaults.php:256
|
2696 |
+
msgid "Added the %ContentType% called %ContentName% to menu %MenuName%."
|
2697 |
+
msgstr "Ha añadido el %ContentType% llamado %ContentName% al menú %MenuName%."
|
2698 |
+
|
2699 |
+
#: defaults.php:257
|
2700 |
+
msgid "User removed content from a menu"
|
2701 |
+
msgstr "Usuario ha eliminado contenido de un menú"
|
2702 |
+
|
2703 |
+
#: defaults.php:257
|
2704 |
+
msgid ""
|
2705 |
+
"Removed the %ContentType% called %ContentName% from the menu %MenuName%."
|
2706 |
+
msgstr "Ha eliminado %ContentType% llamado %ContentName% del menú %MenuName%."
|
2707 |
+
|
2708 |
+
#: defaults.php:258
|
2709 |
+
msgid "User deleted menu"
|
2710 |
+
msgstr "Usuario ha borrado menú"
|
2711 |
+
|
2712 |
+
#: defaults.php:258
|
2713 |
+
msgid "Deleted the menu %MenuName%."
|
2714 |
+
msgstr "Ha borrado el menú %MenuName%."
|
2715 |
+
|
2716 |
+
#: defaults.php:259
|
2717 |
+
msgid "User changed menu setting"
|
2718 |
+
msgstr "Usuario ha cambiado ajustes de menú"
|
2719 |
+
|
2720 |
+
#: defaults.php:259
|
2721 |
+
msgid "%Status% the menu setting %MenuSetting% in %MenuName%."
|
2722 |
+
msgstr "%Status% los ajustes de menú %MenuSetting% en %MenuName%."
|
2723 |
+
|
2724 |
+
#: defaults.php:260
|
2725 |
+
msgid "User modified content in a menu"
|
2726 |
+
msgstr "Usuario ha modificado contenido en un menú"
|
2727 |
+
|
2728 |
+
#: defaults.php:260
|
2729 |
+
msgid "Modified the %ContentType% called %ContentName% in menu %MenuName%."
|
2730 |
+
msgstr ""
|
2731 |
+
"Ha modificado el %ContentType% llamado %ContentName% en menú %MenuName%."
|
2732 |
+
|
2733 |
+
#: defaults.php:261
|
2734 |
+
msgid "User changed name of a menu"
|
2735 |
+
msgstr "Ha cambiado el nombre de un menú"
|
2736 |
+
|
2737 |
+
#: defaults.php:261
|
2738 |
+
msgid "Changed the name of menu %OldMenuName% to %NewMenuName%."
|
2739 |
+
msgstr "Ha cambiado el nombre del menú %OldMenuName% a %NewMenuName%."
|
2740 |
+
|
2741 |
+
#: defaults.php:262
|
2742 |
+
msgid "User changed order of the objects in a menu"
|
2743 |
+
msgstr "Ha cambiado el orden de los objetos en un menú"
|
2744 |
+
|
2745 |
+
#: defaults.php:262
|
2746 |
+
msgid "Changed the order of the %ItemName% in menu %MenuName%."
|
2747 |
+
msgstr "Ha cambiado el orden del %ItemName% en menú %MenuName%."
|
2748 |
+
|
2749 |
+
#: defaults.php:263
|
2750 |
+
msgid "User moved objects as a sub-item"
|
2751 |
+
msgstr "Usuario ha movido objeto como sub-ítem"
|
2752 |
+
|
2753 |
+
#: defaults.php:263
|
2754 |
+
msgid "Moved %ItemName% as a sub-item of %ParentName% in menu %MenuName%."
|
2755 |
+
msgstr "Movido %ItemName% como sub-ítem de %ParentName% en menú %MenuName%."
|
2756 |
+
|
2757 |
+
#: defaults.php:265
|
2758 |
+
msgid "Comments"
|
2759 |
+
msgstr "Comentarios"
|
2760 |
+
|
2761 |
+
#: defaults.php:266
|
2762 |
+
msgid "User approved a comment"
|
2763 |
+
msgstr "Usuario ha aprobado un comentario"
|
2764 |
+
|
2765 |
+
#: defaults.php:266
|
2766 |
+
msgid ""
|
2767 |
+
"Approved the comment posted in response to the post %PostTitle% by %Author% "
|
2768 |
+
"on %CommentLink%."
|
2769 |
+
msgstr ""
|
2770 |
+
"Ha aprobado el comentario publicado en respuesta a la entrada %PostTitle% "
|
2771 |
+
"por %Author% en %CommentLink%."
|
2772 |
+
|
2773 |
+
#: defaults.php:267
|
2774 |
+
msgid "User unapproved a comment"
|
2775 |
+
msgstr "Usuario ha desaprobado un comentario"
|
2776 |
+
|
2777 |
+
#: defaults.php:267
|
2778 |
+
msgid ""
|
2779 |
+
"Unapproved the comment posted in response to the post %PostTitle% by %Author"
|
2780 |
+
"% on %CommentLink%."
|
2781 |
+
msgstr ""
|
2782 |
+
"Ha rechazado el comentario publicado en respuesta a la entrada %PostTitle% "
|
2783 |
+
"por %Author% en %CommentLink%."
|
2784 |
+
|
2785 |
+
#: defaults.php:268
|
2786 |
+
msgid "User replied to a comment"
|
2787 |
+
msgstr "Usuario ha respondido a un comentario"
|
2788 |
+
|
2789 |
+
#: defaults.php:268
|
2790 |
+
msgid ""
|
2791 |
+
"Replied to the comment posted in response to the post %PostTitle% by %Author"
|
2792 |
+
"% on %CommentLink%."
|
2793 |
+
msgstr ""
|
2794 |
+
"Ha respondido al comentario publicado en respuesta a la entrada %PostTitle% "
|
2795 |
+
"por %Author% en %CommentLink%."
|
2796 |
+
|
2797 |
+
#: defaults.php:269
|
2798 |
+
msgid "User edited a comment"
|
2799 |
+
msgstr "Usuario ha editado un comentario"
|
2800 |
+
|
2801 |
+
#: defaults.php:269
|
2802 |
+
msgid ""
|
2803 |
+
"Edited a comment posted in response to the post %PostTitle% by %Author% on "
|
2804 |
+
"%CommentLink%."
|
2805 |
+
msgstr ""
|
2806 |
+
"Ha editado un comentario publicado en respuesta a la entrada %PostTitle% por "
|
2807 |
+
"%Author% en %CommentLink%."
|
2808 |
+
|
2809 |
+
#: defaults.php:270
|
2810 |
+
msgid "User marked a comment as Spam"
|
2811 |
+
msgstr "Usuario ha marcado un comentario como Spam"
|
2812 |
+
|
2813 |
+
#: defaults.php:270
|
2814 |
+
msgid ""
|
2815 |
+
"Marked the comment posted in response to the post %PostTitle% by %Author% on "
|
2816 |
+
"%CommentLink% as Spam."
|
2817 |
+
msgstr ""
|
2818 |
+
"Ha marcado el comentario publicado en respuesta a la entrada %PostTitle% por "
|
2819 |
+
"%Author% en %CommentLink% como Spam."
|
2820 |
+
|
2821 |
+
#: defaults.php:271
|
2822 |
+
msgid "User marked a comment as Not Spam"
|
2823 |
+
msgstr "Usuario ha marcado un comentario como No es spam"
|
2824 |
+
|
2825 |
+
#: defaults.php:271
|
2826 |
+
msgid ""
|
2827 |
+
"Marked the comment posted in response to the post %PostTitle% by %Author% on "
|
2828 |
+
"%CommentLink% as Not Spam."
|
2829 |
+
msgstr ""
|
2830 |
+
"Ha marcado el comentario publicado en respuesta a la entrada %PostTitle% por "
|
2831 |
+
"%Author% en %CommentLink% como No es spam,"
|
2832 |
+
|
2833 |
+
#: defaults.php:272
|
2834 |
+
msgid "User moved a comment to trash"
|
2835 |
+
msgstr "Usuario ha movido un comenta a papelera"
|
2836 |
+
|
2837 |
+
#: defaults.php:272
|
2838 |
+
msgid ""
|
2839 |
+
"Moved the comment posted in response to the post %PostTitle% by %Author% on "
|
2840 |
+
"%Date% to trash."
|
2841 |
+
msgstr ""
|
2842 |
+
"Ha movido el comentario publicado en respuesta a la entrada %PostTitle% por "
|
2843 |
+
"%Author% el %Date% a la papelera."
|
2844 |
+
|
2845 |
+
#: defaults.php:273
|
2846 |
+
msgid "User restored a comment from the trash"
|
2847 |
+
msgstr "Usuario ha restaurado un comentario de la papelera"
|
2848 |
+
|
2849 |
+
#: defaults.php:273
|
2850 |
+
msgid ""
|
2851 |
+
"Restored the comment posted in response to the post %PostTitle% by %Author% "
|
2852 |
+
"on %CommentLink% from the trash."
|
2853 |
+
msgstr ""
|
2854 |
+
"Ha restaurado el comentario publicado en respuesta a la entrada %PostTitle% "
|
2855 |
+
"por %Author% en %CommentLink% de la papelera."
|
2856 |
+
|
2857 |
+
#: defaults.php:274
|
2858 |
+
msgid "User permanently deleted a comment"
|
2859 |
+
msgstr "Usuario ha borrado permanentemente un comentario"
|
2860 |
+
|
2861 |
+
#: defaults.php:274
|
2862 |
+
msgid ""
|
2863 |
+
"Permanently deleted the comment posted in response to the post %PostTitle% "
|
2864 |
+
"by %Author% on %Date%."
|
2865 |
+
msgstr ""
|
2866 |
+
"Ha borrado permanentemente el comentario publicado en respuesta a la entrada "
|
2867 |
+
"%PostTitle% por %Author% en %Date%."
|
2868 |
+
|
2869 |
+
#: defaults.php:275
|
2870 |
+
msgid "User posted a comment"
|
2871 |
+
msgstr "Usuario ha publicado un comentario"
|
2872 |
+
|
2873 |
+
#: defaults.php:275
|
2874 |
+
msgid "%CommentMsg% on %CommentLink%."
|
2875 |
+
msgstr "%CommentMsg% on %CommentLink%."
|
2876 |
+
|
2877 |
+
#: wp-security-audit-log.php:261
|
2878 |
+
msgid ""
|
2879 |
+
"You are using a version of PHP that is older than %s, which is no longer "
|
2880 |
+
"supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
|
2881 |
+
"\">plugins@wpwhitesecurity.com</a> to help you switch the version of PHP you "
|
2882 |
+
"are using."
|
2883 |
+
msgstr ""
|
2884 |
+
"Estás usando una versión de PHP que es más antigua que %s, que ya no está "
|
2885 |
+
"soportada.<br/>Contáctanos en <a href=\"mailto:plugins@wpwhitesecurity.com"
|
2886 |
+
"\">plugins@wpwhitesecurity.com</a> para ayudarte a cambiar la versión de PHP "
|
2887 |
+
"que estás usando."
|
2888 |
+
|
2889 |
+
#. Plugin Name of the plugin/theme
|
2890 |
+
msgid "WP Security Audit Log"
|
2891 |
+
msgstr "WP Security Audit Log"
|
2892 |
+
|
2893 |
+
#. Plugin URI of the plugin/theme
|
2894 |
+
#. Author URI of the plugin/theme
|
2895 |
+
msgid "http://www.wpsecurityauditlog.com/"
|
2896 |
+
msgstr "http://www.wpsecurityauditlog.com/"
|
2897 |
+
|
2898 |
+
#. Description of the plugin/theme
|
2899 |
+
msgid ""
|
2900 |
+
"Identify WordPress security issues before they become a problem. Keep track "
|
2901 |
+
"of everything happening on your WordPress including WordPress users "
|
2902 |
+
"activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit "
|
2903 |
+
"Log generates a security alert for everything that happens on your WordPress "
|
2904 |
+
"blogs and websites. Use the Audit Log Viewer included in the plugin to see "
|
2905 |
+
"all the security alerts."
|
2906 |
+
msgstr ""
|
2907 |
+
"Identificar los fallos de seguridad de WordPress antes de que se conviertan "
|
2908 |
+
"en un problema. Lleva un registro de todo lo que sucede en su WordPress "
|
2909 |
+
"incluyendo la actividad de los usuarios de WordPress. Al igual que el "
|
2910 |
+
"registro de eventos de Windows y Syslog de Linux, WP Security Audit Log "
|
2911 |
+
"genera una alerta de seguridad para todo lo que sucede en sus blogs y sitios "
|
2912 |
+
"web de WordPress. Utiliza el Visor de Registro de Auditoría incluido en el "
|
2913 |
+
"plugin para ver todas las alertas de seguridad."
|
2914 |
+
|
2915 |
+
#. Author of the plugin/theme
|
2916 |
+
msgid "WP White Security"
|
2917 |
+
msgstr "WP White Security"
|
languages/wp-security-audit-log-fr_FR.po
ADDED
@@ -0,0 +1,2803 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Copyright (C) 2016 WP Security Audit Log
|
2 |
+
# This file is distributed under the same license as the WP Security Audit Log package.
|
3 |
+
msgid ""
|
4 |
+
msgstr ""
|
5 |
+
"Project-Id-Version: WP Security Audit Log 2.5.3\n"
|
6 |
+
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-security-audit-"
|
7 |
+
"log\n"
|
8 |
+
"POT-Creation-Date: 2017-09-13 08:22+0300\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"PO-Revision-Date: 2017-09-20 10:16+0300\n"
|
13 |
+
"Language-Team: \n"
|
14 |
+
"X-Generator: Poedit 2.0.3\n"
|
15 |
+
"Last-Translator: \n"
|
16 |
+
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
17 |
+
"Language: fr_FR\n"
|
18 |
+
|
19 |
+
#: classes/AuditLogListView.php:36
|
20 |
+
msgid "No events so far."
|
21 |
+
msgstr "Pas d'incident."
|
22 |
+
|
23 |
+
#: classes/AuditLogListView.php:42
|
24 |
+
msgid "Other"
|
25 |
+
msgstr "Autre"
|
26 |
+
|
27 |
+
#: classes/AuditLogListView.php:49
|
28 |
+
msgid "Show "
|
29 |
+
msgstr "Montrer "
|
30 |
+
|
31 |
+
#: classes/AuditLogListView.php:59
|
32 |
+
msgid " Items"
|
33 |
+
msgstr " Articles"
|
34 |
+
|
35 |
+
#: classes/AuditLogListView.php:72 classes/Views/AuditLog.php:96
|
36 |
+
msgid "All Sites"
|
37 |
+
msgstr "Tous les sites"
|
38 |
+
|
39 |
+
#: classes/AuditLogListView.php:123 classes/AuditLogListView.php:143
|
40 |
+
#: classes/Views/ToggleAlerts.php:75
|
41 |
+
msgid "Code"
|
42 |
+
msgstr "Code"
|
43 |
+
|
44 |
+
#: classes/AuditLogListView.php:124 classes/AuditLogListView.php:146
|
45 |
+
#: classes/Views/ToggleAlerts.php:76
|
46 |
+
msgid "Type"
|
47 |
+
msgstr "Type"
|
48 |
+
|
49 |
+
#: classes/AuditLogListView.php:125 classes/AuditLogListView.php:149
|
50 |
+
msgid "Date"
|
51 |
+
msgstr "Date"
|
52 |
+
|
53 |
+
#: classes/AuditLogListView.php:126 classes/AuditLogListView.php:152
|
54 |
+
msgid "Username"
|
55 |
+
msgstr "Nom de compte"
|
56 |
+
|
57 |
+
#: classes/AuditLogListView.php:127 classes/AuditLogListView.php:155
|
58 |
+
msgid "Source IP"
|
59 |
+
msgstr "IP d'origine"
|
60 |
+
|
61 |
+
#: classes/AuditLogListView.php:130 classes/AuditLogListView.php:158
|
62 |
+
msgid "Site"
|
63 |
+
msgstr "Site"
|
64 |
+
|
65 |
+
#: classes/AuditLogListView.php:132 classes/AuditLogListView.php:161
|
66 |
+
msgid "Message"
|
67 |
+
msgstr "Message"
|
68 |
+
|
69 |
+
#: classes/AuditLogListView.php:197
|
70 |
+
msgid "Click to toggle."
|
71 |
+
msgstr "Cliquer pour changer."
|
72 |
+
|
73 |
+
#: classes/AuditLogListView.php:203
|
74 |
+
msgid "Unknown error code."
|
75 |
+
msgstr "Code d'erreur inconnue."
|
76 |
+
|
77 |
+
#: classes/AuditLogListView.php:227
|
78 |
+
msgid "Unknown"
|
79 |
+
msgstr "Inconnu"
|
80 |
+
|
81 |
+
#: classes/AuditLogListView.php:231
|
82 |
+
msgid "Plugin"
|
83 |
+
msgstr "Extension"
|
84 |
+
|
85 |
+
#: classes/AuditLogListView.php:235
|
86 |
+
msgid "Plugins"
|
87 |
+
msgstr "Extensions"
|
88 |
+
|
89 |
+
#: classes/AuditLogListView.php:239
|
90 |
+
msgid "Website Visitor"
|
91 |
+
msgstr "Site du visiteur"
|
92 |
+
|
93 |
+
#: classes/AuditLogListView.php:243
|
94 |
+
msgid "System"
|
95 |
+
msgstr "Système"
|
96 |
+
|
97 |
+
#: classes/AuditLogListView.php:271
|
98 |
+
msgid "Alert Data Inspector"
|
99 |
+
msgstr "Alerte Inspecteur de données"
|
100 |
+
|
101 |
+
#: classes/Sensors/Content.php:421 classes/Sensors/Content.php:429
|
102 |
+
msgid "Password Protected"
|
103 |
+
msgstr "Protégé par mot de passe"
|
104 |
+
|
105 |
+
#: classes/Sensors/Content.php:423 classes/Sensors/Content.php:431
|
106 |
+
msgid "Public"
|
107 |
+
msgstr "Public"
|
108 |
+
|
109 |
+
#: classes/Sensors/Content.php:425 classes/Sensors/Content.php:433
|
110 |
+
msgid "Private"
|
111 |
+
msgstr "Privé"
|
112 |
+
|
113 |
+
#: classes/Views/About.php:6
|
114 |
+
msgid "About WP Security Audit Log"
|
115 |
+
msgstr "Au sujet de WP Security Audit Log"
|
116 |
+
|
117 |
+
#: classes/Views/About.php:14
|
118 |
+
msgid "About"
|
119 |
+
msgstr "Au sujet"
|
120 |
+
|
121 |
+
#: classes/Views/About.php:28
|
122 |
+
msgid ""
|
123 |
+
"WP Security Audit Log enables WordPress administrators and owners to "
|
124 |
+
"identify WordPress security issues before they become a security problem by "
|
125 |
+
"keeping a security audit log. WP Security Audit Log is developed by "
|
126 |
+
"WordPress security professionals WP White Security."
|
127 |
+
msgstr ""
|
128 |
+
"WP Security Audit Log permet aux administrateurs et usagers de Wordpress "
|
129 |
+
"d'identifier les failles de sécurité avant qu'elles ne deviennent des "
|
130 |
+
"problèmes en maintenant un audit de sécurité. WP Security Audit Log est "
|
131 |
+
"développé par des professionnels de la sécurité de WordPress au sein de WP "
|
132 |
+
"White Security."
|
133 |
+
|
134 |
+
#: classes/Views/About.php:30
|
135 |
+
msgid ""
|
136 |
+
"Keep A WordPress Security Audit Log & Identify WordPress Security Issues"
|
137 |
+
msgstr ""
|
138 |
+
"Garder un audit de WordPress Security Audit Log et identifier les alertes de "
|
139 |
+
"WordPress Security"
|
140 |
+
|
141 |
+
#: classes/Views/About.php:32
|
142 |
+
msgid ""
|
143 |
+
"WP Security Audit Log logs everything happening on your WordPress blog or "
|
144 |
+
"website and WordPress multisite network. By using WP Security Audit Log "
|
145 |
+
"security plugin it is very easy to track suspicious user activity before it "
|
146 |
+
"becomes a problem or a security issue. A WordPress security alert is "
|
147 |
+
"generated by the plugin when:"
|
148 |
+
msgstr ""
|
149 |
+
"WordPress Security Audit Log enregistre tous les évênements de votre blog ou "
|
150 |
+
"site WordPress, ainsi que des sites multiples WordPress. Grâce à l'extension "
|
151 |
+
"WordPress Security Audit Log il est très facile d'identifier les activités "
|
152 |
+
"suspectes des usagers avant qu'elles ne deviennent une alerte ou un problème "
|
153 |
+
"de sécurité. Une alerte est générée par l'extension WordPress Security "
|
154 |
+
"lorsque:"
|
155 |
+
|
156 |
+
#: classes/Views/About.php:35
|
157 |
+
msgid "User creates a new user or a new user is registered"
|
158 |
+
msgstr "Un usager crée un nouvel usager ou un nouvel usager est enregistré"
|
159 |
+
|
160 |
+
#: classes/Views/About.php:36
|
161 |
+
msgid ""
|
162 |
+
"Existing user changes the role, password or other properties of another user"
|
163 |
+
msgstr ""
|
164 |
+
"Un usager existant change le rêle, mot de passe ou autre propriété d'un "
|
165 |
+
"autre usager"
|
166 |
+
|
167 |
+
#: classes/Views/About.php:37
|
168 |
+
msgid "Existing user on a WordPress multisite network is added to a site"
|
169 |
+
msgstr "Un usager existant d'un multisite WordPress est ajouté à un site"
|
170 |
+
|
171 |
+
#: classes/Views/About.php:38
|
172 |
+
msgid "User uploads or deletes a file, changes a password or email address"
|
173 |
+
msgstr ""
|
174 |
+
"Un usager télécharge ou efface un fichier, change un mot de passe ou une "
|
175 |
+
"adresse mail"
|
176 |
+
|
177 |
+
#: classes/Views/About.php:39
|
178 |
+
msgid "User installs, activates, deactivates, upgrades or uninstalls a plugin"
|
179 |
+
msgstr ""
|
180 |
+
"Un usager installe, active, désactive, met à jour ou désinstalle une "
|
181 |
+
"extension"
|
182 |
+
|
183 |
+
#: classes/Views/About.php:40
|
184 |
+
msgid ""
|
185 |
+
"User creates, modifies or deletes a new post, page, category or a custom "
|
186 |
+
"post type"
|
187 |
+
msgstr ""
|
188 |
+
"Un usager crée, modifie ou efface un nouvel article, page ou catégorie, ou "
|
189 |
+
"un article de type personnalisé"
|
190 |
+
|
191 |
+
#: classes/Views/About.php:41
|
192 |
+
msgid "User installs or activates a WordPress theme"
|
193 |
+
msgstr "Un usager installe ou active un thème WordPress"
|
194 |
+
|
195 |
+
#: classes/Views/About.php:42
|
196 |
+
msgid "User adds, modifies or deletes a widget"
|
197 |
+
msgstr "Un usager ajoute, modifie ou efface un widget"
|
198 |
+
|
199 |
+
#: classes/Views/About.php:43
|
200 |
+
msgid "User uses the dashboard file editor"
|
201 |
+
msgstr "Un usager utilise l'éditeur de fichier"
|
202 |
+
|
203 |
+
#: classes/Views/About.php:44
|
204 |
+
msgid "WordPress settings are changed"
|
205 |
+
msgstr "Les paramètres de WordPress sont modifiés"
|
206 |
+
|
207 |
+
#: classes/Views/About.php:45
|
208 |
+
msgid "Failed login attempts"
|
209 |
+
msgstr "Erreurs de login"
|
210 |
+
|
211 |
+
#: classes/Views/About.php:46
|
212 |
+
msgid "and much more…"
|
213 |
+
msgstr "et beaucoup plus…"
|
214 |
+
|
215 |
+
#: classes/Views/About.php:56
|
216 |
+
msgid "Extend the Functionality & Get More Value from WP Security Audit Log"
|
217 |
+
msgstr ""
|
218 |
+
"Etendre les possibilités et obtenir de meilleurs résultats de WP Security "
|
219 |
+
"Audit Log"
|
220 |
+
|
221 |
+
#: classes/Views/About.php:59
|
222 |
+
msgid ""
|
223 |
+
"Get more value out of WP Security Audit Log by extending the functionality "
|
224 |
+
"of WP Security Audit Log with the premium Add-Ons."
|
225 |
+
msgstr ""
|
226 |
+
"Obtenir de meilleurs résultats de WP Security Audit Log en etendant ses "
|
227 |
+
"possibilités avec l'extension Premium."
|
228 |
+
|
229 |
+
#: classes/Views/About.php:61
|
230 |
+
msgid "See Add-Ons"
|
231 |
+
msgstr "Voir les extensions"
|
232 |
+
|
233 |
+
#: classes/Views/About.php:65 classes/Views/Help.php:68
|
234 |
+
msgid "WP Security Audit Log in your Language!"
|
235 |
+
msgstr "WP Security Audit Log dans votre langue!"
|
236 |
+
|
237 |
+
#: classes/Views/About.php:67 classes/Views/Help.php:70
|
238 |
+
msgid ""
|
239 |
+
"If you are interested in translating our plugin please drop us an email on"
|
240 |
+
msgstr "Si vous êtes intéressés par traduire notre extension, contactez-nous à"
|
241 |
+
|
242 |
+
#: classes/Views/About.php:72
|
243 |
+
msgid "WordPress Security Services"
|
244 |
+
msgstr "WP Security Services"
|
245 |
+
|
246 |
+
#: classes/Views/About.php:74
|
247 |
+
msgid "Professional WordPress security services provided by WP White Security"
|
248 |
+
msgstr "Services professionnels WP Security Services par WP White Security"
|
249 |
+
|
250 |
+
#: classes/Views/AuditLog.php:34
|
251 |
+
msgid "Upgrade to Premium"
|
252 |
+
msgstr "Mise à jour Premium"
|
253 |
+
|
254 |
+
#: classes/Views/AuditLog.php:35
|
255 |
+
msgid ""
|
256 |
+
"and add Email Alerts, Reports, Search and Users Login and Session Management."
|
257 |
+
msgstr ""
|
258 |
+
"et ajouter des alertes par mail, Rapports, Recherches et Logins d'Usagers et "
|
259 |
+
"management de session."
|
260 |
+
|
261 |
+
#: classes/Views/AuditLog.php:36
|
262 |
+
msgid "Upgrade Now!"
|
263 |
+
msgstr "Upgrade maintenant!"
|
264 |
+
|
265 |
+
#: classes/Views/AuditLog.php:50 classes/Views/AuditLog.php:60
|
266 |
+
msgid "Audit Log Viewer"
|
267 |
+
msgstr "Log d'Audit"
|
268 |
+
|
269 |
+
#: classes/Views/AuditLog.php:74 classes/Views/Licensing.php:34
|
270 |
+
#: classes/Views/Settings.php:132 classes/Views/ToggleAlerts.php:30
|
271 |
+
msgid "You do not have sufficient permissions to access this page."
|
272 |
+
msgstr "Vous n'avez pas les permissions nécessaires pour accéder à cette page."
|
273 |
+
|
274 |
+
#: classes/Views/AuditLog.php:95
|
275 |
+
msgid "Please enter the number of alerts you would like to see on one page:"
|
276 |
+
msgstr "Veuillez entrer le nombre d'alertes que vous voulez voir sur une page:"
|
277 |
+
|
278 |
+
#: classes/Views/AuditLog.php:97
|
279 |
+
msgid "No Results"
|
280 |
+
msgstr "Aucun résultat"
|
281 |
+
|
282 |
+
#: classes/Views/EmailNotifications.php:7
|
283 |
+
msgid "Email Notifications Add-On"
|
284 |
+
msgstr "Extension de notifications par mail"
|
285 |
+
|
286 |
+
#: classes/Views/EmailNotifications.php:17
|
287 |
+
msgid "Notifications Email"
|
288 |
+
msgstr "Adresse email de notifications"
|
289 |
+
|
290 |
+
#: classes/Views/EmailNotifications.php:39 classes/Views/Extensions.php:69
|
291 |
+
msgid "Email Notifications"
|
292 |
+
msgstr "Notifications Email"
|
293 |
+
|
294 |
+
#: classes/Views/EmailNotifications.php:41
|
295 |
+
msgid ""
|
296 |
+
"This premium add-on allows you to configure email alerts so you are "
|
297 |
+
"<br>notified instantly when important changes happen on your WordPress."
|
298 |
+
msgstr ""
|
299 |
+
"Cette extension Premium vous permet de configurer les alertes par mail pour "
|
300 |
+
"être<br>notifié immédiatement de tous changements importants sur votre "
|
301 |
+
"WordPress."
|
302 |
+
|
303 |
+
#: classes/Views/EmailNotifications.php:45 classes/Views/LogInUsers.php:45
|
304 |
+
#: classes/Views/Reports.php:45 classes/Views/Search.php:45
|
305 |
+
msgid "Learn More"
|
306 |
+
msgstr "En savoir plus"
|
307 |
+
|
308 |
+
#: classes/Views/EmailNotifications.php:54 classes/Views/LogInUsers.php:54
|
309 |
+
#: classes/Views/Reports.php:54 classes/Views/Search.php:54
|
310 |
+
msgid "Buy all Add-Ons Bundle"
|
311 |
+
msgstr "Acheter toutes les Extensions"
|
312 |
+
|
313 |
+
#: classes/Views/Extensions.php:8
|
314 |
+
msgid "WP Security Audit Log Add-Ons"
|
315 |
+
msgstr "Extensions de WP Security Audit Log"
|
316 |
+
|
317 |
+
#: classes/Views/Extensions.php:16
|
318 |
+
msgid " Add Functionality"
|
319 |
+
msgstr " Ajouter la fonction"
|
320 |
+
|
321 |
+
#: classes/Views/Extensions.php:35
|
322 |
+
msgid ""
|
323 |
+
"The below add-ons allow you to extend the functionality of WP Security Audit "
|
324 |
+
"Log plugin and enable you to get more benefits out of the WordPress security "
|
325 |
+
"audit, such as configurable email alerts, ability to search using free text "
|
326 |
+
"based searches & filters, and generate user activity reports to meet "
|
327 |
+
"regulatory compliance requirements."
|
328 |
+
msgstr ""
|
329 |
+
"Les extensions ci-dessous vous permettent d'étendre les capacités de "
|
330 |
+
"l'extension WP Security Audit Log et vous permettent de profiter plus encore "
|
331 |
+
"des audits de WP Security, comme par exemple les alertes par mail et les "
|
332 |
+
"possibilités de recherche avec le texte de votre choix, et génèrent des "
|
333 |
+
"rapports d'activité des usagers dans le respect de vos exigences."
|
334 |
+
|
335 |
+
#: classes/Views/Extensions.php:41
|
336 |
+
msgid "All Add-Ons Bundle"
|
337 |
+
msgstr "Toutes les extensions"
|
338 |
+
|
339 |
+
#: classes/Views/Extensions.php:43
|
340 |
+
msgid ""
|
341 |
+
"Benefit from a 60% discount when you purchase all the add-ons as a single "
|
342 |
+
"bundle."
|
343 |
+
msgstr ""
|
344 |
+
"Obtenez une remise de 60% en achetant toutes les extensions en une fois."
|
345 |
+
|
346 |
+
#: classes/Views/Extensions.php:46
|
347 |
+
msgid "Get this Bundle"
|
348 |
+
msgstr "Recevoir cette extension"
|
349 |
+
|
350 |
+
#: classes/Views/Extensions.php:54
|
351 |
+
msgid "Users Logins and Management"
|
352 |
+
msgstr "Logins des Usagers et Management"
|
353 |
+
|
354 |
+
#: classes/Views/Extensions.php:56
|
355 |
+
msgid ""
|
356 |
+
"See who is logged in to your WordPress and manage user sessions and logins."
|
357 |
+
msgstr ""
|
358 |
+
"Voir qui est actif dans votre WordPress et gérer les sessions et logins."
|
359 |
+
|
360 |
+
#: classes/Views/Extensions.php:60 classes/Views/Extensions.php:75
|
361 |
+
#: classes/Views/Extensions.php:90 classes/Views/Extensions.php:105
|
362 |
+
#: classes/Views/Extensions.php:120
|
363 |
+
msgid "Get this extension"
|
364 |
+
msgstr "Recevoir cette extension"
|
365 |
+
|
366 |
+
#: classes/Views/Extensions.php:71
|
367 |
+
msgid ""
|
368 |
+
"Get notified instantly via email when important changes are made on your "
|
369 |
+
"WordPress!"
|
370 |
+
msgstr ""
|
371 |
+
"Soyez immédiatement informés par mail de tous changements importants sur "
|
372 |
+
"votre WordPress!"
|
373 |
+
|
374 |
+
#: classes/Views/Extensions.php:84 classes/Views/Reports.php:17
|
375 |
+
#: classes/Views/Reports.php:39
|
376 |
+
msgid "Reports"
|
377 |
+
msgstr "Rapports"
|
378 |
+
|
379 |
+
#: classes/Views/Extensions.php:86
|
380 |
+
msgid ""
|
381 |
+
"Generate any type of user,site and activity report to keep track of user "
|
382 |
+
"productivity and to meet regulatory compliance requirements."
|
383 |
+
msgstr ""
|
384 |
+
"Générer tous types de rapport (usager et site) pour évaluer la productivité "
|
385 |
+
"de l'usager en fonction de vos exigences."
|
386 |
+
|
387 |
+
#: classes/Views/Extensions.php:99 classes/Views/Search.php:17
|
388 |
+
#: classes/Views/Search.php:39
|
389 |
+
msgid "Search"
|
390 |
+
msgstr "Recherche"
|
391 |
+
|
392 |
+
#: classes/Views/Extensions.php:101
|
393 |
+
msgid ""
|
394 |
+
"Do free-text based searches for specific activity in the WordPress audit "
|
395 |
+
"trail. You can also use filters to fine-tune your searches."
|
396 |
+
msgstr ""
|
397 |
+
"Recherche par texte libre pour des activités spécifiques dans la page "
|
398 |
+
"d'audit. Vous pouvez également utiliser des filtres pour affiner vos "
|
399 |
+
"recherches."
|
400 |
+
|
401 |
+
#: classes/Views/Extensions.php:114
|
402 |
+
msgid "External DB"
|
403 |
+
msgstr "Database externe"
|
404 |
+
|
405 |
+
#: classes/Views/Extensions.php:116
|
406 |
+
msgid ""
|
407 |
+
"Store the WordPress audit trial in an external database for a more secure "
|
408 |
+
"and faster WordPress website."
|
409 |
+
msgstr ""
|
410 |
+
"Enregistrer l'audit de WordPress dans une database externe pour un maximum "
|
411 |
+
"de sécurité et un site WordPress plus rapide."
|
412 |
+
|
413 |
+
#: classes/Views/Help.php:6 classes/Views/Help.php:14
|
414 |
+
msgid "Help"
|
415 |
+
msgstr "Aide"
|
416 |
+
|
417 |
+
#: classes/Views/Help.php:27
|
418 |
+
msgid "Plugin Support"
|
419 |
+
msgstr "Aide de l'extension"
|
420 |
+
|
421 |
+
#: classes/Views/Help.php:29
|
422 |
+
msgid ""
|
423 |
+
"Have you encountered or noticed any issues while using WP Security Audit Log "
|
424 |
+
"plugin?"
|
425 |
+
msgstr ""
|
426 |
+
"Avez-vous noté des problèmes en utilisant l'extension WP Security Audit Log?"
|
427 |
+
|
428 |
+
#: classes/Views/Help.php:30
|
429 |
+
msgid ""
|
430 |
+
"Or you want to report something to us? Click any of the options below to "
|
431 |
+
"post on the plugin's forum or contact our support directly."
|
432 |
+
msgstr ""
|
433 |
+
"Ou bien vous voulez nous informer de quelque chose? Choisissez dans les "
|
434 |
+
"options ci-dessous pour écrire sur le forum de l'extension ou contacter "
|
435 |
+
"notre service directement."
|
436 |
+
|
437 |
+
#: classes/Views/Help.php:32
|
438 |
+
msgid "Free Support Forum"
|
439 |
+
msgstr "Forum d'Aide gratuit"
|
440 |
+
|
441 |
+
#: classes/Views/Help.php:34
|
442 |
+
msgid "Free Support Email"
|
443 |
+
msgstr "Aide gratuite par mail"
|
444 |
+
|
445 |
+
#: classes/Views/Help.php:39
|
446 |
+
msgid "Plugin Documentation"
|
447 |
+
msgstr "Documentation de l'extension"
|
448 |
+
|
449 |
+
#: classes/Views/Help.php:41
|
450 |
+
msgid ""
|
451 |
+
"For more detailed information about WP Security Audit Log you can visit the "
|
452 |
+
"plugin website."
|
453 |
+
msgstr ""
|
454 |
+
"Pour plus d'informations sur WP Security Audit Log vous pouvez visiter le "
|
455 |
+
"site de l'extension."
|
456 |
+
|
457 |
+
#: classes/Views/Help.php:42
|
458 |
+
msgid ""
|
459 |
+
"You can also visit the official list of WordPress Security Alerts for more "
|
460 |
+
"information about all of the WordPress activity and changes you can monitor "
|
461 |
+
"with WP Security Audit Log."
|
462 |
+
msgstr ""
|
463 |
+
"Vous pouvez également visiter la liste officielle de WordPress Security "
|
464 |
+
"Alerts pour plus d'informations sur l'ensemble des activités et changements "
|
465 |
+
"de WordPress que vous pouvez suivre avec WordPress Security Audit Log."
|
466 |
+
|
467 |
+
#: classes/Views/Help.php:44
|
468 |
+
msgid "Plugin Website"
|
469 |
+
msgstr "Site de l'extension"
|
470 |
+
|
471 |
+
#: classes/Views/Help.php:46
|
472 |
+
msgid "Plugin Documenation"
|
473 |
+
msgstr "Documentation de l'extension"
|
474 |
+
|
475 |
+
#: classes/Views/Help.php:48
|
476 |
+
msgid "FAQs"
|
477 |
+
msgstr "FAQs"
|
478 |
+
|
479 |
+
#: classes/Views/Help.php:50
|
480 |
+
msgid "List of WordPress Security Alerts"
|
481 |
+
msgstr "List des Alertes de WordPress Security"
|
482 |
+
|
483 |
+
#: classes/Views/Help.php:55
|
484 |
+
msgid "Keep Yourself Up-to-Date with WordPress Security"
|
485 |
+
msgstr "Restez à jour avec WordPress Security"
|
486 |
+
|
487 |
+
#: classes/Views/Help.php:57
|
488 |
+
msgid ""
|
489 |
+
"Keep yourself informed with what is happening in the WordPress security "
|
490 |
+
"ecosystem, which are the new vulnerabilities, which plugins you need to "
|
491 |
+
"update and what are the latest WordPress security hacks so you can stay one "
|
492 |
+
"step ahead of the hackers."
|
493 |
+
msgstr ""
|
494 |
+
"Restez informés des changements dans l'écosysteme WordPress Security, des "
|
495 |
+
"nouvelles vulnérabilités, des extensions que vous devez mettre à jour et des "
|
496 |
+
"dernières informations de sécurité sur WordPress."
|
497 |
+
|
498 |
+
#: classes/Views/Help.php:59
|
499 |
+
msgid "Read the WP White Security Blog"
|
500 |
+
msgstr "Consulter le blog de WordPress Security"
|
501 |
+
|
502 |
+
#: classes/Views/Help.php:61
|
503 |
+
msgid ""
|
504 |
+
"Subscribe to WP Security Bloggers (An Aggregate of WordPress Security Blogs)"
|
505 |
+
msgstr ""
|
506 |
+
"S'abonner à WordPress Security Bloggers (Une compilation de WordPress "
|
507 |
+
"Security Blogs)"
|
508 |
+
|
509 |
+
#: classes/Views/Licensing.php:6 classes/Views/Licensing.php:14
|
510 |
+
msgid "Licensing"
|
511 |
+
msgstr "License"
|
512 |
+
|
513 |
+
#: classes/Views/Licensing.php:39 classes/Views/Settings.php:138
|
514 |
+
#: classes/Views/ToggleAlerts.php:45
|
515 |
+
msgid "Settings have been saved."
|
516 |
+
msgstr "Paramètres sauvegardés."
|
517 |
+
|
518 |
+
#: classes/Views/Licensing.php:41 classes/Views/Settings.php:141
|
519 |
+
#: classes/Views/ToggleAlerts.php:47
|
520 |
+
msgid "Error: "
|
521 |
+
msgstr "Erreur "
|
522 |
+
|
523 |
+
#: classes/Views/Licensing.php:61
|
524 |
+
msgid "Version"
|
525 |
+
msgstr "Version"
|
526 |
+
|
527 |
+
#: classes/Views/Licensing.php:71
|
528 |
+
msgid "Active"
|
529 |
+
msgstr "Active"
|
530 |
+
|
531 |
+
#: classes/Views/Licensing.php:73
|
532 |
+
msgid "Inactive"
|
533 |
+
msgstr "Inactive"
|
534 |
+
|
535 |
+
#: classes/Views/LogInUsers.php:7
|
536 |
+
msgid "User Sessions Management Add-On"
|
537 |
+
msgstr "Add-on Management des Sessions des Usagers"
|
538 |
+
|
539 |
+
#: classes/Views/LogInUsers.php:17
|
540 |
+
msgid "Logged In Users"
|
541 |
+
msgstr "Usagers actifs actuellement"
|
542 |
+
|
543 |
+
#: classes/Views/LogInUsers.php:39
|
544 |
+
msgid "Users login and Management"
|
545 |
+
msgstr "Logins des usagers et management"
|
546 |
+
|
547 |
+
#: classes/Views/LogInUsers.php:41
|
548 |
+
msgid ""
|
549 |
+
"This premium add-on allows you to see who is logged in to your WordPress,"
|
550 |
+
"<br> block multiple same-user WordPress sessions and more."
|
551 |
+
msgstr ""
|
552 |
+
"Ce Module Premium vous permet de voir qui est actif actuellement dans votre "
|
553 |
+
"Wordpress,<br>de bloquer les sessions multiples d'un usager, et plus encore."
|
554 |
+
|
555 |
+
#: classes/Views/Reports.php:7
|
556 |
+
msgid "Reports Add-On"
|
557 |
+
msgstr "Module de Rapports"
|
558 |
+
|
559 |
+
#: classes/Views/Reports.php:41
|
560 |
+
msgid ""
|
561 |
+
"Generate any type of user and site activity report to keep track of user "
|
562 |
+
"productivity<br> and meet regulatory compliance requirements. You can also "
|
563 |
+
"configure automated weekly or monthly email summary reports."
|
564 |
+
msgstr ""
|
565 |
+
"Générer tout type de rapport d'activité du site ou des usagers pour "
|
566 |
+
"contrôler la productivité selon vos exigences. Vous pouvez également "
|
567 |
+
"configurer des rapports de synthèse hebdomadaires ou mensuels."
|
568 |
+
|
569 |
+
#: classes/Views/Search.php:7
|
570 |
+
msgid "Search Add-On"
|
571 |
+
msgstr "Rechercher un module"
|
572 |
+
|
573 |
+
#: classes/Views/Search.php:41
|
574 |
+
msgid ""
|
575 |
+
"Do free-text based searches for specific activity in the WordPress audit "
|
576 |
+
"trail.<br> You can also use the built-in filters to fine-tune your searches."
|
577 |
+
msgstr ""
|
578 |
+
"Faire des recherches avec texte libre pour une activité spécifique dans le "
|
579 |
+
"rapport de WordPress.<br>Vous pouvez également utiliser des filtres pour "
|
580 |
+
"affiner votre recherche."
|
581 |
+
|
582 |
+
#: classes/Views/Settings.php:22 classes/Views/Settings.php:30
|
583 |
+
msgid "Settings"
|
584 |
+
msgstr "Paramètres"
|
585 |
+
|
586 |
+
#: classes/Views/Settings.php:162
|
587 |
+
msgid "Security Alerts Pruning"
|
588 |
+
msgstr "Purge des alertes de sécurité"
|
589 |
+
|
590 |
+
#: classes/Views/Settings.php:165 classes/Views/Settings.php:173
|
591 |
+
msgid "(eg: 1 month)"
|
592 |
+
msgstr "(1 mois)"
|
593 |
+
|
594 |
+
#: classes/Views/Settings.php:169
|
595 |
+
msgid "None"
|
596 |
+
msgstr "Aucun/e"
|
597 |
+
|
598 |
+
#: classes/Views/Settings.php:177
|
599 |
+
msgid "Delete alerts older than"
|
600 |
+
msgstr "Effacer les alertes plus anciennes que"
|
601 |
+
|
602 |
+
#: classes/Views/Settings.php:185
|
603 |
+
msgid "(eg: 80)"
|
604 |
+
msgstr "(80)"
|
605 |
+
|
606 |
+
#: classes/Views/Settings.php:189
|
607 |
+
msgid "Keep up to"
|
608 |
+
msgstr "Garder"
|
609 |
+
|
610 |
+
#: classes/Views/Settings.php:194
|
611 |
+
msgid "alerts"
|
612 |
+
msgstr "alertes"
|
613 |
+
|
614 |
+
#: classes/Views/Settings.php:198
|
615 |
+
msgid "Next Scheduled Cleanup is in "
|
616 |
+
msgstr "Prochain nettoyage programmé dans "
|
617 |
+
|
618 |
+
#: classes/Views/Settings.php:202
|
619 |
+
msgid "(or %s)"
|
620 |
+
msgstr "(ou %s)"
|
621 |
+
|
622 |
+
#: classes/Views/Settings.php:203
|
623 |
+
msgid "Run Manually"
|
624 |
+
msgstr "Lancer manuellement"
|
625 |
+
|
626 |
+
#: classes/Views/Settings.php:209
|
627 |
+
msgid "From Email & Name"
|
628 |
+
msgstr "De Email & Nom"
|
629 |
+
|
630 |
+
#: classes/Views/Settings.php:212
|
631 |
+
msgid "Email Address"
|
632 |
+
msgstr "Adresse mail"
|
633 |
+
|
634 |
+
#: classes/Views/Settings.php:215
|
635 |
+
msgid "Display Name"
|
636 |
+
msgstr "Afficher le Nom"
|
637 |
+
|
638 |
+
#: classes/Views/Settings.php:221
|
639 |
+
msgid ""
|
640 |
+
"These email address and display name will be used as From details in the "
|
641 |
+
"emails sent by the %s . Please ensure the mail server can relay emails with "
|
642 |
+
"the domain of the specified email address."
|
643 |
+
msgstr ""
|
644 |
+
"Ces adresses email et nom affiché seront utilisés comme From dans les emails "
|
645 |
+
"envoyés par %s. Assurez-vous que le serveur de mail puisse envoyer ces "
|
646 |
+
"emails avec le domaine spécifié dans l'adresse."
|
647 |
+
|
648 |
+
#: classes/Views/Settings.php:222
|
649 |
+
msgid "(premium add-ons)"
|
650 |
+
msgstr "(module Premium)"
|
651 |
+
|
652 |
+
#: classes/Views/Settings.php:229
|
653 |
+
msgid "Alerts Dashboard Widget"
|
654 |
+
msgstr "Widget des Alertes"
|
655 |
+
|
656 |
+
#: classes/Views/Settings.php:235
|
657 |
+
msgid "On"
|
658 |
+
msgstr "On"
|
659 |
+
|
660 |
+
#: classes/Views/Settings.php:240
|
661 |
+
msgid "Off"
|
662 |
+
msgstr "Off"
|
663 |
+
|
664 |
+
#: classes/Views/Settings.php:245
|
665 |
+
msgid "Display a dashboard widget with the latest %d security alerts."
|
666 |
+
msgstr "Afficher un widget avec les %d dernières alertes de sécurité."
|
667 |
+
|
668 |
+
#: classes/Views/Settings.php:253
|
669 |
+
msgid "Reverse Proxy / Firewall Options"
|
670 |
+
msgstr "Reverse Proxy / Options du Firewall"
|
671 |
+
|
672 |
+
#: classes/Views/Settings.php:259
|
673 |
+
msgid "WordPress running behind firewall or proxy"
|
674 |
+
msgstr "WordPress est derriere un firewall ou un proxy"
|
675 |
+
|
676 |
+
#: classes/Views/Settings.php:260
|
677 |
+
msgid ""
|
678 |
+
"Enable this option if your WordPress is running behind a firewall or reverse "
|
679 |
+
"proxy. When this option is enabled the plugin will retrieve the user's IP "
|
680 |
+
"address from the proxy header."
|
681 |
+
msgstr ""
|
682 |
+
"Activer cette option si WordPress est installé derrière un firewall ou un "
|
683 |
+
"proxy. Dans ce cas l'extension retrouvera l'adresse IP de l'usager depuis "
|
684 |
+
"les entêtes du proxy."
|
685 |
+
|
686 |
+
#: classes/Views/Settings.php:266
|
687 |
+
msgid "Filter Internal IP Addresses"
|
688 |
+
msgstr "Filtre d'adresse IP interne"
|
689 |
+
|
690 |
+
#: classes/Views/Settings.php:267
|
691 |
+
msgid ""
|
692 |
+
"Enable this option to filter internal IP addresses from the proxy headers."
|
693 |
+
msgstr ""
|
694 |
+
"Activer cette option pour filtrer les adresses IP internes depuis les "
|
695 |
+
"entêtes du proxy."
|
696 |
+
|
697 |
+
#: classes/Views/Settings.php:273
|
698 |
+
msgid "Can View Alerts"
|
699 |
+
msgstr "Peut voir les Alertes"
|
700 |
+
|
701 |
+
#: classes/Views/Settings.php:280
|
702 |
+
msgid "Users and Roles in this list can view the security alerts"
|
703 |
+
msgstr ""
|
704 |
+
"Les Usagers et Rôles de cette liste peuvent voir les alertes de sécurité"
|
705 |
+
|
706 |
+
#: classes/Views/Settings.php:295
|
707 |
+
msgid "Can Manage Plugin"
|
708 |
+
msgstr "Peut manager l'extension"
|
709 |
+
|
710 |
+
#: classes/Views/Settings.php:302
|
711 |
+
msgid "Users and Roles in this list can manage the plugin settings"
|
712 |
+
msgstr ""
|
713 |
+
"Les Usagers et Rôles de cette liste peuvent manager les paramètres de "
|
714 |
+
"l'extension"
|
715 |
+
|
716 |
+
#: classes/Views/Settings.php:317
|
717 |
+
msgid "Restrict Plugin Access"
|
718 |
+
msgstr "Restreindre l'accès de l'extension"
|
719 |
+
|
720 |
+
#: classes/Views/Settings.php:325
|
721 |
+
msgid ""
|
722 |
+
"By default all the administrators on this WordPress have access to manage "
|
723 |
+
"this plugin.<br/>By enabling this option only the users specified in the two "
|
724 |
+
"options above and your username will have access to view alerts and manage "
|
725 |
+
"this plugin."
|
726 |
+
msgstr ""
|
727 |
+
"Par défaut tous les administratoirs de ce WordPress peuvent manager cette "
|
728 |
+
"extension.<br>En activant cette option seuls vous et les usagers spécifiés "
|
729 |
+
"dans les 2 options ci-dessus pourront voir les alertes et manager "
|
730 |
+
"l'extension."
|
731 |
+
|
732 |
+
#: classes/Views/Settings.php:332
|
733 |
+
msgid "Refresh Audit Log Viewer"
|
734 |
+
msgstr "Mettre à jour le journal d'audit"
|
735 |
+
|
736 |
+
#: classes/Views/Settings.php:338
|
737 |
+
msgid "Automatic"
|
738 |
+
msgstr "Automatique"
|
739 |
+
|
740 |
+
#: classes/Views/Settings.php:340
|
741 |
+
msgid "Refresh Audit Log Viewer as soon as there are new alerts."
|
742 |
+
msgstr "Mettre à jour le journal d'audit en cas de nouvelles alertes."
|
743 |
+
|
744 |
+
#: classes/Views/Settings.php:344
|
745 |
+
msgid "Manual"
|
746 |
+
msgstr "Manuel"
|
747 |
+
|
748 |
+
#: classes/Views/Settings.php:346
|
749 |
+
msgid "Refresh Audit Log Viewer only when the page is reloaded."
|
750 |
+
msgstr ""
|
751 |
+
"Mettre à jour le journal d'audit seulement lors du rechargement de la page."
|
752 |
+
|
753 |
+
#: classes/Views/Settings.php:352
|
754 |
+
msgid "Alerts Time Format"
|
755 |
+
msgstr "Format d'Heure des Alertes"
|
756 |
+
|
757 |
+
#: classes/Views/Settings.php:358
|
758 |
+
msgid "24 hours"
|
759 |
+
msgstr "24 heures"
|
760 |
+
|
761 |
+
#: classes/Views/Settings.php:363
|
762 |
+
msgid "AM/PM"
|
763 |
+
msgstr "AM/PM"
|
764 |
+
|
765 |
+
#: classes/Views/Settings.php:370
|
766 |
+
msgid "Alerts Timestamp"
|
767 |
+
msgstr "Timestamp des Alertes"
|
768 |
+
|
769 |
+
#: classes/Views/Settings.php:376
|
770 |
+
msgid "UTC"
|
771 |
+
msgstr "UTC"
|
772 |
+
|
773 |
+
#: classes/Views/Settings.php:381
|
774 |
+
msgid "WordPress' timezone"
|
775 |
+
msgstr "Fuseau horaire de WordPress"
|
776 |
+
|
777 |
+
#: classes/Views/Settings.php:384
|
778 |
+
msgid ""
|
779 |
+
"Select which timestamp should the alerts have in the Audit Log viewer. Note "
|
780 |
+
"that the WordPress' timezone might be different from that of the server."
|
781 |
+
msgstr ""
|
782 |
+
"Choisire le timestamp des alertes dans le journal d'audit. Veuillez noter "
|
783 |
+
"que le fuseau horaire de WordPRess peut être différent de celui du serveur."
|
784 |
+
|
785 |
+
#: classes/Views/Settings.php:389
|
786 |
+
msgid "Audit Log Columns Selection"
|
787 |
+
msgstr "Selection des Colonnes du journal d'Audit"
|
788 |
+
|
789 |
+
#: classes/Views/Settings.php:400
|
790 |
+
msgid ""
|
791 |
+
"When you disable any of the above such details won’t be shown in the Audit "
|
792 |
+
"Log\n"
|
793 |
+
"viewer though the plugin will still record such information in the database."
|
794 |
+
msgstr ""
|
795 |
+
"Quand vous desactivez les options ci-dessus les informations ne seront pas "
|
796 |
+
"visibles dans le\n"
|
797 |
+
"journal d'Auditbien qu'elles soient enregistrées par l'extension dans la "
|
798 |
+
"base de données."
|
799 |
+
|
800 |
+
#: classes/Views/Settings.php:406
|
801 |
+
msgid "Developer Options"
|
802 |
+
msgstr "Options de développeur"
|
803 |
+
|
804 |
+
#: classes/Views/Settings.php:414
|
805 |
+
msgid ""
|
806 |
+
"Only enable these options on testing, staging and development websites. "
|
807 |
+
"Enabling any of the settings below on LIVE websites may cause unintended "
|
808 |
+
"side-effects including degraded performance."
|
809 |
+
msgstr ""
|
810 |
+
"N'activer ces options que pour des tests et dans les sites en développement. "
|
811 |
+
"Sur des sites ACTIFS cette option peut avoir des effets néfastes et dégrader "
|
812 |
+
"les performances."
|
813 |
+
|
814 |
+
#: classes/Views/Settings.php:418
|
815 |
+
msgid "Data Inspector"
|
816 |
+
msgstr "Inspecteur de Données"
|
817 |
+
|
818 |
+
#: classes/Views/Settings.php:419
|
819 |
+
msgid "View data logged for each triggered alert."
|
820 |
+
msgstr "Voir les données enregistrées pour chacune des alertes."
|
821 |
+
|
822 |
+
#: classes/Views/Settings.php:422
|
823 |
+
msgid "PHP Errors"
|
824 |
+
msgstr "Erreurs PHP"
|
825 |
+
|
826 |
+
#: classes/Views/Settings.php:423
|
827 |
+
msgid "Enables sensor for alerts generated from PHP."
|
828 |
+
msgstr "Activer les senseurs pour les alertes générées par PHP."
|
829 |
+
|
830 |
+
#: classes/Views/Settings.php:426
|
831 |
+
msgid "Request Log"
|
832 |
+
msgstr "Journal des requêtes"
|
833 |
+
|
834 |
+
#: classes/Views/Settings.php:427
|
835 |
+
msgid "Enables logging request to file."
|
836 |
+
msgstr "Activer l'enregistrement des requêtes."
|
837 |
+
|
838 |
+
#: classes/Views/Settings.php:430
|
839 |
+
msgid "Backtrace"
|
840 |
+
msgstr "Traçage"
|
841 |
+
|
842 |
+
#: classes/Views/Settings.php:431
|
843 |
+
msgid "Log full backtrace for PHP-generated alerts."
|
844 |
+
msgstr "Enregistrer le traçage complet des alertes générées par PHP."
|
845 |
+
|
846 |
+
#: classes/Views/Settings.php:449
|
847 |
+
msgid "Hide Plugin in Plugins Page"
|
848 |
+
msgstr "Cacher l'extension dans la Page des Extensions"
|
849 |
+
|
850 |
+
#: classes/Views/Settings.php:455
|
851 |
+
msgid "Hide"
|
852 |
+
msgstr "Cacher"
|
853 |
+
|
854 |
+
#: classes/Views/Settings.php:459
|
855 |
+
msgid ""
|
856 |
+
"To manually revert this setting set the value of option wsal-hide-plugin to "
|
857 |
+
"0 in the wp_options table."
|
858 |
+
msgstr ""
|
859 |
+
"Pour annuler cette option manuellement mettre la valeur de l'option wasal-"
|
860 |
+
"hide-plugin à 0 dans la table wp_options."
|
861 |
+
|
862 |
+
#: classes/Views/Settings.php:465
|
863 |
+
msgid "Disable Alerts for WordPress Background Activity"
|
864 |
+
msgstr ""
|
865 |
+
"Desactiver les alertes pour les activités en tâches de fond de WordPress"
|
866 |
+
|
867 |
+
#: classes/Views/Settings.php:471
|
868 |
+
msgid "Hide activity"
|
869 |
+
msgstr "Cacher l'activité"
|
870 |
+
|
871 |
+
#: classes/Views/Settings.php:475
|
872 |
+
msgid ""
|
873 |
+
"For example do not raise an alert when WordPress deletes the auto drafts."
|
874 |
+
msgstr ""
|
875 |
+
"Par exemple ne pas déclencher d'alerte quand WordPress détruit les "
|
876 |
+
"brouillons automatiques."
|
877 |
+
|
878 |
+
#: classes/Views/Settings.php:481
|
879 |
+
msgid "Remove Data on Uninstall"
|
880 |
+
msgstr "Effacer les donéees lors d'une désinstallation"
|
881 |
+
|
882 |
+
#: classes/Views/Settings.php:504
|
883 |
+
msgid "Excluded Users"
|
884 |
+
msgstr "Usagers exclus"
|
885 |
+
|
886 |
+
#: classes/Views/Settings.php:523
|
887 |
+
msgid "Excluded Roles"
|
888 |
+
msgstr "Rôles exclus"
|
889 |
+
|
890 |
+
#: classes/Views/Settings.php:549
|
891 |
+
msgid "Excluded Custom Fields"
|
892 |
+
msgstr "Champs particuliers exclus"
|
893 |
+
|
894 |
+
#: classes/Views/Settings.php:574
|
895 |
+
msgid "Excluded IP Addresses"
|
896 |
+
msgstr "Adresses IP exclues"
|
897 |
+
|
898 |
+
#: classes/Views/ToggleAlerts.php:6 classes/Views/ToggleAlerts.php:14
|
899 |
+
msgid "Enable/Disable Alerts"
|
900 |
+
msgstr "Activer/Désactiver les Alertes"
|
901 |
+
|
902 |
+
#: classes/Views/ToggleAlerts.php:77 classes/WidgetManager.php:48
|
903 |
+
msgid "Description"
|
904 |
+
msgstr "Description"
|
905 |
+
|
906 |
+
#: classes/Views/ToggleAlerts.php:87
|
907 |
+
msgid "Not Implemented"
|
908 |
+
msgstr "Non implementé"
|
909 |
+
|
910 |
+
#: classes/Views/ToggleAlerts.php:90
|
911 |
+
msgid "Not Available"
|
912 |
+
msgstr "Non disponible"
|
913 |
+
|
914 |
+
#: classes/Views/ToggleAlerts.php:105
|
915 |
+
msgid ""
|
916 |
+
"Capture 404 requests to file (the log file are created in the /wp-content/"
|
917 |
+
"uploads/wp-security-audit-log/404s/ directory)"
|
918 |
+
msgstr ""
|
919 |
+
"Eregistre les erreurs 404 (le journal est enregistré dans le répertoire /wp-"
|
920 |
+
"content/uploads/wp-security-audit-log/404s/)"
|
921 |
+
|
922 |
+
#: classes/Views/ToggleAlerts.php:110
|
923 |
+
msgid "Purge log files older than one month"
|
924 |
+
msgstr "Purger les journaux après un mois"
|
925 |
+
|
926 |
+
#: classes/Views/ToggleAlerts.php:118
|
927 |
+
msgid "Save Changes"
|
928 |
+
msgstr "Enregistrer les modifications"
|
929 |
+
|
930 |
+
#: classes/WidgetManager.php:22
|
931 |
+
msgid "Latest Alerts"
|
932 |
+
msgstr "Dernières Alertes"
|
933 |
+
|
934 |
+
#: classes/WidgetManager.php:42
|
935 |
+
msgid "No alerts found."
|
936 |
+
msgstr "Aucune Alerte trouvée."
|
937 |
+
|
938 |
+
#: classes/WidgetManager.php:47
|
939 |
+
msgid "User"
|
940 |
+
msgstr "Usager"
|
941 |
+
|
942 |
+
#: defaults.php:17
|
943 |
+
msgid "Fatal run-time error."
|
944 |
+
msgstr "Erreur fatale de fonctionnement."
|
945 |
+
|
946 |
+
#: defaults.php:18
|
947 |
+
msgid "Run-time warning (non-fatal error)."
|
948 |
+
msgstr "Problème de fonctionnement (Erreur non fatale)."
|
949 |
+
|
950 |
+
#: defaults.php:19
|
951 |
+
msgid "Compile-time parse error."
|
952 |
+
msgstr "Erreur de compilation."
|
953 |
+
|
954 |
+
#: defaults.php:20
|
955 |
+
msgid "Run-time notice."
|
956 |
+
msgstr "Notification d'exécution."
|
957 |
+
|
958 |
+
#: defaults.php:21
|
959 |
+
msgid "Fatal error that occurred during startup."
|
960 |
+
msgstr "Erreur fatale lors du démarrage."
|
961 |
+
|
962 |
+
#: defaults.php:22
|
963 |
+
msgid "Warnings that occurred during startup."
|
964 |
+
msgstr "Alertes durant le démarrage."
|
965 |
+
|
966 |
+
#: defaults.php:23
|
967 |
+
msgid "Fatal compile-time error."
|
968 |
+
msgstr "Erreur fatale de compilation."
|
969 |
+
|
970 |
+
#: defaults.php:24
|
971 |
+
msgid "Compile-time warning."
|
972 |
+
msgstr "Problème de compilation."
|
973 |
+
|
974 |
+
#: defaults.php:25
|
975 |
+
msgid "User-generated error message."
|
976 |
+
msgstr "Message d'erreur généré pour l'usager."
|
977 |
+
|
978 |
+
#: defaults.php:26
|
979 |
+
msgid "User-generated warning message."
|
980 |
+
msgstr "Message d'avertissement généré pour l'usager."
|
981 |
+
|
982 |
+
#: defaults.php:27
|
983 |
+
msgid "User-generated notice message."
|
984 |
+
msgstr "Message généré pour l'usager."
|
985 |
+
|
986 |
+
#: defaults.php:28
|
987 |
+
msgid "Non-standard/optimal code warning."
|
988 |
+
msgstr "Avertissement de code non standard/optimal."
|
989 |
+
|
990 |
+
#: defaults.php:29
|
991 |
+
msgid "Catchable fatal error."
|
992 |
+
msgstr "Erreur fatale Catchable."
|
993 |
+
|
994 |
+
#: defaults.php:30
|
995 |
+
msgid "Run-time deprecation notices."
|
996 |
+
msgstr "Notices de dépréciation à l'exécution."
|
997 |
+
|
998 |
+
#: defaults.php:31
|
999 |
+
msgid "Run-time user deprecation notices."
|
1000 |
+
msgstr "Notices de dépréciation usager à l'exécution."
|
1001 |
+
|
1002 |
+
#: defaults.php:33
|
1003 |
+
msgid "Critical, high-impact messages."
|
1004 |
+
msgstr "Messages critiques."
|
1005 |
+
|
1006 |
+
#: defaults.php:34
|
1007 |
+
msgid "Debug informational messages."
|
1008 |
+
msgstr "Messages de debuggage."
|
1009 |
+
|
1010 |
+
#: defaults.php:38
|
1011 |
+
msgid "Other User Activity"
|
1012 |
+
msgstr "Autres activités des usagers"
|
1013 |
+
|
1014 |
+
#: defaults.php:39
|
1015 |
+
msgid "User logged in"
|
1016 |
+
msgstr "Usager actif"
|
1017 |
+
|
1018 |
+
#: defaults.php:39
|
1019 |
+
msgid "Successfully logged in."
|
1020 |
+
msgstr "Login avec succès."
|
1021 |
+
|
1022 |
+
#: defaults.php:40
|
1023 |
+
msgid "User logged out"
|
1024 |
+
msgstr "Usager inactif"
|
1025 |
+
|
1026 |
+
#: defaults.php:40
|
1027 |
+
msgid "Successfully logged out."
|
1028 |
+
msgstr "Logout avec succès."
|
1029 |
+
|
1030 |
+
#: defaults.php:41
|
1031 |
+
msgid "Login failed"
|
1032 |
+
msgstr "Echec de login"
|
1033 |
+
|
1034 |
+
#: defaults.php:41
|
1035 |
+
msgid "%Attempts% failed login(s) detected."
|
1036 |
+
msgstr "%Attempts% erreur(s) de login détectée(s)."
|
1037 |
+
|
1038 |
+
#: defaults.php:42
|
1039 |
+
msgid "Login failed / non existing user"
|
1040 |
+
msgstr "Erreur de login / Usager non existant"
|
1041 |
+
|
1042 |
+
#: defaults.php:42
|
1043 |
+
msgid "%Attempts% failed login(s) detected using non existing user."
|
1044 |
+
msgstr "%Attempts% erreur(s) de login détectée(s) pour un usager non existant."
|
1045 |
+
|
1046 |
+
#: defaults.php:43
|
1047 |
+
msgid "Login blocked"
|
1048 |
+
msgstr "Login bloqué"
|
1049 |
+
|
1050 |
+
#: defaults.php:43
|
1051 |
+
msgid ""
|
1052 |
+
"Blocked from logging in because the same WordPress user is logged in from "
|
1053 |
+
"%ClientIP%."
|
1054 |
+
msgstr "Login bloqué: Cet usager est déjà actif avec l'IP %ClientIP%."
|
1055 |
+
|
1056 |
+
#: defaults.php:44
|
1057 |
+
msgid "User logged in with existing session(s)"
|
1058 |
+
msgstr "Usager bloqué avec session(s) existante(s)"
|
1059 |
+
|
1060 |
+
#: defaults.php:44
|
1061 |
+
msgid ""
|
1062 |
+
"Successfully logged in. Another session from %IPAddress% for this user "
|
1063 |
+
"already exist."
|
1064 |
+
msgstr ""
|
1065 |
+
"Login avec succès. Une autre session avec l'IP %IPAddress% existe déjà pour "
|
1066 |
+
"cet usager."
|
1067 |
+
|
1068 |
+
#: defaults.php:45
|
1069 |
+
msgid "User uploaded file from Uploads directory"
|
1070 |
+
msgstr "User uploaded file from Uploads directory"
|
1071 |
+
|
1072 |
+
#: defaults.php:45
|
1073 |
+
msgid "Uploaded the file %FileName% in %FilePath%."
|
1074 |
+
msgstr "Fichier %FileName% téléchargé dans %FilePath%."
|
1075 |
+
|
1076 |
+
#: defaults.php:46
|
1077 |
+
msgid "User deleted file from Uploads directory"
|
1078 |
+
msgstr "L'usager a détruit un fichier du répertoire Uploads"
|
1079 |
+
|
1080 |
+
#: defaults.php:46
|
1081 |
+
msgid "Deleted the file %FileName% from %FilePath%."
|
1082 |
+
msgstr "Fichier %FileName% détruit de %FilePath%."
|
1083 |
+
|
1084 |
+
#: defaults.php:48
|
1085 |
+
msgid "Blog Posts"
|
1086 |
+
msgstr "Articles du Blog"
|
1087 |
+
|
1088 |
+
#: defaults.php:49
|
1089 |
+
msgid "User created a new blog post and saved it as draft"
|
1090 |
+
msgstr "L'usager a créé un nouvel article de blog et enregistré en brouillon"
|
1091 |
+
|
1092 |
+
#: defaults.php:49
|
1093 |
+
msgid ""
|
1094 |
+
"Created a new post called %PostTitle% and saved it as draft. %EditorLinkPost"
|
1095 |
+
"%."
|
1096 |
+
msgstr ""
|
1097 |
+
"A créé un nouvel article %PostTitle% et enregistré en brouillon. "
|
1098 |
+
"%EditorLinkPost%."
|
1099 |
+
|
1100 |
+
#: defaults.php:50
|
1101 |
+
msgid "User published a blog post"
|
1102 |
+
msgstr "L'usager a publié un article de blog"
|
1103 |
+
|
1104 |
+
#: defaults.php:50
|
1105 |
+
msgid ""
|
1106 |
+
"Published a post called %PostTitle%. Post URL is %PostUrl%. %EditorLinkPost%."
|
1107 |
+
msgstr ""
|
1108 |
+
"A publié un article %PostTitle%. L'adresse de l'article est %PostUrl%. "
|
1109 |
+
"%EditorLinkPost%."
|
1110 |
+
|
1111 |
+
#: defaults.php:51
|
1112 |
+
msgid "User modified a published blog post"
|
1113 |
+
msgstr "L'usager a modifié un article de blog publié"
|
1114 |
+
|
1115 |
+
#: defaults.php:51
|
1116 |
+
msgid ""
|
1117 |
+
"Modified the published post %PostTitle%. Post URL is %PostUrl%. "
|
1118 |
+
"%EditorLinkPost%."
|
1119 |
+
msgstr ""
|
1120 |
+
"A modifié l'article publié %PostTitle%. Adresse de l'article: %PostUrl%. "
|
1121 |
+
"%EditorLinkPost%."
|
1122 |
+
|
1123 |
+
#: defaults.php:52
|
1124 |
+
msgid "User modified a draft blog post"
|
1125 |
+
msgstr "L'usager a modifié un brouillon d'article de blog"
|
1126 |
+
|
1127 |
+
#: defaults.php:52
|
1128 |
+
msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
|
1129 |
+
msgstr "A modifié le brouillon d'article avec %PostTitle%. %EditorLinkPost%."
|
1130 |
+
|
1131 |
+
#: defaults.php:53
|
1132 |
+
msgid "User permanently deleted a blog post from the trash"
|
1133 |
+
msgstr "L'usager a définitivement détruit un article de blog"
|
1134 |
+
|
1135 |
+
#: defaults.php:53
|
1136 |
+
msgid ""
|
1137 |
+
"Permanently deleted the post %PostTitle%. Post URL was %PostUrl%. "
|
1138 |
+
"%EditorLinkPost%."
|
1139 |
+
msgstr ""
|
1140 |
+
"A définitivement détruit l'article %PostTitle%. L'adresse de l'article était "
|
1141 |
+
"%PostUrl%. %EditorLinkPost%."
|
1142 |
+
|
1143 |
+
#: defaults.php:54
|
1144 |
+
msgid "User moved a blog post to the trash"
|
1145 |
+
msgstr "L'usager a mis un article de blog à la poubelle"
|
1146 |
+
|
1147 |
+
#: defaults.php:54
|
1148 |
+
msgid "Moved the post %PostTitle% to trash. Post URL is %PostUrl%."
|
1149 |
+
msgstr ""
|
1150 |
+
"A mis l'article %PostTitle% à la poubelle. L'adresse de l'article est "
|
1151 |
+
"%PostUrl%."
|
1152 |
+
|
1153 |
+
#: defaults.php:55
|
1154 |
+
msgid "User restored a blog post from trash"
|
1155 |
+
msgstr "L'usager a restauré un article de blog"
|
1156 |
+
|
1157 |
+
#: defaults.php:55
|
1158 |
+
msgid "Post %PostTitle% has been restored from trash. %EditorLinkPost%."
|
1159 |
+
msgstr "L'article %PostTitle% a été restauré. %EditorLinkPost%."
|
1160 |
+
|
1161 |
+
#: defaults.php:56
|
1162 |
+
msgid "User changed blog post category"
|
1163 |
+
msgstr "L'usager a changé la catégorie d'un article de blog"
|
1164 |
+
|
1165 |
+
#: defaults.php:56
|
1166 |
+
msgid ""
|
1167 |
+
"Changed the category of the post %PostTitle% from %OldCategories% to "
|
1168 |
+
"%NewCategories%. %EditorLinkPost%."
|
1169 |
+
msgstr ""
|
1170 |
+
"A changé la catégorie de l'article %PostTitle% de %OldCategories% à "
|
1171 |
+
"%NewCategories%. %EditorLinkPost%."
|
1172 |
+
|
1173 |
+
#: defaults.php:57
|
1174 |
+
msgid "User changed blog post URL"
|
1175 |
+
msgstr "L'usager a change l'adresse d'un article de blog"
|
1176 |
+
|
1177 |
+
#: defaults.php:57
|
1178 |
+
msgid ""
|
1179 |
+
"Changed the URL of the post %PostTitle% from %OldUrl% to %NewUrl%. "
|
1180 |
+
"%EditorLinkPost%."
|
1181 |
+
msgstr ""
|
1182 |
+
"A changé l'adresse de l'article %PostTitle% de %OldUrl% à %NewUrl%. "
|
1183 |
+
"%EditorLinkPost%."
|
1184 |
+
|
1185 |
+
#: defaults.php:58
|
1186 |
+
msgid "User changed blog post author"
|
1187 |
+
msgstr "L'usager a changé l'auteur d'un article de blog"
|
1188 |
+
|
1189 |
+
#: defaults.php:58
|
1190 |
+
msgid ""
|
1191 |
+
"Changed the author of %PostTitle% post from %OldAuthor% to %NewAuthor%. "
|
1192 |
+
"%EditorLinkPost%."
|
1193 |
+
msgstr ""
|
1194 |
+
"A changé l'auteur de l'article %PostTitle% de %OldAuthor% à %NewAuthor%. "
|
1195 |
+
"%EditorLinkPost%."
|
1196 |
+
|
1197 |
+
#: defaults.php:59
|
1198 |
+
msgid "User changed blog post status"
|
1199 |
+
msgstr "L'usager a changé le status d'un article de blog"
|
1200 |
+
|
1201 |
+
#: defaults.php:59
|
1202 |
+
msgid ""
|
1203 |
+
"Changed the status of %PostTitle% post from %OldStatus% to %NewStatus%. "
|
1204 |
+
"%EditorLinkPost%."
|
1205 |
+
msgstr ""
|
1206 |
+
"A changé le statut de l'article %PostTitle% de %OldStatus% à %NewStatus%. "
|
1207 |
+
"%EditorLinkPost%."
|
1208 |
+
|
1209 |
+
#: defaults.php:60
|
1210 |
+
msgid "User created new category"
|
1211 |
+
msgstr "L'usager a créé une nouvelle catégorie"
|
1212 |
+
|
1213 |
+
#: defaults.php:60
|
1214 |
+
msgid ""
|
1215 |
+
"Created a new category called %CategoryName% .Category slug is %Slug%. "
|
1216 |
+
"%CategoryLink%."
|
1217 |
+
msgstr ""
|
1218 |
+
"A créé la catégorie %CategoryName% . Le code de la catégorie est %Slug%. "
|
1219 |
+
"%CategoryLink%."
|
1220 |
+
|
1221 |
+
#: defaults.php:61
|
1222 |
+
msgid "User deleted category"
|
1223 |
+
msgstr "L'usager a détruit une catégorie"
|
1224 |
+
|
1225 |
+
#: defaults.php:61
|
1226 |
+
msgid "Deleted the category %CategoryName%. Category slug was %Slug%."
|
1227 |
+
msgstr ""
|
1228 |
+
"A détruit la catégorie %CategoryName%. Le code de la catégorie état %Slug%."
|
1229 |
+
|
1230 |
+
#: defaults.php:62
|
1231 |
+
msgid "User changed the visibility of a blog post"
|
1232 |
+
msgstr "L'usager a changé la visibilite d'un article du blog"
|
1233 |
+
|
1234 |
+
#: defaults.php:62
|
1235 |
+
msgid ""
|
1236 |
+
"Changed the visibility of the post %PostTitle% from %OldVisibility% to "
|
1237 |
+
"%NewVisibility%. %EditorLinkPost%."
|
1238 |
+
msgstr ""
|
1239 |
+
"A changé la visibilité de l'article %PostTitle% de %OldVisibility% à "
|
1240 |
+
"%NewVisibility%. %EditorLinkPost%."
|
1241 |
+
|
1242 |
+
#: defaults.php:63
|
1243 |
+
msgid "User changed the date of a blog post"
|
1244 |
+
msgstr "L'usager a changé la date d'un article du blog"
|
1245 |
+
|
1246 |
+
#: defaults.php:63
|
1247 |
+
msgid ""
|
1248 |
+
"Changed the date of the post %PostTitle% from %OldDate% to %NewDate%. "
|
1249 |
+
"%EditorLinkPost%."
|
1250 |
+
msgstr ""
|
1251 |
+
"A changé la date de l'article %PostTitle% de %OldDate% à %NewDate%. "
|
1252 |
+
"%EditorLinkPost%."
|
1253 |
+
|
1254 |
+
#: defaults.php:64
|
1255 |
+
msgid "User set a post as sticky"
|
1256 |
+
msgstr "L'usager a installé un article en sticky"
|
1257 |
+
|
1258 |
+
#: defaults.php:64
|
1259 |
+
msgid ""
|
1260 |
+
"Set the post %PostTitle% as Sticky. Post URL is %PostUrl%. %EditorLinkPost%."
|
1261 |
+
msgstr ""
|
1262 |
+
"A installé l'article %PostTitle% en Sticky. L'adresse de l'article est "
|
1263 |
+
"%PostUrl%. %EditorLinkPost%."
|
1264 |
+
|
1265 |
+
#: defaults.php:65
|
1266 |
+
msgid "User removed post from sticky"
|
1267 |
+
msgstr "L'usager a enlevé un article sticky"
|
1268 |
+
|
1269 |
+
#: defaults.php:65
|
1270 |
+
msgid "Removed the post %PostTitle% from Sticky. %EditorLinkPost%."
|
1271 |
+
msgstr "A enlevé le sticky sur l'article %PostTitle%. %EditorLinkPost%."
|
1272 |
+
|
1273 |
+
#: defaults.php:66
|
1274 |
+
msgid "User changed generic tables"
|
1275 |
+
msgstr "L'usager a changé les tables génériques"
|
1276 |
+
|
1277 |
+
#: defaults.php:66
|
1278 |
+
msgid ""
|
1279 |
+
"Changed the parent of the category %CategoryName% from %OldParent% to "
|
1280 |
+
"%NewParent%. %CategoryLink%."
|
1281 |
+
msgstr ""
|
1282 |
+
"A changé le parent de la catégorie %CategoryName% de %OldParent% à %NewParent"
|
1283 |
+
"%. %CategoryLink%."
|
1284 |
+
|
1285 |
+
#: defaults.php:67
|
1286 |
+
msgid "User created a custom field for a post"
|
1287 |
+
msgstr "L'usager a créé un champ particulier pour un article"
|
1288 |
+
|
1289 |
+
#: defaults.php:68
|
1290 |
+
msgid "User updated a custom field value for a post"
|
1291 |
+
msgstr "L\"usager a mis à jour un champ particulier pour un article"
|
1292 |
+
|
1293 |
+
#: defaults.php:69
|
1294 |
+
msgid "User deleted a custom field from a post"
|
1295 |
+
msgstr "L'usager a détruit un champ particulier d'un article"
|
1296 |
+
|
1297 |
+
#: defaults.php:70
|
1298 |
+
msgid "User updated a custom field name for a post"
|
1299 |
+
msgstr "L'usager a mis à jour un champ particulier d'un article"
|
1300 |
+
|
1301 |
+
#: defaults.php:71
|
1302 |
+
msgid "User modified content for a published post"
|
1303 |
+
msgstr "L'usager a modifié le contenu d'un article publié"
|
1304 |
+
|
1305 |
+
#: defaults.php:72
|
1306 |
+
msgid "User modified content for a draft post"
|
1307 |
+
msgstr "L'usager a modifié le contenu d'un brouillon"
|
1308 |
+
|
1309 |
+
#: defaults.php:73
|
1310 |
+
msgid "User modified content of a post"
|
1311 |
+
msgstr "L'usager a modifié le contenu d'un article"
|
1312 |
+
|
1313 |
+
#: defaults.php:74
|
1314 |
+
msgid "User submitted a post for review"
|
1315 |
+
msgstr "L'usager a envoyé un article pour contrôle"
|
1316 |
+
|
1317 |
+
#: defaults.php:74
|
1318 |
+
msgid "Submitted the post %PostTitle% for review. %EditorLinkPost%."
|
1319 |
+
msgstr "A envoyé l'article %PostTitle% pour contrôle. %EditorLinkPost%."
|
1320 |
+
|
1321 |
+
#: defaults.php:75
|
1322 |
+
msgid "User scheduled a post"
|
1323 |
+
msgstr "L'usager a planifié un article"
|
1324 |
+
|
1325 |
+
#: defaults.php:75
|
1326 |
+
msgid ""
|
1327 |
+
"Scheduled the post %PostTitle% to be published %PublishingDate%. "
|
1328 |
+
"%EditorLinkPost%."
|
1329 |
+
msgstr ""
|
1330 |
+
"A planifié l'article %PostTitle% pour diffusion le %PublishingDate%. "
|
1331 |
+
"%EditorLinkPost%."
|
1332 |
+
|
1333 |
+
#: defaults.php:76
|
1334 |
+
msgid "User changed title of a post"
|
1335 |
+
msgstr "L'usager a change le titre d'un article"
|
1336 |
+
|
1337 |
+
#: defaults.php:76
|
1338 |
+
msgid ""
|
1339 |
+
"Changed the title of the post %OldTitle% to %NewTitle%. %EditorLinkPost%."
|
1340 |
+
msgstr ""
|
1341 |
+
"A changé le titre de l'article %OldTitle% à %NewTitle%. %EditorLinkPost%."
|
1342 |
+
|
1343 |
+
#: defaults.php:78
|
1344 |
+
msgid "Pages"
|
1345 |
+
msgstr "Pages"
|
1346 |
+
|
1347 |
+
#: defaults.php:79
|
1348 |
+
msgid "User created a new WordPress page and saved it as draft"
|
1349 |
+
msgstr ""
|
1350 |
+
"L'usager a crée une nouvelle page WordPress et l'a sauvegardé en brouillon"
|
1351 |
+
|
1352 |
+
#: defaults.php:79
|
1353 |
+
msgid ""
|
1354 |
+
"Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage"
|
1355 |
+
"%."
|
1356 |
+
msgstr ""
|
1357 |
+
"A créé une nouvelle page appellée %PostTitle% et sauvegardé en brouillon. "
|
1358 |
+
"%EditorLinkPage%."
|
1359 |
+
|
1360 |
+
#: defaults.php:80
|
1361 |
+
msgid "User published a WorPress page"
|
1362 |
+
msgstr "L'usager a publié un article WordPress"
|
1363 |
+
|
1364 |
+
#: defaults.php:80
|
1365 |
+
msgid ""
|
1366 |
+
"Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
|
1367 |
+
msgstr ""
|
1368 |
+
"A publié une page appellée %Postitle%. L'adresse de l'article est %PostUrl%. "
|
1369 |
+
"%EditorLinkPage%."
|
1370 |
+
|
1371 |
+
#: defaults.php:81
|
1372 |
+
msgid "User modified a published WordPress page"
|
1373 |
+
msgstr "L'usager a modifié une page WordPress publiée"
|
1374 |
+
|
1375 |
+
#: defaults.php:81
|
1376 |
+
msgid ""
|
1377 |
+
"Modified the published page %PostTitle%. Page URL is %PostUrl%. "
|
1378 |
+
"%EditorLinkPage%."
|
1379 |
+
msgstr ""
|
1380 |
+
"A modifié la page publiée %PostTitle%. L\"adresse de la page est %PostUrl%. "
|
1381 |
+
"%EditorLinkPage%."
|
1382 |
+
|
1383 |
+
#: defaults.php:82
|
1384 |
+
msgid "User modified a draft WordPress page"
|
1385 |
+
msgstr "L'usager a modifie un brouillon de page WordPress"
|
1386 |
+
|
1387 |
+
#: defaults.php:82
|
1388 |
+
msgid ""
|
1389 |
+
"Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
|
1390 |
+
msgstr ""
|
1391 |
+
"A modifié le brouillon de la page %PostTitle%. L'ID de la page est %PostID%. "
|
1392 |
+
"%EditorLinkPage%."
|
1393 |
+
|
1394 |
+
#: defaults.php:83
|
1395 |
+
msgid "User permanently deleted a page from the trash"
|
1396 |
+
msgstr "L'usager a détruit une page de la poubelle"
|
1397 |
+
|
1398 |
+
#: defaults.php:83
|
1399 |
+
msgid ""
|
1400 |
+
"Permanently deleted the page %PostTitle%. Page URL was %PostUrl%. "
|
1401 |
+
"%EditorLinkPage%."
|
1402 |
+
msgstr ""
|
1403 |
+
"A détruit la page %PostTitle%. L'adresse de la page était %PostUrl%. "
|
1404 |
+
"%EditorLinkPage%."
|
1405 |
+
|
1406 |
+
#: defaults.php:84
|
1407 |
+
msgid "User moved WordPress page to the trash"
|
1408 |
+
msgstr "L'usager a mis une page WordPress à la poubelle"
|
1409 |
+
|
1410 |
+
#: defaults.php:84
|
1411 |
+
msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
|
1412 |
+
msgstr ""
|
1413 |
+
"A mis à la poubelle la page %PostTitle%: L'adresse de la page était %PostUrl"
|
1414 |
+
"%."
|
1415 |
+
|
1416 |
+
#: defaults.php:85
|
1417 |
+
msgid "User restored a WordPress page from trash"
|
1418 |
+
msgstr "L'usager a restauré une page WordPress de la poubelle"
|
1419 |
+
|
1420 |
+
#: defaults.php:85
|
1421 |
+
msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
|
1422 |
+
msgstr "La page %PostTitle% à été restaurée. %EditorLinkPage%."
|
1423 |
+
|
1424 |
+
#: defaults.php:86
|
1425 |
+
msgid "User changed page URL"
|
1426 |
+
msgstr "L'usager a changé l'adresse d'une page"
|
1427 |
+
|
1428 |
+
#: defaults.php:86
|
1429 |
+
msgid ""
|
1430 |
+
"Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. "
|
1431 |
+
"%EditorLinkPage%."
|
1432 |
+
msgstr ""
|
1433 |
+
"A changé l'adresse de la page %PostTitle% de %OldUrl% à %NewUrl%. "
|
1434 |
+
"%EditorLinkPage%."
|
1435 |
+
|
1436 |
+
#: defaults.php:87
|
1437 |
+
msgid "User changed page author"
|
1438 |
+
msgstr "L'usager a changé l'auteur d'une page"
|
1439 |
+
|
1440 |
+
#: defaults.php:87
|
1441 |
+
msgid ""
|
1442 |
+
"Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. "
|
1443 |
+
"%EditorLinkPage%."
|
1444 |
+
msgstr ""
|
1445 |
+
"A changé l'auteur de la page %PostTitle% de %OldAuthor% à %NewAuthor%. "
|
1446 |
+
"%EditorLinkPage%."
|
1447 |
+
|
1448 |
+
#: defaults.php:88
|
1449 |
+
msgid "User changed page status"
|
1450 |
+
msgstr "L'usager a changé le statut d'une page"
|
1451 |
+
|
1452 |
+
#: defaults.php:88
|
1453 |
+
msgid ""
|
1454 |
+
"Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. "
|
1455 |
+
"%EditorLinkPage%."
|
1456 |
+
msgstr ""
|
1457 |
+
"A changé le statut de la page %PostTitle% de %OldStatus% à %NewStatus%. "
|
1458 |
+
"%EditorLinkPage%."
|
1459 |
+
|
1460 |
+
#: defaults.php:89
|
1461 |
+
msgid "User changed the visibility of a page post"
|
1462 |
+
msgstr "L'usager a changé la visibilité d'une page"
|
1463 |
+
|
1464 |
+
#: defaults.php:89
|
1465 |
+
msgid ""
|
1466 |
+
"Changed the visibility of the page %PostTitle% from %OldVisibility% to "
|
1467 |
+
"%NewVisibility%. %EditorLinkPage%."
|
1468 |
+
msgstr ""
|
1469 |
+
"A changé la visibilité de la page %PostTitle% de %OldVisibility% à "
|
1470 |
+
"%NewVisibility%. %EditorLinkPage%."
|
1471 |
+
|
1472 |
+
#: defaults.php:90
|
1473 |
+
msgid "User changed the date of a page post"
|
1474 |
+
msgstr "L'usager a changé la date d'une page"
|
1475 |
+
|
1476 |
+
#: defaults.php:90
|
1477 |
+
msgid ""
|
1478 |
+
"Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. "
|
1479 |
+
"%EditorLinkPage%."
|
1480 |
+
msgstr ""
|
1481 |
+
"A changé la date de la page %PostTitle% de %OldDate% à %NewDate%. "
|
1482 |
+
"%EditorLinkPage%."
|
1483 |
+
|
1484 |
+
#: defaults.php:91
|
1485 |
+
msgid "User changed the parent of a page"
|
1486 |
+
msgstr "L'usager a changé le parent d'une page"
|
1487 |
+
|
1488 |
+
#: defaults.php:91
|
1489 |
+
msgid ""
|
1490 |
+
"Changed the parent of the page %PostTitle% from %OldParentName% to "
|
1491 |
+
"%NewParentName%. %EditorLinkPage%."
|
1492 |
+
msgstr ""
|
1493 |
+
"A changé le parent de la page %PostTitle% de %OldParentName% à %NewParentName"
|
1494 |
+
"%. %EditorLinkPage%."
|
1495 |
+
|
1496 |
+
#: defaults.php:92
|
1497 |
+
msgid "User changed the template of a page"
|
1498 |
+
msgstr "L'usager a changé le template d'une page"
|
1499 |
+
|
1500 |
+
#: defaults.php:92
|
1501 |
+
msgid ""
|
1502 |
+
"Changed the template of the page %PostTitle% from %OldTemplate% to "
|
1503 |
+
"%NewTemplate%. %EditorLinkPage%."
|
1504 |
+
msgstr ""
|
1505 |
+
"A changé le template de la page %PostTitle% de %OldTemplate% à %NewTemplate"
|
1506 |
+
"%. %EditorLinkPage%."
|
1507 |
+
|
1508 |
+
#: defaults.php:93
|
1509 |
+
msgid "User created a custom field for a page"
|
1510 |
+
msgstr "L'usager a créé un champ spécifique pour une page"
|
1511 |
+
|
1512 |
+
#: defaults.php:94
|
1513 |
+
msgid "User updated a custom field value for a page"
|
1514 |
+
msgstr "L'usager a mis à jour la valeur d'un champ spécifique pour une page"
|
1515 |
+
|
1516 |
+
#: defaults.php:95
|
1517 |
+
msgid "User deleted a custom field from a page"
|
1518 |
+
msgstr "L'usager a détruit un champ spécifique d'une page"
|
1519 |
+
|
1520 |
+
#: defaults.php:96
|
1521 |
+
msgid "User updated a custom field name for a page"
|
1522 |
+
msgstr "L'usager a mis à jour le nom d'un champ spécifique pour une page"
|
1523 |
+
|
1524 |
+
#: defaults.php:97
|
1525 |
+
msgid "User modified content for a published page"
|
1526 |
+
msgstr "L'usager a modifié le contenu d'une page publiée"
|
1527 |
+
|
1528 |
+
#: defaults.php:98
|
1529 |
+
msgid "User modified content for a draft page"
|
1530 |
+
msgstr "L'usager a modifié le contenu d'un brouillon de page"
|
1531 |
+
|
1532 |
+
#: defaults.php:99
|
1533 |
+
msgid "User scheduled a page"
|
1534 |
+
msgstr "L'usager a programmé une page"
|
1535 |
+
|
1536 |
+
#: defaults.php:100
|
1537 |
+
msgid "User changed title of a page"
|
1538 |
+
msgstr "L'usager a changé le titre d'une page"
|
1539 |
+
|
1540 |
+
#: defaults.php:102
|
1541 |
+
msgid "Custom Posts"
|
1542 |
+
msgstr "Posts personnalisés"
|
1543 |
+
|
1544 |
+
#: defaults.php:103
|
1545 |
+
msgid "User created a new post with custom post type and saved it as draft"
|
1546 |
+
msgstr ""
|
1547 |
+
"L'usager a créé et sauvegardé en brouillon un nouvel article de type "
|
1548 |
+
"personnalisé"
|
1549 |
+
|
1550 |
+
#: defaults.php:103
|
1551 |
+
msgid ""
|
1552 |
+
"Created a new custom post called %PostTitle% of type %PostType%. "
|
1553 |
+
"%EditorLinkPost%."
|
1554 |
+
msgstr ""
|
1555 |
+
"A crée un nouvel article personnalisé appellé %PostTitle% de type %PostType"
|
1556 |
+
"%. %EditorLinkPost%."
|
1557 |
+
|
1558 |
+
#: defaults.php:104
|
1559 |
+
msgid "User published a post with custom post type"
|
1560 |
+
msgstr "L'usager a publié un article de type personnalisé"
|
1561 |
+
|
1562 |
+
#: defaults.php:104
|
1563 |
+
msgid ""
|
1564 |
+
"Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
|
1565 |
+
"%. %EditorLinkPost%."
|
1566 |
+
msgstr ""
|
1567 |
+
"A publié un article personnalisé %PostTitle% de type %PostType%. L'adresse "
|
1568 |
+
"de l'article est %PostUrl%. %EditorLinkPost%."
|
1569 |
+
|
1570 |
+
#: defaults.php:105
|
1571 |
+
msgid "User modified a post with custom post type"
|
1572 |
+
msgstr "L'usager a modifié un article de type personnalisé"
|
1573 |
+
|
1574 |
+
#: defaults.php:105
|
1575 |
+
msgid ""
|
1576 |
+
"Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
|
1577 |
+
"%. %EditorLinkPost%."
|
1578 |
+
msgstr ""
|
1579 |
+
"A modifié l'article personnalisé %PostTitle% de type %PostType%. L'adresse "
|
1580 |
+
"de l'article est %PostUrl%. %EditorLinkPost%."
|
1581 |
+
|
1582 |
+
#: defaults.php:106
|
1583 |
+
msgid "User modified a draft post with custom post type"
|
1584 |
+
msgstr "L'usager a modifié le brouillon d'un article de type personnalisé"
|
1585 |
+
|
1586 |
+
#: defaults.php:106
|
1587 |
+
msgid ""
|
1588 |
+
"Modified the draft custom post %PostTitle% of type is %PostType%. "
|
1589 |
+
"%EditorLinkPost%."
|
1590 |
+
msgstr ""
|
1591 |
+
"A modifié le brouillon de l'article personnalisé %PostTitle% de type "
|
1592 |
+
"%PostType%. %EditorLinkPost%."
|
1593 |
+
|
1594 |
+
#: defaults.php:107
|
1595 |
+
msgid "User permanently deleted post with custom post type"
|
1596 |
+
msgstr "L'usager a détruit un article de type personnalisé"
|
1597 |
+
|
1598 |
+
#: defaults.php:107
|
1599 |
+
msgid ""
|
1600 |
+
"Permanently Deleted the custom post %PostTitle% of type %PostType%. The post "
|
1601 |
+
"URL was %PostUrl%. %EditorLinkPost%."
|
1602 |
+
msgstr ""
|
1603 |
+
"A détruit l'article personnalisé %PostTitle% de type %PostType%. L'adresse "
|
1604 |
+
"de l'article était %PostUrl%. %EditorLinkPost%."
|
1605 |
+
|
1606 |
+
#: defaults.php:108
|
1607 |
+
msgid "User moved post with custom post type to trash"
|
1608 |
+
msgstr "L'usager a mis à la poubelle un article de type personnalisé"
|
1609 |
+
|
1610 |
+
#: defaults.php:108
|
1611 |
+
msgid ""
|
1612 |
+
"Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was "
|
1613 |
+
"%PostUrl%."
|
1614 |
+
msgstr ""
|
1615 |
+
"A mis à la poubelle l'article personnalisé %PostTitle% de type %PostType%. "
|
1616 |
+
"L'adresse de l'article était %PostUrl%. %EditorLinkPost%."
|
1617 |
+
|
1618 |
+
#: defaults.php:109
|
1619 |
+
msgid "User restored post with custom post type from trash"
|
1620 |
+
msgstr "L'usager a restauré un article de type personnalisé"
|
1621 |
+
|
1622 |
+
#: defaults.php:109
|
1623 |
+
msgid ""
|
1624 |
+
"The custom post %PostTitle% of type %PostType% has been restored from trash. "
|
1625 |
+
"%EditorLinkPost%."
|
1626 |
+
msgstr ""
|
1627 |
+
"L'article personnalisé %PostTitle% de type %PostType% a été restauré. "
|
1628 |
+
"%EditorLinkPost%."
|
1629 |
+
|
1630 |
+
#: defaults.php:110
|
1631 |
+
msgid "User changed the category of a post with custom post type"
|
1632 |
+
msgstr "L'usager a changé la catégorie d'un article de type personnalisé"
|
1633 |
+
|
1634 |
+
#: defaults.php:110
|
1635 |
+
msgid ""
|
1636 |
+
"Changed the category(ies) of the custom post %PostTitle% of type %PostType% "
|
1637 |
+
"from %OldCategories% to %NewCategories%. %EditorLinkPost%."
|
1638 |
+
msgstr ""
|
1639 |
+
"A changé la ou les catégorie(s) de l'article personnalisé %PostTitle% de "
|
1640 |
+
"type %PostType% de %OldCategories% à %NewCategories%. %EditorLinkPost%."
|
1641 |
+
|
1642 |
+
#: defaults.php:111
|
1643 |
+
msgid "User changed the URL of a post with custom post type"
|
1644 |
+
msgstr "L'usager a changé l'adresse d'un article de type personnalisé"
|
1645 |
+
|
1646 |
+
#: defaults.php:111
|
1647 |
+
msgid ""
|
1648 |
+
"Changed the URL of the custom post %PostTitle% of type %PostType% from "
|
1649 |
+
"%OldUrl% to %NewUrl%. %EditorLinkPost%."
|
1650 |
+
msgstr ""
|
1651 |
+
"A changé l'adresse de l'article personnalisé %PostTitle% de type %PostType% "
|
1652 |
+
"de %OldUrl% à %NewUrl%. %EditorLinkPost%."
|
1653 |
+
|
1654 |
+
#: defaults.php:112
|
1655 |
+
msgid "User changed the author or post with custom post type"
|
1656 |
+
msgstr "L'usager a changé l'auteur d'un article de type personnalisé"
|
1657 |
+
|
1658 |
+
#: defaults.php:112
|
1659 |
+
msgid ""
|
1660 |
+
"Changed the author of custom post %PostTitle% of type %PostType% from "
|
1661 |
+
"%OldAuthor% to %NewAuthor%. %EditorLinkPost%."
|
1662 |
+
msgstr ""
|
1663 |
+
"A changé l'auteur de l'article personnalisé %PostTitle% de type %PostType% "
|
1664 |
+
"de %OldAuthor% à %NewAuthor%. %EditorLinkPost%."
|
1665 |
+
|
1666 |
+
#: defaults.php:113
|
1667 |
+
msgid "User changed the status of post with custom post type"
|
1668 |
+
msgstr "L'usager a changé le statut d'un article de type personnalisé"
|
1669 |
+
|
1670 |
+
#: defaults.php:113
|
1671 |
+
msgid ""
|
1672 |
+
"Changed the status of custom post %PostTitle% of type %PostType% from "
|
1673 |
+
"%OldStatus% to %NewStatus%. %EditorLinkPost%."
|
1674 |
+
msgstr ""
|
1675 |
+
"A changé le statut de l'article personnalisé %PostTitle% de type %PostType% "
|
1676 |
+
"de %OldStatus% à %NewStatus%. %EditorLinkPost%."
|
1677 |
+
|
1678 |
+
#: defaults.php:114
|
1679 |
+
msgid "User changed the visibility of a post with custom post type"
|
1680 |
+
msgstr "L'usager a changé la visibilité d'un article de type personnalisé"
|
1681 |
+
|
1682 |
+
#: defaults.php:114
|
1683 |
+
msgid ""
|
1684 |
+
"Changed the visibility of the custom post %PostTitle% of type %PostType% "
|
1685 |
+
"from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
|
1686 |
+
msgstr ""
|
1687 |
+
"A changé la visibilié de l'article personnalisé %PostTitle% de type %PostType"
|
1688 |
+
"% de %OldVisibility% à %NewVisibility%. %EditorLinkPost%."
|
1689 |
+
|
1690 |
+
#: defaults.php:115
|
1691 |
+
msgid "User changed the date of post with custom post type"
|
1692 |
+
msgstr "L'usager a changé la date d'un article de type personnalisé"
|
1693 |
+
|
1694 |
+
#: defaults.php:115
|
1695 |
+
msgid ""
|
1696 |
+
"Changed the date of the custom post %PostTitle% of type %PostType% from "
|
1697 |
+
"%OldDate% to %NewDate%. %EditorLinkPost%."
|
1698 |
+
msgstr ""
|
1699 |
+
"A changé la date de l'article personnalisé %PostTitle% de type %PostType% de "
|
1700 |
+
"%OldDate% à %NewDate%. %EditorLinkPost%."
|
1701 |
+
|
1702 |
+
#: defaults.php:116
|
1703 |
+
msgid "User created a custom field for a custom post type"
|
1704 |
+
msgstr ""
|
1705 |
+
"L'usager a créé un champ particulier pour un type d'article personnalisé"
|
1706 |
+
|
1707 |
+
#: defaults.php:117
|
1708 |
+
msgid "User updated a custom field for a custom post type"
|
1709 |
+
msgstr ""
|
1710 |
+
"L'usager a mis à jour un champ particulier pour un type d'article "
|
1711 |
+
"personnalisé"
|
1712 |
+
|
1713 |
+
#: defaults.php:118
|
1714 |
+
msgid "User deleted a custom field from a custom post type"
|
1715 |
+
msgstr ""
|
1716 |
+
"L'usager a détruit un champ particulier pour un type d'article personnalisé"
|
1717 |
+
|
1718 |
+
#: defaults.php:119
|
1719 |
+
msgid "User updated a custom field name for a custom post type"
|
1720 |
+
msgstr ""
|
1721 |
+
"L'usager a mis à jour le nom d'un champ particulier pour un type d'article "
|
1722 |
+
"personnalisé"
|
1723 |
+
|
1724 |
+
#: defaults.php:120
|
1725 |
+
msgid "User modified content for a published custom post type"
|
1726 |
+
msgstr "L'usager a modifié le contenu d'un type d'article personnalisé publié"
|
1727 |
+
|
1728 |
+
#: defaults.php:121
|
1729 |
+
msgid "User modified content for a draft custom post type"
|
1730 |
+
msgstr "L'usager a modifié le brouillon d'un type d'article personnalisé"
|
1731 |
+
|
1732 |
+
#: defaults.php:122
|
1733 |
+
msgid "User scheduled a custom post type"
|
1734 |
+
msgstr "L'usager a mis à jour un type d'article personnalisé"
|
1735 |
+
|
1736 |
+
#: defaults.php:122
|
1737 |
+
msgid ""
|
1738 |
+
"Scheduled the custom post type %PostTitle% to be published %PublishingDate%. "
|
1739 |
+
"%EditorLinkPost%."
|
1740 |
+
msgstr ""
|
1741 |
+
"A programmé le type d'article personnalisé %PostTitle% pour diffusion "
|
1742 |
+
"%PublishingDate%. %EditorLinkPost%."
|
1743 |
+
|
1744 |
+
#: defaults.php:123
|
1745 |
+
msgid "User changed title of a custom post type"
|
1746 |
+
msgstr "L'usager a changé le titre d'un type d'article personnalisé"
|
1747 |
+
|
1748 |
+
#: defaults.php:123
|
1749 |
+
msgid ""
|
1750 |
+
"Changed the title of the custom post %OldTitle% to %NewTitle%. "
|
1751 |
+
"%EditorLinkPost%."
|
1752 |
+
msgstr ""
|
1753 |
+
"A changé le titre de l'article personnalisé %OldTitle% à %NewTitle%. "
|
1754 |
+
"%EditorLinkPost%."
|
1755 |
+
|
1756 |
+
#: defaults.php:125
|
1757 |
+
msgid "Widgets"
|
1758 |
+
msgstr "Widgets"
|
1759 |
+
|
1760 |
+
#: defaults.php:126
|
1761 |
+
msgid "User added a new widget"
|
1762 |
+
msgstr "L'usager a ajouté un nouveau widget"
|
1763 |
+
|
1764 |
+
#: defaults.php:126
|
1765 |
+
msgid "Added a new %WidgetName% widget in %Sidebar%."
|
1766 |
+
msgstr "A ajouté le widget %WidgetNBame% dans %SideBar%."
|
1767 |
+
|
1768 |
+
#: defaults.php:127
|
1769 |
+
msgid "User modified a widget"
|
1770 |
+
msgstr "L'usager a modifé un widget"
|
1771 |
+
|
1772 |
+
#: defaults.php:127
|
1773 |
+
msgid "Modified the %WidgetName% widget in %Sidebar%."
|
1774 |
+
msgstr "A modifié le widget %WidgetName% dans %SideBar%."
|
1775 |
+
|
1776 |
+
#: defaults.php:128
|
1777 |
+
msgid "User deleted widget"
|
1778 |
+
msgstr "L'usager a détruit un widget"
|
1779 |
+
|
1780 |
+
#: defaults.php:128
|
1781 |
+
msgid "Deleted the %WidgetName% widget from %Sidebar%."
|
1782 |
+
msgstr "A détruit le widget %WidgetName% de %SideBar%."
|
1783 |
+
|
1784 |
+
#: defaults.php:129
|
1785 |
+
msgid "User moved widget"
|
1786 |
+
msgstr "L'usager a déplacé un widget"
|
1787 |
+
|
1788 |
+
#: defaults.php:129
|
1789 |
+
msgid "Moved the %WidgetName% widget from %OldSidebar% to %NewSidebar%."
|
1790 |
+
msgstr "A déplacé le widget %WidgetName% de %OldSideBar% à %NewSideBar%."
|
1791 |
+
|
1792 |
+
#: defaults.php:130
|
1793 |
+
msgid "User changed widget position"
|
1794 |
+
msgstr "L'usager a changé la position d'un widget"
|
1795 |
+
|
1796 |
+
#: defaults.php:130
|
1797 |
+
msgid "Changed the position of the widget %WidgetName% in sidebar %Sidebar%."
|
1798 |
+
msgstr "A changé la position du widget %WidgetName% dans %SideBar%."
|
1799 |
+
|
1800 |
+
#: defaults.php:132
|
1801 |
+
msgid "User Profiles"
|
1802 |
+
msgstr "Profils des Usagers"
|
1803 |
+
|
1804 |
+
#: defaults.php:133
|
1805 |
+
msgid "New user was created on WordPress"
|
1806 |
+
msgstr "Un nouvel usager a été créé dans WordPress"
|
1807 |
+
|
1808 |
+
#: defaults.php:133
|
1809 |
+
msgid ""
|
1810 |
+
"A new user %NewUserData->Username% was created with role of %NewUserData-"
|
1811 |
+
">Roles%."
|
1812 |
+
msgstr ""
|
1813 |
+
"Un nouvel usager %NewUserData->Username% a été créé avec le rôle de "
|
1814 |
+
"%NewUserData->Roles%."
|
1815 |
+
|
1816 |
+
#: defaults.php:134
|
1817 |
+
msgid "User created another WordPress user"
|
1818 |
+
msgstr "L'usager a créé un autre usager WordPress"
|
1819 |
+
|
1820 |
+
#: defaults.php:134
|
1821 |
+
msgid ""
|
1822 |
+
"%UserChanger% created a new user %NewUserData->Username% with the role of "
|
1823 |
+
"%NewUserData->Roles%."
|
1824 |
+
msgstr ""
|
1825 |
+
"%UserChange% a créé le nouvel usager %NewUserData->Username% a été créé avec "
|
1826 |
+
"le rôle de %NewUserData->Roles%."
|
1827 |
+
|
1828 |
+
#: defaults.php:135
|
1829 |
+
msgid "The role of a user was changed by another WordPress user"
|
1830 |
+
msgstr "Le rôle d'un usager a été changé par un autre usager WordPress"
|
1831 |
+
|
1832 |
+
#: defaults.php:135
|
1833 |
+
msgid ""
|
1834 |
+
"Changed the role of the user %TargetUsername% from %OldRole% to %NewRole%."
|
1835 |
+
msgstr ""
|
1836 |
+
"A changé le rôle de l'usager %TargetUsername% de %OldRole% à %NewRole%."
|
1837 |
+
|
1838 |
+
#: defaults.php:136
|
1839 |
+
msgid "User has changed his or her password"
|
1840 |
+
msgstr "L'usager a changé son mot de passe"
|
1841 |
+
|
1842 |
+
#: defaults.php:136
|
1843 |
+
msgid "Changed the password."
|
1844 |
+
msgstr "A changé le mot de passe."
|
1845 |
+
|
1846 |
+
#: defaults.php:137
|
1847 |
+
msgid "User changed another user's password"
|
1848 |
+
msgstr "L'usager a changé le mot de passe d'un autre usager"
|
1849 |
+
|
1850 |
+
#: defaults.php:137
|
1851 |
+
msgid ""
|
1852 |
+
"Changed the password for the user %TargetUserData->Username% with the role "
|
1853 |
+
"of %TargetUserData->Roles%."
|
1854 |
+
msgstr ""
|
1855 |
+
"A changé le mot de passe pour l'usager %TargetUserData->Username% avec le "
|
1856 |
+
"rôle de %TargetUserData->Roles%."
|
1857 |
+
|
1858 |
+
#: defaults.php:138
|
1859 |
+
msgid "User changed his or her email address"
|
1860 |
+
msgstr "L'usager a changé son adresse email"
|
1861 |
+
|
1862 |
+
#: defaults.php:138
|
1863 |
+
msgid "Changed the email address from %OldEmail% to %NewEmail%."
|
1864 |
+
msgstr "A changé l'adresse email de %OldEmail% à %NewEmail%."
|
1865 |
+
|
1866 |
+
#: defaults.php:139
|
1867 |
+
msgid "User changed another user's email address"
|
1868 |
+
msgstr "L'usager a changé l'adresse email d'un autre usager"
|
1869 |
+
|
1870 |
+
#: defaults.php:139
|
1871 |
+
msgid ""
|
1872 |
+
"Changed the email address of the user %TargetUsername% from %OldEmail% to "
|
1873 |
+
"%NewEmail%."
|
1874 |
+
msgstr ""
|
1875 |
+
"A changé l'adresse email de l'usager %TargetUsername% de %OldEmail% à "
|
1876 |
+
"%NewEmail%."
|
1877 |
+
|
1878 |
+
#: defaults.php:140
|
1879 |
+
msgid "User was deleted by another user"
|
1880 |
+
msgstr "L'usager a été détruit par un autre usager"
|
1881 |
+
|
1882 |
+
#: defaults.php:140
|
1883 |
+
msgid ""
|
1884 |
+
"Deleted the user %TargetUserData->Username% with the role of %TargetUserData-"
|
1885 |
+
">Roles%."
|
1886 |
+
msgstr ""
|
1887 |
+
"A détruit l'usager %TargetUserData->Username% avec le rôle de "
|
1888 |
+
"%TargetUserData->Roles%."
|
1889 |
+
|
1890 |
+
#: defaults.php:142
|
1891 |
+
msgid "Plugins & Themes"
|
1892 |
+
msgstr "Extensions & Thèmes"
|
1893 |
+
|
1894 |
+
#: defaults.php:143
|
1895 |
+
msgid "User installed a plugin"
|
1896 |
+
msgstr "L'usager a installé une extension"
|
1897 |
+
|
1898 |
+
#: defaults.php:143
|
1899 |
+
msgid "Installed the plugin %Plugin->Name% in %Plugin->plugin_dir_path%."
|
1900 |
+
msgstr "A installé l'extension %Plugin->Name% dans %Plugin->plugin_dir_path%."
|
1901 |
+
|
1902 |
+
#: defaults.php:144
|
1903 |
+
msgid "User activated a WordPress plugin"
|
1904 |
+
msgstr "L'usager a activé une extension WordPress"
|
1905 |
+
|
1906 |
+
#: defaults.php:144
|
1907 |
+
msgid "Activated the plugin %PluginData->Name% installed in %PluginFile%."
|
1908 |
+
msgstr "A activé l'extension %PluginData->Name% installée dans %PluginFile%."
|
1909 |
+
|
1910 |
+
#: defaults.php:145
|
1911 |
+
msgid "User deactivated a WordPress plugin"
|
1912 |
+
msgstr "L'usager a désactivé une extension WordPress"
|
1913 |
+
|
1914 |
+
#: defaults.php:145
|
1915 |
+
msgid "Deactivated the plugin %PluginData->Name% installed in %PluginFile%."
|
1916 |
+
msgstr "A désactivé l'extension %PluginData->Name% installé dans %PluginFile%."
|
1917 |
+
|
1918 |
+
#: defaults.php:146
|
1919 |
+
msgid "User uninstalled a plugin"
|
1920 |
+
msgstr "L'usager a désinstallé une extension WordPress"
|
1921 |
+
|
1922 |
+
#: defaults.php:146
|
1923 |
+
msgid ""
|
1924 |
+
"Uninstalled the plugin %PluginData->Name% which was installed in %PluginFile"
|
1925 |
+
"%."
|
1926 |
+
msgstr ""
|
1927 |
+
"A déinstallé l'extension %PluginData->Name% installé dans %PluginFile%."
|
1928 |
+
|
1929 |
+
#: defaults.php:147
|
1930 |
+
msgid "User upgraded a plugin"
|
1931 |
+
msgstr "L'usager a mis à jour une extension WordPress"
|
1932 |
+
|
1933 |
+
#: defaults.php:147
|
1934 |
+
msgid "Upgraded the plugin %PluginData->Name% installed in %PluginFile%."
|
1935 |
+
msgstr ""
|
1936 |
+
"A mis à jour l'extension %PluginData->Name% installé dans %PluginFile%."
|
1937 |
+
|
1938 |
+
#: defaults.php:148
|
1939 |
+
msgid "User installed a theme"
|
1940 |
+
msgstr "L'usager a installé un thème"
|
1941 |
+
|
1942 |
+
#: defaults.php:148
|
1943 |
+
msgid ""
|
1944 |
+
"Installed the theme \"%Theme->Name%\" in %Theme->get_template_directory%."
|
1945 |
+
msgstr ""
|
1946 |
+
"A installé le thème \"%Theme->Name%\" dans %Theme->get_template_directory%."
|
1947 |
+
|
1948 |
+
#: defaults.php:149
|
1949 |
+
msgid "User activated a theme"
|
1950 |
+
msgstr "L'usager a activé un thème"
|
1951 |
+
|
1952 |
+
#: defaults.php:149
|
1953 |
+
msgid ""
|
1954 |
+
"Activated the theme \"%Theme->Name%\", installed in %Theme-"
|
1955 |
+
">get_template_directory%."
|
1956 |
+
msgstr ""
|
1957 |
+
"A activé le thème \"%Theme->Name%\" installé dans %Theme-"
|
1958 |
+
">get_template_directory%."
|
1959 |
+
|
1960 |
+
#: defaults.php:150
|
1961 |
+
msgid "User uninstalled a theme"
|
1962 |
+
msgstr "L'usager a désinstallé un thème"
|
1963 |
+
|
1964 |
+
#: defaults.php:150
|
1965 |
+
msgid ""
|
1966 |
+
"Deleted the theme \"%Theme->Name%\" installed in %Theme-"
|
1967 |
+
">get_template_directory%."
|
1968 |
+
msgstr ""
|
1969 |
+
"A détruit le thème \"%Theme->Name%\" installé dans %Theme-"
|
1970 |
+
">get_template_directory%."
|
1971 |
+
|
1972 |
+
#: defaults.php:151
|
1973 |
+
msgid "A plugin created a post"
|
1974 |
+
msgstr "Une extension a créé un article"
|
1975 |
+
|
1976 |
+
#: defaults.php:151
|
1977 |
+
msgid "A plugin automatically created the following post: %PostTitle%."
|
1978 |
+
msgstr "Une extension a automatiquement créé cet article: %PostTitle%."
|
1979 |
+
|
1980 |
+
#: defaults.php:152
|
1981 |
+
msgid "A plugin created a page"
|
1982 |
+
msgstr "Une extension a créé une page"
|
1983 |
+
|
1984 |
+
#: defaults.php:152
|
1985 |
+
msgid "A plugin automatically created the following page: %PostTitle%."
|
1986 |
+
msgstr "Une extension a automatiquement créé cette page: %PostTitle%."
|
1987 |
+
|
1988 |
+
#: defaults.php:153
|
1989 |
+
msgid "A plugin created a custom post"
|
1990 |
+
msgstr "Une extension a créé un article personnalisé"
|
1991 |
+
|
1992 |
+
#: defaults.php:153
|
1993 |
+
msgid "A plugin automatically created the following custom post: %PostTitle%."
|
1994 |
+
msgstr ""
|
1995 |
+
"Une extension a automatiquement créé cet article personnalisé: %PostTitle%."
|
1996 |
+
|
1997 |
+
#: defaults.php:154
|
1998 |
+
msgid "A plugin deleted a post"
|
1999 |
+
msgstr "Une extension a détruit un article"
|
2000 |
+
|
2001 |
+
#: defaults.php:154
|
2002 |
+
msgid "A plugin automatically deleted the following post: %PostTitle%."
|
2003 |
+
msgstr "Une extension a automatiquement détruit cet article: %PostTitle%."
|
2004 |
+
|
2005 |
+
#: defaults.php:155
|
2006 |
+
msgid "A plugin deleted a page"
|
2007 |
+
msgstr "Une extension a détruit une page"
|
2008 |
+
|
2009 |
+
#: defaults.php:155
|
2010 |
+
msgid "A plugin automatically deleted the following page: %PostTitle%."
|
2011 |
+
msgstr "Une extension a automatiquement détruit cette article: %PostTitle%."
|
2012 |
+
|
2013 |
+
#: defaults.php:156
|
2014 |
+
msgid "A plugin deleted a custom post"
|
2015 |
+
msgstr "Une extension a détruit un article personnalisé"
|
2016 |
+
|
2017 |
+
#: defaults.php:156
|
2018 |
+
msgid "A plugin automatically deleted the following custom post: %PostTitle%."
|
2019 |
+
msgstr ""
|
2020 |
+
"Une extension a automatiquement créé cet article personnalisé: %PostTitle%."
|
2021 |
+
|
2022 |
+
#: defaults.php:157
|
2023 |
+
msgid "User updated a theme"
|
2024 |
+
msgstr "L'usager a mis à jour un thème"
|
2025 |
+
|
2026 |
+
#: defaults.php:157
|
2027 |
+
msgid ""
|
2028 |
+
"Updated the theme \"%Theme->Name%\" installed in %Theme-"
|
2029 |
+
">get_template_directory%."
|
2030 |
+
msgstr ""
|
2031 |
+
"A mis à jour le thème \"%Theme->Name%\" installé dans %Theme-"
|
2032 |
+
">get_template_directory%."
|
2033 |
+
|
2034 |
+
#: defaults.php:158
|
2035 |
+
msgid "User changed a file using the theme editor"
|
2036 |
+
msgstr "Utilisateur a modifié un fichier à l’aide de l’éditeur de thème"
|
2037 |
+
|
2038 |
+
#: defaults.php:158
|
2039 |
+
msgid "Modified %File% with the Theme Editor."
|
2040 |
+
msgstr "A modifié %File% avec l'Editeur de Thèmes."
|
2041 |
+
|
2042 |
+
#: defaults.php:159
|
2043 |
+
msgid "User changed a file using the plugin editor"
|
2044 |
+
msgstr "Un usager a modifié un fichier à l’aide de l’éditeur d'extension"
|
2045 |
+
|
2046 |
+
#: defaults.php:159
|
2047 |
+
msgid "Modified %File% with the Plugin Editor."
|
2048 |
+
msgstr "A modifié %File% avec l'Editeur d'Extensions."
|
2049 |
+
|
2050 |
+
#: defaults.php:161
|
2051 |
+
msgid "System Activity"
|
2052 |
+
msgstr "Activité Système"
|
2053 |
+
|
2054 |
+
#: defaults.php:162
|
2055 |
+
msgid "Unknown Error"
|
2056 |
+
msgstr "Erreur inconnue"
|
2057 |
+
|
2058 |
+
#: defaults.php:162
|
2059 |
+
msgid "An unexpected error has occurred ."
|
2060 |
+
msgstr "Erreur imprévue."
|
2061 |
+
|
2062 |
+
#: defaults.php:163
|
2063 |
+
msgid "PHP error"
|
2064 |
+
msgstr "Erreur PHP"
|
2065 |
+
|
2066 |
+
#: defaults.php:163 defaults.php:164 defaults.php:165 defaults.php:166
|
2067 |
+
#: defaults.php:167
|
2068 |
+
msgid "%Message%."
|
2069 |
+
msgstr "%Message%."
|
2070 |
+
|
2071 |
+
#: defaults.php:164
|
2072 |
+
msgid "PHP warning"
|
2073 |
+
msgstr "Avertissement PHP"
|
2074 |
+
|
2075 |
+
#: defaults.php:165
|
2076 |
+
msgid "PHP notice"
|
2077 |
+
msgstr "Notification PHP"
|
2078 |
+
|
2079 |
+
#: defaults.php:166
|
2080 |
+
msgid "PHP exception"
|
2081 |
+
msgstr "Exception PHP"
|
2082 |
+
|
2083 |
+
#: defaults.php:167
|
2084 |
+
msgid "PHP shutdown error"
|
2085 |
+
msgstr "Erreur de terminaison PHP"
|
2086 |
+
|
2087 |
+
#: defaults.php:168
|
2088 |
+
msgid "Events automatically pruned by system"
|
2089 |
+
msgstr "Des évênements ont automatiquement été purgés par le système"
|
2090 |
+
|
2091 |
+
#: defaults.php:168
|
2092 |
+
msgid "System automatically deleted %EventCount% alert(s)."
|
2093 |
+
msgstr "Le système a automatiquement supprimé % EventCount % alerte (s)."
|
2094 |
+
|
2095 |
+
#: defaults.php:169
|
2096 |
+
msgid "Option Anyone Can Register in WordPress settings changed"
|
2097 |
+
msgstr ""
|
2098 |
+
"L'option permettant à quiconque de s'enregistrer dans WordPress a été changée"
|
2099 |
+
|
2100 |
+
#: defaults.php:169
|
2101 |
+
msgid "%NewValue% the option \"Anyone can register\"."
|
2102 |
+
msgstr "%NewValue% pour l'option permettant à quiconque de s'enregistrer."
|
2103 |
+
|
2104 |
+
#: defaults.php:170
|
2105 |
+
msgid "New User Default Role changed"
|
2106 |
+
msgstr "Nouveau rôle par défaut du nouvel usager"
|
2107 |
+
|
2108 |
+
#: defaults.php:170
|
2109 |
+
msgid "Changed the New User Default Role from %OldRole% to %NewRole%."
|
2110 |
+
msgstr "A changé le rôle par défaut du nouvel usager de %OldRole% à %NewRole%."
|
2111 |
+
|
2112 |
+
#: defaults.php:171
|
2113 |
+
msgid "WordPress Administrator Notification email changed"
|
2114 |
+
msgstr "L'adresse email de Notification de l'Administrateur WordPress a changé"
|
2115 |
+
|
2116 |
+
#: defaults.php:171
|
2117 |
+
msgid ""
|
2118 |
+
"Changed the WordPress administrator notifications email address from "
|
2119 |
+
"%OldEmail% to %NewEmail%."
|
2120 |
+
msgstr ""
|
2121 |
+
"A changé l'adresse email de Notification de l'Administrateur WordPress de "
|
2122 |
+
"%OldEmail% à %NewEmail%."
|
2123 |
+
|
2124 |
+
#: defaults.php:172
|
2125 |
+
msgid "WordPress was updated"
|
2126 |
+
msgstr "WordPress a été mis à jour"
|
2127 |
+
|
2128 |
+
#: defaults.php:172
|
2129 |
+
msgid "Updated WordPress from version %OldVersion% to %NewVersion%."
|
2130 |
+
msgstr "Mise à jour de WordPress de la version %OldVersion% à %NewVersion%."
|
2131 |
+
|
2132 |
+
#: defaults.php:173
|
2133 |
+
msgid "User changes the WordPress Permalinks"
|
2134 |
+
msgstr "L'usager a changé les Permalinks de WordPress"
|
2135 |
+
|
2136 |
+
#: defaults.php:173
|
2137 |
+
msgid "Changed the WordPress permalinks from %OldPattern% to %NewPattern%."
|
2138 |
+
msgstr "A changé les permalinks WordPress de %OldPattern% à %NewPattern%."
|
2139 |
+
|
2140 |
+
#: defaults.php:174
|
2141 |
+
msgid "User requests non-existing pages (404 Error Pages)"
|
2142 |
+
msgstr "L’utilisateur demande des pages inexistantes (Erreur 404)"
|
2143 |
+
|
2144 |
+
#: defaults.php:174
|
2145 |
+
msgid ""
|
2146 |
+
"Has requested a non existing page (404 Error Pages) %Attempts% %Msg%. These "
|
2147 |
+
"requests are being logged to a log file in the /uploads/wp-security-audit-"
|
2148 |
+
"log/404s/ directory."
|
2149 |
+
msgstr ""
|
2150 |
+
"A demandé une page non existante (Erreur 404) %Attempts% %Msg%. Ces requêtes "
|
2151 |
+
"sont enregistrées dans un fichier du répertoire /uploads/wp-security-audit-"
|
2152 |
+
"log/404s/."
|
2153 |
+
|
2154 |
+
#: defaults.php:175
|
2155 |
+
msgid "Advertising Add-ons."
|
2156 |
+
msgstr "Add-Ons de publicité."
|
2157 |
+
|
2158 |
+
#: defaults.php:175
|
2159 |
+
msgid "%PromoName% %PromoMessage%"
|
2160 |
+
msgstr "%PromoName% %PromoMessage%"
|
2161 |
+
|
2162 |
+
#: defaults.php:177
|
2163 |
+
msgid "MultiSite"
|
2164 |
+
msgstr "MultiSite"
|
2165 |
+
|
2166 |
+
#: defaults.php:178
|
2167 |
+
msgid "User granted Super Admin privileges"
|
2168 |
+
msgstr "L'usager a reçu les privilèges de Super Admin"
|
2169 |
+
|
2170 |
+
#: defaults.php:178
|
2171 |
+
msgid "Granted Super Admin privileges to %TargetUsername%."
|
2172 |
+
msgstr "A attribué les privilèges de Super Admin à %TargetUsername%."
|
2173 |
+
|
2174 |
+
#: defaults.php:179
|
2175 |
+
msgid "User revoked from Super Admin privileges"
|
2176 |
+
msgstr "L'usager a révoqué les privilèges de Super Admin"
|
2177 |
+
|
2178 |
+
#: defaults.php:179
|
2179 |
+
msgid "Revoked Super Admin privileges from %TargetUsername%."
|
2180 |
+
msgstr "A révoqué les privilèges de Super Admin de %TargetUsername%."
|
2181 |
+
|
2182 |
+
#: defaults.php:180
|
2183 |
+
msgid "Existing user added to a site"
|
2184 |
+
msgstr "Un utilisateur existant a été ajouté à un site"
|
2185 |
+
|
2186 |
+
#: defaults.php:180
|
2187 |
+
msgid ""
|
2188 |
+
"Added the existing user %TargetUsername% with %TargetUserRole% role to site "
|
2189 |
+
"%SiteName%."
|
2190 |
+
msgstr ""
|
2191 |
+
"A ajouté l’utilisateur existant %TargetUsername% avec le rôle %TargetUserRole"
|
2192 |
+
"% au site %SiteName%."
|
2193 |
+
|
2194 |
+
#: defaults.php:181
|
2195 |
+
msgid "User removed from site"
|
2196 |
+
msgstr "L'usager a été détruit du site"
|
2197 |
+
|
2198 |
+
#: defaults.php:181
|
2199 |
+
msgid ""
|
2200 |
+
"Removed the user %TargetUsername% with role %TargetUserRole% from %SiteName% "
|
2201 |
+
"site."
|
2202 |
+
msgstr ""
|
2203 |
+
"A enlevé l’utilisateur %TargetUsername% avec le rôle %TargetUserRole% du "
|
2204 |
+
"site %SiteName%."
|
2205 |
+
|
2206 |
+
#: defaults.php:182
|
2207 |
+
msgid "New network user created"
|
2208 |
+
msgstr "Un nouvel usager a été créé"
|
2209 |
+
|
2210 |
+
#: defaults.php:182
|
2211 |
+
msgid "Created a new network user %NewUserData->Username%."
|
2212 |
+
msgstr "A créé u nouvel usager %NewUserData->Username%."
|
2213 |
+
|
2214 |
+
#: defaults.php:183
|
2215 |
+
msgid "The forum role of a user was changed by another WordPress user"
|
2216 |
+
msgstr ""
|
2217 |
+
"Le rôle de forum d'un usager a été changé par un autre usager WordPress"
|
2218 |
+
|
2219 |
+
#: defaults.php:183
|
2220 |
+
msgid ""
|
2221 |
+
"Change the forum role of the user %TargetUsername% from %OldRole% to %NewRole"
|
2222 |
+
"% by %UserChanger%."
|
2223 |
+
msgstr ""
|
2224 |
+
"Changement du rôle de forum de l’utilisateur %TargetUsername% de %OldRole% à "
|
2225 |
+
"%NewRole% par %UserChanger%."
|
2226 |
+
|
2227 |
+
#: defaults.php:184
|
2228 |
+
msgid "New site added on the network"
|
2229 |
+
msgstr "Nouveau site ajouté au réseau"
|
2230 |
+
|
2231 |
+
#: defaults.php:184
|
2232 |
+
msgid "Added the site %SiteName% to the network."
|
2233 |
+
msgstr "A ajouté le site %SiteName% au réseau."
|
2234 |
+
|
2235 |
+
#: defaults.php:185
|
2236 |
+
msgid "Existing site archived"
|
2237 |
+
msgstr "Site existant archivé"
|
2238 |
+
|
2239 |
+
#: defaults.php:185
|
2240 |
+
msgid "Archived the site %SiteName%."
|
2241 |
+
msgstr "A archivé le site %SiteName%."
|
2242 |
+
|
2243 |
+
#: defaults.php:186
|
2244 |
+
msgid "Archived site has been unarchived"
|
2245 |
+
msgstr "Un site archivé a été désarchivé"
|
2246 |
+
|
2247 |
+
#: defaults.php:186
|
2248 |
+
msgid "Unarchived the site %SiteName%."
|
2249 |
+
msgstr "A désarchivé le site %SiteName%."
|
2250 |
+
|
2251 |
+
#: defaults.php:187
|
2252 |
+
msgid "Deactivated site has been activated"
|
2253 |
+
msgstr "Un site desactivé a été activé"
|
2254 |
+
|
2255 |
+
#: defaults.php:187
|
2256 |
+
msgid "Activated the site %SiteName%."
|
2257 |
+
msgstr "A activé le site %SiteName%."
|
2258 |
+
|
2259 |
+
#: defaults.php:188
|
2260 |
+
msgid "Site has been deactivated"
|
2261 |
+
msgstr "Le site a été desactivé"
|
2262 |
+
|
2263 |
+
#: defaults.php:188
|
2264 |
+
msgid "Deactivated the site %SiteName%."
|
2265 |
+
msgstr "A désactivé le site %SiteName%."
|
2266 |
+
|
2267 |
+
#: defaults.php:189
|
2268 |
+
msgid "Existing site deleted from network"
|
2269 |
+
msgstr "Un site existant a été détruit"
|
2270 |
+
|
2271 |
+
#: defaults.php:189
|
2272 |
+
msgid "Deleted the site %SiteName%."
|
2273 |
+
msgstr "A détruit le site %SiteName%."
|
2274 |
+
|
2275 |
+
#: defaults.php:190
|
2276 |
+
msgid "Activated theme on network"
|
2277 |
+
msgstr "Thème activé sur le réseau"
|
2278 |
+
|
2279 |
+
#: defaults.php:190
|
2280 |
+
msgid ""
|
2281 |
+
"Network activated the theme %Theme->Name% installed in %Theme-"
|
2282 |
+
">get_template_directory%."
|
2283 |
+
msgstr ""
|
2284 |
+
"Le réseau a activé le thème \"%Theme->Name%\" installé dans %Theme-"
|
2285 |
+
">get_template_directory%."
|
2286 |
+
|
2287 |
+
#: defaults.php:191
|
2288 |
+
msgid "Deactivated theme from network"
|
2289 |
+
msgstr "Thème désactivé du réseau"
|
2290 |
+
|
2291 |
+
#: defaults.php:191
|
2292 |
+
msgid ""
|
2293 |
+
"Network deactivated the theme %Theme->Name% installed in %Theme-"
|
2294 |
+
">get_template_directory%."
|
2295 |
+
msgstr ""
|
2296 |
+
"Le réseau a désactivé le thème \"%Theme->Name%\" installé dans %Theme-"
|
2297 |
+
">get_template_directory%."
|
2298 |
+
|
2299 |
+
#: defaults.php:193
|
2300 |
+
msgid "Database"
|
2301 |
+
msgstr "Database"
|
2302 |
+
|
2303 |
+
#: defaults.php:194
|
2304 |
+
msgid "Plugin created tables"
|
2305 |
+
msgstr "Une extension a créé des tables"
|
2306 |
+
|
2307 |
+
#: defaults.php:194
|
2308 |
+
msgid ""
|
2309 |
+
"Plugin %Plugin->Name% created these tables in the database: %TableNames%."
|
2310 |
+
msgstr ""
|
2311 |
+
"L'extension %Plugin->Name% a créé ces tables dans la base de données : % "
|
2312 |
+
"TableNames %."
|
2313 |
+
|
2314 |
+
#: defaults.php:195
|
2315 |
+
msgid "Plugin modified tables structure"
|
2316 |
+
msgstr "Une extension a modifié la structure de tables"
|
2317 |
+
|
2318 |
+
#: defaults.php:195
|
2319 |
+
msgid ""
|
2320 |
+
"Plugin %Plugin->Name% modified the structure of these database tables: "
|
2321 |
+
"%TableNames%."
|
2322 |
+
msgstr ""
|
2323 |
+
"L'extension %Plugin->Name% a modifié la structure de ces tables dans la base "
|
2324 |
+
"de données : % TableNames %."
|
2325 |
+
|
2326 |
+
#: defaults.php:196
|
2327 |
+
msgid "Plugin deleted tables"
|
2328 |
+
msgstr "Une extension a détruit des tables"
|
2329 |
+
|
2330 |
+
#: defaults.php:196
|
2331 |
+
msgid ""
|
2332 |
+
"Plugin %Plugin->Name% deleted the following tables from the database: "
|
2333 |
+
"%TableNames%."
|
2334 |
+
msgstr ""
|
2335 |
+
"L'extension %Plugin->Name% a détruit ces tables de la base de données : % "
|
2336 |
+
"TableNames %."
|
2337 |
+
|
2338 |
+
#: defaults.php:197
|
2339 |
+
msgid "Theme created tables"
|
2340 |
+
msgstr "Un thème a créé des tables"
|
2341 |
+
|
2342 |
+
#: defaults.php:197
|
2343 |
+
msgid "Theme %Theme->Name% created these tables in the database: %TableNames%."
|
2344 |
+
msgstr ""
|
2345 |
+
"Le thème %Theme->Name% a créé ces tables dans la base de données : % "
|
2346 |
+
"TableNames %."
|
2347 |
+
|
2348 |
+
#: defaults.php:198
|
2349 |
+
msgid "Theme modified tables structure"
|
2350 |
+
msgstr "Un thème a modifié la structure de tables"
|
2351 |
+
|
2352 |
+
#: defaults.php:198
|
2353 |
+
msgid ""
|
2354 |
+
"Theme %Theme->Name% modified the structure of these database tables: "
|
2355 |
+
"%TableNames%."
|
2356 |
+
msgstr ""
|
2357 |
+
"Le thème %Theme->Name% a modifié la structure de ces tables dans la base de "
|
2358 |
+
"données : % TableNames %."
|
2359 |
+
|
2360 |
+
#: defaults.php:199
|
2361 |
+
msgid "Theme deleted tables"
|
2362 |
+
msgstr "Un thème a détruit des tables"
|
2363 |
+
|
2364 |
+
#: defaults.php:199
|
2365 |
+
msgid ""
|
2366 |
+
"Theme %Theme->Name% deleted the following tables from the database: "
|
2367 |
+
"%TableNames%."
|
2368 |
+
msgstr ""
|
2369 |
+
"Le thème %Theme->Name% a détruit ces tables de la base de données : % "
|
2370 |
+
"TableNames %."
|
2371 |
+
|
2372 |
+
#: defaults.php:200
|
2373 |
+
msgid "Unknown component created tables"
|
2374 |
+
msgstr "Un composant inconnu a créé des tables"
|
2375 |
+
|
2376 |
+
#: defaults.php:200
|
2377 |
+
msgid ""
|
2378 |
+
"An unknown component created these tables in the database: %TableNames%."
|
2379 |
+
msgstr ""
|
2380 |
+
"Un composant inconnu a créé ces tables dans la base de données : % "
|
2381 |
+
"TableNames %."
|
2382 |
+
|
2383 |
+
#: defaults.php:201
|
2384 |
+
msgid "Unknown component modified tables structure"
|
2385 |
+
msgstr "Un composant inconnu a modifié la structure de tables"
|
2386 |
+
|
2387 |
+
#: defaults.php:201
|
2388 |
+
msgid ""
|
2389 |
+
"An unknown component modified the structure of these database tables: "
|
2390 |
+
"%TableNames%."
|
2391 |
+
msgstr ""
|
2392 |
+
"Un composant inconnu a modifié la structure de ces tables de la base de "
|
2393 |
+
"données: %TableNames%."
|
2394 |
+
|
2395 |
+
#: defaults.php:202
|
2396 |
+
msgid "Unknown component deleted tables"
|
2397 |
+
msgstr "Un composant inconnu a détruit des tables"
|
2398 |
+
|
2399 |
+
#: defaults.php:202
|
2400 |
+
msgid ""
|
2401 |
+
"An unknown component deleted the following tables from the database: "
|
2402 |
+
"%TableNames%."
|
2403 |
+
msgstr ""
|
2404 |
+
"Un composant inconnu a détruit ces tables de la base de données: %TableNames"
|
2405 |
+
"%."
|
2406 |
+
|
2407 |
+
#: defaults.php:204
|
2408 |
+
msgid "BBPress Forum"
|
2409 |
+
msgstr "Forum BBPress"
|
2410 |
+
|
2411 |
+
#: defaults.php:205
|
2412 |
+
msgid "User created new forum"
|
2413 |
+
msgstr "L'usager a créé un nouveau forum"
|
2414 |
+
|
2415 |
+
#: defaults.php:206
|
2416 |
+
msgid "User changed status of a forum"
|
2417 |
+
msgstr "L'usager a changé le status d'un forum"
|
2418 |
+
|
2419 |
+
#: defaults.php:207
|
2420 |
+
msgid "User changed visibility of a forum"
|
2421 |
+
msgstr "L'usager a changé la visibilite d'un forum"
|
2422 |
+
|
2423 |
+
#: defaults.php:208
|
2424 |
+
msgid "User changed the URL of a forum"
|
2425 |
+
msgstr "L'usager a change l'adresse d'un forum"
|
2426 |
+
|
2427 |
+
#: defaults.php:209
|
2428 |
+
msgid "User changed order of a forum"
|
2429 |
+
msgstr "L'usager a changé l'ordre d'un forum"
|
2430 |
+
|
2431 |
+
#: defaults.php:210
|
2432 |
+
msgid "User moved forum to trash"
|
2433 |
+
msgstr "L'usager a mis un forum à la poubelle"
|
2434 |
+
|
2435 |
+
#: defaults.php:210
|
2436 |
+
msgid "Moved the forum %ForumName% to trash."
|
2437 |
+
msgstr "A mis le forum %ForumName% à la poubelle."
|
2438 |
+
|
2439 |
+
#: defaults.php:211
|
2440 |
+
msgid "User permanently deleted forum"
|
2441 |
+
msgstr "L'usager a détruit un forum"
|
2442 |
+
|
2443 |
+
#: defaults.php:211
|
2444 |
+
msgid "Permanently deleted the forum %ForumName%."
|
2445 |
+
msgstr "L'usager a détruit le forum %ForumName%."
|
2446 |
+
|
2447 |
+
#: defaults.php:212
|
2448 |
+
msgid "User restored forum from trash"
|
2449 |
+
msgstr "L'usager a restauré un forum"
|
2450 |
+
|
2451 |
+
#: defaults.php:213
|
2452 |
+
msgid "User changed the parent of a forum"
|
2453 |
+
msgstr "L'usager a changé le parent d'un forum"
|
2454 |
+
|
2455 |
+
#: defaults.php:214
|
2456 |
+
msgid "User changed forum's role"
|
2457 |
+
msgstr "L'usager a changé un rôle du forum"
|
2458 |
+
|
2459 |
+
#: defaults.php:214
|
2460 |
+
msgid "Changed the forum's auto role from %OldRole% to %NewRole%."
|
2461 |
+
msgstr "A changé le rôle automatique du forum de %OldRole% à %NewRole%."
|
2462 |
+
|
2463 |
+
#: defaults.php:215
|
2464 |
+
msgid "User changed option of a forum"
|
2465 |
+
msgstr "L'usager a changé une option d'un forum"
|
2466 |
+
|
2467 |
+
#: defaults.php:215
|
2468 |
+
msgid "%Status% the option for anonymous posting on forum."
|
2469 |
+
msgstr "%Status% de l'option pour poster aninymement sur le forum."
|
2470 |
+
|
2471 |
+
#: defaults.php:216
|
2472 |
+
msgid "User changed type of a forum"
|
2473 |
+
msgstr "L'usager a changé le type d'un forum"
|
2474 |
+
|
2475 |
+
#: defaults.php:217
|
2476 |
+
msgid "User changed time to disallow post editing"
|
2477 |
+
msgstr "L'usager a changé le délai pour l'édition des articles"
|
2478 |
+
|
2479 |
+
#: defaults.php:217
|
2480 |
+
msgid ""
|
2481 |
+
"Changed the time to disallow post editing from %OldTime% to %NewTime% "
|
2482 |
+
"minutes in the forums."
|
2483 |
+
msgstr ""
|
2484 |
+
"A changé le délai pour interdire l'édition des articles du forum de %OldTime"
|
2485 |
+
"% à %NewTime% minutes."
|
2486 |
+
|
2487 |
+
#: defaults.php:218
|
2488 |
+
msgid "User changed the forum setting posting throttle time"
|
2489 |
+
msgstr "L'usager a changé le paramètre du délai entre articles du forum"
|
2490 |
+
|
2491 |
+
#: defaults.php:218
|
2492 |
+
msgid ""
|
2493 |
+
"Changed the posting throttle time from %OldTime% to %NewTime% seconds in the "
|
2494 |
+
"forums."
|
2495 |
+
msgstr ""
|
2496 |
+
"A changé le délai entre articles du forum de %OldTime% à %NewTime% secondes."
|
2497 |
+
|
2498 |
+
#: defaults.php:219
|
2499 |
+
msgid "User created new topic"
|
2500 |
+
msgstr "L'usager a créé un nouveau sujet"
|
2501 |
+
|
2502 |
+
#: defaults.php:220
|
2503 |
+
msgid "User changed status of a topic"
|
2504 |
+
msgstr "L'usager a changé le status d'un sujet"
|
2505 |
+
|
2506 |
+
#: defaults.php:221
|
2507 |
+
msgid "User changed type of a topic"
|
2508 |
+
msgstr "L'usager a changé le type d'un sujet"
|
2509 |
+
|
2510 |
+
#: defaults.php:222
|
2511 |
+
msgid "User changed URL of a topic"
|
2512 |
+
msgstr "L'usager a change l'adresse d'un sujet"
|
2513 |
+
|
2514 |
+
#: defaults.php:222
|
2515 |
+
msgid "Changed the URL of the topic %TopicName% from %OldUrl% to %NewUrl%."
|
2516 |
+
msgstr "A changé l'adresse du sujet %TopicName% de %OldUrl% à %NewUrl%."
|
2517 |
+
|
2518 |
+
#: defaults.php:223
|
2519 |
+
msgid "User changed the forum of a topic"
|
2520 |
+
msgstr "L'usager a changé le sujet d'un forum"
|
2521 |
+
|
2522 |
+
#: defaults.php:224
|
2523 |
+
msgid "User moved topic to trash"
|
2524 |
+
msgstr "L'usager a mis un sujet à la poubelle"
|
2525 |
+
|
2526 |
+
#: defaults.php:224
|
2527 |
+
msgid "Moved the topic %TopicName% to trash."
|
2528 |
+
msgstr "A mis le sujet %TopicName% à la poubelle."
|
2529 |
+
|
2530 |
+
#: defaults.php:225
|
2531 |
+
msgid "User permanently deleted topic"
|
2532 |
+
msgstr "L'usager a détruit un sujet"
|
2533 |
+
|
2534 |
+
#: defaults.php:225
|
2535 |
+
msgid "Permanently deleted the topic %TopicName%."
|
2536 |
+
msgstr "L'usager a détruit le sujet %TopicName%."
|
2537 |
+
|
2538 |
+
#: defaults.php:226
|
2539 |
+
msgid "User restored topic from trash"
|
2540 |
+
msgstr "L'usager a restauré un sujet"
|
2541 |
+
|
2542 |
+
#: defaults.php:227
|
2543 |
+
msgid "User changed visibility of a topic"
|
2544 |
+
msgstr "L'usager a changé la visibilite d'un sujet"
|
2545 |
+
|
2546 |
+
#: defaults.php:229
|
2547 |
+
msgid "Menus"
|
2548 |
+
msgstr "Menus"
|
2549 |
+
|
2550 |
+
#: defaults.php:230
|
2551 |
+
msgid "User created new menu"
|
2552 |
+
msgstr "L'usager a créé un nouveau menu"
|
2553 |
+
|
2554 |
+
#: defaults.php:230
|
2555 |
+
msgid "Created a new menu called %MenuName%."
|
2556 |
+
msgstr "A créé le nouveau menu %MenuName%."
|
2557 |
+
|
2558 |
+
#: defaults.php:231
|
2559 |
+
msgid "User added content to a menu"
|
2560 |
+
msgstr "L'usager a ajouté un élément au menu"
|
2561 |
+
|
2562 |
+
#: defaults.php:231
|
2563 |
+
msgid "Added the %ContentType% called %ContentName% to menu %MenuName%."
|
2564 |
+
msgstr "A ajouté le %ContentType% appellé %ContentName% au menu %MenuName%."
|
2565 |
+
|
2566 |
+
#: defaults.php:232
|
2567 |
+
msgid "User removed content from a menu"
|
2568 |
+
msgstr "L'usager a détruit le contenu d'un menu"
|
2569 |
+
|
2570 |
+
#: defaults.php:232
|
2571 |
+
msgid ""
|
2572 |
+
"Removed the %ContentType% called %ContentName% from the menu %MenuName%."
|
2573 |
+
msgstr "A détruit le %ContentType% appellé %ContentName% au menu %MenuName%."
|
2574 |
+
|
2575 |
+
#: defaults.php:233
|
2576 |
+
msgid "User deleted menu"
|
2577 |
+
msgstr "L'usager a détruit un menu"
|
2578 |
+
|
2579 |
+
#: defaults.php:233
|
2580 |
+
msgid "Deleted the menu %MenuName%."
|
2581 |
+
msgstr "A détruit le menu %MenuName%."
|
2582 |
+
|
2583 |
+
#: defaults.php:234
|
2584 |
+
msgid "User changed menu setting"
|
2585 |
+
msgstr "L'usager a changé un paramètre du menu"
|
2586 |
+
|
2587 |
+
#: defaults.php:234
|
2588 |
+
msgid "%Status% the menu setting %MenuSetting% in %MenuName%."
|
2589 |
+
msgstr "%Status% du paramètre de menu %MenuSetting% de %MenuName%."
|
2590 |
+
|
2591 |
+
#: defaults.php:235
|
2592 |
+
msgid "User modified content in a menu"
|
2593 |
+
msgstr "L'usager a modifié le contenu d'un menu"
|
2594 |
+
|
2595 |
+
#: defaults.php:235
|
2596 |
+
msgid "Modified the %ContentType% called %ContentName% in menu %MenuName%."
|
2597 |
+
msgstr "A modifié le %ContentType% appellé %ContentName% du %MenuName%."
|
2598 |
+
|
2599 |
+
#: defaults.php:236
|
2600 |
+
msgid "User changed name of a menu"
|
2601 |
+
msgstr "L'usager a changé le nom d'un menu"
|
2602 |
+
|
2603 |
+
#: defaults.php:236
|
2604 |
+
msgid "Changed the name of menu %OldMenuName% to %NewMenuName%."
|
2605 |
+
msgstr "A changé le nom du menu %OldMenuName% à %NewMenuName%."
|
2606 |
+
|
2607 |
+
#: defaults.php:237
|
2608 |
+
msgid "User changed order of the objects in a menu"
|
2609 |
+
msgstr "L'usager a changé l'ordre des objets dans un menu"
|
2610 |
+
|
2611 |
+
#: defaults.php:237
|
2612 |
+
msgid "Changed the order of the %ItemName% in menu %MenuName%."
|
2613 |
+
msgstr "A changé l'ordre de %ItemName% dans le menu %MenuName%."
|
2614 |
+
|
2615 |
+
#: defaults.php:238
|
2616 |
+
msgid "User moved objects as a sub-item"
|
2617 |
+
msgstr "L'usager a deplacé des objets en sous-objet"
|
2618 |
+
|
2619 |
+
#: defaults.php:238
|
2620 |
+
msgid "Moved %ItemName% as a sub-item of %ParentName% in menu %MenuName%."
|
2621 |
+
msgstr ""
|
2622 |
+
"A deplacé %ItemName% en sous)objet de %ParentName% dans le menu %MenuName%."
|
2623 |
+
|
2624 |
+
#: defaults.php:240
|
2625 |
+
msgid "Comments"
|
2626 |
+
msgstr "Commentaires"
|
2627 |
+
|
2628 |
+
#: defaults.php:241
|
2629 |
+
msgid "User approved a comment"
|
2630 |
+
msgstr "L’utilisateur a approuvé un commentaire"
|
2631 |
+
|
2632 |
+
#: defaults.php:241
|
2633 |
+
msgid ""
|
2634 |
+
"Approved the comment posted in response to the post %PostTitle% by %Author% "
|
2635 |
+
"on %CommentLink%."
|
2636 |
+
msgstr ""
|
2637 |
+
"A approuvé le commentaire en réponse à l'article %PostTitle% par %Author% "
|
2638 |
+
"dans %CommentLink%."
|
2639 |
+
|
2640 |
+
#: defaults.php:242
|
2641 |
+
msgid "User unapproved a comment"
|
2642 |
+
msgstr "L’utilisateur a refusé un commentaire"
|
2643 |
+
|
2644 |
+
#: defaults.php:242
|
2645 |
+
msgid ""
|
2646 |
+
"Unapproved the comment posted in response to the post %PostTitle% by %Author"
|
2647 |
+
"% on %CommentLink%."
|
2648 |
+
msgstr ""
|
2649 |
+
"A désapprouvé le commentaire en réponse à l'article %PostTitle% par %Author% "
|
2650 |
+
"dans %CommentLink%."
|
2651 |
+
|
2652 |
+
#: defaults.php:243
|
2653 |
+
msgid "User replied to a comment"
|
2654 |
+
msgstr "L’utilisateur a répondu à un commentaire"
|
2655 |
+
|
2656 |
+
#: defaults.php:243
|
2657 |
+
msgid ""
|
2658 |
+
"Replied to the comment posted in response to the post %PostTitle% by %Author"
|
2659 |
+
"% on %CommentLink%."
|
2660 |
+
msgstr ""
|
2661 |
+
"A répondu au commentaire en réponse à l'article %PostTitle% par %Author% "
|
2662 |
+
"dans %CommentLink%."
|
2663 |
+
|
2664 |
+
#: defaults.php:244
|
2665 |
+
msgid "User edited a comment"
|
2666 |
+
msgstr "L’utilisateur a édité un commentaire"
|
2667 |
+
|
2668 |
+
#: defaults.php:244
|
2669 |
+
msgid ""
|
2670 |
+
"Edited a comment posted in response to the post %PostTitle% by %Author% on "
|
2671 |
+
"%CommentLink%."
|
2672 |
+
msgstr ""
|
2673 |
+
"A édité le commentaire en réponse à l'article %PostTitle% par %Author% dans "
|
2674 |
+
"%CommentLink%."
|
2675 |
+
|
2676 |
+
#: defaults.php:245
|
2677 |
+
msgid "User marked a comment as Spam"
|
2678 |
+
msgstr "L’utilisateur a marqué un commentaire en spam"
|
2679 |
+
|
2680 |
+
#: defaults.php:245
|
2681 |
+
msgid ""
|
2682 |
+
"Marked the comment posted in response to the post %PostTitle% by %Author% on "
|
2683 |
+
"%CommentLink% as Spam."
|
2684 |
+
msgstr ""
|
2685 |
+
"A classé en spam le commentaire en réponse à l'article %PostTitle% par "
|
2686 |
+
"%Author% dans %CommentLink%."
|
2687 |
+
|
2688 |
+
#: defaults.php:246
|
2689 |
+
msgid "User marked a comment as Not Spam"
|
2690 |
+
msgstr "L’utilisateur a marqué à un commentaire non-spam"
|
2691 |
+
|
2692 |
+
#: defaults.php:246
|
2693 |
+
msgid ""
|
2694 |
+
"Marked the comment posted in response to the post %PostTitle% by %Author% on "
|
2695 |
+
"%CommentLink% as Not Spam."
|
2696 |
+
msgstr ""
|
2697 |
+
"A classé en non-spam le commentaire en réponse à l'article %PostTitle% par "
|
2698 |
+
"%Author% dans %CommentLink%."
|
2699 |
+
|
2700 |
+
#: defaults.php:247
|
2701 |
+
msgid "User moved a comment to trash"
|
2702 |
+
msgstr "L'usager a mis un commentaire à la poubelle"
|
2703 |
+
|
2704 |
+
#: defaults.php:247
|
2705 |
+
msgid ""
|
2706 |
+
"Moved the comment posted in response to the post %PostTitle% by %Author% on "
|
2707 |
+
"%Date% to trash."
|
2708 |
+
msgstr ""
|
2709 |
+
"A mis à la poubelle le commentaire en réponse à l'article %PostTitle% par "
|
2710 |
+
"%Author% dans %CommentLink%."
|
2711 |
+
|
2712 |
+
#: defaults.php:248
|
2713 |
+
msgid "User restored a comment from the trash"
|
2714 |
+
msgstr "L'usager a restauré un commentaire"
|
2715 |
+
|
2716 |
+
#: defaults.php:248
|
2717 |
+
msgid ""
|
2718 |
+
"Restored the comment posted in response to the post %PostTitle% by %Author% "
|
2719 |
+
"on %CommentLink% from the trash."
|
2720 |
+
msgstr ""
|
2721 |
+
"A restauré le commentaire en réponse à l'article %PostTitle% par %Author% "
|
2722 |
+
"dans %CommentLink%."
|
2723 |
+
|
2724 |
+
#: defaults.php:249
|
2725 |
+
msgid "User permanently deleted a comment"
|
2726 |
+
msgstr "L’utilisateur a détruit un commentaire"
|
2727 |
+
|
2728 |
+
#: defaults.php:249
|
2729 |
+
msgid ""
|
2730 |
+
"Permanently deleted the comment posted in response to the post %PostTitle% "
|
2731 |
+
"by %Author% on %Date%."
|
2732 |
+
msgstr ""
|
2733 |
+
"A détruit le commentaire en réponse à l'article %PostTitle% par %Author% le "
|
2734 |
+
"%Date%."
|
2735 |
+
|
2736 |
+
#: defaults.php:250
|
2737 |
+
msgid "User posted a comment"
|
2738 |
+
msgstr "L’utilisateur a publié un commentaire"
|
2739 |
+
|
2740 |
+
#: defaults.php:250
|
2741 |
+
msgid "%CommentMsg% on %CommentLink%."
|
2742 |
+
msgstr "%CommentMsg% dans %CommentLink%."
|
2743 |
+
|
2744 |
+
#: defaults.php:252
|
2745 |
+
msgid "Custom Alerts"
|
2746 |
+
msgstr "Alertes personnalisées"
|
2747 |
+
|
2748 |
+
#: defaults.php:253
|
2749 |
+
msgid "Custom critical Alert"
|
2750 |
+
msgstr "Alerte personnalisée critique"
|
2751 |
+
|
2752 |
+
#: defaults.php:253 defaults.php:254 defaults.php:255
|
2753 |
+
msgid "%CustomAlertText%"
|
2754 |
+
msgstr "%CustomAlertText%"
|
2755 |
+
|
2756 |
+
#: defaults.php:254
|
2757 |
+
msgid "Custom warning Alert"
|
2758 |
+
msgstr "Alerte Personnalisée"
|
2759 |
+
|
2760 |
+
#: defaults.php:255
|
2761 |
+
msgid "Custom notice Alert"
|
2762 |
+
msgstr "Note d'alerte personnalisée"
|
2763 |
+
|
2764 |
+
#: wp-security-audit-log.php:261
|
2765 |
+
msgid ""
|
2766 |
+
"You are using a version of PHP that is older than %s, which is no longer "
|
2767 |
+
"supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
|
2768 |
+
"\">plugins@wpwhitesecurity.com</a> to help you switch the version of PHP you "
|
2769 |
+
"are using."
|
2770 |
+
msgstr ""
|
2771 |
+
"Vous utilisez une version de PHP anterieure a %s, qui n'est plus supportee."
|
2772 |
+
"<br>Contactez-nous à <a href=\"mailto:plugins@wpwhitesecurity.com"
|
2773 |
+
"\">plugins@wpwhitesecurity.com</a> pour une assistance sur ce sujet."
|
2774 |
+
|
2775 |
+
#. Plugin Name of the plugin/theme
|
2776 |
+
msgid "WP Security Audit Log"
|
2777 |
+
msgstr "WP Security Audit Log"
|
2778 |
+
|
2779 |
+
#. Plugin URI of the plugin/theme
|
2780 |
+
#. Author URI of the plugin/theme
|
2781 |
+
msgid "http://www.wpsecurityauditlog.com/"
|
2782 |
+
msgstr "http://www.wpsecurityauditlog.com/"
|
2783 |
+
|
2784 |
+
#. Description of the plugin/theme
|
2785 |
+
msgid ""
|
2786 |
+
"Identify WordPress security issues before they become a problem. Keep track "
|
2787 |
+
"of everything happening on your WordPress including WordPress users "
|
2788 |
+
"activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit "
|
2789 |
+
"Log generates a security alert for everything that happens on your WordPress "
|
2790 |
+
"blogs and websites. Use the Audit Log Viewer included in the plugin to see "
|
2791 |
+
"all the security alerts."
|
2792 |
+
msgstr ""
|
2793 |
+
"Identifier les problèmes de sécurité WordPress avant qu’elles deviennent un "
|
2794 |
+
"problème. Garder une trace de tout ce qui se passe sur votre WordPress, y "
|
2795 |
+
"compris l’activité utilisateurs de WordPress. Semblable au journal des "
|
2796 |
+
"événements Windows et Linux Syslog, Le Journal de WP Security génère une "
|
2797 |
+
"alerte pour tout ce qui se passe sur vos sites et blogs WordPress. Utilisez "
|
2798 |
+
"l’Audit Log Viewer inclus dans l'extention pour voir toutes les alertes de "
|
2799 |
+
"sécurité."
|
2800 |
+
|
2801 |
+
#. Author of the plugin/theme
|
2802 |
+
msgid "WP White Security"
|
2803 |
+
msgstr "Consulter le blog de WordPress Security"
|
languages/wp-security-audit-log-it_IT.mo
CHANGED
Binary file
|
languages/wp-security-audit-log-it_IT.po
ADDED
@@ -0,0 +1,7607 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Copyright (C) 2016 WP Security Audit Log
|
2 |
+
# This file is distributed under the same license as the WP Security Audit Log package.
|
3 |
+
msgid ""
|
4 |
+
msgstr ""
|
5 |
+
"Project-Id-Version: WP Security Audit Log 2.5.3\n"
|
6 |
+
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-security-audit-"
|
7 |
+
"log\n"
|
8 |
+
"POT-Creation-Date: 2019-01-29 06:19+0100\n"
|
9 |
+
"PO-Revision-Date: 2019-04-02 15:37+0200\n"
|
10 |
+
"Last-Translator: Leonardo\n"
|
11 |
+
"Language-Team: \n"
|
12 |
+
"Language: it\n"
|
13 |
+
"MIME-Version: 1.0\n"
|
14 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
15 |
+
"Content-Transfer-Encoding: 8bit\n"
|
16 |
+
"X-Generator: Poedit 2.2.1\n"
|
17 |
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
18 |
+
|
19 |
+
#. translators: Event ID
|
20 |
+
#: classes/AlertManager.php:321
|
21 |
+
#, php-format
|
22 |
+
msgid "Event with code %d has not be registered."
|
23 |
+
msgstr "L'evento con codice %d non è stato registrato."
|
24 |
+
|
25 |
+
#: classes/AlertManager.php:376
|
26 |
+
#, php-format
|
27 |
+
msgid "Event %s already registered with WP Security Audit Log."
|
28 |
+
msgstr "L'evento %s già registrato con WP Security Audit Log."
|
29 |
+
|
30 |
+
#: classes/AlertManager.php:411
|
31 |
+
msgid ""
|
32 |
+
"You have custom events that are using the same ID or IDs which are already "
|
33 |
+
"registered in the plugin, so they have been disabled."
|
34 |
+
msgstr ""
|
35 |
+
"Alcuni eventi personalizzati utilizzano lo stesso ID, o ID già registrati "
|
36 |
+
"nel plugin, di conseguenza sono stati disabilitati."
|
37 |
+
|
38 |
+
#: classes/AlertManager.php:414
|
39 |
+
#, php-format
|
40 |
+
msgid "%4$s to help you solve this issue."
|
41 |
+
msgstr "%4$s per aiutarvi a risolvere questo problema."
|
42 |
+
|
43 |
+
#: classes/AlertManager.php:416
|
44 |
+
msgid "ERROR:"
|
45 |
+
msgstr "ERRORE:"
|
46 |
+
|
47 |
+
#: classes/AlertManager.php:418
|
48 |
+
msgid "Contact us"
|
49 |
+
msgstr "Contattaci"
|
50 |
+
|
51 |
+
#: classes/AuditLogListView.php:106
|
52 |
+
msgid "No events so far."
|
53 |
+
msgstr "Nessun evento finora."
|
54 |
+
|
55 |
+
#: classes/AuditLogListView.php:157
|
56 |
+
msgid "Show "
|
57 |
+
msgstr "Mostra "
|
58 |
+
|
59 |
+
#: classes/AuditLogListView.php:167
|
60 |
+
msgid " Items"
|
61 |
+
msgstr " Elementi"
|
62 |
+
|
63 |
+
#: classes/AuditLogListView.php:183 classes/Views/AuditLog.php:417
|
64 |
+
#: classes/Views/AuditLog.php:440
|
65 |
+
msgid "All Sites"
|
66 |
+
msgstr "Tutti i siti"
|
67 |
+
|
68 |
+
#: classes/AuditLogListView.php:207
|
69 |
+
msgid "Live Database"
|
70 |
+
msgstr "Database live"
|
71 |
+
|
72 |
+
#: classes/AuditLogListView.php:210
|
73 |
+
msgid "Archive Database"
|
74 |
+
msgstr "Archivio database"
|
75 |
+
|
76 |
+
#: classes/AuditLogListView.php:266 classes/Views/Settings.php:1045
|
77 |
+
#: classes/WidgetManager.php:86
|
78 |
+
msgid "User"
|
79 |
+
msgstr "Utente"
|
80 |
+
|
81 |
+
#: classes/AuditLogListView.php:268
|
82 |
+
msgid "Username"
|
83 |
+
msgstr "Nome utente"
|
84 |
+
|
85 |
+
#: classes/AuditLogListView.php:273 classes/AuditLogListView.php:299
|
86 |
+
#: classes/Views/Settings.php:1039
|
87 |
+
msgid "Event ID"
|
88 |
+
msgstr "ID evento"
|
89 |
+
|
90 |
+
#: classes/AuditLogListView.php:274 classes/AuditLogListView.php:302
|
91 |
+
#: classes/Views/Settings.php:1041 classes/Views/ToggleAlerts.php:318
|
92 |
+
msgid "Severity"
|
93 |
+
msgstr "Gravità"
|
94 |
+
|
95 |
+
#: classes/AuditLogListView.php:275 classes/AuditLogListView.php:305
|
96 |
+
msgid "Date"
|
97 |
+
msgstr "Data"
|
98 |
+
|
99 |
+
#: classes/AuditLogListView.php:277 classes/AuditLogListView.php:311
|
100 |
+
msgid "Source IP"
|
101 |
+
msgstr "IP Origine"
|
102 |
+
|
103 |
+
#: classes/AuditLogListView.php:282 classes/AuditLogListView.php:314
|
104 |
+
msgid "Site"
|
105 |
+
msgstr "Sito"
|
106 |
+
|
107 |
+
#: classes/AuditLogListView.php:285 classes/AuditLogListView.php:317
|
108 |
+
msgid "Message"
|
109 |
+
msgstr "Messaggio"
|
110 |
+
|
111 |
+
#: classes/AuditLogListView.php:368
|
112 |
+
msgid "Click to toggle."
|
113 |
+
msgstr "Clic per attivare/disattivare."
|
114 |
+
|
115 |
+
#: classes/AuditLogListView.php:387
|
116 |
+
msgid "Disable this type of events."
|
117 |
+
msgstr "Disabilita questo tipo di eventi."
|
118 |
+
|
119 |
+
#: classes/AuditLogListView.php:395
|
120 |
+
msgid "Unknown error code."
|
121 |
+
msgstr "Codice errore sconosciuto."
|
122 |
+
|
123 |
+
#: classes/AuditLogListView.php:399
|
124 |
+
msgid "Critical"
|
125 |
+
msgstr "Critico"
|
126 |
+
|
127 |
+
#: classes/AuditLogListView.php:401
|
128 |
+
msgid "Warning"
|
129 |
+
msgstr "Avviso"
|
130 |
+
|
131 |
+
#: classes/AuditLogListView.php:403
|
132 |
+
msgid "Notification"
|
133 |
+
msgstr "Notifica"
|
134 |
+
|
135 |
+
#: classes/AuditLogListView.php:413 classes/AuditLogListView.php:454
|
136 |
+
msgid "Unknown"
|
137 |
+
msgstr "Sconosciuto"
|
138 |
+
|
139 |
+
#: classes/AuditLogListView.php:439
|
140 |
+
msgid "Show me all activity by this User"
|
141 |
+
msgstr "Mostrami tutte le attività di questo utente"
|
142 |
+
|
143 |
+
#: classes/AuditLogListView.php:458 classes/Views/Licensing.php:113
|
144 |
+
#: classes/Views/Licensing.php:153
|
145 |
+
msgid "Plugin"
|
146 |
+
msgstr "Plugin"
|
147 |
+
|
148 |
+
#: classes/AuditLogListView.php:462 defaults.php:356
|
149 |
+
msgid "Plugins"
|
150 |
+
msgstr "Plugins"
|
151 |
+
|
152 |
+
#: classes/AuditLogListView.php:466
|
153 |
+
msgid "Website Visitor"
|
154 |
+
msgstr "Visitatore del sito web"
|
155 |
+
|
156 |
+
#: classes/AuditLogListView.php:470 classes/Views/ToggleAlerts.php:420
|
157 |
+
#: classes/Views/ToggleAlerts.php:454 defaults.php:389
|
158 |
+
msgid "System"
|
159 |
+
msgstr "Sistema"
|
160 |
+
|
161 |
+
#: classes/AuditLogListView.php:502 classes/AuditLogListView.php:515
|
162 |
+
msgid "Show me all activity originating from this IP Address"
|
163 |
+
msgstr "Mostrami tutte le attività provenienti da questo indirizzo IP"
|
164 |
+
|
165 |
+
#: classes/AuditLogListView.php:544
|
166 |
+
msgid "View all details of this change"
|
167 |
+
msgstr "Mostra tutti i dettagli di questa modifica"
|
168 |
+
|
169 |
+
#: classes/AuditLogListView.php:545 classes/AuditLogListView.php:695
|
170 |
+
#: classes/Settings.php:1649
|
171 |
+
msgid "Alert Data Inspector"
|
172 |
+
msgstr "Alert Data Inspector"
|
173 |
+
|
174 |
+
#: classes/AuditLogListView.php:647 classes/Settings.php:1593
|
175 |
+
msgid "Download the log file"
|
176 |
+
msgstr "Scarica il file di log"
|
177 |
+
|
178 |
+
#: classes/AuditLogListView.php:667 classes/Settings.php:1613
|
179 |
+
msgid "Download the log file."
|
180 |
+
msgstr "Scarica il file di log."
|
181 |
+
|
182 |
+
#: classes/AuditLogListView.php:675 classes/Settings.php:1621
|
183 |
+
#: classes/Settings.php:1873
|
184 |
+
msgid "published"
|
185 |
+
msgstr "pubblicato"
|
186 |
+
|
187 |
+
#. translators: Mailto link for support.
|
188 |
+
#: classes/AuditLogListView.php:703 classes/Settings.php:1660
|
189 |
+
#: classes/Settings.php:1899
|
190 |
+
#, php-format
|
191 |
+
msgid "Contact us on %s for assistance"
|
192 |
+
msgstr "Contattaci su %s per assistenza"
|
193 |
+
|
194 |
+
#: classes/AuditLogListView.php:901
|
195 |
+
msgid "Select All"
|
196 |
+
msgstr "Seleziona tutto"
|
197 |
+
|
198 |
+
#: classes/Connector/wp-db-custom.php:202
|
199 |
+
msgid "Error establishing a database connection"
|
200 |
+
msgstr "Errore durante la connessione al database"
|
201 |
+
|
202 |
+
#. translators: 1: wp-config.php. 2: database host
|
203 |
+
#: classes/Connector/wp-db-custom.php:206
|
204 |
+
#, php-format
|
205 |
+
msgid ""
|
206 |
+
"This either means that the username and password information in your %1$s "
|
207 |
+
"file is incorrect or we can’t contact the database server at %2$s. "
|
208 |
+
"This could mean your host’s database server is down."
|
209 |
+
msgstr ""
|
210 |
+
"Ciò significa che le informazioni sul nome utente e sulla password nel tuo "
|
211 |
+
"file %1$s non sono corrette, o che non possiamo contattare il server del "
|
212 |
+
"database in %2$s. Ciò potrebbe significare che il server del database "
|
213 |
+
"dell'host è inattivo."
|
214 |
+
|
215 |
+
#: classes/Connector/wp-db-custom.php:212
|
216 |
+
msgid "Are you sure you have the correct username and password?"
|
217 |
+
msgstr "Sei sicuro di avere nome utente e password corretti?"
|
218 |
+
|
219 |
+
#: classes/Connector/wp-db-custom.php:213
|
220 |
+
msgid "Are you sure that you have typed the correct hostname?"
|
221 |
+
msgstr "Sei sicuro di aver digitato il nome host corretto?"
|
222 |
+
|
223 |
+
#: classes/Connector/wp-db-custom.php:214
|
224 |
+
msgid "Are you sure that the database server is running?"
|
225 |
+
msgstr "Sei sicuro che il database server sia in esecuzione?"
|
226 |
+
|
227 |
+
#. translators: %s: support forums URL
|
228 |
+
#: classes/Connector/wp-db-custom.php:219
|
229 |
+
#, php-format
|
230 |
+
msgid ""
|
231 |
+
"If you’re unsure what these terms mean you should probably contact "
|
232 |
+
"your host. If you still need help you can always visit the <a href=\"%s"
|
233 |
+
"\">WordPress Support Forums</a>."
|
234 |
+
msgstr ""
|
235 |
+
"Se non sei sicuro di cosa significhino questi termini, probabilmente "
|
236 |
+
"dovresti contattare il tuo host. Se hai ancora bisogno di aiuto, puoi sempre "
|
237 |
+
"visitare i <a href=\"%s\">forum di supporto di WordPress</a>."
|
238 |
+
|
239 |
+
#: classes/Connector/wp-db-custom.php:220
|
240 |
+
msgid "https://wordpress.org/support/"
|
241 |
+
msgstr "https://wordpress.org/support/"
|
242 |
+
|
243 |
+
#: classes/Loggers/Database.php:243 classes/Views/EmailNotifications.php:153
|
244 |
+
#: classes/Views/EmailNotifications.php:185 classes/Views/ExternalDB.php:152
|
245 |
+
#: classes/Views/ExternalDB.php:184 classes/Views/Help.php:188
|
246 |
+
#: classes/Views/Help.php:239 classes/Views/LogInUsers.php:154
|
247 |
+
#: classes/Views/LogInUsers.php:186 classes/Views/Reports.php:153
|
248 |
+
#: classes/Views/Reports.php:185 classes/Views/Search.php:153
|
249 |
+
#: classes/Views/Search.php:178
|
250 |
+
msgid "Upgrade to Premium"
|
251 |
+
msgstr "Aggiorna a Premium"
|
252 |
+
|
253 |
+
#: classes/Loggers/Database.php:244 classes/Views/EmailNotifications.php:154
|
254 |
+
#: classes/Views/EmailNotifications.php:186 classes/Views/ExternalDB.php:153
|
255 |
+
#: classes/Views/ExternalDB.php:185 classes/Views/Help.php:240
|
256 |
+
#: classes/Views/LogInUsers.php:155 classes/Views/LogInUsers.php:187
|
257 |
+
#: classes/Views/Reports.php:154 classes/Views/Reports.php:186
|
258 |
+
#: classes/Views/Search.php:154 classes/Views/Search.php:179
|
259 |
+
msgid "More Information"
|
260 |
+
msgstr "Maggiori informazioni"
|
261 |
+
|
262 |
+
#: classes/Sensors/Content.php:1326 classes/Sensors/Content.php:1334
|
263 |
+
#: classes/Sensors/WooCommerce.php:603 classes/Sensors/WooCommerce.php:609
|
264 |
+
msgid "Password Protected"
|
265 |
+
msgstr "Protetto da password"
|
266 |
+
|
267 |
+
#: classes/Sensors/Content.php:1328 classes/Sensors/Content.php:1336
|
268 |
+
msgid "Public"
|
269 |
+
msgstr "Pubblico"
|
270 |
+
|
271 |
+
#: classes/Sensors/Content.php:1330 classes/Sensors/Content.php:1338
|
272 |
+
msgid "Private"
|
273 |
+
msgstr "Privato"
|
274 |
+
|
275 |
+
#: classes/Sensors/Public.php:109
|
276 |
+
#, php-format
|
277 |
+
msgid ""
|
278 |
+
"A comment was posted in response to the post %1$s. The comment was posted by "
|
279 |
+
"%2$s"
|
280 |
+
msgstr ""
|
281 |
+
"Un commento è stato postato come replica al post %1$s. Il commento è stato "
|
282 |
+
"postato da %2$s"
|
283 |
+
|
284 |
+
#: classes/Sensors/Public.php:629 classes/Sensors/WooCommerce.php:1748
|
285 |
+
msgid "In stock"
|
286 |
+
msgstr "Disponibile"
|
287 |
+
|
288 |
+
#: classes/Sensors/Public.php:631 classes/Sensors/WooCommerce.php:1750
|
289 |
+
msgid "Out of stock"
|
290 |
+
msgstr "Non disponibile"
|
291 |
+
|
292 |
+
#: classes/Sensors/Public.php:633 classes/Sensors/WooCommerce.php:1752
|
293 |
+
msgid "On backorder"
|
294 |
+
msgstr "In arretrato"
|
295 |
+
|
296 |
+
#: classes/Sensors/WooCommerce.php:2555
|
297 |
+
msgid "Visible"
|
298 |
+
msgstr "Visibile"
|
299 |
+
|
300 |
+
#: classes/Sensors/WooCommerce.php:2555
|
301 |
+
msgid "Non-Visible"
|
302 |
+
msgstr "Non-visibile"
|
303 |
+
|
304 |
+
#: classes/Settings.php:464
|
305 |
+
msgid "This function is deprecated"
|
306 |
+
msgstr "Questa funzione è deprecata"
|
307 |
+
|
308 |
+
#: classes/Settings.php:1561
|
309 |
+
msgid "View Order"
|
310 |
+
msgstr "Mostra ordine"
|
311 |
+
|
312 |
+
#: classes/Settings.php:1672 classes/Settings.php:1911
|
313 |
+
msgid "plugin settings"
|
314 |
+
msgstr "impostazioni plugin"
|
315 |
+
|
316 |
+
#: classes/Settings.php:1675 classes/Settings.php:1914
|
317 |
+
msgid "contact our support"
|
318 |
+
msgstr "contattate il nostro supporto"
|
319 |
+
|
320 |
+
#: classes/Utilities/Emailer.php:53
|
321 |
+
#, php-format
|
322 |
+
msgid "WP Security Audit Log plugin disabled on %s"
|
323 |
+
msgstr "Il plugin WP Security Audit Log disabilitato su %s"
|
324 |
+
|
325 |
+
#: classes/Utilities/Emailer.php:56
|
326 |
+
msgid "Hello admin,"
|
327 |
+
msgstr "Ciao admin,"
|
328 |
+
|
329 |
+
#: classes/Utilities/Emailer.php:61
|
330 |
+
#, php-format
|
331 |
+
msgid ""
|
332 |
+
"This is a notification to let you know that the user %1$s has deactivated "
|
333 |
+
"the plugin WP Security Audit Log on the website %2$s on %3$s."
|
334 |
+
msgstr ""
|
335 |
+
"Questa è una notifica per informarti che l'utente %1$s ha disattivato il "
|
336 |
+
"plugin WP Security Audit Log sul sito %2$s su \v%3$s."
|
337 |
+
|
338 |
+
#: classes/Views/AuditLog.php:78
|
339 |
+
msgid ""
|
340 |
+
"Get instantly alerted of important changes via email, do text based searches "
|
341 |
+
"and filter results, generate reports, see who is logged in and more!"
|
342 |
+
msgstr ""
|
343 |
+
"Ricevi immediatamente notifica d'importanti modifiche via email, fai "
|
344 |
+
"ricerche testuali e filtra i risultati, genera report, vedi chi è connesso e "
|
345 |
+
"altro ancora!"
|
346 |
+
|
347 |
+
#: classes/Views/AuditLog.php:79
|
348 |
+
msgid "Upgrade to premium to unlock these powerful activity log features."
|
349 |
+
msgstr ""
|
350 |
+
"Aggiorna a premium per sbloccare queste potenti funzioni del log attività."
|
351 |
+
|
352 |
+
#: classes/Views/AuditLog.php:82
|
353 |
+
msgid ""
|
354 |
+
"Instant email notifications, search & filters, reports, users sessions "
|
355 |
+
"management, integration tools and more!"
|
356 |
+
msgstr ""
|
357 |
+
"Notifiche email istantanee, ricerca e filtri, report, gestione delle "
|
358 |
+
"sessioni utenti, strumenti di integrazione e altro ancora!"
|
359 |
+
|
360 |
+
#: classes/Views/AuditLog.php:83
|
361 |
+
msgid ""
|
362 |
+
"Upgrade to unlock these powerful features and gain more from your activity "
|
363 |
+
"logs."
|
364 |
+
msgstr ""
|
365 |
+
"Aggiorna per sbloccare queste potenti funzionalità e ottenere di più dai "
|
366 |
+
"tuoi log attività."
|
367 |
+
|
368 |
+
#: classes/Views/AuditLog.php:86
|
369 |
+
msgid ""
|
370 |
+
"See who is logged in to your WordPress, create user productivity reports, "
|
371 |
+
"get alerted via email of important changes and more!"
|
372 |
+
msgstr ""
|
373 |
+
"Scopri chi è connesso, crea report sulla produttività degli utenti, ricevi "
|
374 |
+
"avvisi via email d'importanti cambiamenti e altro!"
|
375 |
+
|
376 |
+
#: classes/Views/AuditLog.php:87
|
377 |
+
msgid ""
|
378 |
+
"Unlock these powerful features and much more with the premium edition of WP "
|
379 |
+
"Security Audit Log."
|
380 |
+
msgstr ""
|
381 |
+
"Sblocca queste potenti funzionalità e molto altro con l'edizione premium di "
|
382 |
+
"WP Security Audit Log."
|
383 |
+
|
384 |
+
#: classes/Views/AuditLog.php:150
|
385 |
+
msgid "UPGRADE"
|
386 |
+
msgstr "AGGIORNA"
|
387 |
+
|
388 |
+
#: classes/Views/AuditLog.php:152
|
389 |
+
msgid "Tell me more"
|
390 |
+
msgstr "Maggiori informazioni"
|
391 |
+
|
392 |
+
#: classes/Views/AuditLog.php:153
|
393 |
+
msgid "Dismiss the banner"
|
394 |
+
msgstr "Rimuovi il banner"
|
395 |
+
|
396 |
+
#: classes/Views/AuditLog.php:153
|
397 |
+
msgid "Close"
|
398 |
+
msgstr "Chiudi"
|
399 |
+
|
400 |
+
#: classes/Views/AuditLog.php:179
|
401 |
+
msgid ""
|
402 |
+
"There are connectivity issues with the database where the WordPress activity "
|
403 |
+
"log is stored. The logs will be temporary buffered in the WordPress database "
|
404 |
+
"until the connection is fully restored."
|
405 |
+
msgstr ""
|
406 |
+
"Ci sono problemi di connessione con il database in cui è archiviato il log "
|
407 |
+
"delle attività di WordPress. I log saranno temporaneamente memorizzati nel "
|
408 |
+
"database di WordPress finché la connessione non sarà completamente "
|
409 |
+
"ripristinata."
|
410 |
+
|
411 |
+
#: classes/Views/AuditLog.php:196
|
412 |
+
msgid ""
|
413 |
+
"Help us improve WP Security Audit Log! Opt-in to sending us diagnostic non-"
|
414 |
+
"sensitive data about your plugin usage (<strong>no activity log data is "
|
415 |
+
"sent</strong>) and subscribe to our newsletter."
|
416 |
+
msgstr ""
|
417 |
+
"Aiutaci a migliorare WP Security Audit Log! Acconsenti all'invio di dati "
|
418 |
+
"diagnostici non sensibili sull'utilizzo del tuo plugin (<strong>nessun dato "
|
419 |
+
"del log delle attività verrà inviato</strong>) e iscriviti alla nostra "
|
420 |
+
"newsletter."
|
421 |
+
|
422 |
+
#: classes/Views/AuditLog.php:199
|
423 |
+
msgid "Opt-In"
|
424 |
+
msgstr "Consenso"
|
425 |
+
|
426 |
+
#: classes/Views/AuditLog.php:201
|
427 |
+
msgid "Learn More"
|
428 |
+
msgstr "Maggiori informazioni"
|
429 |
+
|
430 |
+
#: classes/Views/AuditLog.php:203 classes/Views/AuditLog.php:381
|
431 |
+
#: classes/Views/Settings.php:469 classes/Views/Settings.php:496
|
432 |
+
#: classes/Views/Settings.php:587 classes/Views/Settings.php:625
|
433 |
+
#: classes/Views/Settings.php:1107 classes/Views/Settings.php:1175
|
434 |
+
#: classes/Views/Settings.php:1835 classes/Views/Settings.php:1898
|
435 |
+
#: classes/Views/Settings.php:1926 classes/Views/Settings.php:1941
|
436 |
+
#: classes/Views/Settings.php:1951 classes/Views/SetupWizard.php:520
|
437 |
+
msgid "No"
|
438 |
+
msgstr "No"
|
439 |
+
|
440 |
+
#: classes/Views/AuditLog.php:243 classes/Views/AuditLog.php:259
|
441 |
+
msgid "Audit Log Viewer"
|
442 |
+
msgstr "Audit Log Viewer"
|
443 |
+
|
444 |
+
#: classes/Views/AuditLog.php:340 classes/Views/Licensing.php:82
|
445 |
+
#: classes/Views/Settings.php:334 classes/Views/ToggleAlerts.php:127
|
446 |
+
msgid "You do not have sufficient permissions to access this page."
|
447 |
+
msgstr ""
|
448 |
+
"Non si dispone di autorizzazioni sufficienti per accedere a questa pagina."
|
449 |
+
|
450 |
+
#: classes/Views/AuditLog.php:377
|
451 |
+
msgid ""
|
452 |
+
"Thank you very much for using the WP Security Audit Log plugin. We have "
|
453 |
+
"created a wizard to ease the process of configuring the plugin so you can "
|
454 |
+
"get the best out of it. Would you like to run the wizard?"
|
455 |
+
msgstr ""
|
456 |
+
"Grazie mille per aver utilizzato il plugin WP Security Audit Log. Abbiamo "
|
457 |
+
"creato una procedura guidata per semplificare il processo di configurazione "
|
458 |
+
"del plugin in modo da poterne ottenere il meglio. Vuoi che esegua la "
|
459 |
+
"procedura guidata?"
|
460 |
+
|
461 |
+
#: classes/Views/AuditLog.php:380 classes/Views/Settings.php:464
|
462 |
+
#: classes/Views/Settings.php:491 classes/Views/Settings.php:557
|
463 |
+
#: classes/Views/Settings.php:615 classes/Views/Settings.php:1102
|
464 |
+
#: classes/Views/Settings.php:1168 classes/Views/Settings.php:1830
|
465 |
+
#: classes/Views/Settings.php:1891 classes/Views/Settings.php:1919
|
466 |
+
#: classes/Views/Settings.php:1940 classes/Views/Settings.php:1950
|
467 |
+
#: classes/Views/SetupWizard.php:525
|
468 |
+
msgid "Yes"
|
469 |
+
msgstr "Sì"
|
470 |
+
|
471 |
+
#: classes/Views/AuditLog.php:416 classes/Views/AuditLog.php:439
|
472 |
+
msgid "Please enter the number of alerts you would like to see on one page:"
|
473 |
+
msgstr ""
|
474 |
+
"Inserire il numero di avvisi che si desidera vedere su una singola pagina:"
|
475 |
+
|
476 |
+
#: classes/Views/AuditLog.php:418 classes/Views/AuditLog.php:441
|
477 |
+
msgid "No Results"
|
478 |
+
msgstr "Nessun risultato"
|
479 |
+
|
480 |
+
#: classes/Views/AuditLog.php:625
|
481 |
+
msgid "No users found."
|
482 |
+
msgstr "Nessun utente trovato."
|
483 |
+
|
484 |
+
#: classes/Views/AuditLog.php:628 classes/Views/AuditLog.php:705
|
485 |
+
#: classes/Views/AuditLog.php:731 classes/Views/AuditLog.php:1021
|
486 |
+
#: classes/Views/Licensing.php:90 classes/Views/Settings.php:241
|
487 |
+
#: classes/Views/Settings.php:330 classes/Views/Settings.php:2097
|
488 |
+
#: classes/Views/Settings.php:2125 classes/Views/Settings.php:2155
|
489 |
+
#: classes/Views/Settings.php:2194 classes/Views/Settings.php:2196
|
490 |
+
#: classes/Views/Settings.php:2198 classes/Views/Settings.php:2305
|
491 |
+
#: classes/Views/Settings.php:2307 classes/Views/Settings.php:2309
|
492 |
+
#: classes/Views/Settings.php:2399 classes/Views/Settings.php:2479
|
493 |
+
#: classes/Views/SetupWizard.php:81
|
494 |
+
msgid "Nonce verification failed."
|
495 |
+
msgstr "Verifica nonce non riuscita."
|
496 |
+
|
497 |
+
#: classes/Views/AuditLog.php:647
|
498 |
+
msgid "Log file does not exist."
|
499 |
+
msgstr "Il file di log non esiste."
|
500 |
+
|
501 |
+
#: classes/Views/AuditLog.php:696
|
502 |
+
msgid "Request to get log file failed."
|
503 |
+
msgstr "Richiesta di ottenere il file di log non riuscita."
|
504 |
+
|
505 |
+
#: classes/Views/AuditLog.php:771
|
506 |
+
msgid "Freemius opt choice selected."
|
507 |
+
msgstr "Selezionata scelta freemius."
|
508 |
+
|
509 |
+
#: classes/Views/AuditLog.php:778
|
510 |
+
msgid "Freemius opt choice not found."
|
511 |
+
msgstr "Scelta freemius non trovata."
|
512 |
+
|
513 |
+
#: classes/Views/AuditLog.php:935
|
514 |
+
msgid "WordPress Activity Log"
|
515 |
+
msgstr "Log attività di WordPress"
|
516 |
+
|
517 |
+
#: classes/Views/AuditLog.php:936
|
518 |
+
msgid ""
|
519 |
+
"When a user makes a change on your website the plugin will keep a record of "
|
520 |
+
"that event here. Right now there is nothing because this is a new install."
|
521 |
+
msgstr ""
|
522 |
+
"Quando un utente apporta una modifica al tuo sito web, il plugin conserverà "
|
523 |
+
"una registrazione di tale evento qui. Ora non c'è nulla perché questa è una "
|
524 |
+
"nuova installazione."
|
525 |
+
|
526 |
+
#: classes/Views/AuditLog.php:937
|
527 |
+
msgid "Thank you for using WP Security Audit Log"
|
528 |
+
msgstr "Grazie per aver usato WP Security Audit Log"
|
529 |
+
|
530 |
+
#: classes/Views/AuditLog.php:958
|
531 |
+
msgid "Error: You do not have sufficient permissions to exclude this URL."
|
532 |
+
msgstr ""
|
533 |
+
"Errore: non si dispone di autorizzazioni sufficienti per escludere questo "
|
534 |
+
"URL."
|
535 |
+
|
536 |
+
#: classes/Views/AuditLog.php:1004
|
537 |
+
msgid "You do not have sufficient permissions to dismiss this notice."
|
538 |
+
msgstr ""
|
539 |
+
"Non si dispone di autorizzazioni sufficienti per ignorare questo avviso."
|
540 |
+
|
541 |
+
#: classes/Views/EmailNotifications.php:28
|
542 |
+
msgid "Email Notifications Add-On"
|
543 |
+
msgstr "Add-On Notifiche Email"
|
544 |
+
|
545 |
+
#: classes/Views/EmailNotifications.php:42
|
546 |
+
msgid "Email Notifications ⇪"
|
547 |
+
msgstr "Notifiche email ⇪"
|
548 |
+
|
549 |
+
#: classes/Views/EmailNotifications.php:112
|
550 |
+
msgid "Email Notifications"
|
551 |
+
msgstr "Notifiche email"
|
552 |
+
|
553 |
+
#: classes/Views/EmailNotifications.php:114 classes/Views/ExternalDB.php:114
|
554 |
+
#: classes/Views/LogInUsers.php:114 classes/Views/Reports.php:114
|
555 |
+
#: classes/Views/Search.php:114
|
556 |
+
msgid "Upgrade to Premium to:"
|
557 |
+
msgstr "Aggiorna a Premium per:"
|
558 |
+
|
559 |
+
#: classes/Views/EmailNotifications.php:118
|
560 |
+
msgid ""
|
561 |
+
"Configure email notifications to be instantly alerted of important changes,"
|
562 |
+
msgstr ""
|
563 |
+
"Configura le notifiche email per essere immediatamente avvisato di "
|
564 |
+
"importanti cambiamenti,"
|
565 |
+
|
566 |
+
#: classes/Views/EmailNotifications.php:119
|
567 |
+
msgid ""
|
568 |
+
"Configure notifications for when users login, change content, install a "
|
569 |
+
"plugin or do any other change,"
|
570 |
+
msgstr ""
|
571 |
+
"Configura le notifiche per quando gli utenti accedono, cambiano contenuto, "
|
572 |
+
"installano un plugin o eseguono qualsiasi altra modifica,"
|
573 |
+
|
574 |
+
#: classes/Views/EmailNotifications.php:120
|
575 |
+
msgid "Configure security email notifications,"
|
576 |
+
msgstr "Configura le notifiche email di sicurezza,"
|
577 |
+
|
578 |
+
#: classes/Views/EmailNotifications.php:121
|
579 |
+
msgid "Configure email notifications via a user friendly wizard,"
|
580 |
+
msgstr "Configura le notifiche email tramite una procedura guidata intuitiva,"
|
581 |
+
|
582 |
+
#: classes/Views/EmailNotifications.php:122
|
583 |
+
msgid "Edit and create your own templates for email notifications,"
|
584 |
+
msgstr "Modifica e crea i tuoi modelli per le notifiche email,"
|
585 |
+
|
586 |
+
#: classes/Views/EmailNotifications.php:123 classes/Views/ExternalDB.php:122
|
587 |
+
#: classes/Views/LogInUsers.php:124 classes/Views/Search.php:123
|
588 |
+
msgid "& more."
|
589 |
+
msgstr "e altro ancora."
|
590 |
+
|
591 |
+
#: classes/Views/EmailNotifications.php:163 classes/Views/ExternalDB.php:162
|
592 |
+
#: classes/Views/LogInUsers.php:164 classes/Views/Reports.php:163
|
593 |
+
#: classes/Views/Search.php:163
|
594 |
+
msgid "Screenshots"
|
595 |
+
msgstr "Schermate"
|
596 |
+
|
597 |
+
#: classes/Views/EmailNotifications.php:168
|
598 |
+
#: classes/Views/EmailNotifications.php:169
|
599 |
+
msgid ""
|
600 |
+
"Use the trigger builder to configure any type of email notification so you "
|
601 |
+
"are instantly alerted of important changes on your WordPress."
|
602 |
+
msgstr ""
|
603 |
+
"Usa il generatore di trigger per configurare qualsiasi tipo di notifica "
|
604 |
+
"email in modo da essere immediatamente avvisato di importanti cambiamenti."
|
605 |
+
|
606 |
+
#: classes/Views/EmailNotifications.php:175
|
607 |
+
#: classes/Views/EmailNotifications.php:176
|
608 |
+
msgid ""
|
609 |
+
"Use the wizard to easily get started and quickly configure basic email "
|
610 |
+
"notifications."
|
611 |
+
msgstr ""
|
612 |
+
"Usa la procedura guidata per iniziare facilmente e configurare rapidamente "
|
613 |
+
"le notifiche email di base."
|
614 |
+
|
615 |
+
#: classes/Views/ExternalDB.php:28
|
616 |
+
msgid "External DB Add-On"
|
617 |
+
msgstr "Add-on DB esterno"
|
618 |
+
|
619 |
+
#: classes/Views/ExternalDB.php:42
|
620 |
+
msgid "DB & Integrations ⇪"
|
621 |
+
msgstr "DB e Integrazioni ⇪"
|
622 |
+
|
623 |
+
#: classes/Views/ExternalDB.php:112
|
624 |
+
msgid "External DB"
|
625 |
+
msgstr "DB esterno"
|
626 |
+
|
627 |
+
#: classes/Views/ExternalDB.php:118
|
628 |
+
msgid ""
|
629 |
+
"Move the audit log to an external database for improved security & "
|
630 |
+
"performance,"
|
631 |
+
msgstr ""
|
632 |
+
"Sposta il log di audit su un database esterno per migliorare sicurezza e "
|
633 |
+
"prestazioni,"
|
634 |
+
|
635 |
+
#: classes/Views/ExternalDB.php:119
|
636 |
+
msgid "Centralize the audit log in your centralized logging system,"
|
637 |
+
msgstr "Centralizza il log di audit nel tuo sistema di logging centralizzato,"
|
638 |
+
|
639 |
+
#: classes/Views/ExternalDB.php:120
|
640 |
+
msgid "Mirror the audit trail to Syslog, Papertrail etc,"
|
641 |
+
msgstr "Effettua mirror del trail di audit su Syslog, Papertrail, ecc,"
|
642 |
+
|
643 |
+
#: classes/Views/ExternalDB.php:121
|
644 |
+
msgid ""
|
645 |
+
"Configure archiving rules to archive old events in an archiving database,"
|
646 |
+
msgstr ""
|
647 |
+
"Configura le regole di archiviazione per archiviare vecchi eventi in un "
|
648 |
+
"database di archiviazione,"
|
649 |
+
|
650 |
+
#: classes/Views/ExternalDB.php:167 classes/Views/ExternalDB.php:168
|
651 |
+
msgid ""
|
652 |
+
"Configure an external database so the WordPress audit trail is stored on it "
|
653 |
+
"instead of the WordPress database."
|
654 |
+
msgstr ""
|
655 |
+
"Configura un database esterno in modo che l'audit trail di WordPress sia "
|
656 |
+
"memorizzato su di esso anziché sul database di WordPress."
|
657 |
+
|
658 |
+
#: classes/Views/ExternalDB.php:174 classes/Views/ExternalDB.php:175
|
659 |
+
msgid ""
|
660 |
+
"Configure mirroring to keep a secondary copy of the WordPress audit trail on "
|
661 |
+
"Syslog, Papertrail etc."
|
662 |
+
msgstr ""
|
663 |
+
"Configura il mirroring per conservare una copia secondaria del percorso di "
|
664 |
+
"audit trail di WordPress su Syslog, Papertrail, ecc."
|
665 |
+
|
666 |
+
#: classes/Views/Help.php:30 classes/Views/Help.php:44
|
667 |
+
#: classes/Views/Help.php:86
|
668 |
+
msgid "Help"
|
669 |
+
msgstr "Guida"
|
670 |
+
|
671 |
+
#: classes/Views/Help.php:88 classes/Views/Help.php:165
|
672 |
+
msgid "System Info"
|
673 |
+
msgstr "Info Sistema"
|
674 |
+
|
675 |
+
#: classes/Views/Help.php:97
|
676 |
+
msgid "Getting Started"
|
677 |
+
msgstr "Guida introduttiva"
|
678 |
+
|
679 |
+
#: classes/Views/Help.php:99
|
680 |
+
msgid ""
|
681 |
+
"Getting started with WP Security Audit Log is really easy; once the plugin "
|
682 |
+
"is installed it will automatically keep a log of everything that is "
|
683 |
+
"happening on your website and you do not need to do anything. Watch the "
|
684 |
+
"video below for a quick overview of the plugin."
|
685 |
+
msgstr ""
|
686 |
+
"Iniziare con WP Security Audit Log è davvero semplice; una volta installato "
|
687 |
+
"il plugin, conserverà automaticamente un log di tutto ciò che sta accadendo "
|
688 |
+
"sul tuo sito web e non dovrai fare nulla. Guarda il video sotto per una "
|
689 |
+
"rapida panoramica del plugin."
|
690 |
+
|
691 |
+
#: classes/Views/Help.php:108
|
692 |
+
msgid "Plugin Support"
|
693 |
+
msgstr "Supporto plugin"
|
694 |
+
|
695 |
+
#: classes/Views/Help.php:110
|
696 |
+
msgid ""
|
697 |
+
"Have you encountered or noticed any issues while using WP Security Audit Log "
|
698 |
+
"plugin?"
|
699 |
+
msgstr ""
|
700 |
+
"Avete avuto, o notato, problemi utilizzando il plugin WP Security Audit Log?"
|
701 |
+
|
702 |
+
#: classes/Views/Help.php:111
|
703 |
+
msgid ""
|
704 |
+
"Or you want to report something to us? Click any of the options below to "
|
705 |
+
"post on the plugin's forum or contact our support directly."
|
706 |
+
msgstr ""
|
707 |
+
"O volete comunicarci qualcosa? Selezionate una delle seguenti opzioni per "
|
708 |
+
"pubblicare sul forum del plugin, o contattate direttamente il nostro "
|
709 |
+
"supporto."
|
710 |
+
|
711 |
+
#: classes/Views/Help.php:113
|
712 |
+
msgid "Free Support Forum"
|
713 |
+
msgstr "Forum di supporto gratuito"
|
714 |
+
|
715 |
+
#: classes/Views/Help.php:115
|
716 |
+
msgid "Free Support Email"
|
717 |
+
msgstr "Email di supporto gratuito"
|
718 |
+
|
719 |
+
#: classes/Views/Help.php:121
|
720 |
+
msgid "Plugin Documentation"
|
721 |
+
msgstr "Documentazione plugin"
|
722 |
+
|
723 |
+
#: classes/Views/Help.php:123
|
724 |
+
msgid ""
|
725 |
+
"For more technical information about the WP Security Audit Log plugin please "
|
726 |
+
"visit the plugin’s knowledge base."
|
727 |
+
msgstr ""
|
728 |
+
"Per informazioni più dettagliate su WP Security Audit Log visita la "
|
729 |
+
"knowledge base del plugin."
|
730 |
+
|
731 |
+
#: classes/Views/Help.php:124
|
732 |
+
msgid ""
|
733 |
+
"Refer to the list of WordPress security events for a complete list of Events "
|
734 |
+
"and IDs that the plugin uses to keep a log of all the changes in the "
|
735 |
+
"WordPress audit log."
|
736 |
+
msgstr ""
|
737 |
+
"Fai riferimento all'elenco degli eventi di sicurezza di WordPress per un "
|
738 |
+
"elenco completo di eventi e ID che il plugin utilizza per memorizzare tutte "
|
739 |
+
"le modifiche nel log di audit di WordPress."
|
740 |
+
|
741 |
+
#: classes/Views/Help.php:126
|
742 |
+
msgid "Plugin Website"
|
743 |
+
msgstr "Sito web del plugin"
|
744 |
+
|
745 |
+
#: classes/Views/Help.php:128
|
746 |
+
msgid "Knowledge Base"
|
747 |
+
msgstr "Knowledge Base"
|
748 |
+
|
749 |
+
#: classes/Views/Help.php:130
|
750 |
+
msgid "List of WordPress Security Events"
|
751 |
+
msgstr "Elenco degli eventi di sicurezza di Wordpress"
|
752 |
+
|
753 |
+
#: classes/Views/Help.php:136
|
754 |
+
msgid "Rate WP Security Audit Log"
|
755 |
+
msgstr "Valuta WP Security Audit Log"
|
756 |
+
|
757 |
+
#: classes/Views/Help.php:138
|
758 |
+
msgid ""
|
759 |
+
"We work really hard to deliver a plugin that enables you to keep a record of "
|
760 |
+
"all the changes that are happening on your WordPress."
|
761 |
+
msgstr ""
|
762 |
+
"Lavoriamo duramente per fornire un plugin che permetta di tenere traccia di "
|
763 |
+
"tutti i cambiamenti che stanno avvenendo sul tuo WordPress."
|
764 |
+
|
765 |
+
#: classes/Views/Help.php:139
|
766 |
+
msgid ""
|
767 |
+
"It takes thousands of man-hours every year and endless amount of dedication "
|
768 |
+
"to research, develop and maintain the free edition of WP Security Audit Log."
|
769 |
+
msgstr ""
|
770 |
+
"Occorrono migliaia di ore uomo ogni anno e una quantità infinita di "
|
771 |
+
"dedizione per la ricerca, lo sviluppo e la manutenzione della versione "
|
772 |
+
"gratuita di WP Security Audit Log."
|
773 |
+
|
774 |
+
#: classes/Views/Help.php:140
|
775 |
+
msgid ""
|
776 |
+
"Therefore if you like what you see, and find WP Security Audit Log useful we "
|
777 |
+
"ask you nothing more than to please rate our plugin."
|
778 |
+
msgstr ""
|
779 |
+
"Di conseguenza, se ti piace ciò che vedi e trovi utile WP Security Audit "
|
780 |
+
"Log, non ti chiediamo altro che votarlo."
|
781 |
+
|
782 |
+
#: classes/Views/Help.php:141
|
783 |
+
msgid "We appreciate every star!"
|
784 |
+
msgstr "Apprezziamo ogni stella!"
|
785 |
+
|
786 |
+
#: classes/Views/Help.php:151
|
787 |
+
msgid "Rate Plugin"
|
788 |
+
msgstr "Valuta Plugin"
|
789 |
+
|
790 |
+
#: classes/Views/Help.php:192
|
791 |
+
msgid "See who is logged in"
|
792 |
+
msgstr "Scopri chi è connesso"
|
793 |
+
|
794 |
+
#: classes/Views/Help.php:193
|
795 |
+
msgid "And remotely terminate sessions"
|
796 |
+
msgstr "E termina da remoto le sessioni"
|
797 |
+
|
798 |
+
#: classes/Views/Help.php:196
|
799 |
+
msgid "Generate reports"
|
800 |
+
msgstr "Genera i report"
|
801 |
+
|
802 |
+
#: classes/Views/Help.php:197
|
803 |
+
msgid "Or configure automated email reports"
|
804 |
+
msgstr "O configura i report email automatizzati"
|
805 |
+
|
806 |
+
#: classes/Views/Help.php:200
|
807 |
+
msgid "Configure email notifications"
|
808 |
+
msgstr "Configura notifiche email"
|
809 |
+
|
810 |
+
#: classes/Views/Help.php:201
|
811 |
+
msgid "Get instantly notified of important changes"
|
812 |
+
msgstr "Vieni immediatamente avvisato di importanti cambiamenti"
|
813 |
+
|
814 |
+
#: classes/Views/Help.php:204
|
815 |
+
msgid "Add Search"
|
816 |
+
msgstr "Aggiungi Cerca"
|
817 |
+
|
818 |
+
#: classes/Views/Help.php:205
|
819 |
+
msgid "Easily track down suspicious behaviour"
|
820 |
+
msgstr "Traccia facilmente comportamenti sospetti"
|
821 |
+
|
822 |
+
#: classes/Views/Help.php:208
|
823 |
+
msgid "Integrate & Centralise"
|
824 |
+
msgstr "Integra e centralizza"
|
825 |
+
|
826 |
+
#: classes/Views/Help.php:209
|
827 |
+
msgid "Export the logs to your centralised logging system"
|
828 |
+
msgstr "Esporta i log nel tuo sistema di logging centralizzato"
|
829 |
+
|
830 |
+
#: classes/Views/Licensing.php:28 classes/Views/Licensing.php:42
|
831 |
+
msgid "Licensing"
|
832 |
+
msgstr "Gestione licenze"
|
833 |
+
|
834 |
+
#: classes/Views/Licensing.php:96 classes/Views/Settings.php:341
|
835 |
+
#: classes/Views/ToggleAlerts.php:144
|
836 |
+
msgid "Settings have been saved."
|
837 |
+
msgstr "Le impostazioni sono state salvate."
|
838 |
+
|
839 |
+
#: classes/Views/Licensing.php:101 classes/Views/Settings.php:346
|
840 |
+
#: classes/Views/ToggleAlerts.php:150
|
841 |
+
msgid "Error: "
|
842 |
+
msgstr "Errore: "
|
843 |
+
|
844 |
+
#: classes/Views/Licensing.php:114 classes/Views/Licensing.php:154
|
845 |
+
msgid "License"
|
846 |
+
msgstr "Licenza"
|
847 |
+
|
848 |
+
#: classes/Views/Licensing.php:129
|
849 |
+
msgid "Version"
|
850 |
+
msgstr "Versione"
|
851 |
+
|
852 |
+
#: classes/Views/Licensing.php:141
|
853 |
+
msgid "Active"
|
854 |
+
msgstr "Attivo"
|
855 |
+
|
856 |
+
#: classes/Views/Licensing.php:143
|
857 |
+
msgid "Inactive"
|
858 |
+
msgstr "Inattivo"
|
859 |
+
|
860 |
+
#: classes/Views/LogInUsers.php:28
|
861 |
+
msgid "User Sessions Management Add-On"
|
862 |
+
msgstr "Add-On per la gestione delle sessioni utente"
|
863 |
+
|
864 |
+
#: classes/Views/LogInUsers.php:42
|
865 |
+
msgid "Logged In Users ⇪"
|
866 |
+
msgstr "Utenti autenticati ⇪"
|
867 |
+
|
868 |
+
#: classes/Views/LogInUsers.php:112
|
869 |
+
msgid "Users Login and Management"
|
870 |
+
msgstr "Login Utente e gestione"
|
871 |
+
|
872 |
+
#: classes/Views/LogInUsers.php:118
|
873 |
+
msgid "See who is logged in to your WordPress website,"
|
874 |
+
msgstr "Mostra chi è autenticato al vostro sito Wordpress,"
|
875 |
+
|
876 |
+
#: classes/Views/LogInUsers.php:119
|
877 |
+
msgid "When they logged in and from where,"
|
878 |
+
msgstr "Quando è stato effettuato l'accesso e da dove,"
|
879 |
+
|
880 |
+
#: classes/Views/LogInUsers.php:120
|
881 |
+
msgid "The last change they did on your WordPress website,"
|
882 |
+
msgstr "L'ultimo cambiamento compiuto sul tuo sito Web WordPress,"
|
883 |
+
|
884 |
+
#: classes/Views/LogInUsers.php:121
|
885 |
+
msgid "Terminate their session with just a click of a button,"
|
886 |
+
msgstr "Termina la sessione con un semplice clic di un pulsante,"
|
887 |
+
|
888 |
+
#: classes/Views/LogInUsers.php:122
|
889 |
+
msgid "Block multiple sessions for the same user,"
|
890 |
+
msgstr "Blocca sessioni multiple per lo stesso utente,"
|
891 |
+
|
892 |
+
#: classes/Views/LogInUsers.php:123
|
893 |
+
msgid "Get alerted when there are multiple sessions with the same username,"
|
894 |
+
msgstr ""
|
895 |
+
"Ricevi un avviso quando ci sono sessioni multiple con lo stesso nome utente,"
|
896 |
+
|
897 |
+
#: classes/Views/LogInUsers.php:169 classes/Views/LogInUsers.php:170
|
898 |
+
msgid ""
|
899 |
+
"See who is logged in to your WordPress website and WordPress multisite "
|
900 |
+
"network."
|
901 |
+
msgstr "Mostra chi è autenticato al tuo sito e alla rete multisite."
|
902 |
+
|
903 |
+
#: classes/Views/LogInUsers.php:176 classes/Views/LogInUsers.php:177
|
904 |
+
msgid ""
|
905 |
+
"Block multiple sessions for the same user and configure related email "
|
906 |
+
"notifications."
|
907 |
+
msgstr ""
|
908 |
+
"Blocca sessioni multiple per lo stesso utente e configura le relative "
|
909 |
+
"notifiche email."
|
910 |
+
|
911 |
+
#: classes/Views/Reports.php:28
|
912 |
+
msgid "Reports Add-On"
|
913 |
+
msgstr "Add-On dei report"
|
914 |
+
|
915 |
+
#: classes/Views/Reports.php:42
|
916 |
+
msgid "Reports ⇪"
|
917 |
+
msgstr "Report ⇪"
|
918 |
+
|
919 |
+
#: classes/Views/Reports.php:112
|
920 |
+
msgid "Reports"
|
921 |
+
msgstr "Reports"
|
922 |
+
|
923 |
+
#: classes/Views/Reports.php:118
|
924 |
+
msgid ""
|
925 |
+
"Generate user activity, site (in multisite) and any other type of WordPress "
|
926 |
+
"reports,"
|
927 |
+
msgstr ""
|
928 |
+
"Genera attività utente, sito (in multisito) e qualsiasi altro tipo di report "
|
929 |
+
"di WordPress,"
|
930 |
+
|
931 |
+
#: classes/Views/Reports.php:119
|
932 |
+
msgid "Configure automated daily, weekly, monthly & quarterly reports,"
|
933 |
+
msgstr ""
|
934 |
+
"Configura report automatizzati giornalieri, settimanali, mensili e "
|
935 |
+
"trimestrali,"
|
936 |
+
|
937 |
+
#: classes/Views/Reports.php:120
|
938 |
+
msgid "Receive reports automatically in your email,"
|
939 |
+
msgstr "Ricevi i report automaticamente nella tua email,"
|
940 |
+
|
941 |
+
#: classes/Views/Reports.php:121
|
942 |
+
msgid ""
|
943 |
+
"Generate statistics reports on commonly used IP addresses, views per user, "
|
944 |
+
"etc,"
|
945 |
+
msgstr ""
|
946 |
+
"Generare report statistici su indirizzi IP di uso comune, visualizzazioni "
|
947 |
+
"per utente, ecc.,"
|
948 |
+
|
949 |
+
#: classes/Views/Reports.php:122
|
950 |
+
msgid "Export reports to HTML and CSV formats,"
|
951 |
+
msgstr "Esporta i report in formato HTML e CSV,"
|
952 |
+
|
953 |
+
#: classes/Views/Reports.php:123
|
954 |
+
msgid "& much more."
|
955 |
+
msgstr "e molto altro."
|
956 |
+
|
957 |
+
#: classes/Views/Reports.php:168 classes/Views/Reports.php:169
|
958 |
+
msgid ""
|
959 |
+
"Generate any type of report and also configure daily, weekly, monthly and "
|
960 |
+
"quarterly reports which are automatically sent to you via email."
|
961 |
+
msgstr ""
|
962 |
+
"Genera qualsiasi tipo di report e configura anche report giornalieri, "
|
963 |
+
"settimanali, mensili e trimestrali che ti vengono inviati automaticamente "
|
964 |
+
"via email."
|
965 |
+
|
966 |
+
#: classes/Views/Reports.php:175 classes/Views/Reports.php:176
|
967 |
+
msgid ""
|
968 |
+
"Generate statistical reports to get a better overview of what users are "
|
969 |
+
"doing on your WordPress and WordPress multisite network are doing."
|
970 |
+
msgstr ""
|
971 |
+
"Genera rapporti statistici per avere una panoramica migliore di ciò che "
|
972 |
+
"fanno gli utenti sulla tua rete multisito WordPress."
|
973 |
+
|
974 |
+
#: classes/Views/Search.php:28
|
975 |
+
msgid "Search Add-On"
|
976 |
+
msgstr "Add-On di ricerca"
|
977 |
+
|
978 |
+
#: classes/Views/Search.php:42
|
979 |
+
msgid "Search ⇪"
|
980 |
+
msgstr "Cerca ⇪"
|
981 |
+
|
982 |
+
#: classes/Views/Search.php:112
|
983 |
+
msgid "Search"
|
984 |
+
msgstr "Cerca"
|
985 |
+
|
986 |
+
#: classes/Views/Search.php:118
|
987 |
+
msgid ""
|
988 |
+
"Easily find and track back a specific change or suspicious user behaviour,"
|
989 |
+
msgstr ""
|
990 |
+
"Trova facilmente e rintraccia una modifica specifica o un comportamento "
|
991 |
+
"sospetto dell'utente,"
|
992 |
+
|
993 |
+
#: classes/Views/Search.php:119
|
994 |
+
msgid "Easily find the root of a problem to ease troubleshooting,"
|
995 |
+
msgstr ""
|
996 |
+
"Trova facilmente la radice di un problema per facilitarne la risoluzione,"
|
997 |
+
|
998 |
+
#: classes/Views/Search.php:120
|
999 |
+
msgid "Do free-text based searches in the WordPress audit log,"
|
1000 |
+
msgstr "Effettua ricerche testuali semplici nel log di audit WordPress,"
|
1001 |
+
|
1002 |
+
#: classes/Views/Search.php:121
|
1003 |
+
msgid "Use filters to fine tune the search results,"
|
1004 |
+
msgstr "Usa i filtri per affinare i risultati di ricerca,"
|
1005 |
+
|
1006 |
+
#: classes/Views/Search.php:122
|
1007 |
+
msgid "Save search terms & filters for improved productivity,"
|
1008 |
+
msgstr "Salva termini e filtri di ricerca per migliorare la produttività,"
|
1009 |
+
|
1010 |
+
#: classes/Views/Search.php:168 classes/Views/Search.php:169
|
1011 |
+
msgid ""
|
1012 |
+
"Use the free-text based search to find a specific change and use the filters "
|
1013 |
+
"to fine tune the search results."
|
1014 |
+
msgstr ""
|
1015 |
+
"Usa le ricerche testuali semplici per trovare una particolare modifica e usa "
|
1016 |
+
"i filtri per perfezionare i risultati delle ricerche."
|
1017 |
+
|
1018 |
+
#: classes/Views/Settings.php:79
|
1019 |
+
msgid "General"
|
1020 |
+
msgstr "Generale"
|
1021 |
+
|
1022 |
+
#: classes/Views/Settings.php:85
|
1023 |
+
msgid "Activity Log"
|
1024 |
+
msgstr "Log attività"
|
1025 |
+
|
1026 |
+
#: classes/Views/Settings.php:91
|
1027 |
+
msgid "File Integrity Scan"
|
1028 |
+
msgstr "Scansione integrità file"
|
1029 |
+
|
1030 |
+
#: classes/Views/Settings.php:97 classes/Views/SetupWizard.php:148
|
1031 |
+
msgid "Exclude Objects"
|
1032 |
+
msgstr "Escludi oggetti"
|
1033 |
+
|
1034 |
+
#: classes/Views/Settings.php:103
|
1035 |
+
msgid "Advanced Settings"
|
1036 |
+
msgstr "Impostazioni avanzate"
|
1037 |
+
|
1038 |
+
#: classes/Views/Settings.php:144 classes/Views/Settings.php:158
|
1039 |
+
#: classes/Views/ToggleAlerts.php:432 classes/Views/ToggleAlerts.php:456
|
1040 |
+
msgid "Settings"
|
1041 |
+
msgstr "Impostazioni"
|
1042 |
+
|
1043 |
+
#: classes/Views/Settings.php:214
|
1044 |
+
msgid "Unknown settings tab."
|
1045 |
+
msgstr "Scheda impostazioni sconosciute."
|
1046 |
+
|
1047 |
+
#: classes/Views/Settings.php:226 classes/Views/Settings.php:2500
|
1048 |
+
#: classes/Views/Settings.php:2529 classes/Views/SetupWizard.php:66
|
1049 |
+
msgid "Access Denied."
|
1050 |
+
msgstr "Accesso negato."
|
1051 |
+
|
1052 |
+
#: classes/Views/Settings.php:251 classes/Views/SetupWizard.php:91
|
1053 |
+
msgid "Invalid input."
|
1054 |
+
msgstr "Input non valido."
|
1055 |
+
|
1056 |
+
#: classes/Views/Settings.php:354
|
1057 |
+
msgid "Old data successfully purged."
|
1058 |
+
msgstr "Vecchi dati eliminati con successo."
|
1059 |
+
|
1060 |
+
#: classes/Views/Settings.php:360
|
1061 |
+
msgid "No data is old enough to be purged."
|
1062 |
+
msgstr "Nessun dato è abbastanza vecchio da essere eliminato."
|
1063 |
+
|
1064 |
+
#: classes/Views/Settings.php:443
|
1065 |
+
msgid ""
|
1066 |
+
"Need help with setting up the plugin to meet your requirements? <a href="
|
1067 |
+
"\"https://www.wpsecurityauditlog.com/contact/\" target=\"_blank\">Schedule a "
|
1068 |
+
"20 minutes consultation and setup call</a> with our experts for just $50."
|
1069 |
+
msgstr ""
|
1070 |
+
"Hai bisogno di aiuto con la configurazione del plugin per soddisfare le tue "
|
1071 |
+
"esigenze? <a href=\"https://www.wpsecurityauditlog.com/contact/\" target="
|
1072 |
+
"\"_blank\">Pianifica una consulenza di 20 minuti e fissa un appuntamento </"
|
1073 |
+
"a> con i nostri esperti per soli $50."
|
1074 |
+
|
1075 |
+
#: classes/Views/Settings.php:445
|
1076 |
+
msgid "Display latest events widget in Dashboard & Admin bar"
|
1077 |
+
msgstr ""
|
1078 |
+
"Visualizza il widget degli eventi più recenti nella bacheca e barra "
|
1079 |
+
"amministrazione"
|
1080 |
+
|
1081 |
+
#. translators: Max number of dashboard widget alerts.
|
1082 |
+
#: classes/Views/Settings.php:450
|
1083 |
+
#, php-format
|
1084 |
+
msgid ""
|
1085 |
+
"The events widget displays the latest %d security events in the dashboard "
|
1086 |
+
"and the admin bar notification displays the latest event."
|
1087 |
+
msgstr ""
|
1088 |
+
"Il widget eventi visualizza gli ultimi %d eventi di sicurezza nella bacheca "
|
1089 |
+
"e la notifica sulla barra di amministrazione mostra l'ultimo evento."
|
1090 |
+
|
1091 |
+
#: classes/Views/Settings.php:458
|
1092 |
+
msgid "Dashboard Widget"
|
1093 |
+
msgstr "Widget bacheca"
|
1094 |
+
|
1095 |
+
#: classes/Views/Settings.php:479
|
1096 |
+
msgid "Admin Bar Notification"
|
1097 |
+
msgstr "Notifiche barra amministrazione"
|
1098 |
+
|
1099 |
+
#: classes/Views/Settings.php:482
|
1100 |
+
msgid "Admin Bar Notification (Premium)"
|
1101 |
+
msgstr "Notifiche barra amministrazione (Premium)"
|
1102 |
+
|
1103 |
+
#: classes/Views/Settings.php:506
|
1104 |
+
msgid "Admin Bar Notification Updates"
|
1105 |
+
msgstr "Aggiornamento notifiche barra amministrazione"
|
1106 |
+
|
1107 |
+
#: classes/Views/Settings.php:509
|
1108 |
+
msgid "Admin Bar Notification Updates (Premium)"
|
1109 |
+
msgstr "Aggiornamento notifiche barra amministrazione (Premium)"
|
1110 |
+
|
1111 |
+
#: classes/Views/Settings.php:518
|
1112 |
+
msgid "Update in near real time"
|
1113 |
+
msgstr "Aggiornamento quasi in tempo reale"
|
1114 |
+
|
1115 |
+
#: classes/Views/Settings.php:523
|
1116 |
+
msgid "Update only on page refreshes"
|
1117 |
+
msgstr "Aggiorna solo la pagina più recente"
|
1118 |
+
|
1119 |
+
#: classes/Views/Settings.php:533
|
1120 |
+
msgid "Add user notification on the WordPress login page"
|
1121 |
+
msgstr "Aggiungi notifica utente sulla pagina di accesso di WordPress"
|
1122 |
+
|
1123 |
+
#: classes/Views/Settings.php:534
|
1124 |
+
msgid ""
|
1125 |
+
"Many compliance regulations (such as the GDRP) require website "
|
1126 |
+
"administrators to tell the users of their website that all the changes they "
|
1127 |
+
"do when logged in are being logged."
|
1128 |
+
msgstr ""
|
1129 |
+
"Molte norme di conformità (come il GDRP) richiedono agli amministratori del "
|
1130 |
+
"sito Web di comunicare agli utenti del proprio sito Web che tutte le "
|
1131 |
+
"modifiche apportate al momento dell'iscrizione vengano memorizzate."
|
1132 |
+
|
1133 |
+
#: classes/Views/Settings.php:538
|
1134 |
+
msgid "Login Page Notification"
|
1135 |
+
msgstr "Notifica pagina login"
|
1136 |
+
|
1137 |
+
#: classes/Views/Settings.php:563 wp-security-audit-log.php:1545
|
1138 |
+
msgid ""
|
1139 |
+
"For security and auditing purposes, a record of all of your logged-in "
|
1140 |
+
"actions and changes within the WordPress dashboard will be recorded in an "
|
1141 |
+
"audit log with the <a href=\"https://www.wpsecurityauditlog.com/\" target="
|
1142 |
+
"\"_blank\">WP Security Audit Log plugin</a>. The audit log also includes the "
|
1143 |
+
"IP address where you accessed this site from."
|
1144 |
+
msgstr ""
|
1145 |
+
"Ai fini della sicurezza e del controllo, una registrazione di tutte le "
|
1146 |
+
"azioni e modifiche apportate all'interno della bacheca di WordPress verrà "
|
1147 |
+
"registrata in un log di audit con il <a href=\"https://www."
|
1148 |
+
"wpsecurityauditlog.com/\" target=\" _blank \"> plugin WP Security Audit Log "
|
1149 |
+
"</a>. Il log di audit include anche l'indirizzo IP da cui è stato effettuato "
|
1150 |
+
"l'accesso a questo sito."
|
1151 |
+
|
1152 |
+
#: classes/Views/Settings.php:581
|
1153 |
+
msgid "<strong>Note: </strong>"
|
1154 |
+
msgstr "<strong>Nota: </strong>"
|
1155 |
+
|
1156 |
+
#: classes/Views/Settings.php:581
|
1157 |
+
msgid ""
|
1158 |
+
"The only HTML code allowed in the login page notification is for links ( < a "
|
1159 |
+
"href >< /a > )."
|
1160 |
+
msgstr ""
|
1161 |
+
"L'unico codice HTML consentito nella notifica della pagina di login è per i "
|
1162 |
+
"collegamenti ( < a href > < /a > )."
|
1163 |
+
|
1164 |
+
#: classes/Views/Settings.php:597
|
1165 |
+
msgid "Is your website running behind a firewall or reverse proxy?"
|
1166 |
+
msgstr "WordPress viene eseguito dietro un firewall o reverse proxy?"
|
1167 |
+
|
1168 |
+
#. translators: Learn more link.
|
1169 |
+
#: classes/Views/Settings.php:602
|
1170 |
+
#, php-format
|
1171 |
+
msgid ""
|
1172 |
+
"If your website is running behind a firewall set this option to yes so the "
|
1173 |
+
"plugin retrieves the end user’s IP address from the proxy header - %s."
|
1174 |
+
msgstr ""
|
1175 |
+
"Se il tuo sito web è in esecuzione dietro un firewall, imposta questa "
|
1176 |
+
"opzione su sì in modo che il plugin recuperi l'indirizzo IP dell'utente "
|
1177 |
+
"finale dall'intestazione del proxy - %s."
|
1178 |
+
|
1179 |
+
#: classes/Views/Settings.php:603
|
1180 |
+
msgid "learn more"
|
1181 |
+
msgstr "maggiori informazioni"
|
1182 |
+
|
1183 |
+
#: classes/Views/Settings.php:610
|
1184 |
+
msgid "Reverse Proxy / Firewall Options"
|
1185 |
+
msgstr "Reverse Proxy / Opzioni Firewall"
|
1186 |
+
|
1187 |
+
#: classes/Views/Settings.php:620
|
1188 |
+
msgid ""
|
1189 |
+
"Filter internal IP addresses from the proxy headers. Enable this option only "
|
1190 |
+
"if you are\tare still seeing the internal IP addresses of the firewall or "
|
1191 |
+
"proxy."
|
1192 |
+
msgstr ""
|
1193 |
+
"Filtra gli indirizzi IP interni dalle intestazioni proxy. Abilita questa "
|
1194 |
+
"opzione solo se stai ancora vedendo gli indirizzi IP interni del firewall o "
|
1195 |
+
"del proxy."
|
1196 |
+
|
1197 |
+
#: classes/Views/Settings.php:636
|
1198 |
+
msgid "Who can change the plugin settings?"
|
1199 |
+
msgstr "Chi può cambiare le impostazioni del plugin?"
|
1200 |
+
|
1201 |
+
#: classes/Views/Settings.php:637
|
1202 |
+
msgid ""
|
1203 |
+
"By default only users with administrator or super administrator (multisite) "
|
1204 |
+
"roles can change the settings of the plugin. Though you can change these "
|
1205 |
+
"privileges from this section."
|
1206 |
+
msgstr ""
|
1207 |
+
"Per default, solo gli utenti con ruoli di amministratore o super "
|
1208 |
+
"amministratore (multisito) possono modificare le impostazioni del plugin. "
|
1209 |
+
"Ciononostante è possibile cambiare questi privilegi da questa sezione."
|
1210 |
+
|
1211 |
+
#: classes/Views/Settings.php:641
|
1212 |
+
msgid "Restrict Plugin Access"
|
1213 |
+
msgstr "Limita accesso al plugin"
|
1214 |
+
|
1215 |
+
#: classes/Views/Settings.php:647
|
1216 |
+
msgid "Only me"
|
1217 |
+
msgstr "Solo io"
|
1218 |
+
|
1219 |
+
#: classes/Views/Settings.php:652
|
1220 |
+
msgid "Only administrators"
|
1221 |
+
msgstr "Solo amministratori"
|
1222 |
+
|
1223 |
+
#: classes/Views/Settings.php:658
|
1224 |
+
msgid "Only superadmins"
|
1225 |
+
msgstr "Solo superadmin"
|
1226 |
+
|
1227 |
+
#: classes/Views/Settings.php:664
|
1228 |
+
msgid "All these users or users with these roles"
|
1229 |
+
msgstr "Tutti questi utenti o utenti con questi ruoli"
|
1230 |
+
|
1231 |
+
#: classes/Views/Settings.php:666
|
1232 |
+
msgid ""
|
1233 |
+
"Specify the username or the users which can change the plugin settings. You "
|
1234 |
+
"can also specify roles."
|
1235 |
+
msgstr ""
|
1236 |
+
"Specifica il nome utente o gli utenti che possono modificare le impostazioni "
|
1237 |
+
"del plugin. Puoi anche specificare i ruoli."
|
1238 |
+
|
1239 |
+
#: classes/Views/Settings.php:695
|
1240 |
+
msgid "Allow other users to view the activity log"
|
1241 |
+
msgstr "Consenti ad altri utenti di visualizzare il log delle attività"
|
1242 |
+
|
1243 |
+
#: classes/Views/Settings.php:696
|
1244 |
+
msgid ""
|
1245 |
+
"By default only users with administrator and super administrator (multisite) "
|
1246 |
+
"role can view the WordPress activity log. Though you can allow other users "
|
1247 |
+
"with no admin role to view the events."
|
1248 |
+
msgstr ""
|
1249 |
+
"Per impostazione predefinita, solo gli utenti con ruolo di amministratore e "
|
1250 |
+
"super amministratore (multisite) possono visualizzare il log delle attività "
|
1251 |
+
"di WordPress. Tuttavia è possibile permettere ad altri utenti senza ruolo di "
|
1252 |
+
"amministratore di visualizzare gli eventi."
|
1253 |
+
|
1254 |
+
#: classes/Views/Settings.php:700
|
1255 |
+
msgid "Can View Events"
|
1256 |
+
msgstr "Chi può vedere gli avvisi"
|
1257 |
+
|
1258 |
+
#: classes/Views/Settings.php:708
|
1259 |
+
msgid ""
|
1260 |
+
"Specify the username or the users which do not have an admin role but can "
|
1261 |
+
"also see the WordPress activity role. You can also specify roles."
|
1262 |
+
msgstr ""
|
1263 |
+
"Specifica il nome utente o gli utenti che non hanno un ruolo di "
|
1264 |
+
"amministratore ma possono anche vedere il ruolo di attività di WordPress. "
|
1265 |
+
"Puoi anche specificare i ruoli."
|
1266 |
+
|
1267 |
+
#: classes/Views/Settings.php:734
|
1268 |
+
msgid "Which email address should the plugin use as a from address?"
|
1269 |
+
msgstr "Quale indirizzo email dovrebbe utilizzare il plugin come mittente?"
|
1270 |
+
|
1271 |
+
#: classes/Views/Settings.php:735
|
1272 |
+
msgid ""
|
1273 |
+
"By default when the plugin sends an email notification it uses the email "
|
1274 |
+
"address specified in this website’s general settings. Though you can change "
|
1275 |
+
"the email address and display name from this section."
|
1276 |
+
msgstr ""
|
1277 |
+
"Di default, quando il plugin invia una notifica via email, utilizza "
|
1278 |
+
"l'indirizzo email specificato nelle impostazioni generali di questo sito "
|
1279 |
+
"Web. Tuttavia è possibile cambiare l'indirizzo email e il nome visualizzato "
|
1280 |
+
"da questa sezione."
|
1281 |
+
|
1282 |
+
#: classes/Views/Settings.php:739
|
1283 |
+
msgid "From Email & Name"
|
1284 |
+
msgstr "Da Email e Nome"
|
1285 |
+
|
1286 |
+
#: classes/Views/Settings.php:745
|
1287 |
+
msgid "Use the email address from the WordPress general settings"
|
1288 |
+
msgstr "Usa l'indirizzo email dalle impostazioni generali di WordPress"
|
1289 |
+
|
1290 |
+
#: classes/Views/Settings.php:750
|
1291 |
+
msgid "Use another email address"
|
1292 |
+
msgstr "Usa un altro indirizzo email"
|
1293 |
+
|
1294 |
+
#: classes/Views/Settings.php:754
|
1295 |
+
msgid "Email Address"
|
1296 |
+
msgstr "Indirizzo email"
|
1297 |
+
|
1298 |
+
#: classes/Views/Settings.php:759
|
1299 |
+
msgid "Display Name"
|
1300 |
+
msgstr "Mostra nome"
|
1301 |
+
|
1302 |
+
#: classes/Views/Settings.php:770
|
1303 |
+
msgid "Do you want to hide the plugin from the list of installed plugins?"
|
1304 |
+
msgstr "Vuoi nascondere il plugin dalla lista dei plugin installati?"
|
1305 |
+
|
1306 |
+
#: classes/Views/Settings.php:771
|
1307 |
+
msgid ""
|
1308 |
+
"By default all installed plugins are listed in the plugins page. If you do "
|
1309 |
+
"not want other administrators to see that you installed this plugin set this "
|
1310 |
+
"option to Yes so the WP Security Audit Log is not listed as an installed "
|
1311 |
+
"plugin on this website."
|
1312 |
+
msgstr ""
|
1313 |
+
"Di default tutti i plugin installati sono elencati nella pagina dei plugin. "
|
1314 |
+
"Se non vuoi che altri amministratori vedano che hai installato questo "
|
1315 |
+
"plugin, imposta questa opzione su Sì, così WP Security Audit Log non sarà "
|
1316 |
+
"elencato come plugin installato su questo sito."
|
1317 |
+
|
1318 |
+
#: classes/Views/Settings.php:775
|
1319 |
+
msgid "Hide Plugin in Plugins Page"
|
1320 |
+
msgstr "Nascondi plugin nella pagina dei plugin"
|
1321 |
+
|
1322 |
+
#: classes/Views/Settings.php:780
|
1323 |
+
msgid "Yes, hide the plugin from the list of installed plugins"
|
1324 |
+
msgstr "Sì, nascondi il plugin dall'elenco dei plugin installati"
|
1325 |
+
|
1326 |
+
#: classes/Views/Settings.php:785
|
1327 |
+
msgid "No, do not hide the plugin"
|
1328 |
+
msgstr "No, non nascondere il plugin"
|
1329 |
+
|
1330 |
+
#: classes/Views/Settings.php:853
|
1331 |
+
msgid ""
|
1332 |
+
"For how long do you want to keep the activity log events (Retention "
|
1333 |
+
"settings) ?"
|
1334 |
+
msgstr ""
|
1335 |
+
"Per quanto tempo si desidera mantenere gli eventi del log attività "
|
1336 |
+
"(impostazioni di conservazione)?"
|
1337 |
+
|
1338 |
+
#: classes/Views/Settings.php:856
|
1339 |
+
msgid ""
|
1340 |
+
"The plugin uses an efficient way to store the activity log data in the "
|
1341 |
+
"WordPress database, though the more data you keep the more disk space will "
|
1342 |
+
"be required. "
|
1343 |
+
msgstr ""
|
1344 |
+
"Il plugin utilizza un modo efficiente per archiviare i dati del log attività "
|
1345 |
+
"nel database di WordPress, anche se più dati si mantengono, maggiore sarà lo "
|
1346 |
+
"spazio richiesto su disco. "
|
1347 |
+
|
1348 |
+
#: classes/Views/Settings.php:857
|
1349 |
+
msgid ""
|
1350 |
+
"<a href=\"https://www.wpsecurityauditlog.com/pricing/\" target=\"_blank"
|
1351 |
+
"\">Upgrade to Premium</a> to store the activity log data in an external "
|
1352 |
+
"database."
|
1353 |
+
msgstr ""
|
1354 |
+
"<a href=\"https://www.wpsecurityauditlog.com/pricing/\" target=\"_ blank\" "
|
1355 |
+
">Aggiorna a Premium</a> per archiviare i dati del log attività in un "
|
1356 |
+
"database esterno."
|
1357 |
+
|
1358 |
+
#. translators: 1: Archive page link tag. 2: Link closing tag.
|
1359 |
+
#: classes/Views/Settings.php:875
|
1360 |
+
#, php-format
|
1361 |
+
msgid ""
|
1362 |
+
"Retention settings moved to %1$s archiving settings %2$s because archiving "
|
1363 |
+
"is enabled"
|
1364 |
+
msgstr ""
|
1365 |
+
"Impostazioni di conservazione spostate in %1$s impostazioni di archiviazione "
|
1366 |
+
"%2$s perché l'archiviazione è abilitata"
|
1367 |
+
|
1368 |
+
#: classes/Views/Settings.php:882
|
1369 |
+
msgid "Audit Log Retention"
|
1370 |
+
msgstr "Conservazione log di audit"
|
1371 |
+
|
1372 |
+
#: classes/Views/Settings.php:888
|
1373 |
+
msgid "Keep all data"
|
1374 |
+
msgstr "Memorizza fino a"
|
1375 |
+
|
1376 |
+
#: classes/Views/Settings.php:915
|
1377 |
+
msgid "Delete events older than"
|
1378 |
+
msgstr "Elimina avvisi più vecchi di"
|
1379 |
+
|
1380 |
+
#: classes/Views/Settings.php:922
|
1381 |
+
msgid "Months"
|
1382 |
+
msgstr "Mesi"
|
1383 |
+
|
1384 |
+
#: classes/Views/Settings.php:923
|
1385 |
+
msgid "Years"
|
1386 |
+
msgstr "Anni"
|
1387 |
+
|
1388 |
+
#: classes/Views/Settings.php:931
|
1389 |
+
msgid "The next scheduled purging of activity log data that is older than "
|
1390 |
+
msgstr ""
|
1391 |
+
"La successiva eliminazione pianificata dei dati del log attività che sono "
|
1392 |
+
"più vecchi di "
|
1393 |
+
|
1394 |
+
#: classes/Views/Settings.php:938
|
1395 |
+
msgid "You can run the purging process now by clicking the button below."
|
1396 |
+
msgstr ""
|
1397 |
+
"È possibile eseguire il processo di eliminazione ora facendo clic sul "
|
1398 |
+
"pulsante sotto."
|
1399 |
+
|
1400 |
+
#: classes/Views/Settings.php:942
|
1401 |
+
msgid "Purge Old Data"
|
1402 |
+
msgstr "Elimina dati obsoleti"
|
1403 |
+
|
1404 |
+
#: classes/Views/Settings.php:953
|
1405 |
+
msgid "What timestamp you would like to see in the WordPress activity log?"
|
1406 |
+
msgstr "Quale timestamp vorresti vedere nel log delle attività di WordPress?"
|
1407 |
+
|
1408 |
+
#: classes/Views/Settings.php:954
|
1409 |
+
msgid ""
|
1410 |
+
"Note that the WordPress' timezone might be different from that configured on "
|
1411 |
+
"the server so when you switch from UTC to WordPress timezone or vice versa "
|
1412 |
+
"you might notice a big difference."
|
1413 |
+
msgstr ""
|
1414 |
+
"Si noti che il fuso orario di WordPress potrebbe essere diverso da quello "
|
1415 |
+
"configurato sul server, in modo che quando si passa da UTC al fuso orario di "
|
1416 |
+
"WordPress o viceversa, si potrebbe notare una grande differenza."
|
1417 |
+
|
1418 |
+
#: classes/Views/Settings.php:958
|
1419 |
+
msgid "Events Timestamp"
|
1420 |
+
msgstr "Timestamp eventi"
|
1421 |
+
|
1422 |
+
#: classes/Views/Settings.php:978
|
1423 |
+
msgid "UTC"
|
1424 |
+
msgstr "UTC"
|
1425 |
+
|
1426 |
+
#: classes/Views/Settings.php:984
|
1427 |
+
msgid "Timezone configured on this WordPress website"
|
1428 |
+
msgstr "Fuso orario configurato su questo sito WordPress"
|
1429 |
+
|
1430 |
+
#: classes/Views/Settings.php:994
|
1431 |
+
msgid ""
|
1432 |
+
"What user information should be displayed in the WordPress activity log?"
|
1433 |
+
msgstr ""
|
1434 |
+
"Quali informazioni utente devono essere visualizzate nel log delle attività "
|
1435 |
+
"di WordPress?"
|
1436 |
+
|
1437 |
+
#: classes/Views/Settings.php:995
|
1438 |
+
msgid ""
|
1439 |
+
"Usernames might not be the same as a user's first and last name so it can be "
|
1440 |
+
"difficult to recognize whose user was that did a change. When there is no "
|
1441 |
+
"first & last name or public display name configured the plugin will revert "
|
1442 |
+
"back to the WordPress username."
|
1443 |
+
msgstr ""
|
1444 |
+
"I nomi utente potrebbero non essere gli stessi del nome e del cognome "
|
1445 |
+
"dell'utente, quindi può essere difficile riconoscere l'utente che ha "
|
1446 |
+
"apportato un cambiamento. Quando non c'è nessun nome e cognome, o nome "
|
1447 |
+
"pubblico configurato, il plugin tornerà al nome utente di WordPress."
|
1448 |
+
|
1449 |
+
#: classes/Views/Settings.php:999
|
1450 |
+
msgid "User Information in Audit Log"
|
1451 |
+
msgstr "Informazioni utente nel log di audit"
|
1452 |
+
|
1453 |
+
#: classes/Views/Settings.php:1005
|
1454 |
+
msgid "WordPress Username"
|
1455 |
+
msgstr "Nome utente Wordpress"
|
1456 |
+
|
1457 |
+
#: classes/Views/Settings.php:1010
|
1458 |
+
msgid "First Name & Last Name"
|
1459 |
+
msgstr "Nome e Cognome"
|
1460 |
+
|
1461 |
+
#: classes/Views/Settings.php:1015
|
1462 |
+
msgid "Configured Public Display Name"
|
1463 |
+
msgstr "Nome di visualizzazione pubblica configurato"
|
1464 |
+
|
1465 |
+
#: classes/Views/Settings.php:1025
|
1466 |
+
msgid "Select the columns to be displayed in the WordPress activity log"
|
1467 |
+
msgstr "Selezionare le colonne da visualizzare nel log attività di WordPress"
|
1468 |
+
|
1469 |
+
#: classes/Views/Settings.php:1026
|
1470 |
+
msgid ""
|
1471 |
+
"When you deselect a column it won’t be shown in the activity log viewer but "
|
1472 |
+
"the data will still be recorded by the plugin, so when you select it again "
|
1473 |
+
"all the data will be displayed."
|
1474 |
+
msgstr ""
|
1475 |
+
"Quando si deseleziona una colonna non sarà visualizzata nel log viewer del "
|
1476 |
+
"log attività ma i dati saranno comunque registrati dal plugin, così quando "
|
1477 |
+
"la si seleziona di nuovo tutti i dati saranno visualizzati."
|
1478 |
+
|
1479 |
+
#: classes/Views/Settings.php:1030
|
1480 |
+
msgid "Audit Log Columns Selection"
|
1481 |
+
msgstr "Selezione Colonne Audit Log"
|
1482 |
+
|
1483 |
+
#: classes/Views/Settings.php:1043
|
1484 |
+
msgid "Date & Time"
|
1485 |
+
msgstr "Data e Ora"
|
1486 |
+
|
1487 |
+
#: classes/Views/Settings.php:1047
|
1488 |
+
msgid "Source IP Address"
|
1489 |
+
msgstr "IP Origine"
|
1490 |
+
|
1491 |
+
#: classes/Views/Settings.php:1062
|
1492 |
+
msgid "Do you want the activity log viewer to auto refresh?"
|
1493 |
+
msgstr "Si desidera che l'activity log viewer si aggiorni automaticamente?"
|
1494 |
+
|
1495 |
+
#: classes/Views/Settings.php:1063
|
1496 |
+
msgid ""
|
1497 |
+
"The activity log viewer auto refreshes every 30 seconds when opened so you "
|
1498 |
+
"can see the latest events as they happen almost in real time."
|
1499 |
+
msgstr ""
|
1500 |
+
"L'activity log viewer si aggiorna automaticamente ogni 30 secondi "
|
1501 |
+
"all'apertura, in modo da poter vedere gli ultimi eventi che si verificano "
|
1502 |
+
"quasi in tempo reale."
|
1503 |
+
|
1504 |
+
#: classes/Views/Settings.php:1067
|
1505 |
+
msgid "Refresh Audit Log Viewer"
|
1506 |
+
msgstr "Aggiorna Audit Log Viewer"
|
1507 |
+
|
1508 |
+
#: classes/Views/Settings.php:1074
|
1509 |
+
msgid "Auto refresh"
|
1510 |
+
msgstr "Aggiornamento automatico"
|
1511 |
+
|
1512 |
+
#: classes/Views/Settings.php:1080
|
1513 |
+
msgid "Do not auto refresh"
|
1514 |
+
msgstr "Non aggiornare automaticamente"
|
1515 |
+
|
1516 |
+
#: classes/Views/Settings.php:1090
|
1517 |
+
msgid "Do you want to keep a log of WordPress background activity?"
|
1518 |
+
msgstr "Vuoi tenere un log dell'attività in background WordPress?"
|
1519 |
+
|
1520 |
+
#: classes/Views/Settings.php:1092
|
1521 |
+
msgid ""
|
1522 |
+
"WordPress does a lot of things in the background that you do not necessarily "
|
1523 |
+
"need to know about, such as; deletion of post revisions, deletion of auto "
|
1524 |
+
"saved drafts etc. By default the plugin does not report them since there "
|
1525 |
+
"might be a lot and are irrelevant to the user."
|
1526 |
+
msgstr ""
|
1527 |
+
"WordPress fa molte cose in background che non necessariamente hai bisogno di "
|
1528 |
+
"conoscere, come ad esempio: cancellazione di revisioni dei post, "
|
1529 |
+
"cancellazione di bozze salvate automaticamente, ecc. Per impostazione "
|
1530 |
+
"predefinita il plugin non li segnala, dal momento che potrebbero essere "
|
1531 |
+
"parecchi e sono irrilevanti per l'utente."
|
1532 |
+
|
1533 |
+
#: classes/Views/Settings.php:1097
|
1534 |
+
msgid "Enable Events for WordPress Background Activity"
|
1535 |
+
msgstr "Abilita eventi per WordPress Background Activity"
|
1536 |
+
|
1537 |
+
#: classes/Views/Settings.php:1151
|
1538 |
+
msgid ""
|
1539 |
+
"The plugin runs file integrity scans on your website so it keeps a log when "
|
1540 |
+
"a file is added, modified or deleted. All the settings for the file "
|
1541 |
+
"integrity scans can be found in this page."
|
1542 |
+
msgstr ""
|
1543 |
+
"Il plugin esegue scansioni dell'integrità del file sul tuo sito web in modo "
|
1544 |
+
"da mantenere un log quando un file viene aggiunto, modificato o cancellato. "
|
1545 |
+
"Tutte le impostazioni per le scansioni di integrità dei file possono essere "
|
1546 |
+
"trovate in questa pagina."
|
1547 |
+
|
1548 |
+
#: classes/Views/Settings.php:1152
|
1549 |
+
msgid ""
|
1550 |
+
"<a href=\"https://www.wpsecurityauditlog.com/support-documentation/wordpress-"
|
1551 |
+
"files-changes-warning-activity-logs/\" target=\"_blank\">Refer to the "
|
1552 |
+
"WordPress file integrity scans feature page</a> for more information."
|
1553 |
+
msgstr ""
|
1554 |
+
"<a href=\"https://www.wpsecurityauditlog.com/support-documentation/wordpress-"
|
1555 |
+
"files-changes-warning-activity-logs/\" target=\"_blank\">Fai riferimento "
|
1556 |
+
"alla pagina della funzione di scansione dell'integrità dei file WordPress</"
|
1557 |
+
"a> per ulteriori informazioni."
|
1558 |
+
|
1559 |
+
#: classes/Views/Settings.php:1155
|
1560 |
+
msgid "Do you want the plugin to scan your website for file changes?"
|
1561 |
+
msgstr ""
|
1562 |
+
"Vuoi che il plugin analizzi il tuo sito Web per rilevare modifiche ai file?"
|
1563 |
+
|
1564 |
+
#: classes/Views/Settings.php:1160
|
1565 |
+
msgid "Keep a Log of File Changes"
|
1566 |
+
msgstr "Conserva un log delle modifiche ai file"
|
1567 |
+
|
1568 |
+
#: classes/Views/Settings.php:1184
|
1569 |
+
msgid ""
|
1570 |
+
"Which file changes events do you want to keep a log of in the activity log?"
|
1571 |
+
msgstr ""
|
1572 |
+
"Quali eventi di modifica ai file si desidera memorizzare nel log delle "
|
1573 |
+
"attività?"
|
1574 |
+
|
1575 |
+
#: classes/Views/Settings.php:1186
|
1576 |
+
msgid ""
|
1577 |
+
"By default the plugin will keep a log whenever a file has been added, "
|
1578 |
+
"modified or deleted. It will also log an event in the activity log when a "
|
1579 |
+
"file is too big to scan or there are too many files to scan. Click on the "
|
1580 |
+
"link to specify which of these events the plugin should keep a log of."
|
1581 |
+
msgstr ""
|
1582 |
+
"Per impostazione predefinita, il plugin terrà un log ogni volta che un file "
|
1583 |
+
"verrà aggiunto, modificato o cancellato. Memorizzerà anche un evento nel log "
|
1584 |
+
"delle attività quando un file sarà troppo grande per essere digitalizzato, o "
|
1585 |
+
"ci saranno troppi file da analizzare. Fare clic sul link per specificare per "
|
1586 |
+
"quali di questi eventi il plugin dovrebbe tenere un log."
|
1587 |
+
|
1588 |
+
#: classes/Views/Settings.php:1192
|
1589 |
+
msgid "Alert me when"
|
1590 |
+
msgstr "Avvisami quando"
|
1591 |
+
|
1592 |
+
#: classes/Views/Settings.php:1205
|
1593 |
+
msgid "Configure Events"
|
1594 |
+
msgstr "Configura eventi"
|
1595 |
+
|
1596 |
+
#: classes/Views/Settings.php:1214
|
1597 |
+
msgid "When should the plugin scan your website for file changes?"
|
1598 |
+
msgstr ""
|
1599 |
+
"Quando il plugin dovrebbe scansionare il tuo sito Web per modificare i file?"
|
1600 |
+
|
1601 |
+
#: classes/Views/Settings.php:1216
|
1602 |
+
msgid ""
|
1603 |
+
"By default the plugin will run file integrity scans once a week. If you can, "
|
1604 |
+
"ideally you should run file integrity scans on a daily basis. The file "
|
1605 |
+
"integrity scanner is very efficient and requires very little resources. "
|
1606 |
+
"Though if you have a fairly large website we recommend you to scan it when "
|
1607 |
+
"it is the least busy. The scan process should only take a few seconds to "
|
1608 |
+
"complete."
|
1609 |
+
msgstr ""
|
1610 |
+
"Per default il plugin eseguirà scansioni di integrità dei file una volta "
|
1611 |
+
"alla settimana. Se possibile, idealmente si dovrebbe eseguire scansioni di "
|
1612 |
+
"integrità dei file giornalmente. Lo scanner di integrità dei file è molto "
|
1613 |
+
"efficiente e richiede pochissime risorse. Se avete un sito web abbastanza "
|
1614 |
+
"grande, si consiglia di eseguire la scansione quando è meno occupato. Il "
|
1615 |
+
"processo di scansione dovrebbe richiedere solo alcuni secondi per il "
|
1616 |
+
"completamento."
|
1617 |
+
|
1618 |
+
#: classes/Views/Settings.php:1222
|
1619 |
+
msgid "Scan Frequency"
|
1620 |
+
msgstr "Frequenza scansione"
|
1621 |
+
|
1622 |
+
#: classes/Views/Settings.php:1227
|
1623 |
+
msgid "Daily"
|
1624 |
+
msgstr "Quotidiana"
|
1625 |
+
|
1626 |
+
#: classes/Views/Settings.php:1228
|
1627 |
+
msgid "Weekly"
|
1628 |
+
msgstr "Settimanale"
|
1629 |
+
|
1630 |
+
#: classes/Views/Settings.php:1229
|
1631 |
+
msgid "Monthly"
|
1632 |
+
msgstr "Mensile"
|
1633 |
+
|
1634 |
+
#: classes/Views/Settings.php:1247
|
1635 |
+
msgid "Scan Time"
|
1636 |
+
msgstr "Tempo scansione"
|
1637 |
+
|
1638 |
+
#: classes/Views/Settings.php:1253
|
1639 |
+
msgid "00:00"
|
1640 |
+
msgstr "00:00"
|
1641 |
+
|
1642 |
+
#: classes/Views/Settings.php:1254
|
1643 |
+
msgid "01:00"
|
1644 |
+
msgstr "01:00"
|
1645 |
+
|
1646 |
+
#: classes/Views/Settings.php:1255
|
1647 |
+
msgid "02:00"
|
1648 |
+
msgstr "02:00"
|
1649 |
+
|
1650 |
+
#: classes/Views/Settings.php:1256
|
1651 |
+
msgid "03:00"
|
1652 |
+
msgstr "03:00"
|
1653 |
+
|
1654 |
+
#: classes/Views/Settings.php:1257
|
1655 |
+
msgid "04:00"
|
1656 |
+
msgstr "04:00"
|
1657 |
+
|
1658 |
+
#: classes/Views/Settings.php:1258
|
1659 |
+
msgid "05:00"
|
1660 |
+
msgstr "05:00"
|
1661 |
+
|
1662 |
+
#: classes/Views/Settings.php:1259
|
1663 |
+
msgid "06:00"
|
1664 |
+
msgstr "06:00"
|
1665 |
+
|
1666 |
+
#: classes/Views/Settings.php:1260
|
1667 |
+
msgid "07:00"
|
1668 |
+
msgstr "07:00"
|
1669 |
+
|
1670 |
+
#: classes/Views/Settings.php:1261
|
1671 |
+
msgid "08:00"
|
1672 |
+
msgstr "08:00"
|
1673 |
+
|
1674 |
+
#: classes/Views/Settings.php:1262
|
1675 |
+
msgid "09:00"
|
1676 |
+
msgstr "09:00"
|
1677 |
+
|
1678 |
+
#: classes/Views/Settings.php:1263
|
1679 |
+
msgid "10:00"
|
1680 |
+
msgstr "10:00"
|
1681 |
+
|
1682 |
+
#: classes/Views/Settings.php:1264
|
1683 |
+
msgid "11:00"
|
1684 |
+
msgstr "11:00"
|
1685 |
+
|
1686 |
+
#: classes/Views/Settings.php:1265
|
1687 |
+
msgid "12:00"
|
1688 |
+
msgstr "12:00"
|
1689 |
+
|
1690 |
+
#: classes/Views/Settings.php:1266
|
1691 |
+
msgid "13:00"
|
1692 |
+
msgstr "13:00"
|
1693 |
+
|
1694 |
+
#: classes/Views/Settings.php:1267
|
1695 |
+
msgid "14:00"
|
1696 |
+
msgstr "14:00"
|
1697 |
+
|
1698 |
+
#: classes/Views/Settings.php:1268
|
1699 |
+
msgid "15:00"
|
1700 |
+
msgstr "15:00"
|
1701 |
+
|
1702 |
+
#: classes/Views/Settings.php:1269
|
1703 |
+
msgid "16:00"
|
1704 |
+
msgstr "16:00"
|
1705 |
+
|
1706 |
+
#: classes/Views/Settings.php:1270
|
1707 |
+
msgid "17:00"
|
1708 |
+
msgstr "17:00"
|
1709 |
+
|
1710 |
+
#: classes/Views/Settings.php:1271
|
1711 |
+
msgid "18:00"
|
1712 |
+
msgstr "18:00"
|
1713 |
+
|
1714 |
+
#: classes/Views/Settings.php:1272
|
1715 |
+
msgid "19:00"
|
1716 |
+
msgstr "19:00"
|
1717 |
+
|
1718 |
+
#: classes/Views/Settings.php:1273
|
1719 |
+
msgid "20:00"
|
1720 |
+
msgstr "20:00"
|
1721 |
+
|
1722 |
+
#: classes/Views/Settings.php:1274
|
1723 |
+
msgid "21:00"
|
1724 |
+
msgstr "21:00"
|
1725 |
+
|
1726 |
+
#: classes/Views/Settings.php:1275
|
1727 |
+
msgid "22:00"
|
1728 |
+
msgstr "21:00"
|
1729 |
+
|
1730 |
+
#: classes/Views/Settings.php:1276
|
1731 |
+
msgid "23:00"
|
1732 |
+
msgstr "23:00"
|
1733 |
+
|
1734 |
+
#: classes/Views/Settings.php:1281
|
1735 |
+
msgid "Monday"
|
1736 |
+
msgstr "Lunedì"
|
1737 |
+
|
1738 |
+
#: classes/Views/Settings.php:1282
|
1739 |
+
msgid "Tuesday"
|
1740 |
+
msgstr "Martedì"
|
1741 |
+
|
1742 |
+
#: classes/Views/Settings.php:1283
|
1743 |
+
msgid "Wednesday"
|
1744 |
+
msgstr "Mercoledì"
|
1745 |
+
|
1746 |
+
#: classes/Views/Settings.php:1284
|
1747 |
+
msgid "Thursday"
|
1748 |
+
msgstr "Giovedì"
|
1749 |
+
|
1750 |
+
#: classes/Views/Settings.php:1285
|
1751 |
+
msgid "Friday"
|
1752 |
+
msgstr "Venerdì"
|
1753 |
+
|
1754 |
+
#: classes/Views/Settings.php:1286
|
1755 |
+
msgid "Saturday"
|
1756 |
+
msgstr "Sabato"
|
1757 |
+
|
1758 |
+
#: classes/Views/Settings.php:1287
|
1759 |
+
msgid "Sunday"
|
1760 |
+
msgstr "Domenica"
|
1761 |
+
|
1762 |
+
#: classes/Views/Settings.php:1292
|
1763 |
+
msgid "01"
|
1764 |
+
msgstr "01"
|
1765 |
+
|
1766 |
+
#: classes/Views/Settings.php:1293
|
1767 |
+
msgid "02"
|
1768 |
+
msgstr "02"
|
1769 |
+
|
1770 |
+
#: classes/Views/Settings.php:1294
|
1771 |
+
msgid "03"
|
1772 |
+
msgstr "03"
|
1773 |
+
|
1774 |
+
#: classes/Views/Settings.php:1295
|
1775 |
+
msgid "04"
|
1776 |
+
msgstr "04"
|
1777 |
+
|
1778 |
+
#: classes/Views/Settings.php:1296
|
1779 |
+
msgid "05"
|
1780 |
+
msgstr "05"
|
1781 |
+
|
1782 |
+
#: classes/Views/Settings.php:1297
|
1783 |
+
msgid "06"
|
1784 |
+
msgstr "06"
|
1785 |
+
|
1786 |
+
#: classes/Views/Settings.php:1298
|
1787 |
+
msgid "07"
|
1788 |
+
msgstr "07"
|
1789 |
+
|
1790 |
+
#: classes/Views/Settings.php:1299
|
1791 |
+
msgid "08"
|
1792 |
+
msgstr "08"
|
1793 |
+
|
1794 |
+
#: classes/Views/Settings.php:1300
|
1795 |
+
msgid "09"
|
1796 |
+
msgstr "09"
|
1797 |
+
|
1798 |
+
#: classes/Views/Settings.php:1301
|
1799 |
+
msgid "10"
|
1800 |
+
msgstr "10"
|
1801 |
+
|
1802 |
+
#: classes/Views/Settings.php:1302
|
1803 |
+
msgid "11"
|
1804 |
+
msgstr "11"
|
1805 |
+
|
1806 |
+
#: classes/Views/Settings.php:1303
|
1807 |
+
msgid "12"
|
1808 |
+
msgstr "12"
|
1809 |
+
|
1810 |
+
#: classes/Views/Settings.php:1304
|
1811 |
+
msgid "13"
|
1812 |
+
msgstr "13"
|
1813 |
+
|
1814 |
+
#: classes/Views/Settings.php:1305
|
1815 |
+
msgid "14"
|
1816 |
+
msgstr "14"
|
1817 |
+
|
1818 |
+
#: classes/Views/Settings.php:1306
|
1819 |
+
msgid "15"
|
1820 |
+
msgstr "15"
|
1821 |
+
|
1822 |
+
#: classes/Views/Settings.php:1307
|
1823 |
+
msgid "16"
|
1824 |
+
msgstr "16"
|
1825 |
+
|
1826 |
+
#: classes/Views/Settings.php:1308
|
1827 |
+
msgid "17"
|
1828 |
+
msgstr "17"
|
1829 |
+
|
1830 |
+
#: classes/Views/Settings.php:1309
|
1831 |
+
msgid "18"
|
1832 |
+
msgstr "18"
|
1833 |
+
|
1834 |
+
#: classes/Views/Settings.php:1310
|
1835 |
+
msgid "19"
|
1836 |
+
msgstr "19"
|
1837 |
+
|
1838 |
+
#: classes/Views/Settings.php:1311
|
1839 |
+
msgid "20"
|
1840 |
+
msgstr "20"
|
1841 |
+
|
1842 |
+
#: classes/Views/Settings.php:1312
|
1843 |
+
msgid "21"
|
1844 |
+
msgstr "21"
|
1845 |
+
|
1846 |
+
#: classes/Views/Settings.php:1313
|
1847 |
+
msgid "22"
|
1848 |
+
msgstr "22"
|
1849 |
+
|
1850 |
+
#: classes/Views/Settings.php:1314
|
1851 |
+
msgid "23"
|
1852 |
+
msgstr "23"
|
1853 |
+
|
1854 |
+
#: classes/Views/Settings.php:1315
|
1855 |
+
msgid "24"
|
1856 |
+
msgstr "24"
|
1857 |
+
|
1858 |
+
#: classes/Views/Settings.php:1316
|
1859 |
+
msgid "25"
|
1860 |
+
msgstr "25"
|
1861 |
+
|
1862 |
+
#: classes/Views/Settings.php:1317
|
1863 |
+
msgid "26"
|
1864 |
+
msgstr "26"
|
1865 |
+
|
1866 |
+
#: classes/Views/Settings.php:1318
|
1867 |
+
msgid "27"
|
1868 |
+
msgstr "27"
|
1869 |
+
|
1870 |
+
#: classes/Views/Settings.php:1319
|
1871 |
+
msgid "28"
|
1872 |
+
msgstr "28"
|
1873 |
+
|
1874 |
+
#: classes/Views/Settings.php:1320
|
1875 |
+
msgid "29"
|
1876 |
+
msgstr "29"
|
1877 |
+
|
1878 |
+
#: classes/Views/Settings.php:1321
|
1879 |
+
msgid "30"
|
1880 |
+
msgstr "30"
|
1881 |
+
|
1882 |
+
#: classes/Views/Settings.php:1337
|
1883 |
+
msgid "Hour"
|
1884 |
+
msgstr "Ora"
|
1885 |
+
|
1886 |
+
#: classes/Views/Settings.php:1353 classes/Views/Settings.php:1369
|
1887 |
+
msgid "Day"
|
1888 |
+
msgstr "Giorno"
|
1889 |
+
|
1890 |
+
#: classes/Views/Settings.php:1379
|
1891 |
+
msgid "Which directories should be scanned for file changes?"
|
1892 |
+
msgstr "Quali directory devono essere digitalizzate per le modifiche ai file?"
|
1893 |
+
|
1894 |
+
#: classes/Views/Settings.php:1381
|
1895 |
+
msgid ""
|
1896 |
+
"The plugin will scan all the directories in your WordPress website by "
|
1897 |
+
"default because that is the most secure option. Though if for some reason "
|
1898 |
+
"you do not want the plugin to scan any of these directories you can uncheck "
|
1899 |
+
"them from the below list."
|
1900 |
+
msgstr ""
|
1901 |
+
"Il plugin digitalizzerà di default tutte le directory del tuo sito web "
|
1902 |
+
"WordPress perché questa è l'opzione più sicura. Anche se per qualche motivo "
|
1903 |
+
"non si desidera che il plugin digitalizzi una qualsiasi di queste directory, "
|
1904 |
+
"è possibile deselezionarle dall'elenco sottostante."
|
1905 |
+
|
1906 |
+
#: classes/Views/Settings.php:1387
|
1907 |
+
msgid "Directories to scan"
|
1908 |
+
msgstr "Directory da digitalizzare"
|
1909 |
+
|
1910 |
+
#: classes/Views/Settings.php:1393
|
1911 |
+
msgid "Root directory of WordPress (excluding sub directories)"
|
1912 |
+
msgstr "Directory principale di WordPress (escluse le sotto-directory)"
|
1913 |
+
|
1914 |
+
#: classes/Views/Settings.php:1394
|
1915 |
+
msgid "WP Admin directory (/wp-admin/)"
|
1916 |
+
msgstr "Directory WP Admin (/wp-admin/)"
|
1917 |
+
|
1918 |
+
#: classes/Views/Settings.php:1395
|
1919 |
+
msgid "WP Includes directory (/wp-includes/)"
|
1920 |
+
msgstr "Directory WP Includes (/wp-includes/)"
|
1921 |
+
|
1922 |
+
#: classes/Views/Settings.php:1396
|
1923 |
+
msgid ""
|
1924 |
+
"/wp-content/ directory (excluding plugins, themes & uploads directories)"
|
1925 |
+
msgstr ""
|
1926 |
+
"/wp-content/directory (esclusi i plugin, temi e le directory di upload)"
|
1927 |
+
|
1928 |
+
#: classes/Views/Settings.php:1397
|
1929 |
+
msgid "Themes directory (/wp-content/themes/)"
|
1930 |
+
msgstr "Directory dei temi (/wp-content/themes/)"
|
1931 |
+
|
1932 |
+
#: classes/Views/Settings.php:1398
|
1933 |
+
msgid "Plugins directory (/wp-content/plugins/)"
|
1934 |
+
msgstr "Directory dei plugin (/wp-content/plugins/)"
|
1935 |
+
|
1936 |
+
#: classes/Views/Settings.php:1399
|
1937 |
+
msgid "Uploads directory (/wp-content/uploads/)"
|
1938 |
+
msgstr "Directory di uploads (/wp-content/uploads/)"
|
1939 |
+
|
1940 |
+
#: classes/Views/Settings.php:1405
|
1941 |
+
msgid ""
|
1942 |
+
"Uploads directory of all sub sites on this network (/wp-content/sites/*)"
|
1943 |
+
msgstr ""
|
1944 |
+
"Directory di upload di tutti i sotto siti di questa rete (/wp-content/sites/"
|
1945 |
+
"*)"
|
1946 |
+
|
1947 |
+
#: classes/Views/Settings.php:1428
|
1948 |
+
msgid "What is the biggest file size the plugin should scan?"
|
1949 |
+
msgstr "Qual è il file più grande che il plugin dovrebbe digitalizzare?"
|
1950 |
+
|
1951 |
+
#: classes/Views/Settings.php:1429
|
1952 |
+
msgid ""
|
1953 |
+
"By default the plugin does not scan files that are bigger than 5MB. Such "
|
1954 |
+
"files are not common, hence typically not a target. Though if you are "
|
1955 |
+
"getting a lot of 6032 Events, it is recommended to increase the file size "
|
1956 |
+
"limit from the below option."
|
1957 |
+
msgstr ""
|
1958 |
+
"Per default il plugin non digitalizza file di dimensioni superiori a 5MB. "
|
1959 |
+
"Tali file non sono comuni, quindi in genere non vengono considerati. Se "
|
1960 |
+
"tuttavia si dovessero generare molti eventi 6032, si consiglia di aumentare "
|
1961 |
+
"il limite di dimensione del file dall'opzione sottostante."
|
1962 |
+
|
1963 |
+
#: classes/Views/Settings.php:1432
|
1964 |
+
msgid "File Size Limit"
|
1965 |
+
msgstr "Limite dimensioni file"
|
1966 |
+
|
1967 |
+
#: classes/Views/Settings.php:1435
|
1968 |
+
msgid "MB"
|
1969 |
+
msgstr "MB"
|
1970 |
+
|
1971 |
+
#: classes/Views/Settings.php:1441
|
1972 |
+
msgid ""
|
1973 |
+
"Do you want to exclude specific files or files with a particular extension "
|
1974 |
+
"from the scan?"
|
1975 |
+
msgstr ""
|
1976 |
+
"Volete escludere dalla digitalizzazione file specifici o file con una "
|
1977 |
+
"particolare estensione?"
|
1978 |
+
|
1979 |
+
#: classes/Views/Settings.php:1442
|
1980 |
+
msgid ""
|
1981 |
+
"The plugin will scan everything that is in the WordPress root directory or "
|
1982 |
+
"below, even if the files and directories are not part of WordPress. It is "
|
1983 |
+
"recommended to scan all source code files and only exclude files that cannot "
|
1984 |
+
"be tampered, such as text files, media files etc, most of which are already "
|
1985 |
+
"excluded by default."
|
1986 |
+
msgstr ""
|
1987 |
+
"Il plugin digitalizza tutto ciò che si trova nella directory principale di "
|
1988 |
+
"WordPress o sotto, anche se i file e le directory non fanno parte di "
|
1989 |
+
"WordPress. Si consiglia di digitalizzare tutti i file del codice sorgente e "
|
1990 |
+
"di escludere solo i file che non possono essere manomessi, come i file di "
|
1991 |
+
"testo, file multimediali, ecc; la maggior parte dei quali sono già esclusi "
|
1992 |
+
"per default."
|
1993 |
+
|
1994 |
+
#: classes/Views/Settings.php:1447
|
1995 |
+
msgid "Exclude All Files in These Directories"
|
1996 |
+
msgstr "Escludere tutti i file in queste directory"
|
1997 |
+
|
1998 |
+
#: classes/Views/Settings.php:1460 classes/Views/Settings.php:1496
|
1999 |
+
#: classes/Views/Settings.php:1526
|
2000 |
+
msgid "REMOVE"
|
2001 |
+
msgstr "RIMUOVI"
|
2002 |
+
|
2003 |
+
#: classes/Views/Settings.php:1465 classes/Views/Settings.php:1501
|
2004 |
+
#: classes/Views/Settings.php:1531 classes/Views/SetupWizard.php:534
|
2005 |
+
#: classes/Views/SetupWizard.php:542 classes/Views/SetupWizard.php:627
|
2006 |
+
#: classes/Views/SetupWizard.php:646 classes/Views/SetupWizard.php:665
|
2007 |
+
msgid "ADD"
|
2008 |
+
msgstr "AGGIUNGI"
|
2009 |
+
|
2010 |
+
#: classes/Views/Settings.php:1468
|
2011 |
+
msgid ""
|
2012 |
+
"Specify the name of the directory and the path to it in relation to the "
|
2013 |
+
"website's root. For example, if you want to want to exclude all files in the "
|
2014 |
+
"sub directory dir1/dir2 specify the following:"
|
2015 |
+
msgstr ""
|
2016 |
+
"Specificare il nome della directory e il percorso della stessa in relazione "
|
2017 |
+
"alla radice del sito web. Per esempio, se si desidera escludere tutti i file "
|
2018 |
+
"della sottodirectory dir1/dir2 specificare quanto segue:"
|
2019 |
+
|
2020 |
+
#: classes/Views/Settings.php:1479
|
2021 |
+
msgid "Exclude These Files"
|
2022 |
+
msgstr "Escludere questi file"
|
2023 |
+
|
2024 |
+
#: classes/Views/Settings.php:1504
|
2025 |
+
msgid ""
|
2026 |
+
"Specify the name and extension of the file(s) you want to exclude. Wildcard "
|
2027 |
+
"not supported. There is no need to specify the path of the file."
|
2028 |
+
msgstr ""
|
2029 |
+
"Specificare il nome e l'estensione del(i) file che si desidera escludere. "
|
2030 |
+
"Wildcard non supportate. Non è necessario specificare il percorso del file."
|
2031 |
+
|
2032 |
+
#: classes/Views/Settings.php:1513
|
2033 |
+
msgid "Exclude these File Types"
|
2034 |
+
msgstr "Escludere questi tipi di file"
|
2035 |
+
|
2036 |
+
#: classes/Views/Settings.php:1534
|
2037 |
+
msgid ""
|
2038 |
+
"Specify the extension of the file types you want to exclude. You should "
|
2039 |
+
"exclude any type of logs and backup files that tend to be very big."
|
2040 |
+
msgstr ""
|
2041 |
+
"Specificare l'estensione dei tipi di file che si desidera escludere. Si "
|
2042 |
+
"dovrebbe escludere qualsiasi tipo di log e file di backup che tendono ad "
|
2043 |
+
"essere molto grandi."
|
2044 |
+
|
2045 |
+
#: classes/Views/Settings.php:1543
|
2046 |
+
msgid "Launch an instant file integrity scan"
|
2047 |
+
msgstr "Avviare una scansione istantanea dell'integrità dei file"
|
2048 |
+
|
2049 |
+
#: classes/Views/Settings.php:1545
|
2050 |
+
msgid ""
|
2051 |
+
"Click the Scan Now button to launch an instant file integrity scan using the "
|
2052 |
+
"configured settings. You can navigate away from this page during the scan. "
|
2053 |
+
"Note that the instant scan can be more resource intensive than scheduled "
|
2054 |
+
"scans."
|
2055 |
+
msgstr ""
|
2056 |
+
"Fare clic sul pulsante Scansiona ora per avviare una scansione istantanea "
|
2057 |
+
"dell'integrità dei file utilizzando le impostazioni configurate. È possibile "
|
2058 |
+
"allontanarsi da questa pagina durante la scansione. Si noti che la scansione "
|
2059 |
+
"istantanea può essere più impegnativa in termini di risorse rispetto alle "
|
2060 |
+
"scansioni pianificate."
|
2061 |
+
|
2062 |
+
#: classes/Views/Settings.php:1551
|
2063 |
+
msgid "Launch Instant Scan"
|
2064 |
+
msgstr "Avvia scansione istantanea"
|
2065 |
+
|
2066 |
+
#: classes/Views/Settings.php:1558 classes/Views/Settings.php:2061
|
2067 |
+
msgid "Scan Now"
|
2068 |
+
msgstr "Scansiona ora"
|
2069 |
+
|
2070 |
+
#: classes/Views/Settings.php:1561 classes/Views/Settings.php:1568
|
2071 |
+
msgid "Stop Scan"
|
2072 |
+
msgstr "Ferma scansione"
|
2073 |
+
|
2074 |
+
#: classes/Views/Settings.php:1565 classes/Views/Settings.php:2063
|
2075 |
+
msgid "Scan in Progress"
|
2076 |
+
msgstr "Scansione in corso"
|
2077 |
+
|
2078 |
+
#: classes/Views/Settings.php:1649
|
2079 |
+
msgid ""
|
2080 |
+
"By default the plugin keeps a log of all user changes done on your WordPress "
|
2081 |
+
"website. Use the setting below to exclude any objects from the activity log. "
|
2082 |
+
"When an object is excluded from the activity log, any event in which that "
|
2083 |
+
"object is referred will not be logged in the activity log."
|
2084 |
+
msgstr ""
|
2085 |
+
"Per defaukt il plugin tiene un log di tutte le modifiche utente effettuate "
|
2086 |
+
"sul tuo sito web WordPress. Utilizza l'impostazione seguente per escludere "
|
2087 |
+
"qualsiasi oggetto dal log delle attività. Quando un oggetto viene escluso "
|
2088 |
+
"dal log delle attività, qualsiasi evento a cui l'oggetto faccia riferimento "
|
2089 |
+
"non verrà memorizzato nel log delle attività."
|
2090 |
+
|
2091 |
+
#: classes/Views/Settings.php:1653
|
2092 |
+
msgid "Exclude Users:"
|
2093 |
+
msgstr "Utenti esclusi:"
|
2094 |
+
|
2095 |
+
#: classes/Views/Settings.php:1674
|
2096 |
+
msgid "Exclude Roles:"
|
2097 |
+
msgstr "Ruoli esclusi:"
|
2098 |
+
|
2099 |
+
#: classes/Views/Settings.php:1695
|
2100 |
+
msgid "Exclude IP Addresses:"
|
2101 |
+
msgstr "Escludi Indirizzi IP:"
|
2102 |
+
|
2103 |
+
#: classes/Views/Settings.php:1716
|
2104 |
+
msgid "Exclude Post Type:"
|
2105 |
+
msgstr "Escludi tipo di post:"
|
2106 |
+
|
2107 |
+
#: classes/Views/Settings.php:1731
|
2108 |
+
msgid ""
|
2109 |
+
"WordPress has the post and page post types by default though your website "
|
2110 |
+
"might use more post types (custom post types). You can exclude all post "
|
2111 |
+
"types, including the default WordPress ones."
|
2112 |
+
msgstr ""
|
2113 |
+
"WordPress ha post e tipi di post pagina per default, anche se il tuo sito "
|
2114 |
+
"web potrebbe utilizzare più tipi di post (tipi di post personalizzati). È "
|
2115 |
+
"possibile escludere tutti i tipi di post, compresi quelli di default di "
|
2116 |
+
"WordPress."
|
2117 |
+
|
2118 |
+
#: classes/Views/Settings.php:1738
|
2119 |
+
msgid "Exclude Custom Fields:"
|
2120 |
+
msgstr "Escludi campi custom:"
|
2121 |
+
|
2122 |
+
#: classes/Views/Settings.php:1753
|
2123 |
+
msgid ""
|
2124 |
+
"You can use the * wildcard to exclude multiple matching custom fields. For "
|
2125 |
+
"example to exclude all custom fields starting with wp123 enter wp123*"
|
2126 |
+
msgstr ""
|
2127 |
+
"È possibile utilizzare il carattere jolly * per escludere più campi "
|
2128 |
+
"personalizzati corrispondenti. Ad esempio, per escludere tutti i campi "
|
2129 |
+
"personalizzati che iniziano con wp123 immettere wp123*"
|
2130 |
+
|
2131 |
+
#: classes/Views/Settings.php:1760
|
2132 |
+
msgid "Exclude Non-Existing URLs:"
|
2133 |
+
msgstr "Escludi URL non esistenti:"
|
2134 |
+
|
2135 |
+
#: classes/Views/Settings.php:1776
|
2136 |
+
msgid ""
|
2137 |
+
"Add the non existing URLs for which you do not want to be alerted of HTTP "
|
2138 |
+
"404 errors in the activity log by specifying the complete URL.\tExamples "
|
2139 |
+
"below:"
|
2140 |
+
msgstr ""
|
2141 |
+
"Aggiungi gli URL non esistenti per i quali non si desidera essere avvisati "
|
2142 |
+
"degli errori HTTP 404 nel log attività specificando l'URL completo.\tEsempi "
|
2143 |
+
"di seguito:"
|
2144 |
+
|
2145 |
+
#: classes/Views/Settings.php:1778
|
2146 |
+
msgid "File: "
|
2147 |
+
msgstr "File: "
|
2148 |
+
|
2149 |
+
#: classes/Views/Settings.php:1780
|
2150 |
+
msgid "Directory: "
|
2151 |
+
msgstr "Directory: "
|
2152 |
+
|
2153 |
+
#: classes/Views/Settings.php:1813
|
2154 |
+
msgid "These settings are for advanced users."
|
2155 |
+
msgstr "Queste impostazioni sono per gli utenti avanzati."
|
2156 |
+
|
2157 |
+
#: classes/Views/Settings.php:1814
|
2158 |
+
msgid ""
|
2159 |
+
"If you have any questions <a href=\"https://www.wpsecurityauditlog.com/"
|
2160 |
+
"contact/\" target=\"_blank\">contact us</a>."
|
2161 |
+
msgstr ""
|
2162 |
+
"Se avete domande <a href=\"https://www.wpsecurityauditlog.com/contact/\" "
|
2163 |
+
"target=\"_ blank\"> Contattaci</a>."
|
2164 |
+
|
2165 |
+
#: classes/Views/Settings.php:1817
|
2166 |
+
msgid ""
|
2167 |
+
"Troubleshooting setting: Keep a debug log of all the requests this website "
|
2168 |
+
"receives"
|
2169 |
+
msgstr ""
|
2170 |
+
"Impostazione risoluzione dei problemi: mantenere un log di debug di tutte le "
|
2171 |
+
"richieste che questo sito riceve"
|
2172 |
+
|
2173 |
+
#: classes/Views/Settings.php:1818
|
2174 |
+
msgid ""
|
2175 |
+
"Only enable the request log on testing, staging and development website. "
|
2176 |
+
"Never enable logging on a live website unless instructed to do so. Enabling "
|
2177 |
+
"request logging on a live website may degrade the performance of the website."
|
2178 |
+
msgstr ""
|
2179 |
+
"Abilitare il log delle richieste soltanto su siti di test, allestimento e "
|
2180 |
+
"sviluppo. Non abilitare mai il log su un sito web attivo se non richiesto. "
|
2181 |
+
"Abilitare il logging su un sito web Live può degradarne le prestazioni."
|
2182 |
+
|
2183 |
+
#: classes/Views/Settings.php:1822
|
2184 |
+
msgid "Request Log"
|
2185 |
+
msgstr "Log richieste"
|
2186 |
+
|
2187 |
+
#: classes/Views/Settings.php:1840
|
2188 |
+
msgid ""
|
2189 |
+
"<strong>Note:</strong> The requests debug log file is saved as request.log."
|
2190 |
+
"php in the /wp-content/uploads/wp-security-audit-log/ directory."
|
2191 |
+
msgstr ""
|
2192 |
+
"<strong>Nota:</strong> Il file di log delle richieste di debug viene salvato "
|
2193 |
+
"come request.log.php nella directory \v/wp-content/uploads/wp-security-audit-"
|
2194 |
+
"log/."
|
2195 |
+
|
2196 |
+
#: classes/Views/Settings.php:1852
|
2197 |
+
msgid "Reset plugin settings to default"
|
2198 |
+
msgstr "Ripristina le impostazioni predefinite del plugin"
|
2199 |
+
|
2200 |
+
#: classes/Views/Settings.php:1853
|
2201 |
+
msgid ""
|
2202 |
+
"Click the RESET button to reset ALL plugin settings to default. Note that "
|
2203 |
+
"the activity log data will be retained and only the plugin settings will be "
|
2204 |
+
"reset. To purge the data of the activity log use the setting below."
|
2205 |
+
msgstr ""
|
2206 |
+
"Fare clic sul pulsante RIPRISTINA per ripristinare le impostazioni "
|
2207 |
+
"predefinite di TUTTE le impostazioni del plugin. Nota che i dati del log "
|
2208 |
+
"attività vengono mantenuti e solo le impostazioni del plugin verranno "
|
2209 |
+
"ripristinate. Per eliminare i dati del log delle attività, utilizzare "
|
2210 |
+
"l'impostazione sotto."
|
2211 |
+
|
2212 |
+
#: classes/Views/Settings.php:1857
|
2213 |
+
msgid "Reset Settings"
|
2214 |
+
msgstr "Ripristina Impostazioni"
|
2215 |
+
|
2216 |
+
#: classes/Views/Settings.php:1859
|
2217 |
+
msgid "RESET"
|
2218 |
+
msgstr "RIPRISTINA"
|
2219 |
+
|
2220 |
+
#: classes/Views/Settings.php:1865
|
2221 |
+
msgid "Purge the WordPress activity log"
|
2222 |
+
msgstr "Elimina il log delle attività di WordPress"
|
2223 |
+
|
2224 |
+
#: classes/Views/Settings.php:1866
|
2225 |
+
msgid ""
|
2226 |
+
"Click the Purge button below to delete all the data from the WordPress "
|
2227 |
+
"activity log and start afresh."
|
2228 |
+
msgstr ""
|
2229 |
+
"Fare clic sul pulsante Elimina qui sotto per cancellare tutti i dati dal log "
|
2230 |
+
"delle attività di WordPress e ricominciare da capo."
|
2231 |
+
|
2232 |
+
#: classes/Views/Settings.php:1870
|
2233 |
+
msgid "Purge Activity Log"
|
2234 |
+
msgstr "Svuota log attività"
|
2235 |
+
|
2236 |
+
#: classes/Views/Settings.php:1872
|
2237 |
+
msgid "PURGE"
|
2238 |
+
msgstr "ELIMINA"
|
2239 |
+
|
2240 |
+
#: classes/Views/Settings.php:1878
|
2241 |
+
msgid "MainWP Child Site Stealth Mode"
|
2242 |
+
msgstr "Modalità stealth del sito MainWP Child"
|
2243 |
+
|
2244 |
+
#: classes/Views/Settings.php:1879
|
2245 |
+
msgid ""
|
2246 |
+
"This option is enabled automatically when the plugin detects the MainWP "
|
2247 |
+
"Child plugin on the site. When this setting is enabled plugin access is "
|
2248 |
+
"restricted to the administrator who installs the plugin, the plugin is not "
|
2249 |
+
"shown in the list of installed plugins and no admin notifications are shown. "
|
2250 |
+
"Disable this option to change the plugin to the default setup."
|
2251 |
+
msgstr ""
|
2252 |
+
"Questa opzione è abilitata automaticamente quando il plugin rileva MainWP "
|
2253 |
+
"Child sul sito. Quando questa impostazione è abilitata, l'accesso al plugin "
|
2254 |
+
"è limitato all'amministratore che lo installa, il plugin non è mostrato "
|
2255 |
+
"nell'elenco dei plugin installati e non vengono mostrate notifiche di "
|
2256 |
+
"amministratore. Disattiva questa opzione per modificare il plugin nella "
|
2257 |
+
"configurazione predefinita."
|
2258 |
+
|
2259 |
+
#: classes/Views/Settings.php:1883
|
2260 |
+
msgid "Enable MainWP Child Site Stealth Mode"
|
2261 |
+
msgstr "Abilita modalità stealth del sito MainWP Child"
|
2262 |
+
|
2263 |
+
#: classes/Views/Settings.php:1907
|
2264 |
+
msgid "Do you want to delete the plugin data from the database upon uninstall?"
|
2265 |
+
msgstr ""
|
2266 |
+
"Vuoi eliminare i dati del plugin dal database al momento della "
|
2267 |
+
"disinstallazione?"
|
2268 |
+
|
2269 |
+
#: classes/Views/Settings.php:1908
|
2270 |
+
msgid ""
|
2271 |
+
"The plugin saves the activity log data and settings in the WordPress "
|
2272 |
+
"database. By default upon uninstalling the plugin the data is kept in the "
|
2273 |
+
"database so if it is installed again, you can still access the data. If the "
|
2274 |
+
"data is deleted it is not possible to recover it so you won't be able to "
|
2275 |
+
"access it again even when you reinstall the plugin."
|
2276 |
+
msgstr ""
|
2277 |
+
"Il plugin salva i dati del log attività e le impostazioni nel database di "
|
2278 |
+
"WordPress. Per default, al momento della disinstallazione del plugin, i dati "
|
2279 |
+
"vengono conservati nel database; quindi se viene nuovamente installato, è "
|
2280 |
+
"comunque possibile accedere ai dati. Se i dati vengono cancellati non è "
|
2281 |
+
"possibile recuperarli, quindi non sarete in grado di accedervi di nuovo "
|
2282 |
+
"anche reinstallando il plugin."
|
2283 |
+
|
2284 |
+
#: classes/Views/Settings.php:1912
|
2285 |
+
msgid "Remove Data on Uninstall"
|
2286 |
+
msgstr "Rimuovi dati alla disinstallazione"
|
2287 |
+
|
2288 |
+
#: classes/Views/Settings.php:1937
|
2289 |
+
msgid "Are you sure you want to reset all the plugin settings to default?"
|
2290 |
+
msgstr ""
|
2291 |
+
"Sei sicuro di voler riportare tutte le impostazioni del plugin ai valori "
|
2292 |
+
"predefiniti?"
|
2293 |
+
|
2294 |
+
#: classes/Views/Settings.php:1947
|
2295 |
+
msgid "Are you sure you want to purge all the activity log data?"
|
2296 |
+
msgstr "Sei sicuro di voler eliminare tutti i dati del log attività?"
|
2297 |
+
|
2298 |
+
#: classes/Views/Settings.php:1979
|
2299 |
+
msgid "MainWP Child plugin is not active on this website."
|
2300 |
+
msgstr "Il plugin MainWP Child non è attivo su questo sito web."
|
2301 |
+
|
2302 |
+
#: classes/Views/Settings.php:2054
|
2303 |
+
msgid "The specified value is not a valid URL!"
|
2304 |
+
msgstr "Il valore specificato non è un URL valido!"
|
2305 |
+
|
2306 |
+
#: classes/Views/Settings.php:2055
|
2307 |
+
msgid "The specified value is not a valid post type!"
|
2308 |
+
msgstr "Il valore specificato non è un tipo di post valido!"
|
2309 |
+
|
2310 |
+
#: classes/Views/Settings.php:2056
|
2311 |
+
msgid "The specified value is not a valid IP address!"
|
2312 |
+
msgstr "Il valore specificato non è un indirizzo IP valido!"
|
2313 |
+
|
2314 |
+
#: classes/Views/Settings.php:2057
|
2315 |
+
msgid "The specified value is not a user nor a role!"
|
2316 |
+
msgstr "Il valore specificato non è un utente né un ruolo!"
|
2317 |
+
|
2318 |
+
#: classes/Views/Settings.php:2058
|
2319 |
+
msgid "Filename cannot be added because it contains invalid characters."
|
2320 |
+
msgstr ""
|
2321 |
+
"Il nome del file non può essere aggiunto perché contiene caratteri non "
|
2322 |
+
"validi."
|
2323 |
+
|
2324 |
+
#: classes/Views/Settings.php:2059
|
2325 |
+
msgid "File extension cannot be added because it contains invalid characters."
|
2326 |
+
msgstr ""
|
2327 |
+
"L'estensione del file non può essere aggiunta perché contiene caratteri non "
|
2328 |
+
"validi."
|
2329 |
+
|
2330 |
+
#: classes/Views/Settings.php:2060
|
2331 |
+
msgid "Directory cannot be added because it contains invalid characters."
|
2332 |
+
msgstr ""
|
2333 |
+
"La directory non può essere aggiunta perché contiene caratteri non validi."
|
2334 |
+
|
2335 |
+
#: classes/Views/Settings.php:2062
|
2336 |
+
msgid "Scan Failed"
|
2337 |
+
msgstr "Scansione non riuscita"
|
2338 |
+
|
2339 |
+
#: classes/Views/Settings.php:2187 classes/Views/Settings.php:2298
|
2340 |
+
msgid "Invalid setting type."
|
2341 |
+
msgstr "Tipo d'impostazione non valido."
|
2342 |
+
|
2343 |
+
#: classes/Views/Settings.php:2241
|
2344 |
+
msgid "You can exclude this directory using the check boxes above."
|
2345 |
+
msgstr ""
|
2346 |
+
"È possibile escludere questa directory utilizzando le caselle di controllo "
|
2347 |
+
"sopra."
|
2348 |
+
|
2349 |
+
#: classes/Views/Settings.php:2260
|
2350 |
+
msgid "Option added to excluded types."
|
2351 |
+
msgstr "Opzione aggiunta ai tipi esclusi."
|
2352 |
+
|
2353 |
+
#: classes/Views/Settings.php:2264
|
2354 |
+
msgid "This file is already excluded from the scan."
|
2355 |
+
msgstr "Questo file è già escluso dalla scansione."
|
2356 |
+
|
2357 |
+
#: classes/Views/Settings.php:2266
|
2358 |
+
msgid "This file extension is already excluded from the scan."
|
2359 |
+
msgstr "Questa estensione del file è già esclusa dalla scansione."
|
2360 |
+
|
2361 |
+
#: classes/Views/Settings.php:2268
|
2362 |
+
msgid "This directory is already excluded from the scan."
|
2363 |
+
msgstr "Questa directory è già esclusa dalla scansione."
|
2364 |
+
|
2365 |
+
#: classes/Views/Settings.php:2278
|
2366 |
+
msgid "Option name is empty."
|
2367 |
+
msgstr "Il nome dell'opzione è vuoto."
|
2368 |
+
|
2369 |
+
#: classes/Views/Settings.php:2374
|
2370 |
+
msgid "Option removed from excluded scan types."
|
2371 |
+
msgstr "Opzione rimossa dai tipi di scansione esclusi."
|
2372 |
+
|
2373 |
+
#: classes/Views/Settings.php:2379 classes/Views/Settings.php:2457
|
2374 |
+
msgid "Something went wrong."
|
2375 |
+
msgstr "Qualcosa è andato storto."
|
2376 |
+
|
2377 |
+
#: classes/Views/Settings.php:2406
|
2378 |
+
msgid "A cron job is in progress."
|
2379 |
+
msgstr "Cron job in corso."
|
2380 |
+
|
2381 |
+
#: classes/Views/Settings.php:2452 classes/Views/Settings.php:2489
|
2382 |
+
msgid "Scan started successfully."
|
2383 |
+
msgstr "Scansione avviata con successo."
|
2384 |
+
|
2385 |
+
#: classes/Views/Settings.php:2514 classes/Views/Settings.php:2541
|
2386 |
+
msgid "Tables has been reset."
|
2387 |
+
msgstr "Le tabelle sono state disattivate."
|
2388 |
+
|
2389 |
+
#: classes/Views/Settings.php:2516 classes/Views/Settings.php:2543
|
2390 |
+
msgid "Reset query failed."
|
2391 |
+
msgstr "Reset query non riuscito."
|
2392 |
+
|
2393 |
+
#: classes/Views/Settings.php:2519 classes/Views/Settings.php:2546
|
2394 |
+
msgid "Nonce Verification Failed."
|
2395 |
+
msgstr "Verifica nonce non riuscita."
|
2396 |
+
|
2397 |
+
#: classes/Views/SetupWizard.php:129
|
2398 |
+
msgid "Welcome"
|
2399 |
+
msgstr "Benvenuto"
|
2400 |
+
|
2401 |
+
#: classes/Views/SetupWizard.php:133
|
2402 |
+
msgid "Log Details"
|
2403 |
+
msgstr "Dettaglio log"
|
2404 |
+
|
2405 |
+
#: classes/Views/SetupWizard.php:138
|
2406 |
+
msgid "Log Retention"
|
2407 |
+
msgstr "Conservazione log"
|
2408 |
+
|
2409 |
+
#: classes/Views/SetupWizard.php:143
|
2410 |
+
msgid "Access"
|
2411 |
+
msgstr "Accesso"
|
2412 |
+
|
2413 |
+
#: classes/Views/SetupWizard.php:153 classes/Views/SetupWizard.php:756
|
2414 |
+
#: classes/Views/SetupWizard.php:757
|
2415 |
+
msgid "Finish"
|
2416 |
+
msgstr "Fine"
|
2417 |
+
|
2418 |
+
#: classes/Views/SetupWizard.php:197
|
2419 |
+
msgid "Specified value in not a user."
|
2420 |
+
msgstr "Il valore specificato non è un utente."
|
2421 |
+
|
2422 |
+
#: classes/Views/SetupWizard.php:198
|
2423 |
+
msgid "Specified value in not a role."
|
2424 |
+
msgstr "Il valore specificato non è un ruolo."
|
2425 |
+
|
2426 |
+
#: classes/Views/SetupWizard.php:199
|
2427 |
+
msgid "Specified value in not an IP address."
|
2428 |
+
msgstr "Il valore specificato non è un indirizzo IP."
|
2429 |
+
|
2430 |
+
#: classes/Views/SetupWizard.php:229
|
2431 |
+
msgid "WP Security Audit Log › Setup Wizard"
|
2432 |
+
msgstr "WP Security Audit Log › Setup Wizard"
|
2433 |
+
|
2434 |
+
#: classes/Views/SetupWizard.php:246
|
2435 |
+
msgid "Close Wizard"
|
2436 |
+
msgstr "Chiudi guida"
|
2437 |
+
|
2438 |
+
#: classes/Views/SetupWizard.php:326
|
2439 |
+
msgid "Thank you for installing the WP Security Audit Log plugin."
|
2440 |
+
msgstr "Grazie per aver installato il plugin WP Security Audit Log."
|
2441 |
+
|
2442 |
+
#: classes/Views/SetupWizard.php:327
|
2443 |
+
msgid ""
|
2444 |
+
"This wizard will help you configure your WordPress activity log plugin and "
|
2445 |
+
"get you started quickly."
|
2446 |
+
msgstr ""
|
2447 |
+
"Questa guida vi aiuterà a configurare il plugin per il log delle attività di "
|
2448 |
+
"WordPress e a iniziare rapidamente."
|
2449 |
+
|
2450 |
+
#: classes/Views/SetupWizard.php:328
|
2451 |
+
msgid ""
|
2452 |
+
"Anything that can be configured in this wizard can be changed at a later "
|
2453 |
+
"stage from the plugin settings. If you are an experienced user of this "
|
2454 |
+
"plugin you can exit this wizard and configure all the settings manually."
|
2455 |
+
msgstr ""
|
2456 |
+
"Tutto ciò che può essere configurato in questa guida può essere modificato "
|
2457 |
+
"in una fase successiva dalle impostazioni del plugin. Se sei un utente "
|
2458 |
+
"esperto di questo plugin puoi uscire da questa guida e configurare tutte le "
|
2459 |
+
"impostazioni manualmente."
|
2460 |
+
|
2461 |
+
#: classes/Views/SetupWizard.php:333
|
2462 |
+
msgid "Start Configuring the Plugin"
|
2463 |
+
msgstr "Avvio configurazione plugin"
|
2464 |
+
|
2465 |
+
#: classes/Views/SetupWizard.php:337
|
2466 |
+
msgid "Exit Wizard"
|
2467 |
+
msgstr "Esci dalla guida"
|
2468 |
+
|
2469 |
+
#: classes/Views/SetupWizard.php:351
|
2470 |
+
msgid "Please select the level of detail for your WordPress activity logs:"
|
2471 |
+
msgstr ""
|
2472 |
+
"Selezionare il livello di dettaglio per i log delle attività di WordPress:"
|
2473 |
+
|
2474 |
+
#: classes/Views/SetupWizard.php:356
|
2475 |
+
msgid ""
|
2476 |
+
"Basic (I want a high level overview and I am not interested in the detail)"
|
2477 |
+
msgstr ""
|
2478 |
+
"Base (voglio una panoramica di alto livello e non sono interessato al "
|
2479 |
+
"dettaglio)"
|
2480 |
+
|
2481 |
+
#: classes/Views/SetupWizard.php:361
|
2482 |
+
msgid "Geek (I want to know everything that is happening on my WordPress)"
|
2483 |
+
msgstr "Geek (voglio sapere tutto quello che sta succedendo sul mio WordPress)"
|
2484 |
+
|
2485 |
+
#: classes/Views/SetupWizard.php:364
|
2486 |
+
msgid ""
|
2487 |
+
"Note: You can change the WordPress logging level from the plugin’s settings "
|
2488 |
+
"anytime."
|
2489 |
+
msgstr ""
|
2490 |
+
"Nota: È possibile modificare il livello di logging di WordPress dalle "
|
2491 |
+
"impostazioni del plugin in qualsiasi momento."
|
2492 |
+
|
2493 |
+
#: classes/Views/SetupWizard.php:372 classes/Views/SetupWizard.php:373
|
2494 |
+
#: classes/Views/SetupWizard.php:438 classes/Views/SetupWizard.php:439
|
2495 |
+
#: classes/Views/SetupWizard.php:567 classes/Views/SetupWizard.php:568
|
2496 |
+
#: classes/Views/SetupWizard.php:687 classes/Views/SetupWizard.php:688
|
2497 |
+
msgid "Next"
|
2498 |
+
msgstr "Successivo"
|
2499 |
+
|
2500 |
+
#: classes/Views/SetupWizard.php:412
|
2501 |
+
msgid "How long do you want to keep the data in the WordPress activity Log?"
|
2502 |
+
msgstr "Per quanto tempo volete tenere i dati del log attività di Wordpress?"
|
2503 |
+
|
2504 |
+
#: classes/Views/SetupWizard.php:417
|
2505 |
+
msgid "6 months (data older than 6 months will be deleted)"
|
2506 |
+
msgstr "6 mesi (i dati più vecchi di 6 mesi saranno cancellati)"
|
2507 |
+
|
2508 |
+
#: classes/Views/SetupWizard.php:422
|
2509 |
+
msgid "12 months (data older than 12 months will be deleted)"
|
2510 |
+
msgstr "12 mesi (i dati più vecchi di 12 mesi saranno cancellati)"
|
2511 |
+
|
2512 |
+
#: classes/Views/SetupWizard.php:427
|
2513 |
+
msgid "Keep all data."
|
2514 |
+
msgstr "Mantieni tutti i dati."
|
2515 |
+
|
2516 |
+
#: classes/Views/SetupWizard.php:430
|
2517 |
+
msgid ""
|
2518 |
+
"Note: You can change the WordPress activity log retention settings at any "
|
2519 |
+
"time from the plugin settings later on."
|
2520 |
+
msgstr ""
|
2521 |
+
"Nota: È possibile modificare in qualsiasi momento le impostazioni di "
|
2522 |
+
"conservazione del log attività di WordPress dalle impostazioni del plugin in "
|
2523 |
+
"un secondo momento."
|
2524 |
+
|
2525 |
+
#: classes/Views/SetupWizard.php:448
|
2526 |
+
msgid ""
|
2527 |
+
"The plugin stores the data in the WordPress database in a very efficient "
|
2528 |
+
"way, though the more data you keep the more hard disk space it will consume. "
|
2529 |
+
"If you need need to retain a lot of data we would recommend you to <a href="
|
2530 |
+
"\"https://www.wpsecurityauditlog.com/premium-features/\" target=\"_blank"
|
2531 |
+
"\">upgrade to Premium</a> and use the Database tools to store the WordPress "
|
2532 |
+
"activity log in an external database."
|
2533 |
+
msgstr ""
|
2534 |
+
"Il plugin memorizza i dati nel database di WordPress in modo molto "
|
2535 |
+
"efficiente, anche se più dati si conservano più spazio su disco verrà "
|
2536 |
+
"consumato. Se avete bisogno di conservare parecchi dati vi consigliamo di <a "
|
2537 |
+
"href=\"https://www.wpsecurityauditlog.com/premium-features/\" target=\"_blank"
|
2538 |
+
"\">aggiornare a Premium</a> e di utilizzare gli strumenti del database per "
|
2539 |
+
"memorizzare il log delle attività di WordPress in un database esterno."
|
2540 |
+
|
2541 |
+
#: classes/Views/SetupWizard.php:515
|
2542 |
+
msgid ""
|
2543 |
+
"By default only the users with administrator role can access the WordPress "
|
2544 |
+
"activity log. Would you like to allow any other user or users with a role to "
|
2545 |
+
"access the WordPress activity log?"
|
2546 |
+
msgstr ""
|
2547 |
+
"Per default, solo gli utenti con ruolo di amministratore possono accedere al "
|
2548 |
+
"log delle attività di WordPress. Vuoi permettere a qualsiasi altro utente, o "
|
2549 |
+
"utenti con un ruolo di accedere al log delle attività di WordPress?"
|
2550 |
+
|
2551 |
+
#: classes/Views/SetupWizard.php:531 classes/Views/SetupWizard.php:624
|
2552 |
+
msgid "Usernames: "
|
2553 |
+
msgstr "Nomi utente: "
|
2554 |
+
|
2555 |
+
#: classes/Views/SetupWizard.php:539 classes/Views/SetupWizard.php:643
|
2556 |
+
msgid "Roles: "
|
2557 |
+
msgstr "Ruoli: "
|
2558 |
+
|
2559 |
+
#: classes/Views/SetupWizard.php:560
|
2560 |
+
msgid ""
|
2561 |
+
"Note: you can change the WordPress activity log privileges settings at any "
|
2562 |
+
"time from the plugin settings."
|
2563 |
+
msgstr ""
|
2564 |
+
"Nota: è possibile modificare in qualsiasi momento le impostazioni dei "
|
2565 |
+
"privilegi del log delle attività di WordPress dalle impostazioni del plugin."
|
2566 |
+
|
2567 |
+
#: classes/Views/SetupWizard.php:574
|
2568 |
+
msgid ""
|
2569 |
+
"The WordPress activity log contains sensitive data such as who logged in, "
|
2570 |
+
"from where, when, and what they did."
|
2571 |
+
msgstr ""
|
2572 |
+
"Il log delle attività di WordPress contiene dati sensibili come chi ha "
|
2573 |
+
"effettuato l'accesso, da dove, quando e cosa hanno fatto."
|
2574 |
+
|
2575 |
+
#: classes/Views/SetupWizard.php:619
|
2576 |
+
msgid ""
|
2577 |
+
"The plugin will keep a log of everything that happens on your WordPress "
|
2578 |
+
"website. If you would like to exclude a particular user, users with a role "
|
2579 |
+
"or an IP address from the log specify them below. If not just click the Next "
|
2580 |
+
"button."
|
2581 |
+
msgstr ""
|
2582 |
+
"Il plugin terrà un log di tutto ciò che accade sul tuo sito web WordPress. "
|
2583 |
+
"Se desideri escludere un particolare utente, gli utenti con un ruolo, o un "
|
2584 |
+
"indirizzo IP dal log, specificali qui sotto. In caso contrario, fai clic sul "
|
2585 |
+
"pulsante Avanti."
|
2586 |
+
|
2587 |
+
#: classes/Views/SetupWizard.php:662
|
2588 |
+
msgid "IP Address: "
|
2589 |
+
msgstr "Indirizzo IP: "
|
2590 |
+
|
2591 |
+
#: classes/Views/SetupWizard.php:680
|
2592 |
+
msgid "Note: You can change these exclusions anytime from the plugin settings."
|
2593 |
+
msgstr ""
|
2594 |
+
"Nota: è possibile modificare queste esclusioni in qualsiasi momento dalle "
|
2595 |
+
"impostazioni del plugin."
|
2596 |
+
|
2597 |
+
#: classes/Views/SetupWizard.php:694
|
2598 |
+
msgid ""
|
2599 |
+
"The WordPress activity log contains sensitive data such as who logged in, "
|
2600 |
+
"from where, when and what they did."
|
2601 |
+
msgstr ""
|
2602 |
+
"Il log delle attività di WordPress contiene dati sensibili come chi ha "
|
2603 |
+
"effettuato l'accesso, da dove, quando e cosa ha fatto."
|
2604 |
+
|
2605 |
+
#: classes/Views/SetupWizard.php:727
|
2606 |
+
msgid ""
|
2607 |
+
"Your plugin is all set and it is ready to start keeping a record of "
|
2608 |
+
"everything that is happening on your WordPress in a WordPress activity log."
|
2609 |
+
msgstr ""
|
2610 |
+
"Il tuo plugin è completamente configurato ed è pronto per iniziare a tenere "
|
2611 |
+
"un registro di tutto ciò che sta accadendo sul tuo sito in un log delle "
|
2612 |
+
"attività WordPress."
|
2613 |
+
|
2614 |
+
#: classes/Views/SetupWizard.php:728
|
2615 |
+
msgid "Below are a few useful links you might need to refer to:"
|
2616 |
+
msgstr ""
|
2617 |
+
"Di seguito sono riportati alcuni link utili ai quali potresti aver bisogno "
|
2618 |
+
"di far riferimento:"
|
2619 |
+
|
2620 |
+
#: classes/Views/SetupWizard.php:733
|
2621 |
+
msgid "Getting started with the WP Security Audit Log plugin"
|
2622 |
+
msgstr "Introduzione al plugin WP Security Audit Log"
|
2623 |
+
|
2624 |
+
#: classes/Views/SetupWizard.php:738
|
2625 |
+
msgid "Knowledge Base & Support Documents"
|
2626 |
+
msgstr "Knowledge Base e documentazione informativa"
|
2627 |
+
|
2628 |
+
#: classes/Views/SetupWizard.php:743
|
2629 |
+
msgid "Benefits of keeping a WordPress activity log"
|
2630 |
+
msgstr "Vantaggi di mantenere un log delle attività di WordPress"
|
2631 |
+
|
2632 |
+
#: classes/Views/SetupWizard.php:748
|
2633 |
+
msgid ""
|
2634 |
+
"We trust this plugin meets all your activity log requirements. Should you "
|
2635 |
+
"encounter any problems, have feature requests or would like to share some "
|
2636 |
+
"feedback, <a href=\"https://www.wpsecurityauditlog.com/contact/\" target="
|
2637 |
+
"\"_blank\">please get in touch!</a>"
|
2638 |
+
msgstr ""
|
2639 |
+
"Confidiamo che questo plugin soddisfi tutti i requisiti del log attività. Se "
|
2640 |
+
"doveste riscontrare problemi, richieste di funzionalità, o vogliate "
|
2641 |
+
"condividere feedback, <a href=\"https://www.wpsecurityauditlog.com/contact/"
|
2642 |
+
"\" target=\"_ blank\"> mettetevi in contatto!</a>"
|
2643 |
+
|
2644 |
+
#: classes/Views/ToggleAlerts.php:27 classes/Views/ToggleAlerts.php:41
|
2645 |
+
msgid "Enable/Disable Events"
|
2646 |
+
msgstr "Abilita/Disabilita eventi"
|
2647 |
+
|
2648 |
+
#: classes/Views/ToggleAlerts.php:184
|
2649 |
+
msgid "Log Level: "
|
2650 |
+
msgstr "Livello log: "
|
2651 |
+
|
2652 |
+
#: classes/Views/ToggleAlerts.php:189
|
2653 |
+
msgid "Basic"
|
2654 |
+
msgstr "Base"
|
2655 |
+
|
2656 |
+
#: classes/Views/ToggleAlerts.php:194
|
2657 |
+
msgid "Geek"
|
2658 |
+
msgstr "Geek"
|
2659 |
+
|
2660 |
+
#: classes/Views/ToggleAlerts.php:197
|
2661 |
+
msgid "Custom"
|
2662 |
+
msgstr "Personalizzato"
|
2663 |
+
|
2664 |
+
#: classes/Views/ToggleAlerts.php:201
|
2665 |
+
msgid ""
|
2666 |
+
"Use the Log level drop down menu above to use one of our preset log levels. "
|
2667 |
+
"Alternatively you can enable or disable any of the individual events from "
|
2668 |
+
"the below tabs. Refer to <a href=\"https://www.wpsecurityauditlog.com/"
|
2669 |
+
"support-documentation/list-wordpress-audit-trail-alerts/\" target=\"_blank"
|
2670 |
+
"\">the complete list of WordPress activity log event IDs</a> for reference "
|
2671 |
+
"on all the events the plugin can keep a log of."
|
2672 |
+
msgstr ""
|
2673 |
+
"Usa il menu a tendina sopra per utilizzare uno dei nostri livelli di log "
|
2674 |
+
"predefiniti. In alternativa, è possibile attivare o disattivare uno "
|
2675 |
+
"qualsiasi dei singoli eventi dalle schede sottostanti. Fare riferimento a <a "
|
2676 |
+
"href=\"https://www.wpsecurityauditlog.com/support-documentation/list-"
|
2677 |
+
"wordpress-audit-trail-alerts/\" target=\"_blank\">l'elenco completo degli ID "
|
2678 |
+
"evento del log attività</a> per riferimento a tutti gli eventi che il plugin "
|
2679 |
+
"può monitorare."
|
2680 |
+
|
2681 |
+
#: classes/Views/ToggleAlerts.php:209 defaults.php:489
|
2682 |
+
msgid "Third Party Plugins"
|
2683 |
+
msgstr "Plugin di terze parti"
|
2684 |
+
|
2685 |
+
#: classes/Views/ToggleAlerts.php:212
|
2686 |
+
msgid "Visitor Events"
|
2687 |
+
msgstr "Eventi visitatori"
|
2688 |
+
|
2689 |
+
#: classes/Views/ToggleAlerts.php:229 classes/Views/ToggleAlerts.php:261
|
2690 |
+
#: defaults.php:265
|
2691 |
+
msgid "Custom Post Types"
|
2692 |
+
msgstr "Tipi di post personalizzati"
|
2693 |
+
|
2694 |
+
#: classes/Views/ToggleAlerts.php:229 classes/Views/ToggleAlerts.php:261
|
2695 |
+
#: defaults.php:305
|
2696 |
+
msgid "Pages"
|
2697 |
+
msgstr "Pagine"
|
2698 |
+
|
2699 |
+
#: classes/Views/ToggleAlerts.php:264 classes/Views/ToggleAlerts.php:271
|
2700 |
+
#: classes/Views/ToggleAlerts.php:329 defaults.php:493
|
2701 |
+
msgid "BBPress Forum"
|
2702 |
+
msgstr "Forum BBPress"
|
2703 |
+
|
2704 |
+
#: classes/Views/ToggleAlerts.php:265 classes/Views/ToggleAlerts.php:278
|
2705 |
+
#: classes/Views/ToggleAlerts.php:342 defaults.php:567
|
2706 |
+
msgid "WooCommerce"
|
2707 |
+
msgstr "WooCommerce"
|
2708 |
+
|
2709 |
+
#: classes/Views/ToggleAlerts.php:266 classes/Views/ToggleAlerts.php:285
|
2710 |
+
#: classes/Views/ToggleAlerts.php:342 classes/Views/ToggleAlerts.php:350
|
2711 |
+
#: defaults.php:522
|
2712 |
+
msgid "WooCommerce Products"
|
2713 |
+
msgstr "Prodotti WooCommerce"
|
2714 |
+
|
2715 |
+
#: classes/Views/ToggleAlerts.php:267 classes/Views/ToggleAlerts.php:292
|
2716 |
+
#: classes/Views/ToggleAlerts.php:357 defaults.php:612
|
2717 |
+
msgid "Yoast SEO"
|
2718 |
+
msgstr "Yoast SEO"
|
2719 |
+
|
2720 |
+
#: classes/Views/ToggleAlerts.php:268 classes/Views/ToggleAlerts.php:301
|
2721 |
+
#: classes/Views/ToggleAlerts.php:370 defaults.php:470
|
2722 |
+
msgid "MultiSite"
|
2723 |
+
msgstr "MultiSite"
|
2724 |
+
|
2725 |
+
#: classes/Views/ToggleAlerts.php:317
|
2726 |
+
msgid "Code"
|
2727 |
+
msgstr "Codice"
|
2728 |
+
|
2729 |
+
#: classes/Views/ToggleAlerts.php:319 classes/WidgetManager.php:87
|
2730 |
+
msgid "Description"
|
2731 |
+
msgstr "Descrizione"
|
2732 |
+
|
2733 |
+
#: classes/Views/ToggleAlerts.php:322 classes/Views/ToggleAlerts.php:484
|
2734 |
+
#: classes/Views/ToggleAlerts.php:599
|
2735 |
+
msgid "File Changes"
|
2736 |
+
msgstr "Modifiche file"
|
2737 |
+
|
2738 |
+
#: classes/Views/ToggleAlerts.php:323 defaults.php:196
|
2739 |
+
msgid "Content"
|
2740 |
+
msgstr "Contenuto"
|
2741 |
+
|
2742 |
+
#: classes/Views/ToggleAlerts.php:326
|
2743 |
+
msgid ""
|
2744 |
+
"<strong>Note:</strong> Post refers to any type of content, i.e. blog post, "
|
2745 |
+
"page or a post with a custom post type."
|
2746 |
+
msgstr ""
|
2747 |
+
"<strong> Nota: </strong> Il post si riferisce a qualsiasi tipo di contenuto, "
|
2748 |
+
"cioè post, pagina, o post con un tipo di post personalizzato."
|
2749 |
+
|
2750 |
+
#: classes/Views/ToggleAlerts.php:333
|
2751 |
+
msgid ""
|
2752 |
+
"The plugin BBPress is not installed on your website so these events have "
|
2753 |
+
"been disabled."
|
2754 |
+
msgstr ""
|
2755 |
+
"Il plugin BBPress non è installato sul tuo sito Web, quindi questi eventi "
|
2756 |
+
"sono stati disabilitati."
|
2757 |
+
|
2758 |
+
#: classes/Views/ToggleAlerts.php:339
|
2759 |
+
msgid "Forums"
|
2760 |
+
msgstr "Forum"
|
2761 |
+
|
2762 |
+
#: classes/Views/ToggleAlerts.php:346
|
2763 |
+
msgid ""
|
2764 |
+
"The plugin WooCommerce is not installed on your website so these events have "
|
2765 |
+
"been disabled."
|
2766 |
+
msgstr ""
|
2767 |
+
"Il plugin WooCommerce non è installato sul tuo sito Web, quindi questi "
|
2768 |
+
"eventi sono stati disabilitati."
|
2769 |
+
|
2770 |
+
#: classes/Views/ToggleAlerts.php:353
|
2771 |
+
msgid "Products"
|
2772 |
+
msgstr "Prodotti"
|
2773 |
+
|
2774 |
+
#: classes/Views/ToggleAlerts.php:361
|
2775 |
+
msgid ""
|
2776 |
+
"The plugin Yoast SEO is not installed on your website so these events have "
|
2777 |
+
"been disabled."
|
2778 |
+
msgstr ""
|
2779 |
+
"Il plugin Yoast SEO non è installato sul tuo sito, quindi questi eventi sono "
|
2780 |
+
"stati disabilitati."
|
2781 |
+
|
2782 |
+
#: classes/Views/ToggleAlerts.php:367
|
2783 |
+
msgid "Post Changes"
|
2784 |
+
msgstr "Modifiche post"
|
2785 |
+
|
2786 |
+
#: classes/Views/ToggleAlerts.php:374
|
2787 |
+
msgid ""
|
2788 |
+
"Your website is a single site so the multisite events have been disabled."
|
2789 |
+
msgstr ""
|
2790 |
+
"Hai un unico sito, quindi gli eventi multisito sono stati disabilitati."
|
2791 |
+
|
2792 |
+
#: classes/Views/ToggleAlerts.php:380 defaults.php:170
|
2793 |
+
msgid "User Profiles"
|
2794 |
+
msgstr "Profili Utente"
|
2795 |
+
|
2796 |
+
#: classes/Views/ToggleAlerts.php:383 defaults.php:152
|
2797 |
+
msgid "Other User Activity"
|
2798 |
+
msgstr "Attività utente varia"
|
2799 |
+
|
2800 |
+
#: classes/Views/ToggleAlerts.php:386
|
2801 |
+
msgid "Logins & Logouts"
|
2802 |
+
msgstr "Login e Logout"
|
2803 |
+
|
2804 |
+
#: classes/Views/ToggleAlerts.php:403
|
2805 |
+
msgid "Not Implemented"
|
2806 |
+
msgstr "Non implementato"
|
2807 |
+
|
2808 |
+
#: classes/Views/ToggleAlerts.php:406
|
2809 |
+
msgid "Not Available"
|
2810 |
+
msgstr "Non disponibile"
|
2811 |
+
|
2812 |
+
#: classes/Views/ToggleAlerts.php:416
|
2813 |
+
msgid "User Sessions"
|
2814 |
+
msgstr "Sessioni utente"
|
2815 |
+
|
2816 |
+
#: classes/Views/ToggleAlerts.php:418
|
2817 |
+
msgid "Files"
|
2818 |
+
msgstr "File"
|
2819 |
+
|
2820 |
+
#: classes/Views/ToggleAlerts.php:422
|
2821 |
+
msgid "Post Settings"
|
2822 |
+
msgstr "Impostazioni post"
|
2823 |
+
|
2824 |
+
#: classes/Views/ToggleAlerts.php:424
|
2825 |
+
msgid "Tags"
|
2826 |
+
msgstr "Tag"
|
2827 |
+
|
2828 |
+
#: classes/Views/ToggleAlerts.php:426 classes/Views/ToggleAlerts.php:442
|
2829 |
+
msgid "Categories"
|
2830 |
+
msgstr "Categorie"
|
2831 |
+
|
2832 |
+
#: classes/Views/ToggleAlerts.php:428
|
2833 |
+
msgid "Custom Fields"
|
2834 |
+
msgstr "Campi custom"
|
2835 |
+
|
2836 |
+
#: classes/Views/ToggleAlerts.php:430
|
2837 |
+
msgid "Sites"
|
2838 |
+
msgstr "Siti"
|
2839 |
+
|
2840 |
+
#: classes/Views/ToggleAlerts.php:434
|
2841 |
+
msgid "Topics"
|
2842 |
+
msgstr "Argomenti"
|
2843 |
+
|
2844 |
+
#: classes/Views/ToggleAlerts.php:436
|
2845 |
+
msgid "Product Admin"
|
2846 |
+
msgstr "Admin prodotto"
|
2847 |
+
|
2848 |
+
#: classes/Views/ToggleAlerts.php:438
|
2849 |
+
msgid "Product Attribute"
|
2850 |
+
msgstr "Attributo prodotto"
|
2851 |
+
|
2852 |
+
#: classes/Views/ToggleAlerts.php:440
|
2853 |
+
msgid "Store Admin"
|
2854 |
+
msgstr "Admin Store"
|
2855 |
+
|
2856 |
+
#: classes/Views/ToggleAlerts.php:444
|
2857 |
+
msgid "Attributes"
|
2858 |
+
msgstr "Attributi"
|
2859 |
+
|
2860 |
+
#: classes/Views/ToggleAlerts.php:446
|
2861 |
+
msgid "Coupons"
|
2862 |
+
msgstr "Coupon"
|
2863 |
+
|
2864 |
+
#: classes/Views/ToggleAlerts.php:448
|
2865 |
+
msgid "Orders"
|
2866 |
+
msgstr "Ordini"
|
2867 |
+
|
2868 |
+
#: classes/Views/ToggleAlerts.php:450
|
2869 |
+
msgid "Website Changes"
|
2870 |
+
msgstr "Modifiche sito web"
|
2871 |
+
|
2872 |
+
#: classes/Views/ToggleAlerts.php:452
|
2873 |
+
msgid "Plugin Settings"
|
2874 |
+
msgstr "Impostazioni plugin"
|
2875 |
+
|
2876 |
+
#: classes/Views/ToggleAlerts.php:458
|
2877 |
+
msgid "Cron Jobs"
|
2878 |
+
msgstr "Cron Jobs"
|
2879 |
+
|
2880 |
+
#: classes/Views/ToggleAlerts.php:460
|
2881 |
+
msgid "File Changes Scanning"
|
2882 |
+
msgstr "Scansione modifiche file"
|
2883 |
+
|
2884 |
+
#: classes/Views/ToggleAlerts.php:503 classes/Views/ToggleAlerts.php:536
|
2885 |
+
msgid ""
|
2886 |
+
"Capture 404 requests to file (the log file are created in the /wp-content/"
|
2887 |
+
"uploads/wp-security-audit-log/404s/ directory)"
|
2888 |
+
msgstr ""
|
2889 |
+
"Catturare richieste 404 al file (i file di log sono creati nella directory /"
|
2890 |
+
"wp-content/uploads/wp-security-audit-log/404s/ directory)"
|
2891 |
+
|
2892 |
+
#: classes/Views/ToggleAlerts.php:511 classes/Views/ToggleAlerts.php:544
|
2893 |
+
msgid "Purge log files older than one month"
|
2894 |
+
msgstr "Elimina file di log più vecchi di un mese"
|
2895 |
+
|
2896 |
+
#: classes/Views/ToggleAlerts.php:516
|
2897 |
+
msgid ""
|
2898 |
+
"Number of 404 Requests to Log. By default the plugin keeps up to 99 requests "
|
2899 |
+
"to non-existing pages from the same IP address. Increase the value in this "
|
2900 |
+
"setting to the desired amount to keep a log of more or less requests."
|
2901 |
+
msgstr ""
|
2902 |
+
"Numero di richieste 404 da memorizzare. Di default il plugin conserva fino a "
|
2903 |
+
"99 richieste a pagine non esistenti dallo stesso indirizzo IP. Aumentate il "
|
2904 |
+
"valore di questa impostazione fino alla quantità desiderata per avere un log "
|
2905 |
+
"con richieste maggiori o minori."
|
2906 |
+
|
2907 |
+
#: classes/Views/ToggleAlerts.php:521 classes/Views/ToggleAlerts.php:554
|
2908 |
+
msgid "Record the referrer that generated the 404 error."
|
2909 |
+
msgstr "Registrare il referrer che ha generato l'errore 404."
|
2910 |
+
|
2911 |
+
#: classes/Views/ToggleAlerts.php:549
|
2912 |
+
msgid ""
|
2913 |
+
"Number of 404 Requests to Log. By default the plugin keeps up to 99 requests "
|
2914 |
+
"to non-existing pages from the same IP address. Increase the value in this "
|
2915 |
+
"setting to the desired amount to keep a log of more or less requests. Note "
|
2916 |
+
"that by increasing this value to a high number, should your website be "
|
2917 |
+
"scanned the plugin will consume more resources to log all the requests."
|
2918 |
+
msgstr ""
|
2919 |
+
"Numero di richieste 404 da memorizzare. Di default il plugin conserva fino a "
|
2920 |
+
"99 richieste a pagine non esistenti dallo stesso indirizzo IP. Aumentate il "
|
2921 |
+
"valore di questa impostazione fino alla quantità desiderata per avere un log "
|
2922 |
+
"con richieste maggiori o minori. Se si aumenta troppo questo valore e se il "
|
2923 |
+
"tuo sito dovesse essere scansionato, il plugin consumerà più risorse per "
|
2924 |
+
"memorizzare tutte le richieste."
|
2925 |
+
|
2926 |
+
#: classes/Views/ToggleAlerts.php:566 classes/Views/ToggleAlerts.php:579
|
2927 |
+
msgid ""
|
2928 |
+
"Number of login attempts to log. Enter 0 to log all failed login attempts. "
|
2929 |
+
"(By default the plugin only logs up to 10 failed login because the process "
|
2930 |
+
"can be very resource intensive in case of a brute force attack)"
|
2931 |
+
msgstr ""
|
2932 |
+
"Numero di tentativi di accesso da memorizzare. Immettere 0 per il log di "
|
2933 |
+
"tutti i tentativi di accesso non riusciti. (Per default il plugin effettua "
|
2934 |
+
"il log solo fino a 10 accessi non riusciti, visto che il processo può "
|
2935 |
+
"richiedere parecchie risorse in caso di attacco a forza bruta)."
|
2936 |
+
|
2937 |
+
#: classes/Views/ToggleAlerts.php:592
|
2938 |
+
msgid ""
|
2939 |
+
"Log all stock changes. Disable this setting to only keep a log of stock "
|
2940 |
+
"changes done manually via the WooCommerce dashboard. Therefore automated "
|
2941 |
+
"stock changes typically done via customers placing orders or via other "
|
2942 |
+
"plugins will not be logged."
|
2943 |
+
msgstr ""
|
2944 |
+
"Effettua il log di tutte le variazioni di stock. Disattivare questa "
|
2945 |
+
"impostazione per mantenere un log solo delle variazioni degli stock "
|
2946 |
+
"effettuati manualmente tramite la bacheca di WooCommerce. Pertanto, le "
|
2947 |
+
"modifiche automatiche degli stock effettuate in genere tramite i clienti che "
|
2948 |
+
"effettuano ordini, o tramite altri plugin, non vengono registrate."
|
2949 |
+
|
2950 |
+
#: classes/Views/ToggleAlerts.php:614
|
2951 |
+
msgid "Configure the file integrity scan settings."
|
2952 |
+
msgstr "Configurare le impostazioni della scansione integrità dei file."
|
2953 |
+
|
2954 |
+
#: classes/Views/ToggleAlerts.php:629
|
2955 |
+
msgid ""
|
2956 |
+
"The plugin also keeps a log of some events that website visitors (non-logged "
|
2957 |
+
"in users) do because it is typically required by site admins. You can "
|
2958 |
+
"disable these events from here:"
|
2959 |
+
msgstr ""
|
2960 |
+
"Il plugin tiene anche un log di alcuni eventi che i visitatori del sito "
|
2961 |
+
"(utenti non registrati) compiono perché è tipicamente richiesto dagli "
|
2962 |
+
"amministratori del sito. È possibile disabilitare questi eventi da qui:"
|
2963 |
+
|
2964 |
+
#: classes/Views/ToggleAlerts.php:631
|
2965 |
+
msgid "Enable website visitors events"
|
2966 |
+
msgstr "Abilita eventi dei visitatori del sito"
|
2967 |
+
|
2968 |
+
#: classes/Views/ToggleAlerts.php:637
|
2969 |
+
msgid "Enable"
|
2970 |
+
msgstr "Abilita"
|
2971 |
+
|
2972 |
+
#: classes/Views/ToggleAlerts.php:642
|
2973 |
+
msgid ""
|
2974 |
+
"Below is the list of the events which are disabled when the above option is "
|
2975 |
+
"disabled:"
|
2976 |
+
msgstr ""
|
2977 |
+
"Di seguito è riportato l'elenco degli eventi che sono disabilitati quando "
|
2978 |
+
"l'opzione di cui sopra è disabilitata:"
|
2979 |
+
|
2980 |
+
#: classes/Views/ToggleAlerts.php:657
|
2981 |
+
msgid "Save Changes"
|
2982 |
+
msgstr "Salva modifiche"
|
2983 |
+
|
2984 |
+
#: classes/Views/ToggleAlerts.php:664
|
2985 |
+
msgid "Log Level Updated"
|
2986 |
+
msgstr "Livello log aggiornato"
|
2987 |
+
|
2988 |
+
#. translators: Alerts log level.
|
2989 |
+
#: classes/Views/ToggleAlerts.php:668
|
2990 |
+
#, php-format
|
2991 |
+
msgid "The %s log level has been successfully loaded and applied."
|
2992 |
+
msgstr "Il livello di log %s è stato caricato e applicato correttamente."
|
2993 |
+
|
2994 |
+
#: classes/Views/ToggleAlerts.php:672
|
2995 |
+
msgid "OK"
|
2996 |
+
msgstr "OK"
|
2997 |
+
|
2998 |
+
#: classes/Views/ToggleAlerts.php:686
|
2999 |
+
msgid "Enable File Integrity Scanner"
|
3000 |
+
msgstr "Attivare Scanner Integrità File"
|
3001 |
+
|
3002 |
+
#: classes/Views/ToggleAlerts.php:688
|
3003 |
+
msgid ""
|
3004 |
+
"The file integrity scanner is switched off. To enable this event it has to "
|
3005 |
+
"be switched on."
|
3006 |
+
msgstr ""
|
3007 |
+
"Lo scanner di integrità dei file è spento. Per abilitare questo evento deve "
|
3008 |
+
"essere acceso."
|
3009 |
+
|
3010 |
+
#: classes/Views/ToggleAlerts.php:692
|
3011 |
+
msgid "SWITCH ON"
|
3012 |
+
msgstr "AVVIA"
|
3013 |
+
|
3014 |
+
#: classes/Views/ToggleAlerts.php:693
|
3015 |
+
msgid "DISABLE EVENT"
|
3016 |
+
msgstr "DISABILITA EVENTO"
|
3017 |
+
|
3018 |
+
#: classes/WidgetManager.php:55
|
3019 |
+
msgid "Latest Events"
|
3020 |
+
msgstr "Ultimi eventi"
|
3021 |
+
|
3022 |
+
#: classes/WidgetManager.php:79
|
3023 |
+
msgid "No alerts found."
|
3024 |
+
msgstr "Nessun avviso trovato."
|
3025 |
+
|
3026 |
+
#: defaults.php:73
|
3027 |
+
msgid "Fatal run-time error."
|
3028 |
+
msgstr "Errore di run-time irreversibile."
|
3029 |
+
|
3030 |
+
#: defaults.php:77
|
3031 |
+
msgid "Run-time warning (non-fatal error)."
|
3032 |
+
msgstr "Avviso Run-time (errore non irreversibile)."
|
3033 |
+
|
3034 |
+
#: defaults.php:81
|
3035 |
+
msgid "Compile-time parse error."
|
3036 |
+
msgstr "Errore Compile-time parse."
|
3037 |
+
|
3038 |
+
#: defaults.php:85
|
3039 |
+
msgid "Run-time notice."
|
3040 |
+
msgstr "Avviso a run-time."
|
3041 |
+
|
3042 |
+
#: defaults.php:89
|
3043 |
+
msgid "Fatal error that occurred during startup."
|
3044 |
+
msgstr "Errore irreversibile che si è verificato durante l'avvio."
|
3045 |
+
|
3046 |
+
#: defaults.php:93
|
3047 |
+
msgid "Warnings that occurred during startup."
|
3048 |
+
msgstr "Avvisi che si sono verificati durante l'avvio."
|
3049 |
+
|
3050 |
+
#: defaults.php:97
|
3051 |
+
msgid "Fatal compile-time error."
|
3052 |
+
msgstr "Errore irreversibile in compile-time."
|
3053 |
+
|
3054 |
+
#: defaults.php:101
|
3055 |
+
msgid "Compile-time warning."
|
3056 |
+
msgstr "Avviso di compile-time."
|
3057 |
+
|
3058 |
+
#: defaults.php:105
|
3059 |
+
msgid "User-generated error message."
|
3060 |
+
msgstr "Messaggio d'errore generato dall'utente."
|
3061 |
+
|
3062 |
+
#: defaults.php:109
|
3063 |
+
msgid "User-generated warning message."
|
3064 |
+
msgstr "Messaggio d'avviso generato dall'utente."
|
3065 |
+
|
3066 |
+
#: defaults.php:113
|
3067 |
+
msgid "User-generated notice message."
|
3068 |
+
msgstr "Messaggio di notifica generato dall'utente."
|
3069 |
+
|
3070 |
+
#: defaults.php:117
|
3071 |
+
msgid "Non-standard/optimal code warning."
|
3072 |
+
msgstr "Avviso codice non-standard/ottimale."
|
3073 |
+
|
3074 |
+
#: defaults.php:121
|
3075 |
+
msgid "Catchable fatal error."
|
3076 |
+
msgstr "Catchable fatal error."
|
3077 |
+
|
3078 |
+
#: defaults.php:125
|
3079 |
+
msgid "Run-time deprecation notices."
|
3080 |
+
msgstr "Avvisi di deprecazione a run-time."
|
3081 |
+
|
3082 |
+
#: defaults.php:129
|
3083 |
+
msgid "Run-time user deprecation notices."
|
3084 |
+
msgstr "Avvisi di deprecazione dell'utente a run-time."
|
3085 |
+
|
3086 |
+
#: defaults.php:134
|
3087 |
+
msgid "Critical, high-impact messages."
|
3088 |
+
msgstr "Messaggi critici ad alto impatto."
|
3089 |
+
|
3090 |
+
#: defaults.php:138
|
3091 |
+
msgid "Debug informational messages."
|
3092 |
+
msgstr "Messaggi informativi di debug."
|
3093 |
+
|
3094 |
+
#: defaults.php:148
|
3095 |
+
msgid "Users Profiles & Activity"
|
3096 |
+
msgstr "Profili Utente & Attività"
|
3097 |
+
|
3098 |
+
#: defaults.php:153
|
3099 |
+
msgid "User logged in"
|
3100 |
+
msgstr "Utente connesso"
|
3101 |
+
|
3102 |
+
#: defaults.php:153
|
3103 |
+
msgid "Successfully logged in."
|
3104 |
+
msgstr "Autenticato con successo."
|
3105 |
+
|
3106 |
+
#: defaults.php:154
|
3107 |
+
msgid "User logged out"
|
3108 |
+
msgstr "Utente disconnesso"
|
3109 |
+
|
3110 |
+
#: defaults.php:154
|
3111 |
+
msgid "Successfully logged out."
|
3112 |
+
msgstr "Disconnesso con successo."
|
3113 |
+
|
3114 |
+
#: defaults.php:155
|
3115 |
+
msgid "Login failed"
|
3116 |
+
msgstr "Accesso non riuscito"
|
3117 |
+
|
3118 |
+
#: defaults.php:155
|
3119 |
+
msgid "%Attempts% failed login(s) detected."
|
3120 |
+
msgstr "%Attempts% tentativo(i) d'accesso non riuscito(i)."
|
3121 |
+
|
3122 |
+
#: defaults.php:156
|
3123 |
+
msgid "Login failed / non existing user"
|
3124 |
+
msgstr "Accesso non riuscito / utente inesistente"
|
3125 |
+
|
3126 |
+
#: defaults.php:156
|
3127 |
+
msgid ""
|
3128 |
+
"%Attempts% failed login(s) detected using non existing user. %LogFileText%"
|
3129 |
+
msgstr ""
|
3130 |
+
"Identificati %Attempts% tentativo(i) d'accesso non riuscito(i) da utente "
|
3131 |
+
"inesistente. %LogFileText%"
|
3132 |
+
|
3133 |
+
#: defaults.php:157
|
3134 |
+
msgid "Login blocked"
|
3135 |
+
msgstr "Login bloccato"
|
3136 |
+
|
3137 |
+
#: defaults.php:157
|
3138 |
+
msgid ""
|
3139 |
+
"Blocked from logging in because the same WordPress user is logged in from "
|
3140 |
+
"%ClientIP%."
|
3141 |
+
msgstr ""
|
3142 |
+
"Autenticazione bloccata perché lo stesso utente Wordpress è autenticato da "
|
3143 |
+
"%ClientIP%."
|
3144 |
+
|
3145 |
+
#: defaults.php:158
|
3146 |
+
msgid "User logged in with existing session(s)"
|
3147 |
+
msgstr "Utente autenticato con sessione(i) esistente(i)"
|
3148 |
+
|
3149 |
+
#: defaults.php:158
|
3150 |
+
msgid ""
|
3151 |
+
"Successfully logged in. Another session from %IPAddress% for this user "
|
3152 |
+
"already exist."
|
3153 |
+
msgstr ""
|
3154 |
+
"Autenticato con successo. Esiste già un'altra sessione per questo utente da "
|
3155 |
+
"%IPAddress%."
|
3156 |
+
|
3157 |
+
#: defaults.php:159
|
3158 |
+
msgid "User logged out all other sessions with the same username"
|
3159 |
+
msgstr ""
|
3160 |
+
"L'utente ha disconnesso tutte le altre sessioni con lo stesso nome utente"
|
3161 |
+
|
3162 |
+
#: defaults.php:159
|
3163 |
+
msgid "Logged out all other sessions with the same username."
|
3164 |
+
msgstr "Disconnesse tutte le altre sessioni con lo stesso nome utente."
|
3165 |
+
|
3166 |
+
#: defaults.php:160
|
3167 |
+
msgid "User session destroyed and logged out"
|
3168 |
+
msgstr "Sessione utente distrutta e disconnessa"
|
3169 |
+
|
3170 |
+
#: defaults.php:160
|
3171 |
+
msgid "Logged out session %TargetSessionID% which belonged to %TargetUserName%"
|
3172 |
+
msgstr ""
|
3173 |
+
"Sessione %TargetSessionID% disconnessa che apparteneva a %TargetUserName%"
|
3174 |
+
|
3175 |
+
#: defaults.php:161
|
3176 |
+
msgid "User uploaded file from Uploads directory"
|
3177 |
+
msgstr "L'utente ha caricato il file dalla directory Uploads"
|
3178 |
+
|
3179 |
+
#: defaults.php:161
|
3180 |
+
msgid "Uploaded the file %FileName% in %FilePath%."
|
3181 |
+
msgstr "Caricato il file %FileName% in %FilePath%."
|
3182 |
+
|
3183 |
+
#: defaults.php:162
|
3184 |
+
msgid "User deleted file from Uploads directory"
|
3185 |
+
msgstr "L'utente ha cancellato il file dalla directory Uploads"
|
3186 |
+
|
3187 |
+
#: defaults.php:162
|
3188 |
+
msgid "Deleted the file %FileName% from %FilePath%."
|
3189 |
+
msgstr "Eliminato il file %FileName% da %FilePath%."
|
3190 |
+
|
3191 |
+
#: defaults.php:163
|
3192 |
+
msgid "User requests non-existing pages (404 Error Pages)"
|
3193 |
+
msgstr "L'utente richiede pagine inesistenti (pagine errore 404)"
|
3194 |
+
|
3195 |
+
#: defaults.php:163
|
3196 |
+
msgid ""
|
3197 |
+
"Has requested a non existing page (404 Error Pages) %Attempts% %Msg%. "
|
3198 |
+
"%LinkFile%%URL%"
|
3199 |
+
msgstr ""
|
3200 |
+
"Ha richiesto una pagina inesistente (pagine errore 404) %Attempts% %Msg%. "
|
3201 |
+
"%LinkFile%%URL%"
|
3202 |
+
|
3203 |
+
#: defaults.php:164
|
3204 |
+
msgid "Website Visitor User requests non-existing pages (404 Error Pages)"
|
3205 |
+
msgstr ""
|
3206 |
+
"L'utente visitatore del sito richiede pagine inesistenti (pagine errore 404)"
|
3207 |
+
|
3208 |
+
#: defaults.php:164
|
3209 |
+
msgid ""
|
3210 |
+
"Website Visitor Has requested a non existing page (404 Error Pages) %Attempts"
|
3211 |
+
"% %Msg%. %LinkFile%%URL%"
|
3212 |
+
msgstr ""
|
3213 |
+
"Il visitatore del sito ha richiesto una pagina inesistente (pagine errore "
|
3214 |
+
"404) %Attempts% %Msg%. %LinkFile%%URL%"
|
3215 |
+
|
3216 |
+
#: defaults.php:171
|
3217 |
+
msgid "New user was created on WordPress"
|
3218 |
+
msgstr "Un nuovo utente è stato creato su Wordpress"
|
3219 |
+
|
3220 |
+
#: defaults.php:171
|
3221 |
+
msgid ""
|
3222 |
+
"A new user %NewUserData->Username% was created with role of %NewUserData-"
|
3223 |
+
">Roles%."
|
3224 |
+
msgstr ""
|
3225 |
+
"Un nuovo utente %NewUserData->Username% è stato creato con il ruolo di "
|
3226 |
+
"%NewUserData->Roles%."
|
3227 |
+
|
3228 |
+
#: defaults.php:172
|
3229 |
+
msgid "User created another WordPress user"
|
3230 |
+
msgstr "L'utente ha creato un altro utente Wordpress"
|
3231 |
+
|
3232 |
+
#: defaults.php:172
|
3233 |
+
msgid ""
|
3234 |
+
"%UserChanger% created a new user %NewUserData->Username% with the role of "
|
3235 |
+
"%NewUserData->Roles%."
|
3236 |
+
msgstr ""
|
3237 |
+
"%UserChanger% ha creato un nuovo utente %NewUserData->Username% con il ruolo "
|
3238 |
+
"di %NewUserData->Roles%."
|
3239 |
+
|
3240 |
+
#: defaults.php:173
|
3241 |
+
msgid "The role of a user was changed by another WordPress user"
|
3242 |
+
msgstr "Il ruolo di un utente è stato modificato da un altro utente WordPress"
|
3243 |
+
|
3244 |
+
#: defaults.php:173
|
3245 |
+
msgid ""
|
3246 |
+
"Changed the role of the user %TargetUsername% from %OldRole% to %NewRole%"
|
3247 |
+
"%multisite_text%."
|
3248 |
+
msgstr ""
|
3249 |
+
"Modificato il ruolo dell'utente %TargetUsername% da %OldRole% a %NewRole%"
|
3250 |
+
"%multisite_text%."
|
3251 |
+
|
3252 |
+
#: defaults.php:174
|
3253 |
+
msgid "User has changed his or her password"
|
3254 |
+
msgstr "L'utente ha modificato la propria password"
|
3255 |
+
|
3256 |
+
#: defaults.php:174
|
3257 |
+
msgid "Changed the password."
|
3258 |
+
msgstr "Modificata la password."
|
3259 |
+
|
3260 |
+
#: defaults.php:175
|
3261 |
+
msgid "User changed another user's password"
|
3262 |
+
msgstr "L'utente ha modificato la password di un altro utente"
|
3263 |
+
|
3264 |
+
#: defaults.php:175
|
3265 |
+
msgid ""
|
3266 |
+
"Changed the password for the user %TargetUserData->Username% with the role "
|
3267 |
+
"of %TargetUserData->Roles%."
|
3268 |
+
msgstr ""
|
3269 |
+
"Modificata la password per l'utente %TargetUserData->Username% con il ruolo "
|
3270 |
+
"di %TargetUserData->Roles%."
|
3271 |
+
|
3272 |
+
#: defaults.php:176
|
3273 |
+
msgid "User changed his or her email address"
|
3274 |
+
msgstr "L'utente ha modificato il proprio indirizzo email"
|
3275 |
+
|
3276 |
+
#: defaults.php:176
|
3277 |
+
msgid "Changed the email address from %OldEmail% to %NewEmail%."
|
3278 |
+
msgstr "Modificato l'indirizzo email da %OldEmail% a %NewEmail%."
|
3279 |
+
|
3280 |
+
#: defaults.php:177
|
3281 |
+
msgid "User changed another user's email address"
|
3282 |
+
msgstr "L'utente ha modificato l'indirizzo email di un altro utente"
|
3283 |
+
|
3284 |
+
#: defaults.php:177
|
3285 |
+
msgid ""
|
3286 |
+
"Changed the email address of the user %TargetUsername% from %OldEmail% to "
|
3287 |
+
"%NewEmail%."
|
3288 |
+
msgstr ""
|
3289 |
+
"Modificato l'indirizzo email dell'utente %TargetUsername% da %OldEmail% a "
|
3290 |
+
"%NewEmail%."
|
3291 |
+
|
3292 |
+
#: defaults.php:178
|
3293 |
+
msgid "User was deleted by another user"
|
3294 |
+
msgstr "L'utente è stato eliminato da un altro utente"
|
3295 |
+
|
3296 |
+
#: defaults.php:178
|
3297 |
+
msgid ""
|
3298 |
+
"Deleted the user %TargetUserData->Username% with the role of %TargetUserData-"
|
3299 |
+
">Roles%."
|
3300 |
+
msgstr ""
|
3301 |
+
"Eliminato l'utente %TargetUserData->Username% con il ruolo di "
|
3302 |
+
"%TargetUserData->Roles%."
|
3303 |
+
|
3304 |
+
#: defaults.php:179
|
3305 |
+
msgid "User opened the profile page of another user"
|
3306 |
+
msgstr "L'utente ha aperto la pagina profilo di un altro utente"
|
3307 |
+
|
3308 |
+
#: defaults.php:179
|
3309 |
+
msgid "%UserChanger% opened the profile page of the user %TargetUsername%."
|
3310 |
+
msgstr ""
|
3311 |
+
"%UserChanger% ha aperto la pagina profilo dell'utente %TargetUsername%."
|
3312 |
+
|
3313 |
+
#: defaults.php:180
|
3314 |
+
msgid "User updated a custom field value for a user"
|
3315 |
+
msgstr "L'utente ha aggiornato un valore di campo personalizzato per un utente"
|
3316 |
+
|
3317 |
+
#: defaults.php:180
|
3318 |
+
msgid ""
|
3319 |
+
"Changed the value of the custom field %custom_field_name%%ReportText% for "
|
3320 |
+
"the user %TargetUsername%.%ChangeText%"
|
3321 |
+
msgstr ""
|
3322 |
+
"Modificato il valore del campo personalizzato %custom_field_name%%ReportText"
|
3323 |
+
"% per l'utente %TargetUsername%.%ChangeText%"
|
3324 |
+
|
3325 |
+
#: defaults.php:181
|
3326 |
+
msgid "User created a custom field value for a user"
|
3327 |
+
msgstr "L'utente ha creato un valore di campo custom per un utente"
|
3328 |
+
|
3329 |
+
#: defaults.php:181
|
3330 |
+
msgid ""
|
3331 |
+
"Created the value of the custom field %custom_field_name% with %new_value% "
|
3332 |
+
"for the user %TargetUsername%."
|
3333 |
+
msgstr ""
|
3334 |
+
"Creato il valore del campo personalizzato %custom_field_name% con %new_value"
|
3335 |
+
"% per l'utente %TargetUsername%."
|
3336 |
+
|
3337 |
+
#: defaults.php:182
|
3338 |
+
msgid "User changed first name for a user"
|
3339 |
+
msgstr "L'utente ha modificato il nome per un utente"
|
3340 |
+
|
3341 |
+
#: defaults.php:182
|
3342 |
+
msgid ""
|
3343 |
+
"Changed the first name of the user %TargetUsername% from %old_firstname% to "
|
3344 |
+
"%new_firstname%"
|
3345 |
+
msgstr ""
|
3346 |
+
"Modificato il nome dell'utente %TargetUsername% da %old_firstname% a "
|
3347 |
+
"%new_firstname%"
|
3348 |
+
|
3349 |
+
#: defaults.php:183
|
3350 |
+
msgid "User changed last name for a user"
|
3351 |
+
msgstr "L'utente ha modificato il nome per un utente"
|
3352 |
+
|
3353 |
+
#: defaults.php:183
|
3354 |
+
msgid ""
|
3355 |
+
"Changed the last name of the user %TargetUsername% from %old_lastname% to "
|
3356 |
+
"%new_lastname%"
|
3357 |
+
msgstr ""
|
3358 |
+
"Modificato il nome dell'utente %TargetUsername% da %old_lastname% a "
|
3359 |
+
"%new_lastname%"
|
3360 |
+
|
3361 |
+
#: defaults.php:184
|
3362 |
+
msgid "User changed nickname for a user"
|
3363 |
+
msgstr "L'utente ha modificato il nickname per un utente"
|
3364 |
+
|
3365 |
+
#: defaults.php:184
|
3366 |
+
msgid ""
|
3367 |
+
"Changed the nickname of the user %TargetUsername% from %old_nickname% to "
|
3368 |
+
"%new_nickname%"
|
3369 |
+
msgstr ""
|
3370 |
+
"Modificato il nickname dell'utente %TargetUsername% da %old_nickname% a "
|
3371 |
+
"%new_nickname%"
|
3372 |
+
|
3373 |
+
#: defaults.php:185
|
3374 |
+
msgid "User changed the display name for a user"
|
3375 |
+
msgstr "L'utente ha modificato il nome visualizzato per un utente"
|
3376 |
+
|
3377 |
+
#: defaults.php:185
|
3378 |
+
msgid ""
|
3379 |
+
"Changed the Display name publicly of user %TargetUsername% from "
|
3380 |
+
"%old_displayname% to %new_displayname%"
|
3381 |
+
msgstr ""
|
3382 |
+
"Modificato il nome pubblico visualizzato dell'utente %TargetUsername% da "
|
3383 |
+
"%old_displayname% a %new_displayname%"
|
3384 |
+
|
3385 |
+
#: defaults.php:192
|
3386 |
+
msgid "Content & Comments"
|
3387 |
+
msgstr "Contenuti e commenti"
|
3388 |
+
|
3389 |
+
#: defaults.php:197
|
3390 |
+
msgid "User created a new post and saved it as draft"
|
3391 |
+
msgstr "L'utente ha creato un nuovo post e l'ha salvato come bozza"
|
3392 |
+
|
3393 |
+
#: defaults.php:197
|
3394 |
+
msgid ""
|
3395 |
+
"Created a new %PostType% titled %PostTitle% and saved it as draft. "
|
3396 |
+
"%EditorLinkPost%."
|
3397 |
+
msgstr ""
|
3398 |
+
"Creato un nuovo %PostType% dal titolo %PostTitle% e memorizzato come bozza. "
|
3399 |
+
"%EditorLinkPost%."
|
3400 |
+
|
3401 |
+
#: defaults.php:198
|
3402 |
+
msgid "User published a post"
|
3403 |
+
msgstr "L'utente ha pubblicato un post"
|
3404 |
+
|
3405 |
+
#: defaults.php:198
|
3406 |
+
msgid ""
|
3407 |
+
"Published a %PostType% titled %PostTitle%. URL is %PostUrl%. %EditorLinkPost"
|
3408 |
+
"%."
|
3409 |
+
msgstr ""
|
3410 |
+
"Pubblicato un %PostType% chiamato %PostTitle%. L'URL è %PostUrl%. "
|
3411 |
+
"%EditorLinkPost%."
|
3412 |
+
|
3413 |
+
#: defaults.php:199
|
3414 |
+
msgid "User modified a post"
|
3415 |
+
msgstr "L'utente ha modificato un post"
|
3416 |
+
|
3417 |
+
#: defaults.php:199
|
3418 |
+
msgid ""
|
3419 |
+
"Modified the %PostStatus% %PostType% titled %PostTitle%. URL is: %PostUrl%. "
|
3420 |
+
"%EditorLinkPost%."
|
3421 |
+
msgstr ""
|
3422 |
+
"Modificato il %PostStatus% %PostType% chiamato %PostTitle%. L'URL è: %PostUrl"
|
3423 |
+
"%. %EditorLinkPost%."
|
3424 |
+
|
3425 |
+
#: defaults.php:200
|
3426 |
+
msgid "User permanently deleted a post from the trash"
|
3427 |
+
msgstr "L'utente ha eliminato definitivamente un post dal cestino"
|
3428 |
+
|
3429 |
+
#: defaults.php:200
|
3430 |
+
msgid ""
|
3431 |
+
"Permanently deleted the %PostType% titled %PostTitle%. URL was %PostUrl%."
|
3432 |
+
msgstr ""
|
3433 |
+
"Eliminato definitivamente il %PostType% chiamato %PostTitle%. L'URL era "
|
3434 |
+
"%PostUrl%."
|
3435 |
+
|
3436 |
+
#: defaults.php:201
|
3437 |
+
msgid "User moved a post to the trash"
|
3438 |
+
msgstr "L'utente ha spostato un post nel cestino"
|
3439 |
+
|
3440 |
+
#: defaults.php:201
|
3441 |
+
msgid ""
|
3442 |
+
"Moved the %PostStatus% %PostType% titled %PostTitle% to trash. URL is "
|
3443 |
+
"%PostUrl%."
|
3444 |
+
msgstr ""
|
3445 |
+
"Spostato il %PostStatus% %PostType% intitolato %PostTitle% nel cestino. "
|
3446 |
+
"L'URL è %PostUrl%."
|
3447 |
+
|
3448 |
+
#: defaults.php:202
|
3449 |
+
msgid "User restored a post from trash"
|
3450 |
+
msgstr "L'utente ha ripristinato un post dal cestino"
|
3451 |
+
|
3452 |
+
#: defaults.php:202
|
3453 |
+
msgid ""
|
3454 |
+
"The %PostStatus% %PostType% titled %PostTitle% has been restored from trash. "
|
3455 |
+
"URL is: %PostUrl%. %EditorLinkPost%."
|
3456 |
+
msgstr ""
|
3457 |
+
"Il %PostStatus% %PostType% intitolato %PostTitle% è stato ripristinato dal "
|
3458 |
+
"cestino. L'URL è: %PostUrl%. \v%EditorLinkPost%."
|
3459 |
+
|
3460 |
+
#: defaults.php:203
|
3461 |
+
msgid "User changed post URL"
|
3462 |
+
msgstr "L'utente ha modificato l'URL del post"
|
3463 |
+
|
3464 |
+
#: defaults.php:203
|
3465 |
+
msgid ""
|
3466 |
+
"Changed the URL of the %PostStatus% %PostType% titled %PostTitle%%ReportText"
|
3467 |
+
"%.%ChangeText% %EditorLinkPost%."
|
3468 |
+
msgstr ""
|
3469 |
+
"Modificato l'URL del %PostStatus% %PostType% intitolato %PostTitle%"
|
3470 |
+
"%ReportText%.%ChangeText% %EditorLinkPost%."
|
3471 |
+
|
3472 |
+
#: defaults.php:204
|
3473 |
+
msgid "User changed post author"
|
3474 |
+
msgstr "L'utente ha modificato l'autore del post"
|
3475 |
+
|
3476 |
+
#: defaults.php:204
|
3477 |
+
msgid ""
|
3478 |
+
"Changed the author of the %PostStatus% %PostType% titled %PostTitle% from "
|
3479 |
+
"%OldAuthor% to %NewAuthor%. URL is: %PostUrl%. %EditorLinkPost%."
|
3480 |
+
msgstr ""
|
3481 |
+
"Modificato l'autore del %PostStatus% %PostType% intitolato %PostTitle% da "
|
3482 |
+
"%OldAuthor% a %NewAuthor%. L'URL è: %PostUrl%. %EditorLinkPost%."
|
3483 |
+
|
3484 |
+
#: defaults.php:205
|
3485 |
+
msgid "User changed post status"
|
3486 |
+
msgstr "L'utente ha modificato lo status del post"
|
3487 |
+
|
3488 |
+
#: defaults.php:205
|
3489 |
+
msgid ""
|
3490 |
+
"Changed the status of the %PostType% titled %PostTitle% from %OldStatus% to "
|
3491 |
+
"%NewStatus%. URL is: %PostUrl%. %EditorLinkPost%."
|
3492 |
+
msgstr ""
|
3493 |
+
"Modificato lo stato del %PostType% intitolato %PostTitle% da %OldStatus% a "
|
3494 |
+
"%NewStatus%. L'URL è: %PostUrl%. %EditorLinkPost%."
|
3495 |
+
|
3496 |
+
#: defaults.php:206
|
3497 |
+
msgid "User changed the visibility of a post"
|
3498 |
+
msgstr "L'utente ha modificato la visibilità di un post"
|
3499 |
+
|
3500 |
+
#: defaults.php:206
|
3501 |
+
msgid ""
|
3502 |
+
"Changed the visibility of the %PostStatus% %PostType% titled %PostTitle% "
|
3503 |
+
"from %OldVisibility% to %NewVisibility%. URL is: %PostUrl%. %EditorLinkPost%."
|
3504 |
+
msgstr ""
|
3505 |
+
"Modificata la visibilità del %PostStatus% %PostType% dal titolo %PostTitle% "
|
3506 |
+
"da %OldVisibility% a %NewVisibility%. L'URL è: %PostUrl%. %EditorLinkPost%."
|
3507 |
+
|
3508 |
+
#: defaults.php:207
|
3509 |
+
msgid "User changed the date of a post"
|
3510 |
+
msgstr "L'utente ha modificato la data di un post"
|
3511 |
+
|
3512 |
+
#: defaults.php:207
|
3513 |
+
msgid ""
|
3514 |
+
"Changed the date of the %PostStatus% %PostType% titled %PostTitle% from "
|
3515 |
+
"%OldDate% to %NewDate%. URL is: %PostUrl%. %EditorLinkPost%."
|
3516 |
+
msgstr ""
|
3517 |
+
"Modificata la data del %PostStatus% %PostType% dal titolo %PostTitle% da "
|
3518 |
+
"%OldDate% a %NewDate%. L'URL è: %PostUrl%. %EditorLinkPost%."
|
3519 |
+
|
3520 |
+
#: defaults.php:208
|
3521 |
+
msgid "User changed the parent of a page"
|
3522 |
+
msgstr "L'utente ha modificato il genitore di una pagina"
|
3523 |
+
|
3524 |
+
#: defaults.php:208
|
3525 |
+
msgid ""
|
3526 |
+
"Changed the parent of the %PostStatus% %PostType% titled %PostTitle% from "
|
3527 |
+
"%OldParentName% to %NewParentName%. %EditorLinkPost%."
|
3528 |
+
msgstr ""
|
3529 |
+
"Modificato il genitore del %PostStatus% %PostType% intitolato %PostTitle% da "
|
3530 |
+
"%OldParentName% a %NewParentName%. %EditorLinkPost%."
|
3531 |
+
|
3532 |
+
#: defaults.php:209
|
3533 |
+
msgid "User changed the template of a page"
|
3534 |
+
msgstr "L'utente ha modificato il template di una pagina"
|
3535 |
+
|
3536 |
+
#: defaults.php:209
|
3537 |
+
msgid ""
|
3538 |
+
"Changed the template of the %PostStatus% %PostType% titled %PostTitle% from "
|
3539 |
+
"%OldTemplate% to %NewTemplate%. %EditorLinkPost%."
|
3540 |
+
msgstr ""
|
3541 |
+
"Modificato il modello del %PostStatus% %PostType% intitolato %PostTitle% da "
|
3542 |
+
"%OldTemplate% a %NewTemplate%. %EditorLinkPost%."
|
3543 |
+
|
3544 |
+
#: defaults.php:210
|
3545 |
+
msgid "User set a post as sticky"
|
3546 |
+
msgstr "L'utente pone un post in evidenza"
|
3547 |
+
|
3548 |
+
#: defaults.php:210
|
3549 |
+
msgid ""
|
3550 |
+
"Set the post %PostTitle% as Sticky. Post URL is %PostUrl%. %EditorLinkPost%."
|
3551 |
+
msgstr ""
|
3552 |
+
"Il post %PostTitle% è stato messo in evidenza. L'URL del post è %PostUrl%. "
|
3553 |
+
"%EditorLinkPost%."
|
3554 |
+
|
3555 |
+
#: defaults.php:211
|
3556 |
+
msgid "User removed post from sticky"
|
3557 |
+
msgstr "L'utente ha rimosso il post in evidenza"
|
3558 |
+
|
3559 |
+
#: defaults.php:211
|
3560 |
+
msgid "Removed the post %PostTitle% from Sticky. %EditorLinkPost%."
|
3561 |
+
msgstr "Rimosso il post %PostTitle% in evidenza. %EditorLinkPost%."
|
3562 |
+
|
3563 |
+
#: defaults.php:212
|
3564 |
+
msgid "User modified the content of a post"
|
3565 |
+
msgstr "L'utente ha modificato il contenuto di un post"
|
3566 |
+
|
3567 |
+
#: defaults.php:212
|
3568 |
+
msgid ""
|
3569 |
+
"Modified the content of the %PostStatus% %PostType% titled %PostTitle%. Post "
|
3570 |
+
"URL is %PostUrl%. %RevisionLink% %EditorLinkPost%."
|
3571 |
+
msgstr ""
|
3572 |
+
"Modificato il contenuto del %PostStatus% %PostType% intitolato %PostTitle%. "
|
3573 |
+
"L'URL del post è %PostUrl%. %RevisionLink% %EditorLinkPost%."
|
3574 |
+
|
3575 |
+
#: defaults.php:213
|
3576 |
+
msgid "User submitted a post for review"
|
3577 |
+
msgstr "L'utente ha inviato un post per la revisione"
|
3578 |
+
|
3579 |
+
#: defaults.php:213
|
3580 |
+
msgid ""
|
3581 |
+
"Submitted the %PostType% titled %PostTitle% for review. URL is: %PostUrl%. "
|
3582 |
+
"%EditorLinkPost%."
|
3583 |
+
msgstr ""
|
3584 |
+
"Inviato il %PostType% intitolato %PostTitle% per la revisione. L'URL è: "
|
3585 |
+
"%PostUrl%. %EditorLinkPost%."
|
3586 |
+
|
3587 |
+
#: defaults.php:214
|
3588 |
+
msgid "User scheduled a post"
|
3589 |
+
msgstr "L'utente ha pianificato un post"
|
3590 |
+
|
3591 |
+
#: defaults.php:214
|
3592 |
+
msgid ""
|
3593 |
+
"Scheduled the %PostType% titled %PostTitle% to be published on "
|
3594 |
+
"%PublishingDate%. URL is: %PostUrl%. %EditorLinkPost%."
|
3595 |
+
msgstr ""
|
3596 |
+
"Pianificato il %PostType% intitolato %PostTitle% da pubblicare il "
|
3597 |
+
"%PublishingDate%. L'URL è: %PostUrl%. %EditorLinkPost%."
|
3598 |
+
|
3599 |
+
#: defaults.php:215
|
3600 |
+
msgid "User changed title of a post"
|
3601 |
+
msgstr "L'utente ha modificato il titolo di un post"
|
3602 |
+
|
3603 |
+
#: defaults.php:215
|
3604 |
+
msgid ""
|
3605 |
+
"Changed the title of the %PostStatus% %PostType% from %OldTitle% to %NewTitle"
|
3606 |
+
"%. URL is: %PostUrl%. %EditorLinkPost%."
|
3607 |
+
msgstr ""
|
3608 |
+
"Modificato il titolo del %PostStatus% %PostType% da %OldTitle% a %NewTitle%. "
|
3609 |
+
"L'URL è: %PostUrl%. %EditorLinkPost%."
|
3610 |
+
|
3611 |
+
#: defaults.php:216
|
3612 |
+
msgid "User opened a post in the editor"
|
3613 |
+
msgstr "L'utente ha aperto un post nell'editor"
|
3614 |
+
|
3615 |
+
#: defaults.php:216
|
3616 |
+
msgid ""
|
3617 |
+
"Opened the %PostStatus% %PostType% titled %PostTitle% in the editor. URL is: "
|
3618 |
+
"%PostUrl%. %EditorLinkPost%."
|
3619 |
+
msgstr ""
|
3620 |
+
"Aperto il %PostStatus% %PostType% chiamato %PostTitle% nell'editor. L'URL è: "
|
3621 |
+
"%PostUrl%. %EditorLinkPost%."
|
3622 |
+
|
3623 |
+
#: defaults.php:217
|
3624 |
+
msgid "User viewed a post"
|
3625 |
+
msgstr "Utente ha visualizzato un post"
|
3626 |
+
|
3627 |
+
#: defaults.php:217
|
3628 |
+
msgid ""
|
3629 |
+
"Viewed the %PostStatus% %PostType% titled %PostTitle%. URL is: %PostUrl%. "
|
3630 |
+
"%EditorLinkPost%."
|
3631 |
+
msgstr ""
|
3632 |
+
"Visualizzato il %PostStatus% %PostType% chiamato %PostTitle%. URL è: %PostUrl"
|
3633 |
+
"%. %EditorLinkPost%."
|
3634 |
+
|
3635 |
+
#: defaults.php:218
|
3636 |
+
msgid "A plugin modified a post"
|
3637 |
+
msgstr "Un plugin ha modificato un post"
|
3638 |
+
|
3639 |
+
#: defaults.php:218
|
3640 |
+
msgid ""
|
3641 |
+
"Plugin modified the %PostStatus% %PostType% titled %PostTitle% of type "
|
3642 |
+
"%PostType%. URL is: %PostUrl%. %EditorLinkPost%."
|
3643 |
+
msgstr ""
|
3644 |
+
"Il plugin ha modificato il %PostStatus% %PostType% chiamato %PostTitle% del "
|
3645 |
+
"tipo %PostType%. L'URL è: %PostUrl%. \v%EditorLinkPost%."
|
3646 |
+
|
3647 |
+
#: defaults.php:219
|
3648 |
+
msgid "User disabled Comments/Trackbacks and Pingbacks in a post"
|
3649 |
+
msgstr "Utente ha disabilitato commenti/trackback e pingback in un post"
|
3650 |
+
|
3651 |
+
#: defaults.php:219
|
3652 |
+
msgid ""
|
3653 |
+
"Disabled %Type% on the %PostStatus% %PostType% titled %PostTitle%. URL is: "
|
3654 |
+
"%PostUrl%. %EditorLinkPost%."
|
3655 |
+
msgstr ""
|
3656 |
+
"Disabilitato %Type% nel %PostStatus% %PostType% chiamato %PostTitle%. L'URL "
|
3657 |
+
"è: %PostUrl%. %EditorLinkPost%."
|
3658 |
+
|
3659 |
+
#: defaults.php:220
|
3660 |
+
msgid "User enabled Comments/Trackbacks and Pingbacks in a post"
|
3661 |
+
msgstr "L'utente ha abilitato commenti/trackback e pingback in un post"
|
3662 |
+
|
3663 |
+
#: defaults.php:220
|
3664 |
+
msgid ""
|
3665 |
+
"Enabled %Type% on the %PostStatus% %PostType% titled %PostTitle%. URL is: "
|
3666 |
+
"%PostUrl%. %EditorLinkPost%."
|
3667 |
+
msgstr ""
|
3668 |
+
"Abilitato %Type% nel %PostStatus% %PostType% chiamato %PostTitle%. L'URL è: "
|
3669 |
+
"%PostUrl%. %EditorLinkPost%."
|
3670 |
+
|
3671 |
+
#: defaults.php:221
|
3672 |
+
msgid "User added post tag"
|
3673 |
+
msgstr "L'utente ha aggiunto tag al post"
|
3674 |
+
|
3675 |
+
#: defaults.php:221
|
3676 |
+
msgid ""
|
3677 |
+
"Added the tag %tag% to the %PostStatus% post titled %PostTitle%. URL is: "
|
3678 |
+
"%PostUrl%. %EditorLinkPost%."
|
3679 |
+
msgstr ""
|
3680 |
+
"Aggiunto il tag %tag% al %PostStatus% post intitolato %PostTitle%. L'URL è: "
|
3681 |
+
"%PostUrl%. %EditorLinkPost%."
|
3682 |
+
|
3683 |
+
#: defaults.php:222
|
3684 |
+
msgid "User removed post tag"
|
3685 |
+
msgstr "L'utente ha rimosso il tag del post"
|
3686 |
+
|
3687 |
+
#: defaults.php:222
|
3688 |
+
msgid ""
|
3689 |
+
"Removed the tag %tag% from the %PostStatus% post titled %PostTitle%. URL is: "
|
3690 |
+
"%PostUrl%. %EditorLinkPost%."
|
3691 |
+
msgstr ""
|
3692 |
+
"Rimosso il tag %tag% dal %PostStatus% post intitolato %PostTitle%. L'URL è: "
|
3693 |
+
"%PostUrl%. %EditorLinkPost%."
|
3694 |
+
|
3695 |
+
#: defaults.php:223
|
3696 |
+
msgid "User created new tag"
|
3697 |
+
msgstr "L'utente ha creato un nuovo tag"
|
3698 |
+
|
3699 |
+
#: defaults.php:223
|
3700 |
+
msgid "Added a new tag called %TagName%. View the tag: %TagLink%."
|
3701 |
+
msgstr ""
|
3702 |
+
"Aggiunto un nuovo tag chiamato %TagName%. Visualizza il tag: %TagLink%."
|
3703 |
+
|
3704 |
+
#: defaults.php:224
|
3705 |
+
msgid "User deleted tag"
|
3706 |
+
msgstr "L'utente ha eliminato un tag"
|
3707 |
+
|
3708 |
+
#: defaults.php:224
|
3709 |
+
msgid "Deleted the tag %TagName%."
|
3710 |
+
msgstr "Eliminato il tag %TagName%."
|
3711 |
+
|
3712 |
+
#: defaults.php:225
|
3713 |
+
msgid "User renamed tag"
|
3714 |
+
msgstr "L'utente ha rinominato un tag"
|
3715 |
+
|
3716 |
+
#: defaults.php:225
|
3717 |
+
msgid "Renamed a tag from %old_name% to %new_name%. View the tag: %TagLink%."
|
3718 |
+
msgstr ""
|
3719 |
+
"Rinominato un tag da %old_name% a %new_name%. Visualizza il tag: %TagLink%."
|
3720 |
+
|
3721 |
+
#: defaults.php:226
|
3722 |
+
msgid "User changed tag slug"
|
3723 |
+
msgstr "L'utente ha modificato lo slug del tag"
|
3724 |
+
|
3725 |
+
#: defaults.php:226
|
3726 |
+
msgid ""
|
3727 |
+
"Changed the slug of tag %tag% from %old_slug% to %new_slug%. View the tag: "
|
3728 |
+
"%TagLink%."
|
3729 |
+
msgstr ""
|
3730 |
+
"Cambiato lo slug del tag %tag% da %old_slug% a %new_slug%. Visualizza il "
|
3731 |
+
"tag: %TagLink%."
|
3732 |
+
|
3733 |
+
#: defaults.php:227
|
3734 |
+
msgid "User changed tag description"
|
3735 |
+
msgstr "L'utente ha modificato la descrizione del tag"
|
3736 |
+
|
3737 |
+
#: defaults.php:227
|
3738 |
+
msgid ""
|
3739 |
+
"Changed the description of the tag %tag%%ReportText%.%ChangeText% View the "
|
3740 |
+
"tag: %TagLink%."
|
3741 |
+
msgstr ""
|
3742 |
+
"Cambiata la descrizione del tag %tag%%ReportText%.%ChangeText% Visualizza il "
|
3743 |
+
"tag: %TagLink%."
|
3744 |
+
|
3745 |
+
#: defaults.php:228
|
3746 |
+
msgid "User changed post category"
|
3747 |
+
msgstr "L'utente ha modificato la categoria del post"
|
3748 |
+
|
3749 |
+
#: defaults.php:228
|
3750 |
+
msgid ""
|
3751 |
+
"Changed the category of the %PostStatus% %PostType% titled %PostTitle% from "
|
3752 |
+
"%OldCategories% to %NewCategories%. URL is: %PostUrl%. %EditorLinkPost%."
|
3753 |
+
msgstr ""
|
3754 |
+
"Cambiata la categoria del %PostStatus% %PostType% intitolato %PostTitle% da "
|
3755 |
+
"%OldCategories% a %NewCategories%. L'URL è: %PostUrl%. %EditorLinkPost%."
|
3756 |
+
|
3757 |
+
#: defaults.php:229
|
3758 |
+
msgid "User created new category"
|
3759 |
+
msgstr "L'utente ha creato una nuova categoria"
|
3760 |
+
|
3761 |
+
#: defaults.php:229
|
3762 |
+
msgid ""
|
3763 |
+
"Created a new category called %CategoryName%. Category slug is %Slug%. "
|
3764 |
+
"%CategoryLink%."
|
3765 |
+
msgstr ""
|
3766 |
+
"Creata una nuova categoria chiamata %CategoryName%. Lo slug della categoria "
|
3767 |
+
"è %Slug%. %CategoryLink%."
|
3768 |
+
|
3769 |
+
#: defaults.php:230
|
3770 |
+
msgid "User deleted category"
|
3771 |
+
msgstr "L'utente ha eliminato categoria"
|
3772 |
+
|
3773 |
+
#: defaults.php:230
|
3774 |
+
msgid ""
|
3775 |
+
"Deleted the %CategoryName% category. Category slug was %Slug%. %CategoryLink"
|
3776 |
+
"%."
|
3777 |
+
msgstr ""
|
3778 |
+
"Eliminata la categoria %CategoryName%. Lo slug della categoria era %Slug%. "
|
3779 |
+
"%CategoryLink%."
|
3780 |
+
|
3781 |
+
#: defaults.php:231
|
3782 |
+
msgid "Changed the parent of a category"
|
3783 |
+
msgstr "L'utente ha modificato il genitore di una categoria"
|
3784 |
+
|
3785 |
+
#: defaults.php:231
|
3786 |
+
msgid ""
|
3787 |
+
"Changed the parent of the category %CategoryName% from %OldParent% to "
|
3788 |
+
"%NewParent%. %CategoryLink%."
|
3789 |
+
msgstr ""
|
3790 |
+
"Modificato il genitore della categoria %CategoryName% da %OldParent% a "
|
3791 |
+
"%NewParent%. %CategoryLink%."
|
3792 |
+
|
3793 |
+
#: defaults.php:232
|
3794 |
+
msgid "User changed category name"
|
3795 |
+
msgstr "L'utente ha modificato il nome della categoria"
|
3796 |
+
|
3797 |
+
#: defaults.php:232
|
3798 |
+
msgid "Changed the name of the category %old_name% to %new_name%."
|
3799 |
+
msgstr "Modificato il nome della categoria %old_name% a %new_name%."
|
3800 |
+
|
3801 |
+
#: defaults.php:233
|
3802 |
+
msgid "User changed category slug"
|
3803 |
+
msgstr "L'utente ha modificato lo slug della categoria"
|
3804 |
+
|
3805 |
+
#: defaults.php:233
|
3806 |
+
msgid ""
|
3807 |
+
"Changed the slug of the category %CategoryName% from %old_slug% to %new_slug"
|
3808 |
+
"%."
|
3809 |
+
msgstr ""
|
3810 |
+
"Modificato lo slug della categoria %CategoryName% da %old_slug% a %new_slug%."
|
3811 |
+
|
3812 |
+
#: defaults.php:234
|
3813 |
+
msgid "User created a custom field for a post"
|
3814 |
+
msgstr "L'utente ha creato un campo custom per un post"
|
3815 |
+
|
3816 |
+
#: defaults.php:234
|
3817 |
+
msgid ""
|
3818 |
+
"Created a new custom field called %MetaKey% with value %MetaValue% in the "
|
3819 |
+
"%PostStatus% %PostType% titled %PostTitle%. URL is: %PostUrl%. "
|
3820 |
+
"%EditorLinkPost%.<br>%MetaLink%."
|
3821 |
+
msgstr ""
|
3822 |
+
"Creato un nuovo campo personalizzato chiamato %MetaKey% con valore %MetaValue"
|
3823 |
+
"% nel %PostStatus% %PostType% intitolato %PostTitle%. L'URL è: %PostUrl%. "
|
3824 |
+
"%EditorLinkPost%.<br>%MetaLink%."
|
3825 |
+
|
3826 |
+
#: defaults.php:235
|
3827 |
+
msgid "User updated a custom field value for a post"
|
3828 |
+
msgstr "L'utente ha aggiornato un valore di campo personalizzato per un post"
|
3829 |
+
|
3830 |
+
#: defaults.php:235
|
3831 |
+
msgid ""
|
3832 |
+
"Modified the value of the custom field %MetaKey%%ReportText% in the "
|
3833 |
+
"%PostStatus% %PostType% titled %PostTitle%.%ChangeText% URL is: %PostUrl%. "
|
3834 |
+
"%EditorLinkPost%.<br>%MetaLink%."
|
3835 |
+
msgstr ""
|
3836 |
+
"Modificato il valore del campo personalizzato %MetaKey%%ReportText% nel "
|
3837 |
+
"%PostStatus% %PostType% intitolato %PostTitle%.%ChangeText% L'URL è: %PostUrl"
|
3838 |
+
"%. %EditorLinkPost%.<br>%MetaLink%."
|
3839 |
+
|
3840 |
+
#: defaults.php:236
|
3841 |
+
msgid "User deleted a custom field from a post"
|
3842 |
+
msgstr "L'utente ha eliminato un campo custom da un post"
|
3843 |
+
|
3844 |
+
#: defaults.php:236
|
3845 |
+
msgid ""
|
3846 |
+
"Deleted the custom field %MetaKey% with value %MetaValue% from %PostStatus% "
|
3847 |
+
"%PostType% titled %PostTitle%. URL is: %PostUrl%. %EditorLinkPost%."
|
3848 |
+
msgstr ""
|
3849 |
+
"Eliminato il campo personalizzato %MetaKey% con valore %MetaValue% da "
|
3850 |
+
"%PostStatus%%PostType% chiamato %PostTitle%. L'URL è: %PostUrl%. "
|
3851 |
+
"%EditorLinkPost%."
|
3852 |
+
|
3853 |
+
#: defaults.php:237
|
3854 |
+
msgid "User updated a custom field name for a post"
|
3855 |
+
msgstr "L'utente ha aggiornato un nome di un campo custom per un post"
|
3856 |
+
|
3857 |
+
#: defaults.php:237
|
3858 |
+
msgid ""
|
3859 |
+
"Changed the custom field's name from %MetaKeyOld% to %MetaKeyNew% in the "
|
3860 |
+
"%PostStatus% %PostType% titled %PostTitle%. URL is: %PostUrl%. "
|
3861 |
+
"%EditorLinkPost%.<br>%MetaLink%."
|
3862 |
+
msgstr ""
|
3863 |
+
"Modificato il nome del campo personalizzato da %MetaKeyOld% a %MetaKeyNew% "
|
3864 |
+
"nel %PostStatus% %PostType% intitolato %PostTitle%. L'URL è: %PostUrl%. "
|
3865 |
+
"%EditorLinkPost%.<br>%MetaLink%."
|
3866 |
+
|
3867 |
+
#: defaults.php:243
|
3868 |
+
msgid "Comments"
|
3869 |
+
msgstr "Commenti"
|
3870 |
+
|
3871 |
+
#: defaults.php:244
|
3872 |
+
msgid "User approved a comment"
|
3873 |
+
msgstr "L'utente ha approvato un commento"
|
3874 |
+
|
3875 |
+
#: defaults.php:244
|
3876 |
+
msgid ""
|
3877 |
+
"Approved the comment posted in response to the post %PostTitle% by %Author% "
|
3878 |
+
"on %CommentLink%."
|
3879 |
+
msgstr ""
|
3880 |
+
"Approvato il commento in risposta al post %PostTitle% di %Author% in "
|
3881 |
+
"%CommentLink%."
|
3882 |
+
|
3883 |
+
#: defaults.php:245
|
3884 |
+
msgid "User unapproved a comment"
|
3885 |
+
msgstr "L'utente ha revocato l'approvazione di un commento"
|
3886 |
+
|
3887 |
+
#: defaults.php:245
|
3888 |
+
msgid ""
|
3889 |
+
"Unapproved the comment posted in response to the post %PostTitle% by %Author"
|
3890 |
+
"% on %CommentLink%."
|
3891 |
+
msgstr ""
|
3892 |
+
"Revocata l'approvazione del commento in risposta al post %PostTitle% di "
|
3893 |
+
"%Author% in %CommentLink%."
|
3894 |
+
|
3895 |
+
#: defaults.php:246
|
3896 |
+
msgid "User replied to a comment"
|
3897 |
+
msgstr "L'utente ha replicato a un commento"
|
3898 |
+
|
3899 |
+
#: defaults.php:246
|
3900 |
+
msgid ""
|
3901 |
+
"Replied to the comment posted in response to the post %PostTitle% by %Author"
|
3902 |
+
"% on %CommentLink%."
|
3903 |
+
msgstr ""
|
3904 |
+
"Replica al commento di risposta a %PostTitle% da %Author% in %CommentLink%."
|
3905 |
+
|
3906 |
+
#: defaults.php:247
|
3907 |
+
msgid "User edited a comment"
|
3908 |
+
msgstr "L'utente ha modificato un commento"
|
3909 |
+
|
3910 |
+
#: defaults.php:247
|
3911 |
+
msgid ""
|
3912 |
+
"Edited a comment posted in response to the post %PostTitle% by %Author% on "
|
3913 |
+
"%CommentLink%."
|
3914 |
+
msgstr ""
|
3915 |
+
"Modificato il commento in risposta al post %PostTitle% di %Author% in "
|
3916 |
+
"%CommentLink%."
|
3917 |
+
|
3918 |
+
#: defaults.php:248
|
3919 |
+
msgid "User marked a comment as Spam"
|
3920 |
+
msgstr "L'utente ha contrassegnato un commento come spam"
|
3921 |
+
|
3922 |
+
#: defaults.php:248
|
3923 |
+
msgid ""
|
3924 |
+
"Marked the comment posted in response to the post %PostTitle% by %Author% on "
|
3925 |
+
"%CommentLink% as Spam."
|
3926 |
+
msgstr ""
|
3927 |
+
"Contrassegnato il commento in risposta a %PostTitle% di %Author% in "
|
3928 |
+
"%CommentLink% come spam."
|
3929 |
+
|
3930 |
+
#: defaults.php:249
|
3931 |
+
msgid "User marked a comment as Not Spam"
|
3932 |
+
msgstr "L'utente ha contrassegnato un commento come Non Spam"
|
3933 |
+
|
3934 |
+
#: defaults.php:249
|
3935 |
+
msgid ""
|
3936 |
+
"Marked the comment posted in response to the post %PostTitle% by %Author% on "
|
3937 |
+
"%CommentLink% as Not Spam."
|
3938 |
+
msgstr ""
|
3939 |
+
"Contrassegnato il commento in replica al post %PostTitle% di %Author% in "
|
3940 |
+
"%CommentLink% come Non Spam."
|
3941 |
+
|
3942 |
+
#: defaults.php:250
|
3943 |
+
msgid "User moved a comment to trash"
|
3944 |
+
msgstr "L'utente ha spostato un commento nel cestino"
|
3945 |
+
|
3946 |
+
#: defaults.php:250
|
3947 |
+
msgid ""
|
3948 |
+
"Moved the comment posted in response to the post %PostTitle% by %Author% on "
|
3949 |
+
"%Date% to trash."
|
3950 |
+
msgstr ""
|
3951 |
+
"Spostato il commento in risposta al post %PostTitle% di %Author% il %Date% "
|
3952 |
+
"in %CommentLink% nel cestino."
|
3953 |
+
|
3954 |
+
#: defaults.php:251
|
3955 |
+
msgid "User restored a comment from the trash"
|
3956 |
+
msgstr "L'utente ha ripristinato un commento dal cestino"
|
3957 |
+
|
3958 |
+
#: defaults.php:251
|
3959 |
+
msgid ""
|
3960 |
+
"Restored the comment posted in response to the post %PostTitle% by %Author% "
|
3961 |
+
"on %CommentLink% from the trash."
|
3962 |
+
msgstr ""
|
3963 |
+
"Ripristinato il commento in risposta al post %PostTitle% da %Author% in "
|
3964 |
+
"%CommentLink% dal cestino."
|
3965 |
+
|
3966 |
+
#: defaults.php:252
|
3967 |
+
msgid "User permanently deleted a comment"
|
3968 |
+
msgstr "L'utente ha eliminato definitivamente un commento"
|
3969 |
+
|
3970 |
+
#: defaults.php:252
|
3971 |
+
msgid ""
|
3972 |
+
"Permanently deleted the comment posted in response to the post %PostTitle% "
|
3973 |
+
"by %Author% on %Date%."
|
3974 |
+
msgstr ""
|
3975 |
+
"Eliminato definitivamente il commento in risposta al post %PostTitle% di "
|
3976 |
+
"%Author% il %Date%."
|
3977 |
+
|
3978 |
+
#: defaults.php:253
|
3979 |
+
msgid "User posted a comment"
|
3980 |
+
msgstr "L'utente ha postato un commento"
|
3981 |
+
|
3982 |
+
#: defaults.php:253 defaults.php:254
|
3983 |
+
msgid "%CommentMsg% on %CommentLink%."
|
3984 |
+
msgstr "%CommentMsg% in %CommentLink%."
|
3985 |
+
|
3986 |
+
#: defaults.php:254
|
3987 |
+
msgid "Visitor posted a comment"
|
3988 |
+
msgstr "Il visitatore ha pubblicato un commento"
|
3989 |
+
|
3990 |
+
#: defaults.php:266
|
3991 |
+
msgid "User modified a draft blog post"
|
3992 |
+
msgstr "L'utente ha modificato una bozza"
|
3993 |
+
|
3994 |
+
#: defaults.php:266
|
3995 |
+
msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
|
3996 |
+
msgstr "Modificata la bozza con %PostTitle% . %EditorLinkPost%."
|
3997 |
+
|
3998 |
+
#: defaults.php:267
|
3999 |
+
msgid "User created a new post with custom post type and saved it as draft"
|
4000 |
+
msgstr ""
|
4001 |
+
"L'utente ha creato un nuovo post con custom post type e l'ha salvato come "
|
4002 |
+
"bozza"
|
4003 |
+
|
4004 |
+
#: defaults.php:267
|
4005 |
+
msgid ""
|
4006 |
+
"Created a new custom post called %PostTitle% of type %PostType%. "
|
4007 |
+
"%EditorLinkPost%."
|
4008 |
+
msgstr ""
|
4009 |
+
"Creato un nuovo post custom chiamato %PostTitle% del tipo %PostType%. "
|
4010 |
+
"%EditorLinkPage%."
|
4011 |
+
|
4012 |
+
#: defaults.php:268
|
4013 |
+
msgid "User published a post with custom post type"
|
4014 |
+
msgstr "L'utente ha pubblicato un post con custom post type"
|
4015 |
+
|
4016 |
+
#: defaults.php:268
|
4017 |
+
msgid ""
|
4018 |
+
"Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
|
4019 |
+
"%. %EditorLinkPost%."
|
4020 |
+
msgstr ""
|
4021 |
+
"Pubblicato un post custom %PostTitle% del tipo %PostType%. L'URL del post è "
|
4022 |
+
"%PostUrl%. %EditorLinkPost%."
|
4023 |
+
|
4024 |
+
#: defaults.php:269
|
4025 |
+
msgid "User modified a post with custom post type"
|
4026 |
+
msgstr "L'utente ha modificato un post con custom post type"
|
4027 |
+
|
4028 |
+
#: defaults.php:269
|
4029 |
+
msgid ""
|
4030 |
+
"Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
|
4031 |
+
"%. %EditorLinkPost%."
|
4032 |
+
msgstr ""
|
4033 |
+
"Modificato il post custom %PostTitle% del tipo %PostType%. L'URL del post è "
|
4034 |
+
"%PostUrl%. %EditorLinkPost%."
|
4035 |
+
|
4036 |
+
#: defaults.php:270
|
4037 |
+
msgid "User modified a draft post with custom post type"
|
4038 |
+
msgstr "L'utente ha modificato una bozza con custom post type"
|
4039 |
+
|
4040 |
+
#: defaults.php:270
|
4041 |
+
msgid ""
|
4042 |
+
"Modified the draft custom post %PostTitle% of type is %PostType%. "
|
4043 |
+
"%EditorLinkPost%."
|
4044 |
+
msgstr ""
|
4045 |
+
"Modificata la bozza del post custom %PostTitle% del tipo %PostType%. "
|
4046 |
+
"%EditorLinkPost%."
|
4047 |
+
|
4048 |
+
#: defaults.php:271
|
4049 |
+
msgid "User permanently deleted post with custom post type"
|
4050 |
+
msgstr "L'utente ha definitivamente eliminato il post con custom post type"
|
4051 |
+
|
4052 |
+
#: defaults.php:271
|
4053 |
+
msgid "Permanently Deleted the custom post %PostTitle% of type %PostType%."
|
4054 |
+
msgstr ""
|
4055 |
+
"Eliminato definitivamente il post custom %PostTitle% del tipo %PostType%."
|
4056 |
+
|
4057 |
+
#: defaults.php:272
|
4058 |
+
msgid "User moved post with custom post type to trash"
|
4059 |
+
msgstr "L'utente ha spostato il post con custom post type nel cestino"
|
4060 |
+
|
4061 |
+
#: defaults.php:272
|
4062 |
+
msgid ""
|
4063 |
+
"Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was "
|
4064 |
+
"%PostUrl%."
|
4065 |
+
msgstr ""
|
4066 |
+
"Spostato il post custom %PostTitle% del tipo %PostType% nel cestino. L'URL "
|
4067 |
+
"del post era %PostUrl%."
|
4068 |
+
|
4069 |
+
#: defaults.php:273
|
4070 |
+
msgid "User restored post with custom post type from trash"
|
4071 |
+
msgstr "L'utente ha ripristinato il post con custom post type dal cestino"
|
4072 |
+
|
4073 |
+
#: defaults.php:273
|
4074 |
+
msgid ""
|
4075 |
+
"The custom post %PostTitle% of type %PostType% has been restored from trash. "
|
4076 |
+
"%EditorLinkPost%."
|
4077 |
+
msgstr ""
|
4078 |
+
"Il post custom %PostTitle% del tipo %PostType% è stato ripristinato dal "
|
4079 |
+
"cestino. %EditorLinkPost%."
|
4080 |
+
|
4081 |
+
#: defaults.php:274
|
4082 |
+
msgid "User changed the category of a post with custom post type"
|
4083 |
+
msgstr "L'utente ha modificato la categoria di un post con custom post type"
|
4084 |
+
|
4085 |
+
#: defaults.php:274
|
4086 |
+
msgid ""
|
4087 |
+
"Changed the category(ies) of the custom post %PostTitle% of type %PostType% "
|
4088 |
+
"from %OldCategories% to %NewCategories%. %EditorLinkPost%."
|
4089 |
+
msgstr ""
|
4090 |
+
"Modificata(e) la(le) categoria(e) del post personalizzato %PostTitle% del "
|
4091 |
+
"tipo %PostType% da %OldCategories% a %NewCategories%. %EditorLinkPost%."
|
4092 |
+
|
4093 |
+
#: defaults.php:275
|
4094 |
+
msgid "User changed the URL of a post with custom post type"
|
4095 |
+
msgstr "L'utente ha modificato l'URL di un post con custom post type"
|
4096 |
+
|
4097 |
+
#: defaults.php:275
|
4098 |
+
msgid ""
|
4099 |
+
"Changed the URL of the custom post %PostTitle% of type %PostType% from "
|
4100 |
+
"%OldUrl% to %NewUrl%. %EditorLinkPost%."
|
4101 |
+
msgstr ""
|
4102 |
+
"Modificato l'URL del post personalizzato %PostTitle% del tipo %PostType% da "
|
4103 |
+
"%OldUrl% a %NewUrl%. %EditorLinkPost%."
|
4104 |
+
|
4105 |
+
#: defaults.php:276
|
4106 |
+
msgid "User changed the author or post with custom post type"
|
4107 |
+
msgstr "L'utente ha modificato l'autore, o post, con custom post type"
|
4108 |
+
|
4109 |
+
#: defaults.php:276
|
4110 |
+
msgid ""
|
4111 |
+
"Changed the author of custom post %PostTitle% of type %PostType% from "
|
4112 |
+
"%OldAuthor% to %NewAuthor%. %EditorLinkPost%."
|
4113 |
+
msgstr ""
|
4114 |
+
"Modificato l'autore del post custom %PostTitle% del tipo %PostType% da "
|
4115 |
+
"%OldAuthor% a %NewAuthor%. %EditorLinkPost%."
|
4116 |
+
|
4117 |
+
#: defaults.php:277
|
4118 |
+
msgid "User changed the status of post with custom post type"
|
4119 |
+
msgstr "L'utente ha modificato lo stato del post con custom post type"
|
4120 |
+
|
4121 |
+
#: defaults.php:277
|
4122 |
+
msgid ""
|
4123 |
+
"Changed the status of custom post %PostTitle% of type %PostType% from "
|
4124 |
+
"%OldStatus% to %NewStatus%. %EditorLinkPost%."
|
4125 |
+
msgstr ""
|
4126 |
+
"Modificato lo stato del post custom %PostTitle% del tipo %PostType% da "
|
4127 |
+
"%OldStatus% a %NewStatus%. %EditorLinkPost%."
|
4128 |
+
|
4129 |
+
#: defaults.php:278
|
4130 |
+
msgid "User changed the visibility of a post with custom post type"
|
4131 |
+
msgstr "L'utente ha modificato la visibilità di un post con custom post type"
|
4132 |
+
|
4133 |
+
#: defaults.php:278
|
4134 |
+
msgid ""
|
4135 |
+
"Changed the visibility of the custom post %PostTitle% of type %PostType% "
|
4136 |
+
"from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
|
4137 |
+
msgstr ""
|
4138 |
+
"Modificata la visibilità del post custom %PostTitle% del tipo %PostType% da "
|
4139 |
+
"%OldVisibility% a %NewVisibility%. %EditorLinkPost%."
|
4140 |
+
|
4141 |
+
#: defaults.php:279
|
4142 |
+
msgid "User changed the date of post with custom post type"
|
4143 |
+
msgstr "L'utente ha modificato la data del post con custom post type"
|
4144 |
+
|
4145 |
+
#: defaults.php:279
|
4146 |
+
msgid ""
|
4147 |
+
"Changed the date of the custom post %PostTitle% of type %PostType% from "
|
4148 |
+
"%OldDate% to %NewDate%. %EditorLinkPost%."
|
4149 |
+
msgstr ""
|
4150 |
+
"Modificata la data del post custom %PostTitle% del tipo %PostType% da "
|
4151 |
+
"%OldDate% a %NewDate%. %EditorLinkPost%."
|
4152 |
+
|
4153 |
+
#: defaults.php:280
|
4154 |
+
msgid "User created a custom field for a custom post type"
|
4155 |
+
msgstr "L'utente ha creato un campo custom per un tipo di post custom"
|
4156 |
+
|
4157 |
+
#: defaults.php:280
|
4158 |
+
msgid ""
|
4159 |
+
"Created a new custom field %MetaKey% with value %MetaValue% in custom post "
|
4160 |
+
"%PostTitle% of type %PostType%. %EditorLinkPost%.<br>%MetaLink%."
|
4161 |
+
msgstr ""
|
4162 |
+
"Creato un nuovo campo personalizzato chiamato %MetaKey% con valore %MetaValue"
|
4163 |
+
"% nel post custom %PostTitle% del tipo %PostType%. %EditorLinkPost%.<br>"
|
4164 |
+
"%MetaLink%."
|
4165 |
+
|
4166 |
+
#: defaults.php:281
|
4167 |
+
msgid "User updated a custom field for a custom post type"
|
4168 |
+
msgstr "L'utente ha aggiornato un campo custom per un tipo di post custom"
|
4169 |
+
|
4170 |
+
#: defaults.php:281
|
4171 |
+
msgid ""
|
4172 |
+
"Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
|
4173 |
+
"%MetaValueNew% in custom post %PostTitle% of type %PostType% %EditorLinkPost"
|
4174 |
+
"%.<br>%MetaLink%."
|
4175 |
+
msgstr ""
|
4176 |
+
"Modificato il valore del campo personalizzato %MetaKey% da %MetaValueOld% a "
|
4177 |
+
"%MetaValueNew% nel post personalizzato %PostTitle% del tipo %PostType% "
|
4178 |
+
"%EditorLinkPost%.<br>%MetaLink%."
|
4179 |
+
|
4180 |
+
#: defaults.php:282
|
4181 |
+
msgid "User deleted a custom field from a custom post type"
|
4182 |
+
msgstr "L'utente ha eliminato un campo custom da un tipo di post custom"
|
4183 |
+
|
4184 |
+
#: defaults.php:282
|
4185 |
+
msgid ""
|
4186 |
+
"Deleted the custom field %MetaKey% with id %MetaID% from custom post "
|
4187 |
+
"%PostTitle% of type %PostType% %EditorLinkPost%.<br>%MetaLink%."
|
4188 |
+
msgstr ""
|
4189 |
+
"Eliminato il campo personalizzato %MetaKey% con id %MetaID% da post "
|
4190 |
+
"personalizzato %PostTitle% di tipo %PostType% %EditorLinkPost%.<br>%MetaLink"
|
4191 |
+
"%."
|
4192 |
+
|
4193 |
+
#: defaults.php:283
|
4194 |
+
msgid "User updated a custom field name for a custom post type"
|
4195 |
+
msgstr ""
|
4196 |
+
"L'utente ha aggiornato un nome del campo custom per un tipo di post custom"
|
4197 |
+
|
4198 |
+
#: defaults.php:283
|
4199 |
+
msgid ""
|
4200 |
+
"Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in custom "
|
4201 |
+
"post %PostTitle% of type %PostType% %EditorLinkPost%.<br>%MetaLink%."
|
4202 |
+
msgstr ""
|
4203 |
+
"Modificato il nome del campo personalizzato da %MetaKeyOld% a %MetaKeyNew% "
|
4204 |
+
"nel post personalizzato %PostTitle% del tipo %PostType% %EditorLinkPost%.<br>"
|
4205 |
+
"%MetaLink%."
|
4206 |
+
|
4207 |
+
#: defaults.php:284
|
4208 |
+
msgid "User modified content for a published custom post type"
|
4209 |
+
msgstr ""
|
4210 |
+
"L'utente ha modificato il contenuto di un tipo di post custom pubblicato"
|
4211 |
+
|
4212 |
+
#: defaults.php:284
|
4213 |
+
msgid ""
|
4214 |
+
"Modified the content of the published custom post type %PostTitle%. Post URL "
|
4215 |
+
"is %PostUrl%.%EditorLinkPost%."
|
4216 |
+
msgstr ""
|
4217 |
+
"Modificato il contenuto del tipo di post personalizzato pubblicato %PostTitle"
|
4218 |
+
"%. L'URL del post è %PostUrl%.%EditorLinkPost%."
|
4219 |
+
|
4220 |
+
#: defaults.php:285
|
4221 |
+
msgid "User modified content for a draft post"
|
4222 |
+
msgstr "L'utente ha modificato il contenuto di una bozza"
|
4223 |
+
|
4224 |
+
#: defaults.php:285
|
4225 |
+
msgid ""
|
4226 |
+
"Modified the content of the draft post %PostTitle%.%RevisionLink% "
|
4227 |
+
"%EditorLinkPost%."
|
4228 |
+
msgstr ""
|
4229 |
+
"Modificato il contenuto della bozza %PostTitle%.%RevisionLink% "
|
4230 |
+
"%EditorLinkPost%."
|
4231 |
+
|
4232 |
+
#: defaults.php:286
|
4233 |
+
msgid "User modified content for a draft custom post type"
|
4234 |
+
msgstr "L'utente ha modificato il contenuto di una bozza di tipo post custom"
|
4235 |
+
|
4236 |
+
#: defaults.php:286
|
4237 |
+
msgid ""
|
4238 |
+
"Modified the content of the draft custom post type %PostTitle%."
|
4239 |
+
"%EditorLinkPost%."
|
4240 |
+
msgstr ""
|
4241 |
+
"Modificato il contenuto della bozza di tipo post custom %PostTitle%."
|
4242 |
+
"%EditorLinkPost%."
|
4243 |
+
|
4244 |
+
#: defaults.php:287
|
4245 |
+
msgid "User modified content of a post"
|
4246 |
+
msgstr "L'utente ha modificato il contenuto di un post"
|
4247 |
+
|
4248 |
+
#: defaults.php:287
|
4249 |
+
msgid ""
|
4250 |
+
"Modified the content of post %PostTitle% which is submitted for review."
|
4251 |
+
"%RevisionLink% %EditorLinkPost%."
|
4252 |
+
msgstr ""
|
4253 |
+
"Modificato il contenuto del post %PostTitle% che è stato inviato per la "
|
4254 |
+
"revisione.%RevisionLink% %EditorLinkPost%."
|
4255 |
+
|
4256 |
+
#: defaults.php:288
|
4257 |
+
msgid "User scheduled a custom post type"
|
4258 |
+
msgstr "L'utente ha pianificato un tipo di post custom"
|
4259 |
+
|
4260 |
+
#: defaults.php:288
|
4261 |
+
msgid ""
|
4262 |
+
"Scheduled the custom post type %PostTitle% to be published %PublishingDate%. "
|
4263 |
+
"%EditorLinkPost%."
|
4264 |
+
msgstr ""
|
4265 |
+
"Pianificato il tipo di post custom %PostTitle% per esser pubblicato "
|
4266 |
+
"%PublishingDate%. %EditorLinkPost%."
|
4267 |
+
|
4268 |
+
#: defaults.php:289
|
4269 |
+
msgid "User changed title of a custom post type"
|
4270 |
+
msgstr "L'utente ha modificato il titolo di un tipo di post custom"
|
4271 |
+
|
4272 |
+
#: defaults.php:289
|
4273 |
+
msgid ""
|
4274 |
+
"Changed the title of the custom post %OldTitle% to %NewTitle%. "
|
4275 |
+
"%EditorLinkPost%."
|
4276 |
+
msgstr ""
|
4277 |
+
"Modificato il titolo del post custom %OldTitle% a %NewTitle%. %EditorLinkPost"
|
4278 |
+
"%."
|
4279 |
+
|
4280 |
+
#: defaults.php:290
|
4281 |
+
msgid "User opened a custom post type in the editor"
|
4282 |
+
msgstr "Utente ha aperto un tipo di post personalizzato nell'editor"
|
4283 |
+
|
4284 |
+
#: defaults.php:290
|
4285 |
+
msgid ""
|
4286 |
+
"Opened the custom post %PostTitle% of type %PostType% in the editor. View "
|
4287 |
+
"the post: %EditorLinkPost%."
|
4288 |
+
msgstr ""
|
4289 |
+
"Aperto il post personalizzato %PostTitle% del tipo %PostType% nell'editor. "
|
4290 |
+
"Visualizza il post: %EditorLinkPost%."
|
4291 |
+
|
4292 |
+
#: defaults.php:291
|
4293 |
+
msgid "User viewed a custom post type"
|
4294 |
+
msgstr "Utente ha visualizzato un tipo di post personalizzato"
|
4295 |
+
|
4296 |
+
#: defaults.php:291
|
4297 |
+
msgid ""
|
4298 |
+
"Viewed the custom post %PostTitle% of type %PostType%. View the post: "
|
4299 |
+
"%PostUrl%."
|
4300 |
+
msgstr ""
|
4301 |
+
"Visualizzato il post personalizzato %PostTitle% del tipo %PostType%. "
|
4302 |
+
"Visualizza il post: %PostUrl%."
|
4303 |
+
|
4304 |
+
#: defaults.php:292
|
4305 |
+
msgid "A plugin created a custom post"
|
4306 |
+
msgstr "Un plugin ha creato un post custom"
|
4307 |
+
|
4308 |
+
#: defaults.php:292
|
4309 |
+
msgid "A plugin automatically created the following custom post: %PostTitle%."
|
4310 |
+
msgstr ""
|
4311 |
+
"Un plugin ha creato automaticamente il seguente post custom: %PostTitle%."
|
4312 |
+
|
4313 |
+
#: defaults.php:293
|
4314 |
+
msgid "A plugin deleted a custom post"
|
4315 |
+
msgstr "Un plugin ha eliminato un post custom"
|
4316 |
+
|
4317 |
+
#: defaults.php:293
|
4318 |
+
msgid "A plugin automatically deleted the following custom post: %PostTitle%."
|
4319 |
+
msgstr ""
|
4320 |
+
"Un plugin ha eliminato automaticamente il seguente post custom: %PostTitle%."
|
4321 |
+
|
4322 |
+
#: defaults.php:294
|
4323 |
+
msgid "A plugin modified a custom post"
|
4324 |
+
msgstr "Un plugin ha modificato un post personalizzato"
|
4325 |
+
|
4326 |
+
#: defaults.php:294
|
4327 |
+
msgid ""
|
4328 |
+
"Plugin modified the custom post %PostTitle%. View the post: %EditorLinkPost%."
|
4329 |
+
msgstr ""
|
4330 |
+
"Il plugin ha modificato il post personalizzato %PostTitle%. Visualizza il "
|
4331 |
+
"post: %EditorLinkPost%."
|
4332 |
+
|
4333 |
+
#: defaults.php:306
|
4334 |
+
msgid "User created a new WordPress page and saved it as draft"
|
4335 |
+
msgstr ""
|
4336 |
+
"L'utente ha creato una nuova pagina Wordpress e l'ha salvata come bozza"
|
4337 |
+
|
4338 |
+
#: defaults.php:306
|
4339 |
+
msgid ""
|
4340 |
+
"Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage"
|
4341 |
+
"%."
|
4342 |
+
msgstr ""
|
4343 |
+
"Creata una nuova pagina chiamata %PostTitle% memorizzata come bozza. "
|
4344 |
+
"%EditorLinkPage%."
|
4345 |
+
|
4346 |
+
#: defaults.php:307
|
4347 |
+
msgid "User published a WordPress page"
|
4348 |
+
msgstr "L'utente ha pubblicato una pagina Wordpress"
|
4349 |
+
|
4350 |
+
#: defaults.php:307
|
4351 |
+
msgid ""
|
4352 |
+
"Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
|
4353 |
+
msgstr ""
|
4354 |
+
"Pubblicata una pagina chiamata %PostTitle%. L'URL della pagina è %PostUrl%. "
|
4355 |
+
"%EditorLinkPage%."
|
4356 |
+
|
4357 |
+
#: defaults.php:308
|
4358 |
+
msgid "User modified a published WordPress page"
|
4359 |
+
msgstr "L'utente ha modificato una pagina Wordpress pubblicata"
|
4360 |
+
|
4361 |
+
#: defaults.php:308
|
4362 |
+
msgid ""
|
4363 |
+
"Modified the published page %PostTitle%. Page URL is %PostUrl%. "
|
4364 |
+
"%EditorLinkPage%."
|
4365 |
+
msgstr ""
|
4366 |
+
"Modificata la pagina pubblicata %PostTitle%. L'URL della pagina è %PostUrl%. "
|
4367 |
+
"%EditorLinkPage%."
|
4368 |
+
|
4369 |
+
#: defaults.php:309
|
4370 |
+
msgid "User modified a draft WordPress page"
|
4371 |
+
msgstr "L'utente ha modificato una bozza di una pagina Wordpress"
|
4372 |
+
|
4373 |
+
#: defaults.php:309
|
4374 |
+
msgid ""
|
4375 |
+
"Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
|
4376 |
+
msgstr ""
|
4377 |
+
"Modificata la bozza %PostTitle%. L'ID della pagina è %PostID%. "
|
4378 |
+
"%EditorLinkPage%."
|
4379 |
+
|
4380 |
+
#: defaults.php:310
|
4381 |
+
msgid "User permanently deleted a page from the trash"
|
4382 |
+
msgstr "L'utente ha eliminato definitivamente una pagina dal cestino"
|
4383 |
+
|
4384 |
+
#: defaults.php:310
|
4385 |
+
msgid "Permanently deleted the page %PostTitle%."
|
4386 |
+
msgstr "Eliminata definitivamente la pagina %PostTitle%."
|
4387 |
+
|
4388 |
+
#: defaults.php:311
|
4389 |
+
msgid "User moved WordPress page to the trash"
|
4390 |
+
msgstr "L'utente ha spostato la pagina Wordpress nel cestino"
|
4391 |
+
|
4392 |
+
#: defaults.php:311
|
4393 |
+
msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
|
4394 |
+
msgstr ""
|
4395 |
+
"Spostata la pagina %PostTitle% nel cestino. L'URL della pagina era %PostUrl%."
|
4396 |
+
|
4397 |
+
#: defaults.php:312
|
4398 |
+
msgid "User restored a WordPress page from trash"
|
4399 |
+
msgstr "L'utente ha ripristinato una pagina Wordpress dal cestino"
|
4400 |
+
|
4401 |
+
#: defaults.php:312
|
4402 |
+
msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
|
4403 |
+
msgstr ""
|
4404 |
+
"La pagina %PostTitle% è stata ripristinata dal cestino. %EditorLinkPage%."
|
4405 |
+
|
4406 |
+
#: defaults.php:313
|
4407 |
+
msgid "User changed page URL"
|
4408 |
+
msgstr "L'utente ha modificato l'URL della pagina"
|
4409 |
+
|
4410 |
+
#: defaults.php:313
|
4411 |
+
msgid ""
|
4412 |
+
"Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. "
|
4413 |
+
"%EditorLinkPage%."
|
4414 |
+
msgstr ""
|
4415 |
+
"Modificato l'URL della pagina %PostTitle% da %OldUrl% a %NewUrl%. "
|
4416 |
+
"%EditorLinkPage%."
|
4417 |
+
|
4418 |
+
#: defaults.php:314
|
4419 |
+
msgid "User changed page author"
|
4420 |
+
msgstr "L'utente ha modificato l'autore della pagina"
|
4421 |
+
|
4422 |
+
#: defaults.php:314
|
4423 |
+
msgid ""
|
4424 |
+
"Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. "
|
4425 |
+
"%EditorLinkPage%."
|
4426 |
+
msgstr ""
|
4427 |
+
"Modificato l'autore della pagina %PostTitle% da %OldAuthor% a %NewAuthor%. "
|
4428 |
+
"%EditorLinkPage%."
|
4429 |
+
|
4430 |
+
#: defaults.php:315
|
4431 |
+
msgid "User changed page status"
|
4432 |
+
msgstr "L'utente ha modificato lo stato della pagina"
|
4433 |
+
|
4434 |
+
#: defaults.php:315
|
4435 |
+
msgid ""
|
4436 |
+
"Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. "
|
4437 |
+
"%EditorLinkPage%."
|
4438 |
+
msgstr ""
|
4439 |
+
"Modificato lo stato della pagina %PostTitle% da %OldStatus% a %NewStatus%. "
|
4440 |
+
"%EditorLinkPage%."
|
4441 |
+
|
4442 |
+
#: defaults.php:316
|
4443 |
+
msgid "User changed the visibility of a page post"
|
4444 |
+
msgstr "L'utente ha modificato la visibilità di un post di una pagina"
|
4445 |
+
|
4446 |
+
#: defaults.php:316
|
4447 |
+
msgid ""
|
4448 |
+
"Changed the visibility of the page %PostTitle% from %OldVisibility% to "
|
4449 |
+
"%NewVisibility%. %EditorLinkPage%."
|
4450 |
+
msgstr ""
|
4451 |
+
"Modificata la visibilità della pagina %PostTitle% da %OldVisibility% a "
|
4452 |
+
"%NewVisibility%. %EditorLinkPage%."
|
4453 |
+
|
4454 |
+
#: defaults.php:317
|
4455 |
+
msgid "User changed the date of a page post"
|
4456 |
+
msgstr "L'utente ha modificato la data di un post di una pagina"
|
4457 |
+
|
4458 |
+
#: defaults.php:317
|
4459 |
+
msgid ""
|
4460 |
+
"Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. "
|
4461 |
+
"%EditorLinkPage%."
|
4462 |
+
msgstr ""
|
4463 |
+
"Modificata la data della pagina %PostTitle% da %OldDate% a %NewDate%. "
|
4464 |
+
"%EditorLinkPage%."
|
4465 |
+
|
4466 |
+
#: defaults.php:318
|
4467 |
+
msgid "User created a custom field for a page"
|
4468 |
+
msgstr "L'utente ha creato un campo custom per una pagina"
|
4469 |
+
|
4470 |
+
#: defaults.php:318
|
4471 |
+
msgid ""
|
4472 |
+
"Created a new custom field called %MetaKey% with value %MetaValue% in the "
|
4473 |
+
"page %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
|
4474 |
+
msgstr ""
|
4475 |
+
"Ceato un nuovo campo personalizzato chiamato %MetaKey% con valore %MetaValue"
|
4476 |
+
"% nella pagina %PostTitle% %EditorLinkLinkPage%.<br>%MetaLink%."
|
4477 |
+
|
4478 |
+
#: defaults.php:319
|
4479 |
+
msgid "User updated a custom field value for a page"
|
4480 |
+
msgstr "L'utente ha aggiornato un valore di un campo custom per una pagina"
|
4481 |
+
|
4482 |
+
#: defaults.php:319
|
4483 |
+
msgid ""
|
4484 |
+
"Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
|
4485 |
+
"%MetaValueNew% in the page %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
|
4486 |
+
msgstr ""
|
4487 |
+
"Modificato il valore del campo personalizzato %MetaKey% da %MetaValueOld% a "
|
4488 |
+
"%MetaValueNew% nella pagina %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
|
4489 |
+
|
4490 |
+
#: defaults.php:320
|
4491 |
+
msgid "User deleted a custom field from a page"
|
4492 |
+
msgstr "L'utente ha eliminato un campo custom da una pagina"
|
4493 |
+
|
4494 |
+
#: defaults.php:320
|
4495 |
+
msgid ""
|
4496 |
+
"Deleted the custom field %MetaKey% with id %MetaID% from page %PostTitle% "
|
4497 |
+
"%EditorLinkPage%.<br>%MetaLink%."
|
4498 |
+
msgstr ""
|
4499 |
+
"Cancellato il campo personalizzato %MetaKey% con id %MetaID% dalla pagina "
|
4500 |
+
"%PostTitle% %EditorLinkPage%.<br>%MetaLink%."
|
4501 |
+
|
4502 |
+
#: defaults.php:321
|
4503 |
+
msgid "User updated a custom field name for a page"
|
4504 |
+
msgstr "L'utente ha aggiornato un nome di un campo custom per una pagina"
|
4505 |
+
|
4506 |
+
#: defaults.php:321
|
4507 |
+
msgid ""
|
4508 |
+
"Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in the page "
|
4509 |
+
"%PostTitle% %EditorLinkPage%.<br>%MetaLink%."
|
4510 |
+
msgstr ""
|
4511 |
+
"Modificato il nome del campo personalizzato da %MetaKeyOld% a %MetaKeyNew% "
|
4512 |
+
"nella pagina %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
|
4513 |
+
|
4514 |
+
#: defaults.php:322
|
4515 |
+
msgid "User modified content for a published page"
|
4516 |
+
msgstr "L'utente ha modificato il contenuto di una pagina pubblicata"
|
4517 |
+
|
4518 |
+
#: defaults.php:322
|
4519 |
+
msgid ""
|
4520 |
+
"Modified the content of the published page %PostTitle%. Page URL is %PostUrl"
|
4521 |
+
"%. %RevisionLink% %EditorLinkPage%."
|
4522 |
+
msgstr ""
|
4523 |
+
"Modificato il contenuto della pagina pubblicata %PostTitle%. L'URL della "
|
4524 |
+
"pagina è %PostUrl%. %RevisionLink% %EditorLinkPage%."
|
4525 |
+
|
4526 |
+
#: defaults.php:323
|
4527 |
+
msgid "User modified content for a draft page"
|
4528 |
+
msgstr "L'utente ha modificato il contenuto di una pagina bozza"
|
4529 |
+
|
4530 |
+
#: defaults.php:323
|
4531 |
+
msgid ""
|
4532 |
+
"Modified the content of draft page %PostTitle%.%RevisionLink% %EditorLinkPage"
|
4533 |
+
"%."
|
4534 |
+
msgstr ""
|
4535 |
+
"Modificato il contenuto della pagina bozza %PostTitle%.%RevisionLink% "
|
4536 |
+
"%EditorLinkPage%."
|
4537 |
+
|
4538 |
+
#: defaults.php:324
|
4539 |
+
msgid "User scheduled a page"
|
4540 |
+
msgstr "L'utente ha pianificato una pagina"
|
4541 |
+
|
4542 |
+
#: defaults.php:324
|
4543 |
+
msgid ""
|
4544 |
+
"Scheduled the page %PostTitle% to be published %PublishingDate%. "
|
4545 |
+
"%EditorLinkPage%."
|
4546 |
+
msgstr ""
|
4547 |
+
"Pianificata la pagina %PostTitle% per la pubblicazione %PublishingDate%. "
|
4548 |
+
"%EditorLinkPage%."
|
4549 |
+
|
4550 |
+
#: defaults.php:325
|
4551 |
+
msgid "User changed title of a page"
|
4552 |
+
msgstr "L'utente ha modificato il titolo di una pagina"
|
4553 |
+
|
4554 |
+
#: defaults.php:325
|
4555 |
+
msgid ""
|
4556 |
+
"Changed the title of the page %OldTitle% to %NewTitle%. %EditorLinkPage%."
|
4557 |
+
msgstr ""
|
4558 |
+
"Modificato il titolo della pagina %OldTitle% a %NewTitle%. %EditorLinkPage%."
|
4559 |
+
|
4560 |
+
#: defaults.php:326
|
4561 |
+
msgid "User opened a page in the editor"
|
4562 |
+
msgstr "L'utente ha aperto una pagina nell'editor"
|
4563 |
+
|
4564 |
+
#: defaults.php:326
|
4565 |
+
msgid ""
|
4566 |
+
"Opened the page %PostTitle% in the editor. View the page: %EditorLinkPage%."
|
4567 |
+
msgstr ""
|
4568 |
+
"Aperta la pagina %PostTitle% nell'editor. Visualizza la pagina: "
|
4569 |
+
"%EditorLinkPage%."
|
4570 |
+
|
4571 |
+
#: defaults.php:327
|
4572 |
+
msgid "User viewed a page"
|
4573 |
+
msgstr "L'utente ha visualizzato una pagina"
|
4574 |
+
|
4575 |
+
#: defaults.php:327
|
4576 |
+
msgid "Viewed the page %PostTitle%. View the page: %PostUrl%."
|
4577 |
+
msgstr "Visualizzata la pagina %PostTitle%. Visualizza la pagina: %PostUrl%."
|
4578 |
+
|
4579 |
+
#: defaults.php:328
|
4580 |
+
msgid "User disabled Comments/Trackbacks and Pingbacks on a draft post"
|
4581 |
+
msgstr "Utente ha disabilitato commenti/trackback e i pingback in una bozza"
|
4582 |
+
|
4583 |
+
#: defaults.php:328
|
4584 |
+
msgid ""
|
4585 |
+
"Disabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
|
4586 |
+
msgstr ""
|
4587 |
+
"Disabilitato %Type% sulla bozza %PostTitle%. Visualizza il post: %PostUrl%."
|
4588 |
+
|
4589 |
+
#: defaults.php:329
|
4590 |
+
msgid "User enabled Comments/Trackbacks and Pingbacks on a draft post"
|
4591 |
+
msgstr "Utente ha abilitato commenti/trackback e i pingback in una bozza"
|
4592 |
+
|
4593 |
+
#: defaults.php:329
|
4594 |
+
msgid "Enabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
|
4595 |
+
msgstr ""
|
4596 |
+
"Abilitato %Type% sulla bozza %PostTitle%. Visualizza il post: %PostUrl%."
|
4597 |
+
|
4598 |
+
#: defaults.php:330
|
4599 |
+
msgid "User disabled Comments/Trackbacks and Pingbacks on a published page"
|
4600 |
+
msgstr ""
|
4601 |
+
"Utente ha disabilitato commenti/trackback e i pingback in una pagina "
|
4602 |
+
"pubblicata"
|
4603 |
+
|
4604 |
+
#: defaults.php:330
|
4605 |
+
msgid ""
|
4606 |
+
"Disabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
|
4607 |
+
msgstr ""
|
4608 |
+
"Disabilitato %Type% sulla pagina pubblicata %PostTitle%. Visualizza la "
|
4609 |
+
"pagina: %PostUrl%."
|
4610 |
+
|
4611 |
+
#: defaults.php:331
|
4612 |
+
msgid "User enabled Comments/Trackbacks and Pingbacks on a published page"
|
4613 |
+
msgstr ""
|
4614 |
+
"Utente ha disabilitato commenti/trackback e i pingback in una pagina "
|
4615 |
+
"pubblicata"
|
4616 |
+
|
4617 |
+
#: defaults.php:331
|
4618 |
+
msgid ""
|
4619 |
+
"Enabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
|
4620 |
+
msgstr ""
|
4621 |
+
"Abilitato %Type% sulla pagina pubblicata %PostTitle%. Visualizza la pagina: "
|
4622 |
+
"%PostUrl%."
|
4623 |
+
|
4624 |
+
#: defaults.php:332
|
4625 |
+
msgid "User disabled Comments/Trackbacks and Pingbacks on a draft page"
|
4626 |
+
msgstr ""
|
4627 |
+
"L'utente ha disabilitato commenti/trackback e i pingback in una pagina bozza"
|
4628 |
+
|
4629 |
+
#: defaults.php:332
|
4630 |
+
msgid ""
|
4631 |
+
"Disabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
|
4632 |
+
msgstr ""
|
4633 |
+
"Disabilitato %Type% sulla pagina bozza %PostTitle%. Visualizza la pagina: "
|
4634 |
+
"%PostUrl%."
|
4635 |
+
|
4636 |
+
#: defaults.php:333
|
4637 |
+
msgid "User enabled Comments/Trackbacks and Pingbacks on a draft page"
|
4638 |
+
msgstr ""
|
4639 |
+
"Utente ha abilitato commenti/trackback e i pingback in una pagina bozza"
|
4640 |
+
|
4641 |
+
#: defaults.php:333
|
4642 |
+
msgid "Enabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
|
4643 |
+
msgstr ""
|
4644 |
+
"Abilitato %Type% sulla pagina bozza %PostTitle%. Visualizza la pagina: "
|
4645 |
+
"%PostUrl%."
|
4646 |
+
|
4647 |
+
#: defaults.php:334
|
4648 |
+
msgid "A plugin created a page"
|
4649 |
+
msgstr "Un plugin ha creato una pagina"
|
4650 |
+
|
4651 |
+
#: defaults.php:334
|
4652 |
+
msgid "A plugin automatically created the following page: %PostTitle%."
|
4653 |
+
msgstr "Un plugin ha creato automaticamente la pagina seguente: %PostTitle%."
|
4654 |
+
|
4655 |
+
#: defaults.php:335
|
4656 |
+
msgid "A plugin deleted a page"
|
4657 |
+
msgstr "Un plugin ha eliminato una pagina"
|
4658 |
+
|
4659 |
+
#: defaults.php:335
|
4660 |
+
msgid "A plugin automatically deleted the following page: %PostTitle%."
|
4661 |
+
msgstr ""
|
4662 |
+
"Un plugin ha eliminato automaticamente la pagina seguente: %PostTitle%."
|
4663 |
+
|
4664 |
+
#: defaults.php:336
|
4665 |
+
msgid "A plugin modified a page"
|
4666 |
+
msgstr "Un plugin ha modificato una pagina"
|
4667 |
+
|
4668 |
+
#: defaults.php:336
|
4669 |
+
msgid "Plugin modified the page %PostTitle%. View the page: %EditorLinkPage%."
|
4670 |
+
msgstr ""
|
4671 |
+
"Un plugin ha modificato la pagina %PostTitle%. Visualizza la pagina: "
|
4672 |
+
"%EditorLinkPage%."
|
4673 |
+
|
4674 |
+
#: defaults.php:343
|
4675 |
+
msgid "WordPress Install"
|
4676 |
+
msgstr "Installazione di WordPress"
|
4677 |
+
|
4678 |
+
#: defaults.php:347
|
4679 |
+
msgid "Database"
|
4680 |
+
msgstr "Database"
|
4681 |
+
|
4682 |
+
#: defaults.php:348
|
4683 |
+
msgid "Unknown component created tables"
|
4684 |
+
msgstr "Un componente sconosciuto ha creato delle tabelle"
|
4685 |
+
|
4686 |
+
#: defaults.php:348
|
4687 |
+
msgid ""
|
4688 |
+
"An unknown component created these tables in the database: %TableNames%."
|
4689 |
+
msgstr ""
|
4690 |
+
"Un componente sconosciuto ha creato queste tabelle nel database: %TableNames"
|
4691 |
+
"%."
|
4692 |
+
|
4693 |
+
#: defaults.php:349
|
4694 |
+
msgid "Unknown component modified tables structure"
|
4695 |
+
msgstr "Un componente sconosciuto ha modificato la struttura delle tabelle"
|
4696 |
+
|
4697 |
+
#: defaults.php:349
|
4698 |
+
msgid ""
|
4699 |
+
"An unknown component modified the structure of these database tables: "
|
4700 |
+
"%TableNames%."
|
4701 |
+
msgstr ""
|
4702 |
+
"Un componente sconosciuto ha modificato la struttura di queste tabelle del "
|
4703 |
+
"database: %TableNames%."
|
4704 |
+
|
4705 |
+
#: defaults.php:350
|
4706 |
+
msgid "Unknown component deleted tables"
|
4707 |
+
msgstr "Un componente sconosciuto ha eliminato delle tabelle"
|
4708 |
+
|
4709 |
+
#: defaults.php:350
|
4710 |
+
msgid ""
|
4711 |
+
"An unknown component deleted the following tables from the database: "
|
4712 |
+
"%TableNames%."
|
4713 |
+
msgstr ""
|
4714 |
+
"Un componente sconosciuto ha eliminato le seguenti tabelle dal database: "
|
4715 |
+
"%TableNames%."
|
4716 |
+
|
4717 |
+
#: defaults.php:357
|
4718 |
+
msgid "User installed a plugin"
|
4719 |
+
msgstr "L'utente ha installato un plugin"
|
4720 |
+
|
4721 |
+
#: defaults.php:357
|
4722 |
+
msgid "Installed the plugin %Plugin->Name% in %Plugin->plugin_dir_path%."
|
4723 |
+
msgstr "Installato il plugin %Plugin->Name% in %Plugin->plugin_dir_path%."
|
4724 |
+
|
4725 |
+
#: defaults.php:358
|
4726 |
+
msgid "User activated a WordPress plugin"
|
4727 |
+
msgstr "L'utente ha attivato un plugin WordPress"
|
4728 |
+
|
4729 |
+
#: defaults.php:358
|
4730 |
+
msgid "Activated the plugin %PluginData->Name% installed in %PluginFile%."
|
4731 |
+
msgstr "Attivato il plugin %PluginData->Name% installato in %PluginFile%."
|
4732 |
+
|
4733 |
+
#: defaults.php:359
|
4734 |
+
msgid "User deactivated a WordPress plugin"
|
4735 |
+
msgstr "L'utente ha disattivato un plugin Wordpress"
|
4736 |
+
|
4737 |
+
#: defaults.php:359
|
4738 |
+
msgid "Deactivated the plugin %PluginData->Name% installed in %PluginFile%."
|
4739 |
+
msgstr "Disattivato il plugin %PluginData->Name% installato in %PluginFile%."
|
4740 |
+
|
4741 |
+
#: defaults.php:360
|
4742 |
+
msgid "User uninstalled a plugin"
|
4743 |
+
msgstr "L'utente ha disinstallato un plugin"
|
4744 |
+
|
4745 |
+
#: defaults.php:360
|
4746 |
+
msgid ""
|
4747 |
+
"Uninstalled the plugin %PluginData->Name% which was installed in %PluginFile"
|
4748 |
+
"%."
|
4749 |
+
msgstr ""
|
4750 |
+
"Disinstallato il plugin %PluginData->Name% che era installato in %PluginFile"
|
4751 |
+
"%."
|
4752 |
+
|
4753 |
+
#: defaults.php:361
|
4754 |
+
msgid "User upgraded a plugin"
|
4755 |
+
msgstr "L'utente ha aggiornato un plugin"
|
4756 |
+
|
4757 |
+
#: defaults.php:361
|
4758 |
+
msgid "Upgraded the plugin %PluginData->Name% installed in %PluginFile%."
|
4759 |
+
msgstr "Aggiornato il plugin %PluginData->Name% installato in %PluginFile%."
|
4760 |
+
|
4761 |
+
#: defaults.php:362
|
4762 |
+
msgid "Plugin created tables"
|
4763 |
+
msgstr "Un plugin ha creato delle tabelle"
|
4764 |
+
|
4765 |
+
#: defaults.php:362
|
4766 |
+
msgid ""
|
4767 |
+
"Plugin %Plugin->Name% created these tables in the database: %TableNames%."
|
4768 |
+
msgstr ""
|
4769 |
+
"Il plugin %Plugin->Name% ha creato queste tabelle nel database: %TableNames%."
|
4770 |
+
|
4771 |
+
#: defaults.php:363
|
4772 |
+
msgid "Plugin modified tables structure"
|
4773 |
+
msgstr "Un plugin ha modificato la struttura delle tabelle"
|
4774 |
+
|
4775 |
+
#: defaults.php:363
|
4776 |
+
msgid ""
|
4777 |
+
"Plugin %Plugin->Name% modified the structure of these database tables: "
|
4778 |
+
"%TableNames%."
|
4779 |
+
msgstr ""
|
4780 |
+
"Il plugin %Plugin->Name% ha modificato la struttura di queste tabelle del "
|
4781 |
+
"database: %TableNames%."
|
4782 |
+
|
4783 |
+
#: defaults.php:364
|
4784 |
+
msgid "Plugin deleted tables"
|
4785 |
+
msgstr "Un plugin ha eliminato delle tabelle"
|
4786 |
+
|
4787 |
+
#: defaults.php:364
|
4788 |
+
msgid ""
|
4789 |
+
"Plugin %Plugin->Name% deleted the following tables from the database: "
|
4790 |
+
"%TableNames%."
|
4791 |
+
msgstr ""
|
4792 |
+
"Il plugin %Plugin->Name% ha eliminato le seguenti tabelle dal database: "
|
4793 |
+
"%TableNames%."
|
4794 |
+
|
4795 |
+
#: defaults.php:365
|
4796 |
+
msgid "A plugin created a post"
|
4797 |
+
msgstr "Un plugin ha creato un post"
|
4798 |
+
|
4799 |
+
#: defaults.php:365
|
4800 |
+
msgid ""
|
4801 |
+
"A plugin automatically created the following %PostType% called %PostTitle%. "
|
4802 |
+
"View the post: %EditorLinkPost%."
|
4803 |
+
msgstr ""
|
4804 |
+
"Un plugin ha creato automaticamente il seguente %PostType% chiamato "
|
4805 |
+
"%PostTitle%. Visualizza il post: %EditorLinkPost%."
|
4806 |
+
|
4807 |
+
#: defaults.php:366
|
4808 |
+
msgid "A plugin deleted a post"
|
4809 |
+
msgstr "Un plugin ha eliminato un post"
|
4810 |
+
|
4811 |
+
#: defaults.php:366
|
4812 |
+
msgid ""
|
4813 |
+
"A plugin automatically deleted the following %PostType% called %PostTitle%."
|
4814 |
+
msgstr ""
|
4815 |
+
"Un plugin ha eliminato automaticamente il seguente %PostType% chiamato "
|
4816 |
+
"%PostTitle%."
|
4817 |
+
|
4818 |
+
#: defaults.php:367
|
4819 |
+
msgid "User changed a file using the plugin editor"
|
4820 |
+
msgstr "L'utente ha modificato un file usando il plugin editor"
|
4821 |
+
|
4822 |
+
#: defaults.php:367
|
4823 |
+
msgid "Modified %File% with the Plugin Editor."
|
4824 |
+
msgstr "Modificato %File% con il Plugin Editor."
|
4825 |
+
|
4826 |
+
#: defaults.php:373
|
4827 |
+
msgid "Themes"
|
4828 |
+
msgstr "Temi"
|
4829 |
+
|
4830 |
+
#: defaults.php:374
|
4831 |
+
msgid "User installed a theme"
|
4832 |
+
msgstr "L'utente ha installato un tema"
|
4833 |
+
|
4834 |
+
#: defaults.php:374
|
4835 |
+
msgid ""
|
4836 |
+
"Installed the theme \"%Theme->Name%\" in %Theme->get_template_directory%."
|
4837 |
+
msgstr ""
|
4838 |
+
"Installato il tema \"%Theme->Name%\" in %Theme->get_template_directory%."
|
4839 |
+
|
4840 |
+
#: defaults.php:375
|
4841 |
+
msgid "User activated a theme"
|
4842 |
+
msgstr "L'utente ha attivato un tema"
|
4843 |
+
|
4844 |
+
#: defaults.php:375
|
4845 |
+
msgid ""
|
4846 |
+
"Activated the theme \"%Theme->Name%\", installed in %Theme-"
|
4847 |
+
">get_template_directory%."
|
4848 |
+
msgstr ""
|
4849 |
+
"Attivato il tema \"%Theme->Name%\", installato in %Theme-"
|
4850 |
+
">get_template_directory%."
|
4851 |
+
|
4852 |
+
#: defaults.php:376
|
4853 |
+
msgid "User uninstalled a theme"
|
4854 |
+
msgstr "L'utente ha disinstallato un tema"
|
4855 |
+
|
4856 |
+
#: defaults.php:376
|
4857 |
+
msgid ""
|
4858 |
+
"Deleted the theme \"%Theme->Name%\" installed in %Theme-"
|
4859 |
+
">get_template_directory%."
|
4860 |
+
msgstr ""
|
4861 |
+
"Eliminato il tema \"%Theme->Name%\" installato in %Theme-"
|
4862 |
+
">get_template_directory%."
|
4863 |
+
|
4864 |
+
#: defaults.php:377
|
4865 |
+
msgid "Activated theme on network"
|
4866 |
+
msgstr "Attivato tema nella rete"
|
4867 |
+
|
4868 |
+
#: defaults.php:377
|
4869 |
+
msgid ""
|
4870 |
+
"Network activated the theme %Theme->Name% installed in %Theme-"
|
4871 |
+
">get_template_directory%."
|
4872 |
+
msgstr ""
|
4873 |
+
"Rete ha attivato Il tema %Theme->Name% installato in %Theme-"
|
4874 |
+
">get_template_directory%."
|
4875 |
+
|
4876 |
+
#: defaults.php:378
|
4877 |
+
msgid "Deactivated theme from network"
|
4878 |
+
msgstr "Tema disattivato dalla rete"
|
4879 |
+
|
4880 |
+
#: defaults.php:378
|
4881 |
+
msgid ""
|
4882 |
+
"Network deactivated the theme %Theme->Name% installed in %Theme-"
|
4883 |
+
">get_template_directory%."
|
4884 |
+
msgstr ""
|
4885 |
+
"Rete ha disattivato il tema %Theme->Name% installato in %Theme-"
|
4886 |
+
">get_template_directory%."
|
4887 |
+
|
4888 |
+
#: defaults.php:379
|
4889 |
+
msgid "Theme created tables"
|
4890 |
+
msgstr "Un tema ha creato delle tabelle"
|
4891 |
+
|
4892 |
+
#: defaults.php:379
|
4893 |
+
msgid "Theme %Theme->Name% created these tables in the database: %TableNames%."
|
4894 |
+
msgstr ""
|
4895 |
+
"Il tema %Theme->Name% ha creato queste tabelle nel database: %TableNames%."
|
4896 |
+
|
4897 |
+
#: defaults.php:380
|
4898 |
+
msgid "Theme modified tables structure"
|
4899 |
+
msgstr "Un tema ha modificato la struttura delle tabelle"
|
4900 |
+
|
4901 |
+
#: defaults.php:380
|
4902 |
+
msgid ""
|
4903 |
+
"Theme %Theme->Name% modified the structure of these database tables: "
|
4904 |
+
"%TableNames%."
|
4905 |
+
msgstr ""
|
4906 |
+
"Il tema %Theme->Name% ha modificato la struttura di queste tabelle del "
|
4907 |
+
"database: %TableNames%."
|
4908 |
+
|
4909 |
+
#: defaults.php:381
|
4910 |
+
msgid "Theme deleted tables"
|
4911 |
+
msgstr "Un tema ha eliminato delle tabelle"
|
4912 |
+
|
4913 |
+
#: defaults.php:381
|
4914 |
+
msgid ""
|
4915 |
+
"Theme %Theme->Name% deleted the following tables from the database: "
|
4916 |
+
"%TableNames%."
|
4917 |
+
msgstr ""
|
4918 |
+
"Il tema %Theme->Name% ha eliminato le seguenti tabelle dal database: "
|
4919 |
+
"%TableNames%."
|
4920 |
+
|
4921 |
+
#: defaults.php:382
|
4922 |
+
msgid "User updated a theme"
|
4923 |
+
msgstr "L'utente ha aggiornato un tema"
|
4924 |
+
|
4925 |
+
#: defaults.php:382
|
4926 |
+
msgid ""
|
4927 |
+
"Updated the theme \"%Theme->Name%\" installed in %Theme-"
|
4928 |
+
">get_template_directory%."
|
4929 |
+
msgstr ""
|
4930 |
+
"Aggiornato il tema \"%Theme->Name%\", installato in %Theme-"
|
4931 |
+
">get_template_directory%."
|
4932 |
+
|
4933 |
+
#: defaults.php:383
|
4934 |
+
msgid "User changed a file using the theme editor"
|
4935 |
+
msgstr "L'utente ha modificato un file usando il theme editor"
|
4936 |
+
|
4937 |
+
#: defaults.php:383
|
4938 |
+
msgid "Modified %File% with the Theme Editor."
|
4939 |
+
msgstr "Modificato %File% con il Theme Editor."
|
4940 |
+
|
4941 |
+
#: defaults.php:390
|
4942 |
+
msgid "Unknown Error"
|
4943 |
+
msgstr "Errore sconosciuto"
|
4944 |
+
|
4945 |
+
#: defaults.php:390
|
4946 |
+
msgid "An unexpected error has occurred ."
|
4947 |
+
msgstr "Errore imprevisto."
|
4948 |
+
|
4949 |
+
#: defaults.php:391
|
4950 |
+
msgid "PHP error"
|
4951 |
+
msgstr "Errore PHP"
|
4952 |
+
|
4953 |
+
#: defaults.php:391 defaults.php:392 defaults.php:393 defaults.php:394
|
4954 |
+
#: defaults.php:395
|
4955 |
+
msgid "%Message%."
|
4956 |
+
msgstr "%Message%."
|
4957 |
+
|
4958 |
+
#: defaults.php:392
|
4959 |
+
msgid "PHP warning"
|
4960 |
+
msgstr "Avviso PHP"
|
4961 |
+
|
4962 |
+
#: defaults.php:393
|
4963 |
+
msgid "PHP notice"
|
4964 |
+
msgstr "Notifica PHP"
|
4965 |
+
|
4966 |
+
#: defaults.php:394
|
4967 |
+
msgid "PHP exception"
|
4968 |
+
msgstr "Eccezione PHP"
|
4969 |
+
|
4970 |
+
#: defaults.php:395
|
4971 |
+
msgid "PHP shutdown error"
|
4972 |
+
msgstr "Errore relativo ad arresto imprevisto PHP"
|
4973 |
+
|
4974 |
+
#: defaults.php:396
|
4975 |
+
msgid "Events automatically pruned by system"
|
4976 |
+
msgstr "Eventi eliminati automaticamente dal sistema"
|
4977 |
+
|
4978 |
+
#: defaults.php:396
|
4979 |
+
msgid "System automatically deleted %EventCount% event(s)."
|
4980 |
+
msgstr "Il sistema ha eliminato automaticamente %EventCount% evento(i)."
|
4981 |
+
|
4982 |
+
#: defaults.php:397
|
4983 |
+
msgid "WordPress was updated"
|
4984 |
+
msgstr "WordPress è stato aggiornato"
|
4985 |
+
|
4986 |
+
#: defaults.php:397
|
4987 |
+
msgid "Updated WordPress from version %OldVersion% to %NewVersion%."
|
4988 |
+
msgstr "WordPress aggiornato dalla versione %OldVersion% a %NewVersion%."
|
4989 |
+
|
4990 |
+
#: defaults.php:398
|
4991 |
+
msgid "Reset plugin's settings to default"
|
4992 |
+
msgstr "Ripristina le impostazioni predefinite del plugin"
|
4993 |
+
|
4994 |
+
#: defaults.php:398
|
4995 |
+
msgid "Reset plugin's settings to default."
|
4996 |
+
msgstr "Ripristina le impostazioni predefinite del plugin."
|
4997 |
+
|
4998 |
+
#: defaults.php:399
|
4999 |
+
msgid "Purged the activity log"
|
5000 |
+
msgstr "Svuotato il log attività"
|
5001 |
+
|
5002 |
+
#: defaults.php:399
|
5003 |
+
msgid "Purged the activity log."
|
5004 |
+
msgstr "Svuotato il log attività."
|
5005 |
+
|
5006 |
+
#: defaults.php:400
|
5007 |
+
msgid "File content has been modified"
|
5008 |
+
msgstr "Il contenuto del file è stato modificato"
|
5009 |
+
|
5010 |
+
#: defaults.php:400
|
5011 |
+
msgid "The content of the file %FileLocation% has been modified."
|
5012 |
+
msgstr "Il contenuto del file %FileLocation% è stato modificato."
|
5013 |
+
|
5014 |
+
#: defaults.php:401
|
5015 |
+
msgid "File added to the site"
|
5016 |
+
msgstr "File aggiunto al sito"
|
5017 |
+
|
5018 |
+
#: defaults.php:401
|
5019 |
+
msgid "The file %FileLocation% has been added to your website."
|
5020 |
+
msgstr "Il file %FileLocation% è stato aggiunto al tuo sito web."
|
5021 |
+
|
5022 |
+
#: defaults.php:402
|
5023 |
+
msgid "File deleted from the site"
|
5024 |
+
msgstr "File rimosso dal sito"
|
5025 |
+
|
5026 |
+
#: defaults.php:402
|
5027 |
+
msgid "The file %FileLocation% has been deleted from your website."
|
5028 |
+
msgstr "Il file %FileLocation% è stato rimosso dal tuo sito web."
|
5029 |
+
|
5030 |
+
#: defaults.php:403
|
5031 |
+
msgid "File not scanned because it is bigger than the maximum file size limit"
|
5032 |
+
msgstr ""
|
5033 |
+
"File non scansionato perché più grande del limite massimo di dimensione del "
|
5034 |
+
"file"
|
5035 |
+
|
5036 |
+
#: defaults.php:403
|
5037 |
+
msgid ""
|
5038 |
+
"The file %FileLocation% was not scanned because it is bigger than the "
|
5039 |
+
"maximum file size limit. If you want to include these files in the scan "
|
5040 |
+
"increase the file size limit from the %FileSettings%."
|
5041 |
+
msgstr ""
|
5042 |
+
"Il file %FileLocation% non è stato scansionato perché superiore alla "
|
5043 |
+
"dimensione massima del file. Se vuoi includere questi file nella scansione, "
|
5044 |
+
"aumenta la dimensione massima del file in %FileSettings%."
|
5045 |
+
|
5046 |
+
#: defaults.php:404
|
5047 |
+
msgid "File integrity scan stopped due to the limit of 1 million files"
|
5048 |
+
msgstr ""
|
5049 |
+
"La scansione dell'integrità dei file è stata interrotta a causa del limite "
|
5050 |
+
"di 1 milione di file"
|
5051 |
+
|
5052 |
+
#: defaults.php:404
|
5053 |
+
msgid ""
|
5054 |
+
"The file changes scanning engine has reached the limit of 1 million files "
|
5055 |
+
"and stopped the scan. Please %ContactSupport% for more information."
|
5056 |
+
msgstr ""
|
5057 |
+
"Il motore di scansione delle modifiche dei file ha raggiunto il limite di 1 "
|
5058 |
+
"milione di file e ha interrotto la scansione. Per ulteriori informazioni, si "
|
5059 |
+
"prega di contattare il servizio di assistenza %ContactSupport%."
|
5060 |
+
|
5061 |
+
#: defaults.php:405
|
5062 |
+
msgid "File integrity scan started/stopped"
|
5063 |
+
msgstr "Avvia/ferma scansione integrità file"
|
5064 |
+
|
5065 |
+
#: defaults.php:405
|
5066 |
+
msgid "The file integrity scanner has %ScanStatus%."
|
5067 |
+
msgstr "Lo scanner dell'integrità dei file ha %ScanStatus%."
|
5068 |
+
|
5069 |
+
#: defaults.php:406
|
5070 |
+
msgid "Advertising Add-ons"
|
5071 |
+
msgstr "Add-On pubblicitari"
|
5072 |
+
|
5073 |
+
#: defaults.php:406
|
5074 |
+
msgid "%PromoName% %PromoMessage%"
|
5075 |
+
msgstr "%PromoName% %PromoMessage%"
|
5076 |
+
|
5077 |
+
#: defaults.php:412
|
5078 |
+
msgid "Menus"
|
5079 |
+
msgstr "Menu"
|
5080 |
+
|
5081 |
+
#: defaults.php:413
|
5082 |
+
msgid "User created new menu"
|
5083 |
+
msgstr "L'utente ha creato un nuovo menu"
|
5084 |
+
|
5085 |
+
#: defaults.php:413
|
5086 |
+
msgid "Created a new menu called %MenuName%."
|
5087 |
+
msgstr "Creato un nuovo menu chiamato %MenuName%."
|
5088 |
+
|
5089 |
+
#: defaults.php:414
|
5090 |
+
msgid "User added content to a menu"
|
5091 |
+
msgstr "L'utente ha aggiunto contenuto a un menu"
|
5092 |
+
|
5093 |
+
#: defaults.php:414
|
5094 |
+
msgid "Added the %ContentType% called %ContentName% to menu %MenuName%."
|
5095 |
+
msgstr "Aggiunto il %ContentType% chiamato %ContentName% al menu %MenuName%."
|
5096 |
+
|
5097 |
+
#: defaults.php:415
|
5098 |
+
msgid "User removed content from a menu"
|
5099 |
+
msgstr "L'utente ha rimosso contenuto da un menu"
|
5100 |
+
|
5101 |
+
#: defaults.php:415
|
5102 |
+
msgid ""
|
5103 |
+
"Removed the %ContentType% called %ContentName% from the menu %MenuName%."
|
5104 |
+
msgstr "Rimosso il %ContentType% chiamato %ContentName% dal menu %MenuName%."
|
5105 |
+
|
5106 |
+
#: defaults.php:416
|
5107 |
+
msgid "User deleted menu"
|
5108 |
+
msgstr "L'utente ha eliminato un menu"
|
5109 |
+
|
5110 |
+
#: defaults.php:416
|
5111 |
+
msgid "Deleted the menu %MenuName%."
|
5112 |
+
msgstr "Eliminato il menu %MenuName%."
|
5113 |
+
|
5114 |
+
#: defaults.php:417
|
5115 |
+
msgid "User changed menu setting"
|
5116 |
+
msgstr "L'utente ha modificato le impostazioni del menu"
|
5117 |
+
|
5118 |
+
#: defaults.php:417
|
5119 |
+
msgid "%Status% the menu setting %MenuSetting% in %MenuName%."
|
5120 |
+
msgstr "%Status% l'impostazione del menu %MenuSetting% in %MenuName%."
|
5121 |
+
|
5122 |
+
#: defaults.php:418
|
5123 |
+
msgid "User modified content in a menu"
|
5124 |
+
msgstr "L'utente ha modificato il contenuto in un menu"
|
5125 |
+
|
5126 |
+
#: defaults.php:418
|
5127 |
+
msgid "Modified the %ContentType% called %ContentName% in menu %MenuName%."
|
5128 |
+
msgstr ""
|
5129 |
+
"Modificato il %ContentType% chiamato %ContentName% nel menu %MenuName%."
|
5130 |
+
|
5131 |
+
#: defaults.php:419
|
5132 |
+
msgid "User changed name of a menu"
|
5133 |
+
msgstr "L'utente ha modificato il nome di un menu"
|
5134 |
+
|
5135 |
+
#: defaults.php:419
|
5136 |
+
msgid "Changed the name of menu %OldMenuName% to %NewMenuName%."
|
5137 |
+
msgstr "Modificato il nome del menu %OldMenuName% in %NewMenuName%."
|
5138 |
+
|
5139 |
+
#: defaults.php:420
|
5140 |
+
msgid "User changed order of the objects in a menu"
|
5141 |
+
msgstr "L'utente ha modificato l'ordine degli oggetti in un menu"
|
5142 |
+
|
5143 |
+
#: defaults.php:420
|
5144 |
+
msgid "Changed the order of the %ItemName% in menu %MenuName%."
|
5145 |
+
msgstr "Modificato l'ordine del %ItemName% nel menu %MenuName%."
|
5146 |
+
|
5147 |
+
#: defaults.php:421
|
5148 |
+
msgid "User moved objects as a sub-item"
|
5149 |
+
msgstr "L'utente ha spostato oggetti come elemento secondario"
|
5150 |
+
|
5151 |
+
#: defaults.php:421
|
5152 |
+
msgid "Moved %ItemName% as a sub-item of %ParentName% in menu %MenuName%."
|
5153 |
+
msgstr ""
|
5154 |
+
"Spostato %ItemName% come elemento secondario di %ParentName% nel menu "
|
5155 |
+
"%MenuName%."
|
5156 |
+
|
5157 |
+
#: defaults.php:427
|
5158 |
+
msgid "Widgets"
|
5159 |
+
msgstr "Widgets"
|
5160 |
+
|
5161 |
+
#: defaults.php:428
|
5162 |
+
msgid "User added a new widget"
|
5163 |
+
msgstr "L'utente ha aggiunto un nuovo widget"
|
5164 |
+
|
5165 |
+
#: defaults.php:428
|
5166 |
+
msgid "Added a new %WidgetName% widget in %Sidebar%."
|
5167 |
+
msgstr "Aggiunto un nuovo widget %WidgetName% in %Sidebar%."
|
5168 |
+
|
5169 |
+
#: defaults.php:429
|
5170 |
+
msgid "User modified a widget"
|
5171 |
+
msgstr "L'utente ha modificato un widget"
|
5172 |
+
|
5173 |
+
#: defaults.php:429
|
5174 |
+
msgid "Modified the %WidgetName% widget in %Sidebar%."
|
5175 |
+
msgstr "Modificato il widget %WidgetName% in %Sidebar%."
|
5176 |
+
|
5177 |
+
#: defaults.php:430
|
5178 |
+
msgid "User deleted widget"
|
5179 |
+
msgstr "L'utente ha eliminato un widget"
|
5180 |
+
|
5181 |
+
#: defaults.php:430
|
5182 |
+
msgid "Deleted the %WidgetName% widget from %Sidebar%."
|
5183 |
+
msgstr "Eliminato il widget %WidgetName% da %Sidebar%."
|
5184 |
+
|
5185 |
+
#: defaults.php:431
|
5186 |
+
msgid "User moved widget"
|
5187 |
+
msgstr "L'utente ha spostato un widget"
|
5188 |
+
|
5189 |
+
#: defaults.php:431
|
5190 |
+
msgid "Moved the %WidgetName% widget from %OldSidebar% to %NewSidebar%."
|
5191 |
+
msgstr "Spostato il widget %WidgetName% da %OldSidebar% a %NewSidebar%."
|
5192 |
+
|
5193 |
+
#: defaults.php:432
|
5194 |
+
msgid "User changed widget position"
|
5195 |
+
msgstr "L'utente ha modificato la posizione del widget"
|
5196 |
+
|
5197 |
+
#: defaults.php:432
|
5198 |
+
msgid "Changed the position of the widget %WidgetName% in sidebar %Sidebar%."
|
5199 |
+
msgstr ""
|
5200 |
+
"Modificata la posizione del widget %WidgetName% nella barra laterale %Sidebar"
|
5201 |
+
"%."
|
5202 |
+
|
5203 |
+
#: defaults.php:438
|
5204 |
+
msgid "WordPress Settings"
|
5205 |
+
msgstr "Impostazioni Wordpress"
|
5206 |
+
|
5207 |
+
#: defaults.php:439
|
5208 |
+
msgid "Option Anyone Can Register in WordPress settings changed"
|
5209 |
+
msgstr ""
|
5210 |
+
"Modificata l'opzione Chiunque può registrarsi nelle impostazioni Wordpress"
|
5211 |
+
|
5212 |
+
#: defaults.php:439
|
5213 |
+
msgid "%NewValue% the option \"Anyone can register\"."
|
5214 |
+
msgstr "%NewValue% all'opzione \"Chiunque può registrarsi\"."
|
5215 |
+
|
5216 |
+
#: defaults.php:440
|
5217 |
+
msgid "New User Default Role changed"
|
5218 |
+
msgstr "Ruolo predefinito nuovo utente modificato"
|
5219 |
+
|
5220 |
+
#: defaults.php:440
|
5221 |
+
msgid "Changed the New User Default Role from %OldRole% to %NewRole%."
|
5222 |
+
msgstr "Modificato il Ruolo Predefinito Nuovo Utente da %OldRole% a %NewRole%."
|
5223 |
+
|
5224 |
+
#: defaults.php:441
|
5225 |
+
msgid "WordPress Administrator Notification email changed"
|
5226 |
+
msgstr "Modificata Email notifica amministratore Wordpress"
|
5227 |
+
|
5228 |
+
#: defaults.php:441
|
5229 |
+
msgid ""
|
5230 |
+
"Changed the WordPress administrator notifications email address from "
|
5231 |
+
"%OldEmail% to %NewEmail%."
|
5232 |
+
msgstr ""
|
5233 |
+
"Modificato l'indirizzo email delle notifiche dell'amministratore WordPress "
|
5234 |
+
"da %OldEmail% a %NewEmail%."
|
5235 |
+
|
5236 |
+
#: defaults.php:442
|
5237 |
+
msgid "User changes the WordPress Permalinks"
|
5238 |
+
msgstr "L'utente cambia i permalink Wordpress"
|
5239 |
+
|
5240 |
+
#: defaults.php:442
|
5241 |
+
msgid "Changed the WordPress permalinks from %OldPattern% to %NewPattern%."
|
5242 |
+
msgstr "Modificati i permalink WordPress da %OldPattern% a %NewPattern%."
|
5243 |
+
|
5244 |
+
#: defaults.php:443
|
5245 |
+
msgid ""
|
5246 |
+
"Enabled/Disabled the option Discourage search engines from indexing this site"
|
5247 |
+
msgstr ""
|
5248 |
+
"Attivare/disattivare l'opzione Scoraggiare i motori di ricerca "
|
5249 |
+
"dall'indicizzare questo sito"
|
5250 |
+
|
5251 |
+
#: defaults.php:443
|
5252 |
+
msgid "%Status% the option Discourage search engines from indexing this site."
|
5253 |
+
msgstr ""
|
5254 |
+
"%Status% l'opzione Scoraggiare i motori di ricerca dall'indicizzare questo "
|
5255 |
+
"sito."
|
5256 |
+
|
5257 |
+
#: defaults.php:444
|
5258 |
+
msgid "Enabled/Disabled comments on all the website"
|
5259 |
+
msgstr "Commenti abilitati/disabilitati su tutto il sito web"
|
5260 |
+
|
5261 |
+
#: defaults.php:444
|
5262 |
+
msgid "%Status% comments on all the website."
|
5263 |
+
msgstr "%Status% commenti su tutto il sito web."
|
5264 |
+
|
5265 |
+
#: defaults.php:445
|
5266 |
+
msgid "Enabled/Disabled the option Comment author must fill out name and email"
|
5267 |
+
msgstr ""
|
5268 |
+
"Abilita/Disabilita l'opzione L'autore del commento deve compilare il nome e "
|
5269 |
+
"l'email"
|
5270 |
+
|
5271 |
+
#: defaults.php:445
|
5272 |
+
msgid "%Status% the option Comment author must fill out name and email."
|
5273 |
+
msgstr ""
|
5274 |
+
"%Status% l'opzione L'autore del commento deve compilare il nome e l'email."
|
5275 |
+
|
5276 |
+
#: defaults.php:446
|
5277 |
+
msgid ""
|
5278 |
+
"Enabled/Disabled the option Users must be logged in and registered to comment"
|
5279 |
+
msgstr ""
|
5280 |
+
"Abilita/Disabilita l'opzione Gli utenti devono essere autenticati e "
|
5281 |
+
"registrati per commentare"
|
5282 |
+
|
5283 |
+
#: defaults.php:446
|
5284 |
+
msgid "%Status% the option Users must be logged in and registered to comment."
|
5285 |
+
msgstr ""
|
5286 |
+
"%Status% l'opzione Gli utenti devono essere autenticati e registrati per "
|
5287 |
+
"commentare."
|
5288 |
+
|
5289 |
+
#: defaults.php:447
|
5290 |
+
msgid "Enabled/Disabled the option to automatically close comments"
|
5291 |
+
msgstr "Abilita/Disabilita l'opzione per chiudere automaticamente i commenti"
|
5292 |
+
|
5293 |
+
#: defaults.php:447
|
5294 |
+
msgid "%Status% the option to automatically close comments after %Value% days."
|
5295 |
+
msgstr ""
|
5296 |
+
"%Status% l'opzione per chiudere automaticamente i commenti dopo %Value% "
|
5297 |
+
"giorni."
|
5298 |
+
|
5299 |
+
#: defaults.php:448
|
5300 |
+
msgid "Changed the value of the option Automatically close comments"
|
5301 |
+
msgstr "Modificato il valore dell'opzione Chiudi automaticamente i commenti"
|
5302 |
+
|
5303 |
+
#: defaults.php:448
|
5304 |
+
msgid ""
|
5305 |
+
"Changed the value of the option Automatically close comments from %OldValue% "
|
5306 |
+
"to %NewValue% days."
|
5307 |
+
msgstr ""
|
5308 |
+
"Modificato il valore dell'opzione Chiudi automaticamente i commenti da "
|
5309 |
+
"%OldValue% a %NewValue% giorni."
|
5310 |
+
|
5311 |
+
#: defaults.php:449
|
5312 |
+
msgid "Enabled/Disabled the option for comments to be manually approved"
|
5313 |
+
msgstr ""
|
5314 |
+
"Abilitata/disabilitata l'opzione per i commenti da approvare manualmente"
|
5315 |
+
|
5316 |
+
#: defaults.php:449
|
5317 |
+
msgid "%Status% the option for comments to be manually approved."
|
5318 |
+
msgstr "%status% l'opzione per i commenti da approvare manualmente."
|
5319 |
+
|
5320 |
+
#: defaults.php:450
|
5321 |
+
msgid ""
|
5322 |
+
"Enabled/Disabled the option for an author to have previously approved "
|
5323 |
+
"comments for the comments to appear"
|
5324 |
+
msgstr ""
|
5325 |
+
"Abilitata/disabilitata l'opzione per un autore di avere precedentemente "
|
5326 |
+
"approvato i commenti affinché i commenti vengano mostrati"
|
5327 |
+
|
5328 |
+
#: defaults.php:450
|
5329 |
+
msgid ""
|
5330 |
+
"%Status% the option for an author to have previously approved comments for "
|
5331 |
+
"the comments to appear."
|
5332 |
+
msgstr ""
|
5333 |
+
"%Status% l'opzione per un autore di avere precedentemente approvato i "
|
5334 |
+
"commenti affinché vengano visualizzati."
|
5335 |
+
|
5336 |
+
#: defaults.php:451
|
5337 |
+
msgid ""
|
5338 |
+
"Changed the number of links that a comment must have to be held in the queue"
|
5339 |
+
msgstr ""
|
5340 |
+
"Modificato il numero di link che un commento debba avere per stare in coda"
|
5341 |
+
|
5342 |
+
#: defaults.php:451
|
5343 |
+
msgid ""
|
5344 |
+
"Changed the number of links from %OldValue% to %NewValue% that a comment "
|
5345 |
+
"must have to be held in the queue."
|
5346 |
+
msgstr ""
|
5347 |
+
"Modificato il numero dei link da %OldValue% a %NewValue% che un commento "
|
5348 |
+
"debba avere per essere tenuto in coda."
|
5349 |
+
|
5350 |
+
#: defaults.php:452
|
5351 |
+
msgid "Modified the list of keywords for comments moderation"
|
5352 |
+
msgstr ""
|
5353 |
+
"Modificato l'elenco delle parole chiave per la moderazione dei commenti"
|
5354 |
+
|
5355 |
+
#: defaults.php:452
|
5356 |
+
msgid "Modified the list of keywords for comments moderation."
|
5357 |
+
msgstr ""
|
5358 |
+
"Modificato l'elenco delle parole chiave per la moderazione dei commenti."
|
5359 |
+
|
5360 |
+
#: defaults.php:453
|
5361 |
+
msgid "Modified the list of keywords for comments blacklisting"
|
5362 |
+
msgstr "Modificato l'elenco delle parole chiave per blacklisting dei commenti"
|
5363 |
+
|
5364 |
+
#: defaults.php:453
|
5365 |
+
msgid "Modified the list of keywords for comments blacklisting."
|
5366 |
+
msgstr "Modificato l'elenco delle parole chiave per blacklisting dei commenti."
|
5367 |
+
|
5368 |
+
#: defaults.php:454
|
5369 |
+
msgid "Option WordPress Address (URL) in WordPress settings changed"
|
5370 |
+
msgstr ""
|
5371 |
+
"Modificata l'opzione Indirizzo WordPress (URL) nelle impostazioni WordPress"
|
5372 |
+
|
5373 |
+
#: defaults.php:454
|
5374 |
+
msgid "Changed the WordPress address (URL) from %old_url% to %new_url%."
|
5375 |
+
msgstr "Modificato l'indirizzo WordPress (URL) da %old_url% a %new_url%."
|
5376 |
+
|
5377 |
+
#: defaults.php:455
|
5378 |
+
msgid "Option Site Address (URL) in WordPress settings changed"
|
5379 |
+
msgstr ""
|
5380 |
+
"Modificata l'opzione indirizzo del sito (URL) nelle impostazioni WordPress"
|
5381 |
+
|
5382 |
+
#: defaults.php:455
|
5383 |
+
msgid "Changed the site address (URL) from %old_url% to %new_url%."
|
5384 |
+
msgstr "Modificato l'indirizzo del sito (URL) da %old_url% a %new_url%."
|
5385 |
+
|
5386 |
+
#: defaults.php:456
|
5387 |
+
msgid "Created a New cron job"
|
5388 |
+
msgstr "Creato un nuovo cron job"
|
5389 |
+
|
5390 |
+
#: defaults.php:456
|
5391 |
+
msgid ""
|
5392 |
+
"A new cron job called %name% was created and is scheduled to run %schedule%."
|
5393 |
+
msgstr ""
|
5394 |
+
"È stato creato un nuovo cron job chiamato %name% e se ne prevede "
|
5395 |
+
"l'esecuzione %schedule%."
|
5396 |
+
|
5397 |
+
#: defaults.php:457
|
5398 |
+
msgid "Changed status of the cron job"
|
5399 |
+
msgstr "Modificato lo status del cron job"
|
5400 |
+
|
5401 |
+
#: defaults.php:457
|
5402 |
+
msgid "The cron job %name% was %status%."
|
5403 |
+
msgstr "Il cron job %name% era %status%."
|
5404 |
+
|
5405 |
+
#: defaults.php:458
|
5406 |
+
msgid "Deleted the cron job"
|
5407 |
+
msgstr "Cancellato il cron job"
|
5408 |
+
|
5409 |
+
#: defaults.php:458
|
5410 |
+
msgid "The cron job %name% was deleted."
|
5411 |
+
msgstr "Il cron job %name% è stato cancellato."
|
5412 |
+
|
5413 |
+
#: defaults.php:459
|
5414 |
+
msgid "Started the cron job"
|
5415 |
+
msgstr "Avviato il cron job"
|
5416 |
+
|
5417 |
+
#: defaults.php:459
|
5418 |
+
msgid "The cron job %name% has just started."
|
5419 |
+
msgstr "Il cron job %name% è appena iniziato."
|
5420 |
+
|
5421 |
+
#: defaults.php:466
|
5422 |
+
msgid "Multisite Network"
|
5423 |
+
msgstr "Rete multisito"
|
5424 |
+
|
5425 |
+
#: defaults.php:471
|
5426 |
+
msgid "User granted Super Admin privileges"
|
5427 |
+
msgstr "L'utente possiede privilegi di super admin"
|
5428 |
+
|
5429 |
+
#: defaults.php:471
|
5430 |
+
msgid "Granted Super Admin privileges to %TargetUsername%."
|
5431 |
+
msgstr "Concessi privilegi di Super Admin a %TargetUsername%."
|
5432 |
+
|
5433 |
+
#: defaults.php:472
|
5434 |
+
msgid "User revoked from Super Admin privileges"
|
5435 |
+
msgstr "Revocati privilegi di Super Admin all'utente"
|
5436 |
+
|
5437 |
+
#: defaults.php:472
|
5438 |
+
msgid "Revoked Super Admin privileges from %TargetUsername%."
|
5439 |
+
msgstr "Revocati privilegi Super Admin da %TargetUsername%."
|
5440 |
+
|
5441 |
+
#: defaults.php:473
|
5442 |
+
msgid "Existing user added to a site"
|
5443 |
+
msgstr "Utente esistente aggiunto a un sito"
|
5444 |
+
|
5445 |
+
#: defaults.php:473
|
5446 |
+
msgid ""
|
5447 |
+
"Added the existing user %TargetUsername% with %TargetUserRole% role to site "
|
5448 |
+
"%SiteName%."
|
5449 |
+
msgstr ""
|
5450 |
+
"Aggiunto l'utente esistente %TargetUsername% con ruolo %TargetUserRole% al "
|
5451 |
+
"sito %SiteName%."
|
5452 |
+
|
5453 |
+
#: defaults.php:474
|
5454 |
+
msgid "User removed from site"
|
5455 |
+
msgstr "Utente rimosso dal sito"
|
5456 |
+
|
5457 |
+
#: defaults.php:474
|
5458 |
+
msgid ""
|
5459 |
+
"Removed the user %TargetUsername% with role %TargetUserRole% from %SiteName% "
|
5460 |
+
"site."
|
5461 |
+
msgstr ""
|
5462 |
+
"Rimosso l'utente %TargetUsername% con ruolo %TargetUserRole% dal sito "
|
5463 |
+
"%SiteName%."
|
5464 |
+
|
5465 |
+
#: defaults.php:475
|
5466 |
+
msgid "New network user created"
|
5467 |
+
msgstr "Creato nuovo utente di rete"
|
5468 |
+
|
5469 |
+
#: defaults.php:475
|
5470 |
+
msgid "Created a new network user %NewUserData->Username%."
|
5471 |
+
msgstr "Creato un nuovo utente di rete %NewUserData->Username%."
|
5472 |
+
|
5473 |
+
#: defaults.php:476
|
5474 |
+
msgid "The forum role of a user was changed by another WordPress user"
|
5475 |
+
msgstr ""
|
5476 |
+
"Il ruolo forum di un utente è stato modificato da un altro utente WordPress"
|
5477 |
+
|
5478 |
+
#: defaults.php:476
|
5479 |
+
msgid ""
|
5480 |
+
"Change the forum role of the user %TargetUsername% from %OldRole% to %NewRole"
|
5481 |
+
"% by %UserChanger%."
|
5482 |
+
msgstr ""
|
5483 |
+
"Modificato il ruolo forum dell'utente %TargetUsername% da %OldRole% a "
|
5484 |
+
"%NewRole% da %UserChanger%."
|
5485 |
+
|
5486 |
+
#: defaults.php:477
|
5487 |
+
msgid "New site added on the network"
|
5488 |
+
msgstr "Nuovo sito aggiunto alla rete"
|
5489 |
+
|
5490 |
+
#: defaults.php:477
|
5491 |
+
msgid "Added the site %SiteName% to the network."
|
5492 |
+
msgstr "Aggiunto il sito %SiteName% alla rete."
|
5493 |
+
|
5494 |
+
#: defaults.php:478
|
5495 |
+
msgid "Existing site archived"
|
5496 |
+
msgstr "Sito esistente archiviato"
|
5497 |
+
|
5498 |
+
#: defaults.php:478
|
5499 |
+
msgid "Archived the site %SiteName%."
|
5500 |
+
msgstr "Archiviato il sito %SiteName%."
|
5501 |
+
|
5502 |
+
#: defaults.php:479
|
5503 |
+
msgid "Archived site has been unarchived"
|
5504 |
+
msgstr "Il sito archiviato è stato recuperato dall'archivio"
|
5505 |
+
|
5506 |
+
#: defaults.php:479
|
5507 |
+
msgid "Unarchived the site %SiteName%."
|
5508 |
+
msgstr "Sito %SiteName% recuperato dall'archivio."
|
5509 |
+
|
5510 |
+
#: defaults.php:480
|
5511 |
+
msgid "Deactivated site has been activated"
|
5512 |
+
msgstr "Il sito disattivato è stato attivato"
|
5513 |
+
|
5514 |
+
#: defaults.php:480
|
5515 |
+
msgid "Activated the site %SiteName%."
|
5516 |
+
msgstr "Attivato il sito %SiteName%."
|
5517 |
+
|
5518 |
+
#: defaults.php:481
|
5519 |
+
msgid "Site has been deactivated"
|
5520 |
+
msgstr "Il sito è stato disattivato"
|
5521 |
+
|
5522 |
+
#: defaults.php:481
|
5523 |
+
msgid "Deactivated the site %SiteName%."
|
5524 |
+
msgstr "Disattivato il sito %SiteName%."
|
5525 |
+
|
5526 |
+
#: defaults.php:482
|
5527 |
+
msgid "Existing site deleted from network"
|
5528 |
+
msgstr "Il sito esistente è stato eliminato dalla rete"
|
5529 |
+
|
5530 |
+
#: defaults.php:482
|
5531 |
+
msgid "Deleted the site %SiteName%."
|
5532 |
+
msgstr "Eliminato il sito %SiteName%."
|
5533 |
+
|
5534 |
+
#: defaults.php:494
|
5535 |
+
msgid "User created new forum"
|
5536 |
+
msgstr "L'utente ha creato un nuovo forum"
|
5537 |
+
|
5538 |
+
#: defaults.php:494
|
5539 |
+
msgid ""
|
5540 |
+
"Created new forum %ForumName%. Forum URL is %ForumURL%. %EditorLinkForum%."
|
5541 |
+
msgstr ""
|
5542 |
+
"Creato nuovo forum %ForumName%. L'URL del forum è %ForumURL%. "
|
5543 |
+
"%EditorLinkForum%."
|
5544 |
+
|
5545 |
+
#: defaults.php:495
|
5546 |
+
msgid "User changed status of a forum"
|
5547 |
+
msgstr "L'utente ha modificato lo status di un forum"
|
5548 |
+
|
5549 |
+
#: defaults.php:495
|
5550 |
+
msgid ""
|
5551 |
+
"Changed the status of the forum %ForumName% from %OldStatus% to %NewStatus%. "
|
5552 |
+
"%EditorLinkForum%."
|
5553 |
+
msgstr ""
|
5554 |
+
"Modificato lo stato del forum %ForumName% da %OldStatus% a %NewStatus%. "
|
5555 |
+
"%EditorLinkForum%."
|
5556 |
+
|
5557 |
+
#: defaults.php:496
|
5558 |
+
msgid "User changed visibility of a forum"
|
5559 |
+
msgstr "L'utente ha modificato la visibilità di un forum"
|
5560 |
+
|
5561 |
+
#: defaults.php:496
|
5562 |
+
msgid ""
|
5563 |
+
"Changed the visibility of the forum %ForumName% from %OldVisibility% to "
|
5564 |
+
"%NewVisibility%. %EditorLinkForum%."
|
5565 |
+
msgstr ""
|
5566 |
+
"Modificata la visibilità del forum %ForumName% da %OldVisibility% a "
|
5567 |
+
"%NewVisibility%. %EditorLinkForum%."
|
5568 |
+
|
5569 |
+
#: defaults.php:497
|
5570 |
+
msgid "User changed the URL of a forum"
|
5571 |
+
msgstr "L'utente ha modificato l'URL di un forum"
|
5572 |
+
|
5573 |
+
#: defaults.php:497
|
5574 |
+
msgid ""
|
5575 |
+
"Changed the URL of the forum %ForumName% from %OldUrl% to %NewUrl%. "
|
5576 |
+
"%EditorLinkForum%."
|
5577 |
+
msgstr ""
|
5578 |
+
"Modificato l'URL del forum %ForumName% da %OldUrl% a %NewUrl%. "
|
5579 |
+
"%EditorLinkForum%."
|
5580 |
+
|
5581 |
+
#: defaults.php:498
|
5582 |
+
msgid "User changed order of a forum"
|
5583 |
+
msgstr "L'utente ha modificato l'ordine di un forum"
|
5584 |
+
|
5585 |
+
#: defaults.php:498
|
5586 |
+
msgid ""
|
5587 |
+
"Changed the order of the forum %ForumName% from %OldOrder% to %NewOrder%. "
|
5588 |
+
"%EditorLinkForum%."
|
5589 |
+
msgstr ""
|
5590 |
+
"Modificato l'ordine del forum %ForumName% da %OldOrder% a %NewOrder%. "
|
5591 |
+
"%EditorLinkForum%."
|
5592 |
+
|
5593 |
+
#: defaults.php:499
|
5594 |
+
msgid "User moved forum to trash"
|
5595 |
+
msgstr "L'utente ha spostato un forum nel cestino"
|
5596 |
+
|
5597 |
+
#: defaults.php:499
|
5598 |
+
msgid "Moved the forum %ForumName% to trash."
|
5599 |
+
msgstr "Spostato il forum %ForumName% nel cestino."
|
5600 |
+
|
5601 |
+
#: defaults.php:500
|
5602 |
+
msgid "User permanently deleted forum"
|
5603 |
+
msgstr "L'utente ha eliminato definitivamente un forum"
|
5604 |
+
|
5605 |
+
#: defaults.php:500
|
5606 |
+
msgid "Permanently deleted the forum %ForumName%."
|
5607 |
+
msgstr "Eliminato definitivamente il forum %ForumName%."
|
5608 |
+
|
5609 |
+
#: defaults.php:501
|
5610 |
+
msgid "User restored forum from trash"
|
5611 |
+
msgstr "L'utente ha ripristinato un forum dal cestino"
|
5612 |
+
|
5613 |
+
#: defaults.php:501
|
5614 |
+
msgid "Restored the forum %ForumName% from trash. %EditorLinkForum%."
|
5615 |
+
msgstr "Ripristinato il forum %ForumName% dal cestino. %EditorLinkForum%."
|
5616 |
+
|
5617 |
+
#: defaults.php:502
|
5618 |
+
msgid "User changed the parent of a forum"
|
5619 |
+
msgstr "L'utente ha modificato il genitore di un forum"
|
5620 |
+
|
5621 |
+
#: defaults.php:502
|
5622 |
+
msgid ""
|
5623 |
+
"Changed the parent of the forum %ForumName% from %OldParent% to %NewParent%. "
|
5624 |
+
"%EditorLinkForum%."
|
5625 |
+
msgstr ""
|
5626 |
+
"Modificato il genitore del forum %ForumName% da %OldParent% a %NewParent%. "
|
5627 |
+
"%EditorLinkForum%."
|
5628 |
+
|
5629 |
+
#: defaults.php:503
|
5630 |
+
msgid "User changed type of a forum"
|
5631 |
+
msgstr "L'utente ha modificato il tipo di forum"
|
5632 |
+
|
5633 |
+
#: defaults.php:503
|
5634 |
+
msgid ""
|
5635 |
+
"Changed the type of the forum %ForumName% from %OldType% to %NewType%. "
|
5636 |
+
"%EditorLinkForum%."
|
5637 |
+
msgstr ""
|
5638 |
+
"Modificato il tipo di forum %ForumName% da %OldType% a %NewType%. "
|
5639 |
+
"%EditorLinkForum%."
|
5640 |
+
|
5641 |
+
#: defaults.php:504
|
5642 |
+
msgid "User changed forum's role"
|
5643 |
+
msgstr "L'utente ha modificato il ruolo di un forum"
|
5644 |
+
|
5645 |
+
#: defaults.php:504
|
5646 |
+
msgid "Changed the forum's auto role from %OldRole% to %NewRole%."
|
5647 |
+
msgstr "Modificato l'auto ruolo del forum da %OldRole% a %NewRole%."
|
5648 |
+
|
5649 |
+
#: defaults.php:505
|
5650 |
+
msgid "User changed option of a forum"
|
5651 |
+
msgstr "L'utente ha modificato l'opzione di un forum"
|
5652 |
+
|
5653 |
+
#: defaults.php:505
|
5654 |
+
msgid "%Status% the option for anonymous posting on forum."
|
5655 |
+
msgstr "%Status% l'opzione per posting anonimo nel forum."
|
5656 |
+
|
5657 |
+
#: defaults.php:506
|
5658 |
+
msgid "User changed time to disallow post editing"
|
5659 |
+
msgstr ""
|
5660 |
+
"L'utente ha modificato il periodo per non consentire la modifica del post"
|
5661 |
+
|
5662 |
+
#: defaults.php:506
|
5663 |
+
msgid ""
|
5664 |
+
"Changed the time to disallow post editing from %OldTime% to %NewTime% "
|
5665 |
+
"minutes in the forums."
|
5666 |
+
msgstr ""
|
5667 |
+
"Modificato il periodo per non consentire la modifica del post da %OldTime% a "
|
5668 |
+
"%NewTime% minuti nei forum."
|
5669 |
+
|
5670 |
+
#: defaults.php:507
|
5671 |
+
msgid "User changed the forum setting posting throttle time"
|
5672 |
+
msgstr ""
|
5673 |
+
"L'utente ha modificato l'impostazione del periodo di limitazione del posting "
|
5674 |
+
"del forum"
|
5675 |
+
|
5676 |
+
#: defaults.php:507
|
5677 |
+
msgid ""
|
5678 |
+
"Changed the posting throttle time from %OldTime% to %NewTime% seconds in the "
|
5679 |
+
"forums."
|
5680 |
+
msgstr ""
|
5681 |
+
"Modificato il periodo di limitazione della pubblicazione da %OldTime% a "
|
5682 |
+
"%NewTime% secondi nei forum."
|
5683 |
+
|
5684 |
+
#: defaults.php:508
|
5685 |
+
msgid "User created new topic"
|
5686 |
+
msgstr "L'utente ha creato un nuovo argomento"
|
5687 |
+
|
5688 |
+
#: defaults.php:508
|
5689 |
+
msgid "Created a new topic %TopicName%. %EditorLinkTopic%."
|
5690 |
+
msgstr "Creato un nuovo argomento %TopicName%. %EditorLinkTopic%."
|
5691 |
+
|
5692 |
+
#: defaults.php:509
|
5693 |
+
msgid "User changed status of a topic"
|
5694 |
+
msgstr "L'utente ha modificato lo status di un argomento"
|
5695 |
+
|
5696 |
+
#: defaults.php:509
|
5697 |
+
msgid ""
|
5698 |
+
"Changed the status of the topic %TopicName% from %OldStatus% to %NewStatus%. "
|
5699 |
+
"%EditorLinkTopic%."
|
5700 |
+
msgstr ""
|
5701 |
+
"Modificato lo stato dell'argomento %TopicName% da %OldStatus% a %NewStatus%. "
|
5702 |
+
"%EditorLinkTopic%."
|
5703 |
+
|
5704 |
+
#: defaults.php:510
|
5705 |
+
msgid "User changed type of a topic"
|
5706 |
+
msgstr "L'utente ha modificato il tipo d'argomento"
|
5707 |
+
|
5708 |
+
#: defaults.php:510
|
5709 |
+
msgid ""
|
5710 |
+
"Changed the type of the topic %TopicName% from %OldType% to %NewType%. "
|
5711 |
+
"%EditorLinkTopic%."
|
5712 |
+
msgstr ""
|
5713 |
+
"Modificato il tipo di argomento %TopicName% da %OldType% a %NewType%. "
|
5714 |
+
"%EditorLinkTopic%."
|
5715 |
+
|
5716 |
+
#: defaults.php:511
|
5717 |
+
msgid "User changed URL of a topic"
|
5718 |
+
msgstr "L'utente ha modificato l'URL di un argomento"
|
5719 |
+
|
5720 |
+
#: defaults.php:511
|
5721 |
+
msgid "Changed the URL of the topic %TopicName% from %OldUrl% to %NewUrl%."
|
5722 |
+
msgstr "Modificato l'URL dell'argomento %TopicName% da %OldUrl% a %NewUrl%."
|
5723 |
+
|
5724 |
+
#: defaults.php:512
|
5725 |
+
msgid "User changed the forum of a topic"
|
5726 |
+
msgstr "L'utente ha modificato il forum di un argomento"
|
5727 |
+
|
5728 |
+
#: defaults.php:512
|
5729 |
+
msgid ""
|
5730 |
+
"Changed the forum of the topic %TopicName% from %OldForum% to %NewForum%. "
|
5731 |
+
"%EditorLinkTopic%."
|
5732 |
+
msgstr ""
|
5733 |
+
"Modificato il forum dell'argomento %TopicName% da %OldForum% a %NewForum%. "
|
5734 |
+
"%EditorLinkTopic%."
|
5735 |
+
|
5736 |
+
#: defaults.php:513
|
5737 |
+
msgid "User moved topic to trash"
|
5738 |
+
msgstr "L'utente ha spostato un argomento nel cestino"
|
5739 |
+
|
5740 |
+
#: defaults.php:513
|
5741 |
+
msgid "Moved the topic %TopicName% to trash."
|
5742 |
+
msgstr "Spostato l'argomento %TopicName% nel cestino."
|
5743 |
+
|
5744 |
+
#: defaults.php:514
|
5745 |
+
msgid "User permanently deleted topic"
|
5746 |
+
msgstr "L'utente ha eliminato definitivamente un argomento"
|
5747 |
+
|
5748 |
+
#: defaults.php:514
|
5749 |
+
msgid "Permanently deleted the topic %TopicName%."
|
5750 |
+
msgstr "Eliminato definitivamente l'argomento %TopicName%."
|
5751 |
+
|
5752 |
+
#: defaults.php:515
|
5753 |
+
msgid "User restored topic from trash"
|
5754 |
+
msgstr "L'utente ha ripristinato un argomento dal cestino"
|
5755 |
+
|
5756 |
+
#: defaults.php:515
|
5757 |
+
msgid "Restored the topic %TopicName% from trash. %EditorLinkTopic%."
|
5758 |
+
msgstr "Ripristinato l'argomento %TopicName% dal cestino. %EditorLinkTopic%."
|
5759 |
+
|
5760 |
+
#: defaults.php:516
|
5761 |
+
msgid "User changed visibility of a topic"
|
5762 |
+
msgstr "L'utente ha modificato la visibilità di un argomento"
|
5763 |
+
|
5764 |
+
#: defaults.php:516
|
5765 |
+
msgid ""
|
5766 |
+
"Changed the visibility of the topic %TopicName% from %OldVisibility% to "
|
5767 |
+
"%NewVisibility%. %EditorLinkTopic%."
|
5768 |
+
msgstr ""
|
5769 |
+
"Modificata la visibilità dell'argomento %TopicName% da %OldVisibility% a "
|
5770 |
+
"%NewVisibility%. %EditorLinkTopic%."
|
5771 |
+
|
5772 |
+
#: defaults.php:523
|
5773 |
+
msgid "User created a new product"
|
5774 |
+
msgstr "L'utente ha creato un nuovo prodotto"
|
5775 |
+
|
5776 |
+
#: defaults.php:523
|
5777 |
+
msgid ""
|
5778 |
+
"Created a new product called %ProductTitle% and saved it as draft. View the "
|
5779 |
+
"product: %EditorLinkProduct%."
|
5780 |
+
msgstr ""
|
5781 |
+
"Creato un nuovo prodotto chiamato %ProductTitle% e salvato come bozza. "
|
5782 |
+
"Mostra il prodotto: %EditorLinkProduct%."
|
5783 |
+
|
5784 |
+
#: defaults.php:524
|
5785 |
+
msgid "User published a product"
|
5786 |
+
msgstr "L'utente ha pubblicato un prodotto"
|
5787 |
+
|
5788 |
+
#: defaults.php:524
|
5789 |
+
msgid ""
|
5790 |
+
"Published a product called %ProductTitle%. Product URL is %ProductUrl%. View "
|
5791 |
+
"the product: %EditorLinkProduct%."
|
5792 |
+
msgstr ""
|
5793 |
+
"Pubblicato un prodotto chiamato %ProductTitle%. L'URL del prodotto è "
|
5794 |
+
"%ProductUrl%. Vedi il prodotto: %EditorLinkProduct%."
|
5795 |
+
|
5796 |
+
#: defaults.php:525
|
5797 |
+
msgid "User changed the category of a product"
|
5798 |
+
msgstr "L'utente ha modificato la categoria di un prodotto"
|
5799 |
+
|
5800 |
+
#: defaults.php:525
|
5801 |
+
msgid ""
|
5802 |
+
"Changed the category of the %ProductStatus% product %ProductTitle% from "
|
5803 |
+
"%OldCategories% to %NewCategories%. View the product: %EditorLinkProduct%."
|
5804 |
+
msgstr ""
|
5805 |
+
"Modificata la categoria del %ProductStatus% prodotto %ProductTitle% da "
|
5806 |
+
"%OldCategories% a %NewCategories%. \vVedi il prodotto: %EditorLinkProduct%."
|
5807 |
+
|
5808 |
+
#: defaults.php:526
|
5809 |
+
msgid "User modified the short description of a product"
|
5810 |
+
msgstr "L'utente ha modificato la descrizione breve di un prodotto"
|
5811 |
+
|
5812 |
+
#: defaults.php:526
|
5813 |
+
msgid ""
|
5814 |
+
"Modified the short description of the %ProductStatus% product %ProductTitle%."
|
5815 |
+
"%ChangeText% View the product: %EditorLinkProduct%."
|
5816 |
+
msgstr ""
|
5817 |
+
"Modificata la descrizione breve del %ProductStatus% prodotto %ProductTitle%."
|
5818 |
+
"%ChangeText% Vedi il prodotto: %EditorLinkProduct%."
|
5819 |
+
|
5820 |
+
#: defaults.php:527
|
5821 |
+
msgid "User modified the text of a product"
|
5822 |
+
msgstr "L'utente ha modificato il testo di un prodotto"
|
5823 |
+
|
5824 |
+
#: defaults.php:527
|
5825 |
+
msgid ""
|
5826 |
+
"Modified the text of the %ProductStatus% product %ProductTitle%. View the "
|
5827 |
+
"product: %EditorLinkProduct%."
|
5828 |
+
msgstr ""
|
5829 |
+
"Modificato il testo del %ProductStatus% prodotto %ProductTitle%. Vedi il "
|
5830 |
+
"prodotto: %EditorLinkProduct%."
|
5831 |
+
|
5832 |
+
#: defaults.php:528
|
5833 |
+
msgid "User changed the URL of a product"
|
5834 |
+
msgstr "L'utente ha modificato l'URL di un prodotto"
|
5835 |
+
|
5836 |
+
#: defaults.php:528
|
5837 |
+
msgid ""
|
5838 |
+
"Changed the URL of the %ProductStatus% product %ProductTitle%%ReportText%."
|
5839 |
+
"%ChangeText% View the product: %EditorLinkProduct%."
|
5840 |
+
msgstr ""
|
5841 |
+
"Modificato l'URL del %ProductStatus% prodotto %ProductTitle%%ReportText%."
|
5842 |
+
"%ChangeText% Vedi il prodotto: %EditorLinkProduct%."
|
5843 |
+
|
5844 |
+
#: defaults.php:529
|
5845 |
+
msgid "User changed the date of a product"
|
5846 |
+
msgstr "L'utente ha modificato la data di un prodotto"
|
5847 |
+
|
5848 |
+
#: defaults.php:529
|
5849 |
+
msgid ""
|
5850 |
+
"Changed the date of the %ProductStatus% product %ProductTitle% from %OldDate"
|
5851 |
+
"% to %NewDate%. View the product: %EditorLinkProduct%."
|
5852 |
+
msgstr ""
|
5853 |
+
"Modificata la data del %ProductStatus% prodotto %ProductTitle% da %OldDate% "
|
5854 |
+
"a %NewDate%. Vedi il prodotto: %EditorLinkProduct%."
|
5855 |
+
|
5856 |
+
#: defaults.php:530
|
5857 |
+
msgid "User changed the visibility of a product"
|
5858 |
+
msgstr "L'utente ha modificato la visibilità di un prodotto"
|
5859 |
+
|
5860 |
+
#: defaults.php:530
|
5861 |
+
msgid ""
|
5862 |
+
"Changed the visibility of the %ProductStatus% product %ProductTitle% from "
|
5863 |
+
"%OldVisibility% to %NewVisibility%. View the product: %EditorLinkProduct%."
|
5864 |
+
msgstr ""
|
5865 |
+
"Modificata la visibilità del %ProductStatus% prodotto %ProductTitle% da "
|
5866 |
+
"%OldVisibility% a %NewVisibility%. Vedi il prodotto: %EditorLinkProduct%."
|
5867 |
+
|
5868 |
+
#: defaults.php:531
|
5869 |
+
msgid "User modified the product"
|
5870 |
+
msgstr "L'utente ha modificato il prodotto"
|
5871 |
+
|
5872 |
+
#: defaults.php:531
|
5873 |
+
msgid ""
|
5874 |
+
"Modified the %ProductStatus% product %ProductTitle%. Product URL is "
|
5875 |
+
"%ProductUrl%. View the product: %EditorLinkProduct%."
|
5876 |
+
msgstr ""
|
5877 |
+
"Modificato il %ProductStatus% prodotto %ProductTitle%. L'URL del prodotto è "
|
5878 |
+
"%ProductUrl%. Vedi il prodotto: %EditorLinkProduct%."
|
5879 |
+
|
5880 |
+
#: defaults.php:532
|
5881 |
+
msgid "User modified the draft product"
|
5882 |
+
msgstr "L'utente ha modificato il prodotto bozza"
|
5883 |
+
|
5884 |
+
#: defaults.php:532
|
5885 |
+
msgid ""
|
5886 |
+
"Modified the draft product %ProductTitle%. View the product: "
|
5887 |
+
"%EditorLinkProduct%."
|
5888 |
+
msgstr ""
|
5889 |
+
"Modificato il prodotto bozza %ProductTitle%. Vedi il prodotto: "
|
5890 |
+
"%EditorLinkProduct%."
|
5891 |
+
|
5892 |
+
#: defaults.php:533
|
5893 |
+
msgid "User moved a product to trash"
|
5894 |
+
msgstr "L'utente ha spostato un prodotto nel cestino"
|
5895 |
+
|
5896 |
+
#: defaults.php:533
|
5897 |
+
msgid ""
|
5898 |
+
"Moved the %ProductStatus% product %ProductTitle% to trash. Product URL was "
|
5899 |
+
"%ProductUrl%."
|
5900 |
+
msgstr ""
|
5901 |
+
"Spostato il %ProductStatus% prodotto %ProductTitle% nel cestino. L'URL del "
|
5902 |
+
"prodotto era %ProductUrl%."
|
5903 |
+
|
5904 |
+
#: defaults.php:534
|
5905 |
+
msgid "User permanently deleted a product"
|
5906 |
+
msgstr "L'utente ha eliminato definitivamente un prodotto"
|
5907 |
+
|
5908 |
+
#: defaults.php:534
|
5909 |
+
msgid "Permanently deleted the product %ProductTitle%."
|
5910 |
+
msgstr "Eliminato definitivamente il prodotto %ProductTitle%."
|
5911 |
+
|
5912 |
+
#: defaults.php:535
|
5913 |
+
msgid "User restored a product from the trash"
|
5914 |
+
msgstr "L'utente ha ripristinato un prodotto dal cestino"
|
5915 |
+
|
5916 |
+
#: defaults.php:535
|
5917 |
+
msgid ""
|
5918 |
+
"Product %ProductTitle% has been restored from trash. View product: "
|
5919 |
+
"%EditorLinkProduct%."
|
5920 |
+
msgstr ""
|
5921 |
+
"Il prodotto %ProductTitle% è stato ripristinato dal cestino. Vedi il "
|
5922 |
+
"prodotto: %EditorLinkProduct%."
|
5923 |
+
|
5924 |
+
#: defaults.php:536
|
5925 |
+
msgid "User changed status of a product"
|
5926 |
+
msgstr "L'utente ha modificato lo stato di un prodotto"
|
5927 |
+
|
5928 |
+
#: defaults.php:536
|
5929 |
+
msgid ""
|
5930 |
+
"Changed the status of the product %ProductTitle% from %OldStatus% to "
|
5931 |
+
"%NewStatus%. View the product: %EditorLinkProduct%."
|
5932 |
+
msgstr ""
|
5933 |
+
"Modificato lo stato del prodotto %ProductTitle% da %OldStatus% a %NewStatus"
|
5934 |
+
"%. Vedi il prodotto: %EditorLinkProduct%."
|
5935 |
+
|
5936 |
+
#: defaults.php:537
|
5937 |
+
msgid "User opened a product in the editor"
|
5938 |
+
msgstr "L'utente ha aperto un prodotto nell'editor"
|
5939 |
+
|
5940 |
+
#: defaults.php:537
|
5941 |
+
msgid ""
|
5942 |
+
"Opened the %ProductStatus% product page %ProductTitle% in editor. View the "
|
5943 |
+
"product: %EditorLinkProduct%."
|
5944 |
+
msgstr ""
|
5945 |
+
"Aperto il %ProductStatus% pagina del prodotto %ProductTitle% nell'editor. "
|
5946 |
+
"Vedi il prodotto: %EditorLinkProduct%."
|
5947 |
+
|
5948 |
+
#: defaults.php:538
|
5949 |
+
msgid "User viewed a product"
|
5950 |
+
msgstr "L'utente ha visualizzato un prodotto"
|
5951 |
+
|
5952 |
+
#: defaults.php:538
|
5953 |
+
msgid ""
|
5954 |
+
"Viewed the %ProductStatus% product page %ProductTitle%. View the product: "
|
5955 |
+
"%EditorLinkProduct%."
|
5956 |
+
msgstr ""
|
5957 |
+
"Visualizzato il %ProductStatus% pagina del prodotto %ProductTitle%. Vedi il "
|
5958 |
+
"prodotto: %EditorLinkProduct%."
|
5959 |
+
|
5960 |
+
#: defaults.php:539
|
5961 |
+
msgid "User renamed a product"
|
5962 |
+
msgstr "L'utente ha rinominato un prodotto"
|
5963 |
+
|
5964 |
+
#: defaults.php:539
|
5965 |
+
msgid ""
|
5966 |
+
"Renamed the %ProductStatus% product from %OldTitle% to %NewTitle%. View the "
|
5967 |
+
"product: %EditorLinkProduct%."
|
5968 |
+
msgstr ""
|
5969 |
+
"Rinominato il %ProductStatus% prodotto da %OldTitle% a %NewTitle%. Vedi il "
|
5970 |
+
"prodotto: %EditorLinkProduct%."
|
5971 |
+
|
5972 |
+
#: defaults.php:540
|
5973 |
+
msgid "User changed the Product Data of a product"
|
5974 |
+
msgstr "L'utente ha modificato la Data Prodotto di un prodotto"
|
5975 |
+
|
5976 |
+
#: defaults.php:540
|
5977 |
+
msgid ""
|
5978 |
+
"Changed the Product Type of the product %OldType% to %NewType%. View the "
|
5979 |
+
"product: %EditorLinkProduct%."
|
5980 |
+
msgstr ""
|
5981 |
+
"Modificato Tipo Prodotto del prodotto %OldType% a %NewType%. Vedi il "
|
5982 |
+
"prodotto: %EditorLinkProduct%."
|
5983 |
+
|
5984 |
+
#: defaults.php:541
|
5985 |
+
msgid "User changed type of a price"
|
5986 |
+
msgstr "L'utente ha modificato il tipo di prezzo"
|
5987 |
+
|
5988 |
+
#: defaults.php:541
|
5989 |
+
msgid ""
|
5990 |
+
"Changed the %PriceType% of the %ProductStatus% product %ProductTitle% from "
|
5991 |
+
"%OldPrice% to %NewPrice%. View the product: %EditorLinkProduct%."
|
5992 |
+
msgstr ""
|
5993 |
+
"Modificato il %PriceType% del %ProductStatus% prodotto %ProductTitle% da "
|
5994 |
+
"%OldPrice% a %NewPrice%. Vedi il prodotto: %EditorLinkProduct%."
|
5995 |
+
|
5996 |
+
#: defaults.php:542
|
5997 |
+
msgid "User changed the SKU of a product"
|
5998 |
+
msgstr "L'utente ha modificato lo SKU di un prodotto"
|
5999 |
+
|
6000 |
+
#: defaults.php:542
|
6001 |
+
msgid ""
|
6002 |
+
"Changed the SKU of the %ProductStatus% product %ProductTitle% from %OldSku% "
|
6003 |
+
"to %NewSku%. View the product: %EditorLinkProduct%."
|
6004 |
+
msgstr ""
|
6005 |
+
"Modificato lo SKU del %ProductStatus% prodotto %Product% da %OldSku% a "
|
6006 |
+
"%NewSku%. Vedi il prodotto: %EditorLinkProduct%."
|
6007 |
+
|
6008 |
+
#: defaults.php:543
|
6009 |
+
msgid "User changed the stock status of a product"
|
6010 |
+
msgstr "L'utente ha modificato lo stato dello stock di un prodotto"
|
6011 |
+
|
6012 |
+
#: defaults.php:543
|
6013 |
+
msgid ""
|
6014 |
+
"Changed the stock status of the %ProductStatus% product %ProductTitle% from "
|
6015 |
+
"%OldStatus% to %NewStatus%. View the product: %EditorLinkProduct%."
|
6016 |
+
msgstr ""
|
6017 |
+
"Modificato lo stato dello stock del %ProductStatus% prodotto %ProductTitle% "
|
6018 |
+
"da %OldStatus% a %NewStatus%. Vedi il prodotto: %EditorLinkProduct%."
|
6019 |
+
|
6020 |
+
#: defaults.php:544
|
6021 |
+
msgid "User changed the stock quantity"
|
6022 |
+
msgstr "L'utente ha modificato la quantità dello stock"
|
6023 |
+
|
6024 |
+
#: defaults.php:544
|
6025 |
+
msgid ""
|
6026 |
+
"Changed the stock quantity of the %ProductStatus% product %ProductTitle% "
|
6027 |
+
"from %OldValue% to %NewValue%. View the product: %EditorLinkProduct%"
|
6028 |
+
msgstr ""
|
6029 |
+
"Modificata la quantità in stock del %ProductStatus% prodotto %ProductTitle% "
|
6030 |
+
"da %OldValue% a %NewValue%. Vedi il prodotto: %EditorLinkProduct%"
|
6031 |
+
|
6032 |
+
#: defaults.php:545
|
6033 |
+
msgid "User set a product type"
|
6034 |
+
msgstr "L'utente configura un tipo di prodotto"
|
6035 |
+
|
6036 |
+
#: defaults.php:545
|
6037 |
+
msgid ""
|
6038 |
+
"Changed the type of the %ProductStatus% simple product %ProductTitle% from "
|
6039 |
+
"%OldType% to %NewType%. View the product: %EditorLinkProduct%."
|
6040 |
+
msgstr ""
|
6041 |
+
"Modificato il tipo del %ProductStatus% prodotto semplice %ProductTitle% da "
|
6042 |
+
"%OldType% a %NewType%. Vedi il prodotto: %EditorLinkProduct%."
|
6043 |
+
|
6044 |
+
#: defaults.php:546
|
6045 |
+
msgid "User changed the weight of a product"
|
6046 |
+
msgstr "L'utente ha modificato il peso di un prodotto"
|
6047 |
+
|
6048 |
+
#: defaults.php:546
|
6049 |
+
msgid ""
|
6050 |
+
"Changed the weight of the %ProductStatus% product %ProductTitle% from "
|
6051 |
+
"%OldWeight% to %NewWeight%. View the product: %EditorLinkProduct%."
|
6052 |
+
msgstr ""
|
6053 |
+
"Modificato il peso del %ProductStatus% prodotto %ProductTitle% da %OldWeight"
|
6054 |
+
"% a %NewWeight%. Vedi il prodotto: %EditorLinkProduct%."
|
6055 |
+
|
6056 |
+
#: defaults.php:547
|
6057 |
+
msgid "User changed the dimensions of a product"
|
6058 |
+
msgstr "L'utente ha modificato le dimensioni di un prodotto"
|
6059 |
+
|
6060 |
+
#: defaults.php:547
|
6061 |
+
msgid ""
|
6062 |
+
"Changed the %DimensionType% dimensions of the %ProductStatus% product "
|
6063 |
+
"%ProductTitle% from %OldDimension% to %NewDimension%. View the product: "
|
6064 |
+
"%EditorLinkProduct%."
|
6065 |
+
msgstr ""
|
6066 |
+
"Modificate le dimensioni %DimensionType% del %ProductStatus% prodotto "
|
6067 |
+
"%ProductTitle% da %OldDimension% a %NewDimension%. Vedi il prodotto: "
|
6068 |
+
"%EditorLinkProduct%."
|
6069 |
+
|
6070 |
+
#: defaults.php:548
|
6071 |
+
msgid "User added the Downloadable File to a product"
|
6072 |
+
msgstr "L'utente ha aggiunto il file scaricabile a un prodotto"
|
6073 |
+
|
6074 |
+
#: defaults.php:548
|
6075 |
+
msgid ""
|
6076 |
+
"Added the Downloadable File %FileName% with File URL %FileUrl% to the "
|
6077 |
+
"%ProductStatus% product %ProductTitle%. View the product: %EditorLinkProduct"
|
6078 |
+
"%."
|
6079 |
+
msgstr ""
|
6080 |
+
"Aggiunto il file scaricabile %FileName% con l'URL del file %FileUrl% al "
|
6081 |
+
"%ProductStatus% prodotto %ProductTitle%. Vedi il prodotto: %EditorLinkProduct"
|
6082 |
+
"%."
|
6083 |
+
|
6084 |
+
#: defaults.php:549
|
6085 |
+
msgid "User Removed the Downloadable File from a product"
|
6086 |
+
msgstr "L'utente ha rimosso il file scaricabile da un prodotto"
|
6087 |
+
|
6088 |
+
#: defaults.php:549
|
6089 |
+
msgid ""
|
6090 |
+
"Removed the Downloadable File %FileName% with File URL %FileUrl% from the "
|
6091 |
+
"%ProductStatus% product %ProductTitle%. View the product: %EditorLinkProduct"
|
6092 |
+
"%."
|
6093 |
+
msgstr ""
|
6094 |
+
"Rimosso il file scaricabile %FileName% con l'URL del file %FileUrl% dal "
|
6095 |
+
"%ProductStatus% prodotto %ProductTitle%. Vedi il prodotto: %EditorLinkProduct"
|
6096 |
+
"%."
|
6097 |
+
|
6098 |
+
#: defaults.php:550
|
6099 |
+
msgid "User changed the name of a Downloadable File in a product"
|
6100 |
+
msgstr "L'utente ha modificato il nome di un file scaricabile in un prodotto"
|
6101 |
+
|
6102 |
+
#: defaults.php:550
|
6103 |
+
msgid ""
|
6104 |
+
"Changed the name of a Downloadable File from %OldName% to %NewName% in "
|
6105 |
+
"%ProductStatus% product %ProductTitle%. View the product: %EditorLinkProduct"
|
6106 |
+
"%."
|
6107 |
+
msgstr ""
|
6108 |
+
"Modificato il nome di un file scaricabile da %OldName% a %NewName% in "
|
6109 |
+
"%ProductStatus% prodotto %ProductTitle%. Vedi il prodotto: %EditorLinkProduct"
|
6110 |
+
"%."
|
6111 |
+
|
6112 |
+
#: defaults.php:551
|
6113 |
+
msgid "User changed the URL of the Downloadable File in a product"
|
6114 |
+
msgstr "L'utente ha modificato l'URL del file scaricabile in un prodotto"
|
6115 |
+
|
6116 |
+
#: defaults.php:551
|
6117 |
+
msgid ""
|
6118 |
+
"Changed the URL of the Downloadable File %FileName% from %OldUrl% to %NewUrl"
|
6119 |
+
"% in %ProductStatus% product %ProductTitle%. View the product: "
|
6120 |
+
"%EditorLinkProduct%."
|
6121 |
+
msgstr ""
|
6122 |
+
"Modificato l'URL del file scaricabile %FileName% da %OldUrl% a %NewUrl% in "
|
6123 |
+
"%ProductStatus% prodotto %ProductTitle%. Vedi il prodotto: %EditorLinkProduct"
|
6124 |
+
"%."
|
6125 |
+
|
6126 |
+
#: defaults.php:552
|
6127 |
+
msgid "User changed the catalog visibility of a product"
|
6128 |
+
msgstr "L'utente ha modificato la visibilità del catalogo di un prodotto"
|
6129 |
+
|
6130 |
+
#: defaults.php:552
|
6131 |
+
msgid ""
|
6132 |
+
"Changed the catalog visibility of the %ProductStatus% product %ProductTitle% "
|
6133 |
+
"from %OldVisibility% to %NewVisibility%. View the product: %EditorLinkProduct"
|
6134 |
+
"%."
|
6135 |
+
msgstr ""
|
6136 |
+
"Modificata la visibilità del catalogo del %ProductStatus% prodotto "
|
6137 |
+
"%ProductTitle% da %OldVisibility% a %NewVisibility%. Vedi il prodotto: "
|
6138 |
+
"%EditorLinkProduct%."
|
6139 |
+
|
6140 |
+
#: defaults.php:553
|
6141 |
+
msgid "User changed the setting Featured Product of a product"
|
6142 |
+
msgstr ""
|
6143 |
+
"L'utente ha modificato l'impostazione Prodotto in evidenza di un prodotto"
|
6144 |
+
|
6145 |
+
#: defaults.php:553
|
6146 |
+
msgid ""
|
6147 |
+
"%Status% the setting Featured Product in the %ProductStatus% product "
|
6148 |
+
"%ProductTitle%. View the product: %EditorLinkProduct%."
|
6149 |
+
msgstr ""
|
6150 |
+
"%status% l'impostazione Prodotto in evidenza nel %ProductStatus% prodotto "
|
6151 |
+
"%ProductTitle%. Vedi il prodotto: %EditorLinkProduct%."
|
6152 |
+
|
6153 |
+
#: defaults.php:554
|
6154 |
+
msgid "User changed the Allow Backorders setting of a product"
|
6155 |
+
msgstr ""
|
6156 |
+
"L'utente ha modificato l'impostazione Consenti Ordini Arretrati di un "
|
6157 |
+
"prodotto"
|
6158 |
+
|
6159 |
+
#: defaults.php:554
|
6160 |
+
msgid ""
|
6161 |
+
"Changed the Allow Backorders setting of the %ProductStatus% product "
|
6162 |
+
"%ProductTitle% from %OldStatus% to %NewStatus%. View the product: "
|
6163 |
+
"%EditorLinkProduct%."
|
6164 |
+
msgstr ""
|
6165 |
+
"Modificata l'impostazione Consenti ordini arretrati del %ProductStatus% "
|
6166 |
+
"prodotto %ProductTitle% da %OldStatus% a %NewStatus%. Vedi il prodotto: "
|
6167 |
+
"%EditorLinkProduct%."
|
6168 |
+
|
6169 |
+
#: defaults.php:555
|
6170 |
+
msgid "User added/removed products to upsell of a product"
|
6171 |
+
msgstr "Prodotti aggiunti/rimossi dall'utente per upsell di un prodotto"
|
6172 |
+
|
6173 |
+
#: defaults.php:555
|
6174 |
+
msgid ""
|
6175 |
+
"%Status% the product %UpsellTitle% to Upsells in the %ProductStatus% product "
|
6176 |
+
"%ProductTitle%. View the product: %EditorLinkProduct%."
|
6177 |
+
msgstr ""
|
6178 |
+
"%status% il prodotto %UpsellTitle% per Upsells nella %ProductStatus% "
|
6179 |
+
"prodotto %ProductTitle%. Vedi il prodotto: %EditorLinkProduct%."
|
6180 |
+
|
6181 |
+
#: defaults.php:556
|
6182 |
+
msgid "User added/removed products to cross-sells of a product"
|
6183 |
+
msgstr "Prodotti aggiunti/rimossi dall'utente per i cross-sell di un prodotto"
|
6184 |
+
|
6185 |
+
#: defaults.php:556
|
6186 |
+
msgid ""
|
6187 |
+
"%Status% the product %CrossSellTitle% to Cross-sells in the %ProductStatus% "
|
6188 |
+
"product %ProductTitle%. View the product: %EditorLinkProduct%."
|
6189 |
+
msgstr ""
|
6190 |
+
"%stato% il prodotto %CrossSellTitle% per i cross-sell nel %ProductStatus% "
|
6191 |
+
"prodotto %ProductTitle%. Vedi il prodotto: %EditorLinkProduct%."
|
6192 |
+
|
6193 |
+
#: defaults.php:557
|
6194 |
+
msgid "Added a new attribute of a product"
|
6195 |
+
msgstr "Aggiunto un nuovo attributo di un prodotto"
|
6196 |
+
|
6197 |
+
#: defaults.php:557
|
6198 |
+
msgid ""
|
6199 |
+
"Added a new attribute called %AttributeName% with value %AttributeValue% in "
|
6200 |
+
"the %ProductStatus% product %ProductTitle%. View the product: "
|
6201 |
+
"%EditorLinkProduct%."
|
6202 |
+
msgstr ""
|
6203 |
+
"Aggiunto un nuovo attributo denominato %AttributeName% con valore "
|
6204 |
+
"%AttributeValue% nel %ProductStatus% prodotto %ProductTitle%. Vedi il "
|
6205 |
+
"prodotto: %EditorLinkProduct%."
|
6206 |
+
|
6207 |
+
#: defaults.php:558
|
6208 |
+
msgid "Modified the value of an attribute of a product"
|
6209 |
+
msgstr "Modificato il valore di un attributo di un prodotto"
|
6210 |
+
|
6211 |
+
#: defaults.php:558
|
6212 |
+
msgid ""
|
6213 |
+
"Modified the value of the attribute %AttributeName% from %OldValue% to "
|
6214 |
+
"%NewValue% in the %ProductStatus% product %ProductTitle%. View the product: "
|
6215 |
+
"%EditorLinkProduct%."
|
6216 |
+
msgstr ""
|
6217 |
+
"Modificato il valore dell'attributo %AttributeName% da %OldValue% a %NewValue"
|
6218 |
+
"% nel %ProductStatus% prodotto %ProductTitle%. Vedi il prodotto: "
|
6219 |
+
"%EditorLinkProduct%."
|
6220 |
+
|
6221 |
+
#: defaults.php:559
|
6222 |
+
msgid "Changed the name of an attribute of a product"
|
6223 |
+
msgstr "Modificato il nome di un attributo di un prodotto"
|
6224 |
+
|
6225 |
+
#: defaults.php:559
|
6226 |
+
msgid ""
|
6227 |
+
"Changed the attribute's name from %OldValue% to %NewValue% in the "
|
6228 |
+
"%ProductStatus% product %ProductTitle%. URL is: %ProductUrl%. View the "
|
6229 |
+
"product: %EditorLinkProduct%."
|
6230 |
+
msgstr ""
|
6231 |
+
"Modificato il nome dell'attributo da %OldValue% a %NewValue% nel "
|
6232 |
+
"%ProductStatus% prodotto %ProductTitle%. L'URL è: %ProductUrl%. Vedi il "
|
6233 |
+
"prodotto: %EditorLinkProduct%."
|
6234 |
+
|
6235 |
+
#: defaults.php:560
|
6236 |
+
msgid "Deleted an attribute of a product"
|
6237 |
+
msgstr "Eliminato un attributo di un prodotto"
|
6238 |
+
|
6239 |
+
#: defaults.php:560
|
6240 |
+
msgid ""
|
6241 |
+
"Deleted the attribute %AttributeName% with value %AttributeValue% from "
|
6242 |
+
"%ProductStatus% product %ProductTitle%. URL is: %ProductUrl%. View the "
|
6243 |
+
"product: %EditorLinkProduct%."
|
6244 |
+
msgstr ""
|
6245 |
+
"Eliminato l'attributo %AttributeName% con valore %AttributeValue% da "
|
6246 |
+
"%ProductStatus% prodotto %ProductTitle%. L'URL è: %ProductUrl%. Vedi il "
|
6247 |
+
"prodotto: %EditorLinkProduct%."
|
6248 |
+
|
6249 |
+
#: defaults.php:561
|
6250 |
+
msgid "Set the attribute visibility of a product"
|
6251 |
+
msgstr "Impostare la visibilità degli attributi di un prodotto"
|
6252 |
+
|
6253 |
+
#: defaults.php:561
|
6254 |
+
msgid ""
|
6255 |
+
"Set the attribute %AttributeName% as %AttributeVisiblilty% on product page "
|
6256 |
+
"in %ProductStatus% product %ProductTitle%. View the product: "
|
6257 |
+
"%EditorLinkProduct%."
|
6258 |
+
msgstr ""
|
6259 |
+
"Impostare l'attributo %AttributeName% come %AttributeVisiblilty% sulla "
|
6260 |
+
"pagina del prodotto in %ProductStatus% prodotto %ProductTitle%. Vedi il "
|
6261 |
+
"prodotto: %EditorLinkProduct%."
|
6262 |
+
|
6263 |
+
#: defaults.php:568
|
6264 |
+
msgid "User changed the Weight Unit"
|
6265 |
+
msgstr "L'utente ha modificato l'unità di peso"
|
6266 |
+
|
6267 |
+
#: defaults.php:568
|
6268 |
+
msgid "Changed the Weight Unit from %OldUnit% to %NewUnit% in WooCommerce."
|
6269 |
+
msgstr "Modificata l'unità di peso da %OldUnit% a %NewUnit% in WooCommerce."
|
6270 |
+
|
6271 |
+
#: defaults.php:569
|
6272 |
+
msgid "User changed the Dimensions Unit"
|
6273 |
+
msgstr "L'utente ha modificato l'unità di misura dimensionale"
|
6274 |
+
|
6275 |
+
#: defaults.php:569
|
6276 |
+
msgid "Changed the Dimensions Unit from %OldUnit% to %NewUnit% in WooCommerce."
|
6277 |
+
msgstr ""
|
6278 |
+
"Modificata le unità dimensionali da %OldUnit% to %NewUnit% in WooCommerce."
|
6279 |
+
|
6280 |
+
#: defaults.php:570
|
6281 |
+
msgid "User changed the Base Location"
|
6282 |
+
msgstr "L'utente ha modificato la posizione di partenza"
|
6283 |
+
|
6284 |
+
#: defaults.php:570
|
6285 |
+
msgid ""
|
6286 |
+
"Changed the Base Location from %OldLocation% to %NewLocation% in WooCommerce."
|
6287 |
+
msgstr ""
|
6288 |
+
"Modificata la posizione base da %OldLocation% a %NewLocation% in WooCommerce."
|
6289 |
+
|
6290 |
+
#: defaults.php:571
|
6291 |
+
msgid "User Enabled/Disabled taxes"
|
6292 |
+
msgstr "L'utente ha attivato/disattivato le tasse"
|
6293 |
+
|
6294 |
+
#: defaults.php:571
|
6295 |
+
msgid "%Status% taxes in the WooCommerce store."
|
6296 |
+
msgstr "%Status% tasse nel negozio WooCommerce."
|
6297 |
+
|
6298 |
+
#: defaults.php:572
|
6299 |
+
msgid "User changed the currency"
|
6300 |
+
msgstr "L'utente ha modificato la valuta"
|
6301 |
+
|
6302 |
+
#: defaults.php:572
|
6303 |
+
msgid ""
|
6304 |
+
"Changed the currency from %OldCurrency% to %NewCurrency% in WooCommerce."
|
6305 |
+
msgstr "Modificata la valuta da %OldCurrency% a %NewCurrency% in WooCommerce."
|
6306 |
+
|
6307 |
+
#: defaults.php:573
|
6308 |
+
msgid "User Enabled/Disabled the use of coupons during checkout"
|
6309 |
+
msgstr "L'utente ha abilitato/disabilitato l'uso di coupon durante il checkout"
|
6310 |
+
|
6311 |
+
#: defaults.php:573
|
6312 |
+
msgid "%Status% the use of coupons during checkout in WooCommerce."
|
6313 |
+
msgstr "%status% l'uso di coupon durante il checkout in WooCommerce."
|
6314 |
+
|
6315 |
+
#: defaults.php:574
|
6316 |
+
msgid "User Enabled/Disabled guest checkout"
|
6317 |
+
msgstr "L'utente ha abilitato/disabilitato il checkout dell'ospite"
|
6318 |
+
|
6319 |
+
#: defaults.php:574
|
6320 |
+
msgid "%Status% guest checkout in WooCommerce."
|
6321 |
+
msgstr "%Status% checkout ospite in WooCommerce."
|
6322 |
+
|
6323 |
+
#: defaults.php:575
|
6324 |
+
msgid "User Enabled/Disabled cash on delivery"
|
6325 |
+
msgstr "L'utente ha abilitato/disabilitato il contrassegno alla consegna"
|
6326 |
+
|
6327 |
+
#: defaults.php:575
|
6328 |
+
msgid "%Status% the option Cash on Delivery in WooCommerce."
|
6329 |
+
msgstr "%Status% l'opzione Contrassegno in WooCommerce."
|
6330 |
+
|
6331 |
+
#: defaults.php:576
|
6332 |
+
msgid "User enabled a payment gateway"
|
6333 |
+
msgstr "L'utente ha attivato un gateway di pagamento"
|
6334 |
+
|
6335 |
+
#: defaults.php:576
|
6336 |
+
msgid "Enabled the payment gateway %GatewayName%."
|
6337 |
+
msgstr "Attivato il gateway di pagamento %GatewayName%."
|
6338 |
+
|
6339 |
+
#: defaults.php:577
|
6340 |
+
msgid "User disabled a payment gateway"
|
6341 |
+
msgstr "L'utente ha disattivato un gateway di pagamento"
|
6342 |
+
|
6343 |
+
#: defaults.php:577
|
6344 |
+
msgid "Disabled the payment gateway %GatewayName%."
|
6345 |
+
msgstr "Disattivato il gateway di pagamento %GatewayName%."
|
6346 |
+
|
6347 |
+
#: defaults.php:578
|
6348 |
+
msgid "User modified a payment gateway"
|
6349 |
+
msgstr "L'utente ha modificato un gateway di pagamento"
|
6350 |
+
|
6351 |
+
#: defaults.php:578
|
6352 |
+
msgid "Modified the payment gateway %GatewayName%."
|
6353 |
+
msgstr "Modificato il gateway di pagamento %GatewayName%."
|
6354 |
+
|
6355 |
+
#: defaults.php:579
|
6356 |
+
msgid "User created a new product category"
|
6357 |
+
msgstr "L'utente ha creato una nuova categoria di prodotto"
|
6358 |
+
|
6359 |
+
#: defaults.php:579
|
6360 |
+
msgid ""
|
6361 |
+
"Created a new product category called %CategoryName% in WooCommerce. Product "
|
6362 |
+
"category slug is %Slug%."
|
6363 |
+
msgstr ""
|
6364 |
+
"Creata una nuova categoria di prodotto chiamata %CategoryName% in "
|
6365 |
+
"WooCommerce. Lo slug della categoria di prodotto è %Slug%."
|
6366 |
+
|
6367 |
+
#: defaults.php:580
|
6368 |
+
msgid "User deleted a product category"
|
6369 |
+
msgstr "L'utente ha eliminato una categoria di prodotto"
|
6370 |
+
|
6371 |
+
#: defaults.php:580
|
6372 |
+
msgid ""
|
6373 |
+
"Deleted the product category called %CategoryName% in WooCommerce. Product "
|
6374 |
+
"category slug was %CategorySlug%."
|
6375 |
+
msgstr ""
|
6376 |
+
"Eliminata la categoria di prodotto chiamata %CategoryName% in WooCommerce. "
|
6377 |
+
"Lo slug della categoria di prodotto era %CategorySlug%."
|
6378 |
+
|
6379 |
+
#: defaults.php:581
|
6380 |
+
msgid "User changed the slug of a product category"
|
6381 |
+
msgstr "L'utente ha modificato lo slug della categoria di prodotto"
|
6382 |
+
|
6383 |
+
#: defaults.php:581
|
6384 |
+
msgid ""
|
6385 |
+
"Changed the Slug of the product category %CategoryName% in WooCommerce from "
|
6386 |
+
"%OldSlug% to %NewSlug%."
|
6387 |
+
msgstr ""
|
6388 |
+
"Modificato lo slug della categoria di prodotto %CategoryName% in WooCommerce "
|
6389 |
+
"da %OldSlug% a %NewSlug%."
|
6390 |
+
|
6391 |
+
#: defaults.php:582
|
6392 |
+
msgid "User changed the parent category of a product category"
|
6393 |
+
msgstr ""
|
6394 |
+
"L'utente ha modificato la categoria genitore di una categoria di prodotto"
|
6395 |
+
|
6396 |
+
#: defaults.php:582
|
6397 |
+
msgid ""
|
6398 |
+
"Changed the Parent Category of the product category %CategoryName% in "
|
6399 |
+
"WooCommerce from %OldParentCat% to %NewParentCat%."
|
6400 |
+
msgstr ""
|
6401 |
+
"Modificata la categoria genitore della categoria prodotto %CategoryName% in "
|
6402 |
+
"WooCommerce da %OldParentCat% a %NewParentCat%."
|
6403 |
+
|
6404 |
+
#: defaults.php:583
|
6405 |
+
msgid "User changed the display type of a product category"
|
6406 |
+
msgstr ""
|
6407 |
+
"L'utente ha modificato la modalità di visualizzazione di una categoria di "
|
6408 |
+
"prodotto"
|
6409 |
+
|
6410 |
+
#: defaults.php:583
|
6411 |
+
msgid ""
|
6412 |
+
"Changed the Display Type of the product category %CategoryName% in "
|
6413 |
+
"WooCommerce from %OldDisplayType% to %NewDisplayType%."
|
6414 |
+
msgstr ""
|
6415 |
+
"Modificato la modalità di visualizzazione della categoria di prodotto "
|
6416 |
+
"%CategoryName% in WooCommerce da %OldDisplayType% a %NewDisplayType%."
|
6417 |
+
|
6418 |
+
#: defaults.php:584
|
6419 |
+
msgid "User changed the name of a product category"
|
6420 |
+
msgstr "L'utente ha modificato il nome della categoria di un prodotto"
|
6421 |
+
|
6422 |
+
#: defaults.php:584
|
6423 |
+
msgid ""
|
6424 |
+
"Changed the name of the product category %CategoryName% in WooCommerce from "
|
6425 |
+
"%OldName% to %NewName%."
|
6426 |
+
msgstr ""
|
6427 |
+
"Modificato il nome della categoria di prodotto %CategoryName% in WooCommerce "
|
6428 |
+
"da %OldName% a %NewName%."
|
6429 |
+
|
6430 |
+
#: defaults.php:585
|
6431 |
+
msgid "User created a new attribute"
|
6432 |
+
msgstr "L'utente ha creato un nuovo attributo"
|
6433 |
+
|
6434 |
+
#: defaults.php:585
|
6435 |
+
msgid ""
|
6436 |
+
"Created a new Attribute called %AttributeName% with slug %AttributeSlug% in "
|
6437 |
+
"WooCommerce."
|
6438 |
+
msgstr ""
|
6439 |
+
"Creato un nuovo attributo chiamato %AttributeName% con slug %AttributeSlug% "
|
6440 |
+
"in WooCommerce."
|
6441 |
+
|
6442 |
+
#: defaults.php:586
|
6443 |
+
msgid "User deleted an attribute"
|
6444 |
+
msgstr "L'utente ha eliminato un attributo"
|
6445 |
+
|
6446 |
+
#: defaults.php:586
|
6447 |
+
msgid ""
|
6448 |
+
"Deleted the Attribute called %AttributeName% with Slug %AttributeSlug% from "
|
6449 |
+
"WooCommerce."
|
6450 |
+
msgstr ""
|
6451 |
+
"Eliminato l'attributo chiamato %AttributeName% con Slug %AttributeSlug% in "
|
6452 |
+
"WooCommerce."
|
6453 |
+
|
6454 |
+
#: defaults.php:587
|
6455 |
+
msgid "User changed the slug of an attribute"
|
6456 |
+
msgstr "L'utente ha modificato lo slug di un attributo"
|
6457 |
+
|
6458 |
+
#: defaults.php:587
|
6459 |
+
msgid ""
|
6460 |
+
"Changed the Slug of the Attribute %AttributeName% in WooCommerce from "
|
6461 |
+
"%OldSlug% to %NewSlug%."
|
6462 |
+
msgstr ""
|
6463 |
+
"Modificato lo slug dell'attributo %AttributeName% in WooCommerce da %OldSlug"
|
6464 |
+
"% a %NewSlug%."
|
6465 |
+
|
6466 |
+
#: defaults.php:588
|
6467 |
+
msgid "User changed the name of an attribute"
|
6468 |
+
msgstr "L'utente ha modificato il nome di un attributo"
|
6469 |
+
|
6470 |
+
#: defaults.php:588
|
6471 |
+
msgid ""
|
6472 |
+
"Changed the Name of the Attribute %AttributeName% in WooCommerce from "
|
6473 |
+
"%OldName% to %NewName%."
|
6474 |
+
msgstr ""
|
6475 |
+
"Modificato il nome dell'attributo %AttributeName% in WooCommerce da %OldName"
|
6476 |
+
"% a %NewName%."
|
6477 |
+
|
6478 |
+
#: defaults.php:589
|
6479 |
+
msgid "User changed the default sort order of an attribute"
|
6480 |
+
msgstr ""
|
6481 |
+
"L'utente ha modificato il criterio di ordinamento predefinito di un attributo"
|
6482 |
+
|
6483 |
+
#: defaults.php:589
|
6484 |
+
msgid ""
|
6485 |
+
"Changed the Default Sort Order of the Attribute %AttributeName% in "
|
6486 |
+
"WooCommerce from %OldSortOrder% to %NewSortOrder%."
|
6487 |
+
msgstr ""
|
6488 |
+
"Modificato il criterio di ordinamento predefinito dell'attributo "
|
6489 |
+
"%AttributeName% in WooCommerce da %OldSortOrder% a %NewSortOrder%."
|
6490 |
+
|
6491 |
+
#: defaults.php:590
|
6492 |
+
msgid "User enabled/disabled the option Enable Archives of an attribute"
|
6493 |
+
msgstr ""
|
6494 |
+
"L'utente ha abilitato/disabilitato l'opzione Abilita archivi di un attributo"
|
6495 |
+
|
6496 |
+
#: defaults.php:590
|
6497 |
+
msgid ""
|
6498 |
+
"%ArchivesStatus% the option Enable Archives in the Attribute %AttributeName% "
|
6499 |
+
"in WooCommerce."
|
6500 |
+
msgstr ""
|
6501 |
+
"%ArchivesStatus% l'opzione Abilita archivi nell'attributo %AttributeName% in "
|
6502 |
+
"WooCommerce."
|
6503 |
+
|
6504 |
+
#: defaults.php:591
|
6505 |
+
msgid "User published a new coupon"
|
6506 |
+
msgstr "L'utente ha pubblicato un nuovo coupon"
|
6507 |
+
|
6508 |
+
#: defaults.php:591
|
6509 |
+
msgid "Published a new coupon called %CouponName% in WooCommerce."
|
6510 |
+
msgstr "Pubblicato un nuovo coupon chiamato %CouponName% in WooCommerce."
|
6511 |
+
|
6512 |
+
#: defaults.php:592
|
6513 |
+
msgid "User changed the discount type of a coupon"
|
6514 |
+
msgstr "L'utente ha modificato il tipo di sconto di un coupon"
|
6515 |
+
|
6516 |
+
#: defaults.php:592
|
6517 |
+
msgid ""
|
6518 |
+
"Changed the Discount Type of the %CouponStatus% WooCommerce coupon "
|
6519 |
+
"%CouponName% from %OldDiscountType% to %NewDiscountType%."
|
6520 |
+
msgstr ""
|
6521 |
+
"Modificato la mdalità di sconto del %CouponStatus% coupon WooCommerce "
|
6522 |
+
"%CouponName% da %OldDiscountType% a %NewDiscountType%."
|
6523 |
+
|
6524 |
+
#: defaults.php:593
|
6525 |
+
msgid "User changed the coupon amount of a coupon"
|
6526 |
+
msgstr "L'utente ha modificato l'importo di un coupon"
|
6527 |
+
|
6528 |
+
#: defaults.php:593
|
6529 |
+
msgid ""
|
6530 |
+
"Changed the Coupon Amount of the %CouponStatus% WooCommerce coupon "
|
6531 |
+
"%CouponName% from %OldAmount% to %NewAmount%."
|
6532 |
+
msgstr ""
|
6533 |
+
"Modificato l'importo del coupon del %CouponStatus% coupon WooCommerce "
|
6534 |
+
"%CouponName% da %OldAmount% a %NewAmount%."
|
6535 |
+
|
6536 |
+
#: defaults.php:594
|
6537 |
+
msgid "User changed the coup
|