WP Security Audit Log - Version 4.4.2

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 Icon 128x128 WP Security Audit Log
Version 4.4.2
Comparing to
See all releases

Code changes from version 4.4.1 to 4.4.2

Files changed (76) hide show
  1. classes/AbstractSensor.php +52 -1
  2. classes/Adapters/MySQL/ActiveRecordAdapter.php +221 -32
  3. classes/Adapters/MySQL/MetaAdapter.php +19 -4
  4. classes/Adapters/MySQL/OccurrenceAdapter.php +5 -3
  5. classes/Adapters/MySQL/QueryAdapter.php +3 -1
  6. classes/Adapters/MySQL/TmpUserAdapter.php +2 -0
  7. classes/Alert.php +2 -5
  8. classes/AlertFormatter.php +64 -14
  9. classes/AlertManager.php +95 -83
  10. classes/AuditLogGridView.php +1 -1
  11. classes/AuditLogListView.php +3 -3
  12. classes/Autoloader.php +0 -97
  13. classes/Connector/AbstractConnector.php +0 -6
  14. classes/Connector/ConnectorFactory.php +47 -21
  15. classes/Connector/MySQLDB.php +10 -14
  16. classes/Entities/class-abstract-entity.php +249 -0
  17. classes/Entities/class-metadata-entity.php +56 -0
  18. classes/Entities/class-occurrences-entity.php +92 -0
  19. classes/Entities/class-options-entity.php +88 -0
  20. classes/Helpers/Options.php +9 -2
  21. classes/Helpers/class-classes-helper.php +171 -0
  22. classes/Helpers/class-php-helper.php +54 -0
  23. classes/Helpers/class-validator.php +106 -0
  24. classes/Helpers/class-wp-helper.php +408 -0
  25. classes/Loggers/Database.php +10 -9
  26. classes/MainWpApi.php +7 -3
  27. classes/Migration/class-abstract-migration.php +259 -0
  28. classes/Migration/class-metadata-migration-440.php +231 -0
  29. classes/Migration/class-migration.php +496 -0
  30. classes/SensorManager.php +35 -24
  31. classes/Sensors/Content.php +195 -138
  32. classes/Sensors/Database.php +5 -0
  33. classes/Sensors/Files.php +8 -0
  34. classes/Sensors/LogInOut.php +11 -11
  35. classes/Sensors/MetaData.php +2 -15
  36. classes/Sensors/PluginsThemes.php +105 -38
  37. classes/Sensors/UserProfile.php +27 -26
  38. classes/Settings.php +70 -40
  39. classes/Uninstall.php +3 -3
  40. classes/Upgrade/MetadataMigration.php +0 -208
  41. classes/Upgrade/{Upgrade_43000_to_44400.php → Upgrade_43000_To_44400.php} +2 -0
  42. classes/Utilities/Emailer.php +4 -4
  43. classes/Utilities/FileSystemUtils.php +5 -2
  44. classes/ViewManager.php +2 -2
  45. classes/Views/AuditLog.php +1 -54
  46. classes/Views/Help.php +13 -3
  47. classes/Views/Settings.php +27 -12
  48. classes/Views/SetupWizard.php +2 -1
  49. classes/Views/ToggleAlerts.php +37 -3
  50. classes/Views/addons/html-view.php +23 -22
  51. css/dist/wsal-wizard.css +1 -1
  52. css/src/simple-lightbox.css +231 -0
  53. css/src/simple-lightbox.min.css +7 -0
  54. defaults.php +15 -1
  55. js/auditlog.js +2 -1
  56. js/common.js +9 -0
  57. js/dist/wsal-wizard.js +7 -1
  58. js/settings.js +6 -1
  59. js/src/jquery-steps/build/jquery.steps.js +2054 -0
  60. js/src/jquery-steps/build/jquery.steps.min.js +6 -0
  61. js/src/jquery-steps/demo/css/jquery.steps.css +382 -0
  62. js/src/jquery-steps/demo/css/main.css +300 -0
  63. js/src/jquery-steps/demo/css/normalize.css +533 -0
  64. js/src/jquery-validation/LICENSE.md +22 -0
  65. js/src/jquery-validation/README.md +99 -0
  66. js/src/jquery-validation/changelog.md +776 -0
  67. js/src/jquery-validation/dist/jquery.validate.js +1657 -0
  68. js/src/jquery-validation/dist/jquery.validate.min.js +4 -0
  69. js/src/jquery-validation/package.json +91 -0
  70. js/src/simple-lightbox.jquery.js +1662 -0
  71. js/src/simple-lightbox.jquery.min.js +1 -0
  72. languages/wp-security-audit-log-de_DE.po +2178 -0
  73. languages/wp-security-audit-log-es_ES.po +2917 -0
  74. languages/wp-security-audit-log-fr_FR.po +2803 -0
  75. languages/wp-security-audit-log-it_IT.mo +0 -0
  76. 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 $this->plugin->is_multisite();
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 array
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
- foreach ( $_wpdb->get_results( $sql, ARRAY_A ) as $data ) {
 
 
 
 
 
 
 
 
 
 
 
 
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
- foreach ( $_wpdb->get_results( $sql, ARRAY_A ) as $data ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- return (int) $_wpdb->get_var( $sql );
 
 
 
 
 
 
 
 
 
 
 
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
- $results = $this->connection->get_results( $query, $result_format );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- array_push( $select_fields, 'COALESCE( occ.username, occ.user_id ) as user' );
 
 
 
 
 
 
 
 
 
 
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->format_array_for_query_regex( $report_args->post__in );
665
  } elseif ( $report_args->post__not_in ) {
666
- $_post_ids = $this->format_array_for_query_regex( $report_args->post__not_in );
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->format_array_for_query_regex( $report_args->post_type__in );
674
  } elseif ( $report_args->post_type__not_in ) {
675
- $_post_types = $this->format_array_for_query_regex( $report_args->post_type__not_in );
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->format_array_for_query_regex( $report_args->post_status__in );
683
  } elseif ( $report_args->post_status__not_in ) {
684
- $_post_statuses = $this->format_array_for_query_regex( $report_args->post_status__not_in );
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 . ': ' . $formatter->wrap_in_hightlight_markup( $meta_expression ) );
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
- $max_length = 50;
104
- if ( $this->configuration->is_js_in_links_allowed() && strlen( $value ) > $max_length ) {
105
- $result = '<span>' . substr( $value, 0, $max_length ) . '</span>'; // phpcs:ignore
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 = mb_strlen( $value ) > $this->configuration->get_max_meta_value_length() ? ( mb_substr( $value, 0, 50 ) . $this->configuration->get_ellipses_sequence() ) : $value;
116
 
117
- return $this->wrap_in_hightlight_markup( esc_html( $result ) );
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( esc_html( $result ) );
192
 
193
  case '%multisite_text%' === $expression:
194
- if ( $this->plugin->is_multisite() && $value ) {
195
  $site_info = get_blog_details( $value, true );
196
  if ( $site_info ) {
197
  $site_url = $site_info->siteurl;
198
 
199
- return ' on site ' . $this->wrap_in_hightlight_markup( $this->format_link( $expression, $site_info->blogname, $site_url ) );
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
- public $ignored_cpts = array();
 
 
 
 
 
 
 
 
 
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
- $this->plugin = $plugin;
107
- foreach ( WSAL_Utilities_FileSystemUtils::read_files_in_folder( dirname( __FILE__ ) . '/Loggers', '*.php' ) as $file ) {
108
- $this->add_logger_from_file( $file );
 
 
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
- * Filter: `wsal_ignored_custom_post_types`
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
- * Add new logger from file inside autoloader path.
 
155
  *
156
- * @param string $file Path to file.
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
- * @param string $class Class name.
167
  */
168
- public function add_logger_from_class( $class ) {
169
- $this->add_logger_instance( new $class( $this->plugin ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 = $this->plugin->settings()->get_current_user_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 = $this->plugin->settings()->get_current_user_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
- $this->plugin->load_defaults();
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
- $this->plugin->wsal_log( $error_message );
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
- $this->plugin->wsal_log( $error_message );
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 = $this->plugin->settings()->get_disabled_alerts();
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 = $this->plugin->settings()->get_main_client_ip();
531
  if ( ! empty( $client_ip ) ) {
532
  $event_data['ClientIP'] = $client_ip;
533
  }
534
  }
535
- if ( ! isset( $event_data['OtherIPs'] ) && $this->plugin->settings()->is_main_ip_from_proxy() ) {
536
- $other_ips = $this->plugin->settings()->get_client_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 = $this->plugin->settings()->get_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 = $this->plugin->constants->get_constant_by( 'value', $alert_code );
572
 
573
  /**
574
  * Events Severity.
@@ -621,7 +632,7 @@ final class WSAL_AlertManager {
621
  }
622
 
623
  // Append further details if in multisite.
624
- if ( $this->plugin->is_multisite() ) {
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 $this->plugin->settings()->get_excluded_monitoring_users();
767
  }
768
 
769
  /**
@@ -788,7 +800,7 @@ final class WSAL_AlertManager {
788
  * @return array
789
  */
790
  public function get_disabled_roles() {
791
- return $this->plugin->settings()->get_excluded_monitoring_roles();
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
- return in_array( $post_type, $this->get_disabled_post_types(), true );
 
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
- return $this->plugin->settings()->get_excluded_post_types();
 
 
 
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 = $this->plugin->settings()->get_main_client_ip();
823
- $excluded_ips = $this->plugin->settings()->get_excluded_monitoring_ip();
824
 
825
  if ( ! empty( $excluded_ips ) ) {
826
  foreach ( $excluded_ips as $excluded_ip ) {
827
  if ( false !== strpos( $excluded_ip, '-' ) ) {
828
- $ip_range = $this->plugin->settings()->get_ipv4_by_range( $excluded_ip );
829
  $ip_range = $ip_range->lower . '-' . $ip_range->upper;
830
 
831
- if ( $this->plugin->settings()->check_ipv4_in_range( $ip, $ip_range ) ) {
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) $this->plugin->settings()->get_view_site_id();
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
- $set_fn( $event_transient, $event[0], 30 * MINUTE_IN_SECONDS );
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
- * @TODO: this is to be removed shortly after version 4.0.3 - after other
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
- * @TODO: this is to be removed shortly after version 4.0.3 - after other
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 = $this->plugin->constants->get_constant_by( 'value', $code, $const );
1323
 
1324
- $blog_info = self::get_blog_info( $this->plugin, $site_id );
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 ( $plugin->is_multisite() ) {
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 $this->plugin->is_multisite();
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 . '&amp;TB_iframe=true&amp;width=600&amp;height=550">&hellip;</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 $this->plugin->is_multisite();
554
  }
555
 
556
  /**
510
  return '<a class="more-info thickbox" data-tooltip="' . $tooltip . '" title="' . __( 'Alert Data Inspector', 'wp-security-audit-log' ) . '"'
511
  . ' href="' . $url . '&amp;TB_iframe=true&amp;width=600&amp;height=550">&hellip;</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
- $plugin = WpSecurityAuditLog::get_instance();
129
- $connection_name = $plugin->get_global_setting( 'adapter-connection' );
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
- if ( $connection_name && $is_not_paying ) {
138
- $connector = new WSAL_Connector_MySQLDB();
139
-
140
- if ( ! self::$is_installed ) {
141
- self::$is_installed = $connector->is_installed();
142
- $connector->install_all();
143
  }
144
 
145
- $connection_name = null;
146
- }
147
-
148
- if ( empty( $connection_name ) ) {
149
- return null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
 
 
151
 
152
- return self::load_connection_config( $connection_name );
 
 
 
 
 
 
 
 
153
  }
154
 
155
  /**
@@ -160,7 +186,7 @@ abstract class WSAL_Connector_ConnectorFactory {
160
  * @return array|null
161
  * @since 4.4.0
162
  */
163
- private static function load_connection_config( $connection_name ) {
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 = WSAL_Utilities_FileSystemUtils::read_files_in_folder( $this->get_adapters_directory(), '*.php' );
222
- $adapter_list = apply_filters( 'wsal_install_adapters_list', $adapter_list );
223
- foreach ( $adapter_list as $file ) {
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
- $this->plugin->settings()->set_pruning_date_enabled( $settings_to_enforce['pruning_enabled'] );
 
236
  if ( array_key_exists( 'pruning_date', $settings_to_enforce ) && array_key_exists( 'pruning_unit', $settings_to_enforce ) ) {
237
- $this->plugin->settings()->set_pruning_date( $settings_to_enforce['pruning_date'] . ' ' . $settings_to_enforce['pruning_unit'] );
238
- $this->plugin->settings()->set_pruning_unit( $settings_to_enforce['pruning_unit'] );
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
- * {@inheritDoc}
 
 
 
 
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
- foreach ( WSAL_Utilities_FileSystemUtils::read_files_in_folder( dirname( __FILE__ ) . '/Sensors', '*.php' ) as $file ) {
41
- $this->add_from_file( $file );
 
 
 
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 ( ! $this->plugin->is_multisite() ) {
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 ( $this->plugin->is_multisite() ) {
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 ( ! $this->plugin->is_multisite() ) {
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
- // Ignore attachments, revisions and menu items.
286
- if ( ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true ) ) {
287
- $event = 2008;
288
- // Check WordPress backend operations.
289
- if ( $this->check_auto_draft( $event, $post->post_title ) ) {
290
- return;
291
- }
292
 
293
- $event_data = $this->get_post_event_data( $post ); // Get event data.
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
- $this->plugin->alerts->trigger_event( $event, $event_data ); // Log event.
 
 
 
 
 
 
 
 
 
 
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 = get_post( $post_id );
319
- if ( ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true ) ) {
320
- $editor_link = $this->get_editor_link( $post );
321
 
322
- $this->plugin->alerts->trigger_event(
323
- 2012,
324
- array(
325
- 'PostID' => $post->ID,
326
- 'PostType' => $post->post_type,
327
- 'PostTitle' => $post->post_title,
328
- 'PostStatus' => $post->post_status,
329
- 'PostDate' => $post->post_date,
330
- 'PostUrl' => get_permalink( $post->ID ),
331
- $editor_link['name'] => $editor_link['value'],
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 = get_post( $post_id );
344
- if ( ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true ) ) {
345
- $editor_link = $this->get_editor_link( $post );
346
 
347
- $this->plugin->alerts->trigger_event(
348
- 2014,
349
- array(
350
- 'PostID' => $post->ID,
351
- 'PostType' => $post->post_type,
352
- 'PostTitle' => $post->post_title,
353
- 'PostStatus' => $post->post_status,
354
- 'PostDate' => $post->post_date,
355
- 'PostUrl' => get_permalink( $post->ID ),
356
- $editor_link['name'] => $editor_link['value'],
357
- )
358
- );
359
- remove_action( 'save_post', array( $this, 'post_changed' ), 10, 3 );
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
- if ( ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true ) ) {
372
- $editor_link = $this->get_editor_link( $post );
373
 
374
- $this->plugin->alerts->trigger_event(
375
- 2001,
376
- array(
377
- 'PostID' => $post->ID,
378
- 'PostType' => $post->post_type,
379
- 'PostTitle' => $post->post_title,
380
- 'PostStatus' => $post->post_status,
381
- 'PostDate' => $post->post_date,
382
- 'PostUrl' => get_permalink( $post->ID ),
383
- $editor_link['name'] => $editor_link['value'],
384
- )
385
- );
386
- remove_action( 'save_post', array( $this, 'post_changed' ), 10, 3 );
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 = $this->get_editor_link( $post ); // Get editor 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 ( $this->plugin->is_multisite() && ! is_subdomain_install() ) {
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 mixed
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 = $this->get_editor_link( $post );
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 = $this->get_editor_link( $post );
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 = $this->get_editor_link( $new_post ); // 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 stdClass $post - The post.
965
  *
966
  * @return array $editor_link - Name and value link.
967
  */
968
- private function get_editor_link( $post ) {
969
  $name = 'EditorLinkPost';
970
- $value = get_edit_post_link( $post->ID );
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 = $this->get_editor_link( $oldpost );
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 = $this->get_editor_link( $newpost ); // 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 = $this->get_editor_link( $oldpost );
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 = $this->get_editor_link( $post );
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 = $this->get_editor_link( $oldpost );
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 = $this->get_editor_link( $oldpost );
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 = $this->get_editor_link( $newpost );
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 = $this->get_editor_link( $post );
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 = $this->get_editor_link( $post );
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
- if ( $this->check_title_change( $oldpost, $newpost ) ) {
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 = $this->get_editor_link( $oldpost );
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 ) || $this->was_triggered_recently( $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 = $this->get_editor_link( $oldpost );
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 = $this->get_editor_link( $post ); // 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 = $this->get_editor_link( $post );
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
- return ! $triggered;
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
- $query = new WSAL_Models_OccurrenceQuery();
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 - IP address.
272
  * @param integer $site_id - Blog ID.
273
- * @param WP_User $user - User object.
 
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 = $get_fn( 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 = $get_fn( 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,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 = $get_fn( self::TRANSIENT_FAILEDLOGINS );
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
- $set_fn( self::TRANSIENT_FAILEDLOGINS, $data_known, $this->get_login_failure_expiration() );
315
  } else {
316
- $data_unknown = $get_fn( self::TRANSIENT_FAILEDLOGINS_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
- $set_fn( self::TRANSIENT_FAILEDLOGINS_UNKNOWN, $data_unknown, $this->get_login_failure_expiration() );
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->ignored_cpts ); // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
87
  if ( false !== $key ) {
88
- unset( $this->plugin->alerts->ignored_cpts[ $key ] );
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 1.0.0
8
- * @package wsal
 
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 = array_values( array_diff( array_keys( get_plugins() ), array_keys( $this->old_plugins ) ) );
106
- if ( count( $plugin ) != 1 ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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' => $this->plugin->is_multisite() ? get_current_blog_id() : false,
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
- $current_user = get_user_by( 'login', $user_login );
 
 
 
 
 
 
 
 
 
 
 
 
420
 
421
- $current_userdata = get_userdata( $current_user->ID );
422
- $current_user_roles = implode(
423
- ', ',
424
- array_map(
425
  array(
426
- $this,
427
- 'filter_role_names',
428
- ),
429
- $current_userdata->roles
430
- )
431
- );
432
-
433
- $this->plugin->alerts->trigger_event(
434
- 4029,
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 = $this->plugin->is_multisite() ? 4012 : 4001;
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, $this->plugin->is_multisite() );
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 $enabled If true, time based retention period is enabled.
 
 
343
  */
344
- public function set_pruning_date_enabled( $enabled ) {
345
 
346
- $old_setting = $this->plugin->get_global_boolean_setting( 'pruning-date-e', false );
347
- $enable = \WSAL\Helpers\Options::string_to_bool( $enabled );
348
- if ( $old_setting !== $enable ) {
349
- $this->pruning = $this->plugin->get_global_setting( 'pruning-date' ) . ' ' . $this->plugin->get_global_setting( 'pruning-unit', 'months' );
350
- $alert_data = array(
351
- 'new_setting' => ( $enable ) ? 'Delete events older than ' . $this->pruning : 'Keep all data',
352
- 'previous_setting' => ( $old_setting ) ? 'Delete events older than ' . $this->pruning : 'Keep all data',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  );
354
- $this->plugin->alerts->trigger_event( 6052, $alert_data );
355
  }
356
 
357
- $this->plugin->set_global_boolean_setting( 'pruning-date-e', $enabled );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  }
359
 
360
  /**
@@ -661,7 +680,7 @@ class WSAL_Settings {
661
  * @return array
662
  */
663
  protected function get_super_admins() {
664
- return $this->plugin->is_multisite() ? get_super_admins() : array();
665
  }
666
 
667
  /**
@@ -670,7 +689,7 @@ class WSAL_Settings {
670
  * @return string[]
671
  */
672
  protected function get_admins() {
673
- if ( $this->plugin->is_multisite() ) {
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 = $this->plugin->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 ( $this->plugin->is_multisite() ) {
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 ( $this->plugin->is_multisite() ) {
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 ( ! $this->plugin->is_multisite() ) {
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 ! $this->plugin->is_multisite():
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
- delete_option( $option->option_name );
90
  }
91
 
92
  // Remove wsal specific Freemius entry.
93
- delete_option( 'fs_wsalp' );
94
 
95
  // Ensue entry is fully cleared.
96
- delete_network_option( 0, 'wsal_networkwide_tracker_cpts' );
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 WordPress.DateTime.CurrentTimeTimestamp.Requested
35
  $date_time = str_replace(
36
  '$$$',
37
  substr( number_format( fmod( $now, 1 ), 3 ), 2 ),
38
- date( $datetime_format, $now ) // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
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 string
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 = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING );
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 = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING );
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 && ! $wsal_is_advert_dismissed ) : ?>
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
- $vars = array( 'id' => $freemius_id );
259
- echo fs_get_template( 'contact.php', $vars ); // phpcs:ignore
 
 
 
 
 
 
 
 
 
 
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 = filter_input( INPUT_GET, 'tab', FILTER_SANITIZE_STRING );
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 (Premium)', 'wp-security-audit-log' );
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 (Premium)', 'wp-security-audit-log' );
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 ( $this->plugin->is_multisite() ) {
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 = $this->plugin->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 ( $this->plugin->is_multisite() ) {
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
- $this->plugin->settings()->set_pruning_date_enabled( isset( $post_array['PruneBy'] ) ? 'date' === $post_array['PruneBy'] : '' );
1149
- $this->plugin->settings()->set_pruning_date( $pruning_date );
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
- array_values( WSAL_ConstantManager::get_severities() ),
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()->set_pruning_date( $pruning_date . ' ' . $pruning_unit );
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
- $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING );
 
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
- jQuery('[data-alert-cat]').each( function( index, value ) {
 
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
- // Trial link arguments.
47
- $trial_args = array(
48
- 'page' => 'wsal-auditlog-pricing',
49
- 'billing_cycle' => 'annual',
50
- 'trial' => 'true',
51
  );
 
52
 
53
- // Buy Now button link.
54
- $buy_now = add_query_arg( 'page', 'wsal-auditlog-pricing', admin_url( 'admin.php' ) );
55
- $buy_now_target = '';
56
- $trial_link = add_query_arg( $trial_args, admin_url( 'admin.php' ) );
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{background:#f1f1f1;border:none;box-shadow:none;margin:65px auto 24px;padding:0}#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{color:#b4b9be;flex:1 0 auto;font-weight:700;margin:0 0 5px;padding-bottom:15px;position:relative}.steps li.is-active{color:#009344}.steps li.is-active:before{background:#009344;border:4px solid #009344}.steps li:before{background:#b4b9be;border:4px solid #b4b9be;border-radius:100%;bottom:0;content:"";height:4px;left:50%;margin-bottom:-8px;margin-left:-6px;position:absolute;width:4px}.wsal-setup-content{zoom:1;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.13);margin:0 0 20px;overflow:hidden;padding:2em;text-align:left}.wsal-setup-content fieldset,.wsal-setup-content h4{line-height:1.5}.wsal-setup-content .addon-wrapper{border:1px solid #eee;display:flex;margin-bottom:15px;padding:15px}.wsal-setup-content .addon-wrapper:hover{border-color:#ccc}.wsal-setup-content .addon-wrapper img{align-self:center;margin-right:15px;max-width:200px}.wsal-setup-actions{text-align:center}.wsal-setup-actions .button{box-shadow:none;font-size:14px;height:auto;min-width:12em;min-width:auto;padding:8px 20px;transition:all .1s linear}.wsal-setup-actions .button-primary{background-color:#009344;border-color:#009344;box-shadow:none;margin:0;opacity:1;text-shadow:none}.wsal-setup-actions .button-primary:focus,.wsal-setup-actions .button-primary:hover{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-roles-box],.wsal-setup-form label[for=editor-users-box],.wsal-setup-form label[for=exrole-query-box],.wsal-setup-form label[for=exuser-query-box],.wsal-setup-form label[for=ipaddr-query-box]{display:inline-block;margin:5px 0}.wsal-setup-form label[for=editor-roles-box] span,.wsal-setup-form label[for=editor-users-box] span,.wsal-setup-form label[for=exrole-query-box] span,.wsal-setup-form label[for=exuser-query-box] span,.wsal-setup-form label[for=ipaddr-query-box] span{display:inline-block;min-width:100px}.sectoken-ip,.sectoken-other,.sectoken-role,.sectoken-user{border-radius:3px;border-style:solid;border-width:1px;cursor:default;display:inline-block;font-size:14px;line-height:1.3;margin:2px 0 0 2px;padding:2px 4px}.sectoken-ip a,.sectoken-other a,.sectoken-role a,.sectoken-user a{background:#bbb;border-radius:25px;color:#fff;display:inline-block;font-size:12px;font-weight:700;height:14px;line-height:12px;margin-left:2px;text-align:center;text-decoration:none;vertical-align:middle;width:14px}.sectoken-ip a:hover,.sectoken-other a:hover,.sectoken-role a:hover,.sectoken-user a:hover{background:#fb9}.sectoken-other{border-collapse:separate;display:table}.sectoken-role{background:#efe;border-color:#5b5}.sectoken-user{background:#eff;border-color:#5be}.sectoken-ip,.sectoken-other{background:#ffe;border-color:#ed5}p.description{font-size:13px;font-style:italic}
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 %1$deleted_data_type% %2$deleted_data% from the activity log.', 'wp-security-audit-log' ),
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
- jQuery( '[data-shortened-text]' ).on( 'click', function( event ) {
 
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
- jQuery(document).ready((function(){function e(){const e=jQuery(this).parents("span:first");e.addClass("sectoken-del").fadeOut("fast",(function(){e.remove()}))}jQuery("#editor-users-add, #editor-roles-add, #exuser-query-add, #exrole-query-add, #ipaddr-query-add").click((function(){const r=jQuery(this).attr("id").substr(0,6),t=jQuery(this).attr("id").substr(7,5),s=jQuery.trim(jQuery(`#${r}-${t}-box`).val()),a=jQuery(`#${r}-list input`).filter((function(){return this.value===s}));s&&!a.length&&(jQuery(`#${r}-${t}-box, #${r}-${t}-add`).attr("disabled",!0),jQuery.ajax({type:"POST",url:wsalData.ajaxURL,async:!0,data:{action:"setup_check_security_token",token:s,nonce:wsalData.nonce},dataType:"json",success:function(s){if(jQuery(`#${r}-${t}-box, #${r}-${t}-add`).removeAttr("disabled"),jQuery(`#${r}-${t}-box`).val(""),s.success){if("other"===s.tokenType&&("users"===t||"exuser"===r))return void alert(wsalData.usersError);if("other"===s.tokenType&&("roles"===t||"exrole"===r))return void alert(wsalData.rolesError);if("other"===s.tokenType&&("ip"===t||"ipaddr"===r))return void alert(wsalData.ipError);jQuery(`#${r}-list`).append(jQuery(`<span class="sectoken-${s.tokenType}"/>`).text(s.token).append(jQuery(`<input type="hidden" name="${r}s[]"/>`).val(s.token),jQuery('<a href="javascript:;" title="Remove">&times;</a>').click(e)))}else alert(s.message)},error:function(e,r,t){console.log(e.statusText),console.log(r),console.log(t)}}))})),jQuery("#editor-users-box, #editor-roles-box, #exuser-query-box, #exrole-query-box, #ipaddr-query-box").keydown((function(e){if(13===e.keyCode){const e=jQuery(this).attr("id").substr(0,6),r=jQuery(this).attr("id").substr(7,5);return jQuery(`#${e}-${r}-add`).click(),!1}})),jQuery("#editor-list>span>a, #exuser-list>span>a, #exrole-list>span>a, #ipaddr-list>span>a").click(e)}));
 
 
 
 
 
 
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">&times;</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 &copy; 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: ['&lsaquo;', '&rsaquo;'],
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: '&times;',
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:["&lsaquo;","&rsaquo;"],captions:!0,captionDelay:0,captionSelector:"img",captionType:"attr",captionsData:"title",captionPosition:"bottom",captionClass:"",close:!0,closeText:"&times;",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&hellip;"
194
+ msgstr "und vieles mehr&hellip;"
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&hellip;"
210
+ msgstr "y mucho más&hellip;"
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&hellip;"
213
+ msgstr "et beaucoup plus&hellip;"
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&#8217;t contact the database server at %2$s. "
208
+ "This could mean your host&#8217;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&#8217;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 &#8682;"
547
+ msgstr "Notifiche email &#8682;"
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 &#8682;"
621
+ msgstr "DB e Integrazioni &#8682;"
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 &#8682;"
866
+ msgstr "Utenti autenticati &#8682;"
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 &#8682;"
917
+ msgstr "Report &#8682;"
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 &#8682;"
980
+ msgstr "Cerca &#8682;"
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 &rsaquo; Setup Wizard"
2432
+ msgstr "WP Security Audit Log &rsaquo; 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