Shield Security for WordPress - Version 6.6.0

Version Description

  • Current Release = Released: 19th March, 2018 - Release Notes

  • (v.0) NEW: [PRO] Keyless Activation of Pro licenses.

  • (v.0) ADDED: WordPress Password Policies.

  • (v.0) ADDED: Pwned Passwords Detection.

  • (v.0) IMPROVED: Major rewrite of plugin AJAX handling.

  • (v.0) IMPROVED: Notices to indicate the time of the last scans.

  • (v.0) FIXED: A few bugs

Download this release

Release Info

Developer paultgoodchild
Plugin Icon 128x128 Shield Security for WordPress
Version 6.6.0
Comparing to
See all releases

Code changes from version 6.5.0 to 6.6.0

Files changed (161) hide show
  1. icwp-plugin-controller.php +62 -39
  2. icwp-wpsf.php +3 -3
  3. init.php +1 -1
  4. languages/default.mo +0 -0
  5. languages/default.po +3799 -2047
  6. languages/wp-simple-firewall-fi.mo +0 -0
  7. languages/wp-simple-firewall-sr_RS.mo +0 -0
  8. plugin-spec.php +2 -2
  9. readme.txt +67 -40
  10. resources/js/global-plugin.js +3 -3
  11. resources/js/plugin.js +1 -7
  12. resources/js/whitelabel.js +8 -0
  13. src/common/easydigitaldownloads/ICWP_EDD_LicenseVO.php +8 -0
  14. src/common/icwp-data.php +27 -8
  15. src/common/icwp-edd.php +50 -7
  16. src/common/icwp-optionsvo.php +4 -5
  17. src/common/icwp-usermeta.php +3 -0
  18. src/common/icwp-wpfunctions.php +11 -14
  19. src/common/lib/composer.json +16 -11
  20. src/common/lib/composer.lock +75 -33
  21. src/common/lib/vendor/autoload.php +1 -0
  22. src/common/lib/vendor/composer/autoload_classmap.php +0 -457
  23. src/common/lib/vendor/composer/autoload_static.php +0 -461
  24. src/common/lib/vendor/composer/installed.json +81 -85
  25. src/common/lib/vendor/nesbot/carbon/src/Carbon/Carbon.php +840 -333
  26. src/common/lib/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php +47 -21
  27. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ar.php +3 -3
  28. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php +31 -0
  29. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/az.php +2 -2
  30. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/bg.php +1 -1
  31. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php +31 -0
  32. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/el.php +3 -3
  33. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/fr.php +5 -5
  34. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/hy.php +9 -9
  35. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ja.php +18 -18
  36. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/kk.php +29 -0
  37. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/mn.php +62 -0
  38. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/pl.php +2 -2
  39. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ps.php +31 -0
  40. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sk.php +8 -1
  41. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sr.php +6 -0
  42. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php +38 -0
  43. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php +1 -27
  44. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/th.php +18 -18
  45. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/uk.php +1 -1
  46. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/uz.php +15 -15
  47. src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php +15 -15
  48. src/common/lib/vendor/symfony/translation/CHANGELOG.md +0 -31
  49. src/common/lib/vendor/symfony/translation/Catalogue/AbstractOperation.php +5 -7
  50. src/common/lib/vendor/symfony/translation/Catalogue/DiffOperation.php +33 -0
  51. src/common/lib/vendor/symfony/translation/Command/XliffLintCommand.php +0 -245
  52. src/common/lib/vendor/symfony/translation/DataCollector/TranslationDataCollector.php +0 -23
  53. src/common/lib/vendor/symfony/translation/DataCollectorTranslator.php +1 -3
  54. src/common/lib/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php +0 -44
  55. src/common/lib/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php +0 -49
  56. src/common/lib/vendor/symfony/translation/DependencyInjection/TranslatorPass.php +0 -95
  57. src/common/lib/vendor/symfony/translation/Dumper/CsvFileDumper.php +10 -0
  58. src/common/lib/vendor/symfony/translation/Dumper/FileDumper.php +25 -6
  59. src/common/lib/vendor/symfony/translation/Dumper/IcuResFileDumper.php +10 -0
  60. src/common/lib/vendor/symfony/translation/Dumper/IniFileDumper.php +10 -0
  61. src/common/lib/vendor/symfony/translation/Dumper/JsonFileDumper.php +10 -0
  62. src/common/lib/vendor/symfony/translation/Dumper/MoFileDumper.php +10 -0
  63. src/common/lib/vendor/symfony/translation/Dumper/PhpFileDumper.php +10 -0
  64. src/common/lib/vendor/symfony/translation/Dumper/PoFileDumper.php +10 -0
  65. src/common/lib/vendor/symfony/translation/Dumper/QtFileDumper.php +10 -0
  66. src/common/lib/vendor/symfony/translation/Dumper/XliffFileDumper.php +14 -21
  67. src/common/lib/vendor/symfony/translation/Dumper/YamlFileDumper.php +12 -10
  68. src/common/lib/vendor/symfony/translation/Exception/InvalidArgumentException.php +0 -21
  69. src/common/lib/vendor/symfony/translation/Exception/LogicException.php +0 -21
  70. src/common/lib/vendor/symfony/translation/Exception/RuntimeException.php +0 -21
  71. src/common/lib/vendor/symfony/translation/Extractor/AbstractFileExtractor.php +2 -4
  72. src/common/lib/vendor/symfony/translation/Extractor/PhpExtractor.php +0 -258
  73. src/common/lib/vendor/symfony/translation/Extractor/PhpStringTokenParser.php +0 -142
  74. src/common/lib/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php +0 -30
  75. src/common/lib/vendor/symfony/translation/Formatter/MessageFormatter.php +0 -48
  76. src/common/lib/vendor/symfony/translation/Formatter/MessageFormatterInterface.php +0 -30
  77. src/common/lib/vendor/symfony/translation/Interval.php +2 -4
  78. src/common/lib/vendor/symfony/translation/Loader/XliffFileLoader.php +7 -27
  79. src/common/lib/vendor/symfony/translation/Loader/YamlFileLoader.php +2 -11
  80. src/common/lib/vendor/symfony/translation/LoggingTranslator.php +1 -2
  81. src/common/lib/vendor/symfony/translation/MessageCatalogue.php +3 -4
  82. src/common/lib/vendor/symfony/translation/MessageSelector.php +4 -12
  83. src/common/lib/vendor/symfony/translation/PluralizationRules.php +7 -1
  84. src/common/lib/vendor/symfony/translation/Reader/TranslationReader.php +0 -63
  85. src/common/lib/vendor/symfony/translation/Reader/TranslationReaderInterface.php +0 -30
  86. src/common/lib/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd +0 -2223
  87. src/common/lib/vendor/symfony/translation/Translator.php +65 -39
  88. src/common/lib/vendor/symfony/translation/TranslatorBagInterface.php +1 -3
  89. src/common/lib/vendor/symfony/translation/TranslatorInterface.php +3 -5
  90. src/common/lib/vendor/symfony/translation/Writer/TranslationWriter.php +6 -25
  91. src/common/lib/vendor/symfony/translation/Writer/TranslationWriterInterface.php +0 -34
  92. src/common/lib/vendor/symfony/translation/composer.json +6 -10
  93. src/common/lib/vendor/twig/twig/lib/Twig/Compiler.php +3 -1
  94. src/common/lib/vendor/twig/twig/lib/Twig/Environment.php +13 -9
  95. src/common/lib/vendor/twig/twig/lib/Twig/ExpressionParser.php +8 -5
  96. src/common/lib/vendor/twig/twig/lib/Twig/Extension/Core.php +12 -4
  97. src/common/lib/vendor/twig/twig/lib/Twig/Lexer.php +2 -2
  98. src/common/lib/vendor/twig/twig/lib/Twig/Loader/Filesystem.php +1 -1
  99. src/common/lib/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php +2 -2
  100. src/common/lib/vendor/twig/twig/lib/Twig/Parser.php +5 -3
  101. src/common/lib/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php +1 -1
  102. src/common/lib/vendor/twig/twig/lib/Twig/Template.php +3 -1
  103. src/common/lib/vendor/twig/twig/lib/Twig/TokenParser/For.php +1 -1
  104. src/common/lib/vendor/twig/twig/lib/Twig/TokenParserBroker.php +2 -2
  105. src/common/lib/vendor/twig/twig/lib/Twig/TokenStream.php +1 -1
  106. src/common/wp-admin-notices.php +23 -45
  107. src/common/wp-comments.php +1 -2
  108. src/config/feature-admin_access_restriction.php +87 -0
  109. src/config/feature-autoupdates.php +1 -1
  110. src/config/feature-hack_protect.php +19 -1
  111. src/config/feature-license.php +26 -10
  112. src/config/feature-plugin.php +1 -0
  113. src/config/feature-user_management.php +110 -0
  114. src/features/admin_access_restriction.php +163 -42
  115. src/features/audit_trail.php +35 -15
  116. src/features/autoupdates.php +42 -25
  117. src/features/base.php +168 -172
  118. src/features/base_wpsf.php +21 -2
  119. src/features/email.php +62 -69
  120. src/features/hack_protect.php +79 -6
  121. src/features/ips.php +50 -30
  122. src/features/license.php +221 -208
  123. src/features/login_protect.php +0 -7
  124. src/features/plugin.php +41 -18
  125. src/features/sessions.php +2 -2
  126. src/features/user_management.php +116 -14
  127. src/processors/admin_access_restriction.php +28 -2
  128. src/processors/adminaccess_whitelabel.php +111 -0
  129. src/processors/autoupdates.php +2 -4
  130. src/processors/base.php +4 -2
  131. src/processors/base_plugin.php +0 -4
  132. src/processors/base_wpsf.php +2 -2
  133. src/processors/basedb.php +1 -1
  134. src/processors/hackprotect_corechecksumscan.php +22 -24
  135. src/processors/hackprotect_filecleanerscan.php +6 -9
  136. src/processors/hackprotect_ptguard.php +3 -0
  137. src/processors/hackprotect_wpvulnscan.php +6 -7
  138. src/processors/license.php +28 -2
  139. src/processors/plugin.php +2 -3
  140. src/processors/plugin_badgewidget.php +1 -1
  141. src/processors/plugin_tracking.php +3 -1
  142. src/processors/user_management.php +51 -4
  143. src/processors/usermanagement_passwords.php +337 -0
  144. src/wizards/base.php +29 -20
  145. src/wizards/plugin.php +17 -22
  146. templates/php/access_restricted.php +11 -8
  147. templates/php/index.php +1 -1
  148. templates/php/index_body.php +0 -1
  149. templates/php/index_footer.php +2 -2
  150. templates/php/notices/admin-notice-template.php +11 -13
  151. templates/php/notices/allow-tracking.php +7 -9
  152. templates/php/snippets/admin_access_login.php +16 -22
  153. templates/php/snippets/admin_access_login_box.php +16 -18
  154. templates/php/snippets/module-actions-audit_trail.php +4 -10
  155. templates/php/snippets/module-actions-ips.php +0 -1
  156. templates/php/snippets/options_form.php +36 -69
  157. templates/php/snippets/plugin_badge.php +53 -60
  158. templates/php/snippets/pro.php +28 -56
  159. templates/twig/snippets/state_summary.twig +0 -33
  160. templates/twig/wizard/pages/wizard.twig +17 -10
  161. templates/twig/wizard/slides/welcome/ip_detect.twig +1 -1
icwp-plugin-controller.php CHANGED
@@ -2,11 +2,9 @@
2
  /**
3
  * Copyright (c) 2018 iControlWP <support@icontrolwp.com>
4
  * All rights reserved.
5
- *
6
  * "Shield" (formerly WordPress Simple Firewall) is distributed under the GNU
7
  * General Public License, Version 2, June 1991. Copyright (C) 1989, 1991 Free
8
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
9
- *
10
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
11
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
12
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -247,14 +245,14 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
247
  /**
248
  */
249
  public function onWpDeactivatePlugin() {
250
- if ( current_user_can( $this->getBasePermissions() ) && apply_filters( $this->doPluginPrefix( 'delete_on_deactivate' ), false ) ) {
251
- do_action( $this->doPluginPrefix( 'delete_plugin' ) );
252
  $this->deletePluginControllerOptions();
253
  }
254
  }
255
 
256
  public function onWpActivatePlugin() {
257
- do_action( $this->doPluginPrefix( 'plugin_activate' ) );
258
  $this->loadAllFeatures( true, true );
259
  }
260
 
@@ -270,6 +268,11 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
270
  add_action( 'admin_menu', array( $this, 'onWpAdminMenu' ) );
271
  add_action( 'network_admin_menu', array( $this, 'onWpAdminMenu' ) );
272
 
 
 
 
 
 
273
  add_filter( 'all_plugins', array( $this, 'filter_hidePluginFromTableList' ) );
274
  add_filter( 'all_plugins', array( $this, 'doPluginLabels' ) );
275
  add_filter( 'plugin_action_links_'.$this->getPluginBaseFile(), array( $this, 'onWpPluginActionLinks' ), 50, 1 );
@@ -285,7 +288,9 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
285
 
286
  // outsource the collection of admin notices
287
  if ( is_admin() ) {
288
- $this->loadAdminNoticesProcessor()->setActionPrefix( $this->doPluginPrefix() );
 
 
289
  }
290
  }
291
 
@@ -328,15 +333,15 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
328
  public function onWpDashboardSetup() {
329
  if ( $this->getIsValidAdminArea() ) {
330
  wp_add_dashboard_widget(
331
- $this->doPluginPrefix( 'dashboard_widget' ),
332
- apply_filters( $this->doPluginPrefix( 'dashboard_widget_title' ), $this->getHumanName() ),
333
  array( $this, 'displayDashboardWidget' )
334
  );
335
  }
336
  }
337
 
338
  public function displayDashboardWidget() {
339
- $aContent = apply_filters( $this->doPluginPrefix( 'dashboard_widget_content' ), array() );
340
  echo implode( '', $aContent );
341
  }
342
 
@@ -346,10 +351,10 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
346
  * @return bool
347
  */
348
  public function getHasPermissionToManage() {
349
- if ( apply_filters( $this->doPluginPrefix( 'bypass_permission_to_manage' ), false ) ) {
350
  return true;
351
  }
352
- return ( $this->getMeetsBasePermissions() && apply_filters( $this->doPluginPrefix( 'has_permission_to_manage' ), true ) );
353
  }
354
 
355
  /**
@@ -371,8 +376,8 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
371
  */
372
  private function downloadOptionsExport() {
373
  $oDp = $this->loadDataProcessor();
374
- if ( $oDp->FetchGet( 'icwp_shield_export' ) == 1 ) {
375
- $aExportOptions = apply_filters( $this->doPluginPrefix( 'gather_options_for_export' ), array() );
376
  if ( !empty( $aExportOptions ) && is_array( $aExportOptions ) ) {
377
  $oDp->downloadStringAsFile(
378
  wp_json_encode( $aExportOptions ),
@@ -384,6 +389,25 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
384
  }
385
  }
386
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
387
  /**
388
  * @return string
389
  */
@@ -421,22 +445,21 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
421
  */
422
  protected function createPluginMenu() {
423
 
424
- $bHideMenu = apply_filters( $this->doPluginPrefix( 'filter_hidePluginMenu' ), !$this->getPluginSpec_Menu( 'show' ) );
425
  if ( $bHideMenu ) {
426
  return true;
427
  }
428
 
429
  if ( $this->getPluginSpec_Menu( 'top_level' ) ) {
430
 
431
- $aPluginLabels = $this->getPluginLabels();
432
-
433
- $sMenuTitle = $this->getPluginSpec_Menu( 'title' );
434
  if ( is_null( $sMenuTitle ) ) {
435
  $sMenuTitle = $this->getHumanName();
436
  }
437
 
438
  $sMenuIcon = $this->getPluginUrl_Image( $this->getPluginSpec_Menu( 'icon_image' ) );
439
- $sIconUrl = empty( $aPluginLabels[ 'icon_url_16x16' ] ) ? $sMenuIcon : $aPluginLabels[ 'icon_url_16x16' ];
440
 
441
  $sFullParentMenuId = $this->getPluginPrefix();
442
  add_menu_page(
@@ -450,7 +473,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
450
 
451
  if ( $this->getPluginSpec_Menu( 'has_submenu' ) ) {
452
 
453
- $aPluginMenuItems = apply_filters( $this->doPluginPrefix( 'filter_plugin_submenu_items' ), array() );
454
  if ( !empty( $aPluginMenuItems ) ) {
455
  foreach ( $aPluginMenuItems as $sMenuTitle => $aMenu ) {
456
  list( $sMenuItemText, $sMenuItemId, $aMenuCallBack, $bShowItem ) = $aMenu;
@@ -530,7 +553,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
530
  $sSettingsLink = sprintf( $sLinkTemplate, $this->{$sMethod}(), "_top", $aLink[ 'name' ] );;
531
  $aActionLinks = array_merge(
532
  array(
533
- $this->doPluginPrefix( 'dashboard' ) => $sSettingsLink
534
  ),
535
  $aActionLinks
536
  );
@@ -540,7 +563,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
540
  $sSettingsLink = sprintf( $sLinkTemplate, $aLink[ 'href' ], "_blank", $aLink[ 'name' ] );
541
  $aActionLinks = array_merge(
542
  array(
543
- $this->doPluginPrefix( 'dashboard' ) => $sSettingsLink
544
  ),
545
  $aActionLinks
546
  );
@@ -556,7 +579,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
556
  $aFrontendIncludes = $this->getPluginSpec_Include( 'frontend' );
557
  if ( isset( $aFrontendIncludes[ 'css' ] ) && !empty( $aFrontendIncludes[ 'css' ] ) && is_array( $aFrontendIncludes[ 'css' ] ) ) {
558
  foreach ( $aFrontendIncludes[ 'css' ] as $sCssAsset ) {
559
- $sUnique = $this->doPluginPrefix( $sCssAsset );
560
  wp_register_style( $sUnique, $this->getPluginUrl_Css( $sCssAsset.'.css' ), ( empty( $sDependent ) ? false : $sDependent ), $this->getVersion() );
561
  wp_enqueue_style( $sUnique );
562
  $sDependent = $sUnique;
@@ -573,7 +596,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
573
  foreach ( $aAdminJs[ 'css' ] as $sAsset ) {
574
  $sUrl = $this->getPluginUrl_Js( $sAsset.'.js' );
575
  if ( !empty( $sUrl ) ) {
576
- $sUnique = $this->doPluginPrefix( $sAsset );
577
  wp_register_script( $sUnique, $sUrl, $sDependent, $this->getVersion().rand() );
578
  wp_enqueue_script( $sUnique );
579
  $sDependent = $sUnique;
@@ -589,7 +612,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
589
  foreach ( $aAdminJs[ 'js' ] as $sJsAsset ) {
590
  $sUrl = $this->getPluginUrl_Js( $sJsAsset.'.js' );
591
  if ( !empty( $sUrl ) ) {
592
- $sUnique = $this->doPluginPrefix( $sJsAsset );
593
  wp_register_script( $sUnique, $sUrl, $sDependent, $this->getVersion() );
594
  wp_enqueue_script( $sUnique );
595
  $sDependent = $sUnique;
@@ -608,7 +631,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
608
  foreach ( $aAdminCss[ 'css' ] as $sCssAsset ) {
609
  $sUrl = $this->getPluginUrl_Css( $sCssAsset.'.css' );
610
  if ( !empty( $sUrl ) ) {
611
- $sUnique = $this->doPluginPrefix( $sCssAsset );
612
  wp_register_style( $sUnique, $sUrl, $sDependent, $this->getVersion().rand() );
613
  wp_enqueue_style( $sUnique );
614
  $sDependent = $sUnique;
@@ -624,7 +647,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
624
  foreach ( $aAdminCss[ 'css' ] as $sCssAsset ) {
625
  $sUrl = $this->getPluginUrl_Css( $sCssAsset.'.css' );
626
  if ( !empty( $sUrl ) ) {
627
- $sUnique = $this->doPluginPrefix( $sCssAsset );
628
  wp_register_style( $sUnique, $sUrl, $sDependent, $this->getVersion().rand() );
629
  wp_enqueue_style( $sUnique );
630
  $sDependent = $sUnique;
@@ -639,7 +662,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
639
  */
640
  public function onWpPluginUpdateMessage() {
641
  $sDefault = sprintf( 'Upgrade Now To Get The Latest Available %s Features.', $this->getHumanName() );
642
- $sMessage = apply_filters( $this->doPluginPrefix( 'plugin_update_message' ), $sDefault );
643
  if ( empty( $sMessage ) ) {
644
  $sMessage = '';
645
  }
@@ -772,15 +795,15 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
772
  * @return array
773
  */
774
  public function getPluginLabels() {
775
- return apply_filters( $this->doPluginPrefix( 'plugin_labels' ), $this->getPluginSpec_Labels() );
776
  }
777
 
778
  /**
779
  * Hooked to 'shutdown'
780
  */
781
  public function onWpShutdown() {
782
- do_action( $this->doPluginPrefix( 'pre_plugin_shutdown' ) );
783
- do_action( $this->doPluginPrefix( 'plugin_shutdown' ) );
784
  $this->saveCurrentPluginControllerOptions();
785
  $this->deleteFlags();
786
  }
@@ -813,7 +836,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
813
  */
814
  public function filter_hidePluginFromTableList( $aPlugins ) {
815
 
816
- $bHide = apply_filters( $this->doPluginPrefix( 'hide_plugin' ), false );
817
  if ( !$bHide ) {
818
  return $aPlugins;
819
  }
@@ -839,7 +862,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
839
  if ( $this->loadWp()->isCron() ) {
840
  return $oPlugins;
841
  }
842
- if ( !apply_filters( $this->doPluginPrefix( 'hide_plugin_updates' ), false ) ) {
843
  return $oPlugins;
844
  }
845
  if ( isset( $oPlugins->response[ $this->getPluginBaseFile() ] ) ) {
@@ -867,7 +890,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
867
  }
868
 
869
  // do all the plugin feature/options saving
870
- do_action( $this->doPluginPrefix( 'form_submit' ) );
871
 
872
  if ( $this->getIsPage_PluginAdmin() ) {
873
  $oWp = $this->loadWp();
@@ -881,7 +904,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
881
  * @param string $sGlue
882
  * @return string
883
  */
884
- public function doPluginPrefix( $sSuffix = '', $sGlue = '-' ) {
885
  $sPrefix = $this->getPluginPrefix( $sGlue );
886
 
887
  if ( $sSuffix == $sPrefix || strpos( $sSuffix, $sPrefix.$sGlue ) === 0 ) { //it already has the full prefix
@@ -895,8 +918,8 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
895
  * @param string $sSuffix
896
  * @return string
897
  */
898
- public function doPluginOptionPrefix( $sSuffix = '' ) {
899
- return $this->doPluginPrefix( $sSuffix, '_' );
900
  }
901
 
902
  /**
@@ -1408,9 +1431,9 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
1408
  protected function saveCurrentPluginControllerOptions() {
1409
  $oOptions = $this->getPluginControllerOptions();
1410
  if ( $this->sConfigOptionsHashWhenLoaded != md5( serialize( $oOptions ) ) ) {
1411
- add_filter( $this->doPluginPrefix( 'bypass_permission_to_manage' ), '__return_true' );
1412
  $this->loadWp()->updateOption( $this->getPluginControllerOptionsKey(), $oOptions );
1413
- remove_filter( $this->doPluginPrefix( 'bypass_permission_to_manage' ), '__return_true' );
1414
  }
1415
  }
1416
 
@@ -1555,7 +1578,7 @@ class ICWP_WPSF_Plugin_Controller extends ICWP_WPSF_Foundation {
1555
  }
1556
  }
1557
 
1558
- do_action( $this->doPluginPrefix( 'run_processors' ) );
1559
 
1560
  return $bSuccess;
1561
  }
2
  /**
3
  * Copyright (c) 2018 iControlWP <support@icontrolwp.com>
4
  * All rights reserved.
 
5
  * "Shield" (formerly WordPress Simple Firewall) is distributed under the GNU
6
  * General Public License, Version 2, June 1991. Copyright (C) 1989, 1991 Free
7
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
 
8
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
9
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
245
  /**
246
  */
247
  public function onWpDeactivatePlugin() {
248
+ if ( current_user_can( $this->getBasePermissions() ) && apply_filters( $this->prefix( 'delete_on_deactivate' ), false ) ) {
249
+ do_action( $this->prefix( 'delete_plugin' ) );
250
  $this->deletePluginControllerOptions();
251
  }
252
  }
253
 
254
  public function onWpActivatePlugin() {
255
+ do_action( $this->prefix( 'plugin_activate' ) );
256
  $this->loadAllFeatures( true, true );
257
  }
258
 
268
  add_action( 'admin_menu', array( $this, 'onWpAdminMenu' ) );
269
  add_action( 'network_admin_menu', array( $this, 'onWpAdminMenu' ) );
270
 
271
+ if ( $this->loadWp()->isAjax() ) {
272
+ add_action( 'wp_ajax_'.$this->prefix(), array( $this, 'ajaxAction' ) );
273
+ add_action( 'wp_ajax_nopriv_'.$this->prefix(), array( $this, 'ajaxAction' ) );
274
+ }
275
+
276
  add_filter( 'all_plugins', array( $this, 'filter_hidePluginFromTableList' ) );
277
  add_filter( 'all_plugins', array( $this, 'doPluginLabels' ) );
278
  add_filter( 'plugin_action_links_'.$this->getPluginBaseFile(), array( $this, 'onWpPluginActionLinks' ), 50, 1 );
288
 
289
  // outsource the collection of admin notices
290
  if ( is_admin() ) {
291
+ $oNofics = $this->loadAdminNoticesProcessor();
292
+ $oNofics->setActionPrefix( $this->prefix() );
293
+ add_filter( $this->prefix( 'ajaxAuthAction' ), array( $oNofics, 'handleAuthAjax' ) );
294
  }
295
  }
296
 
333
  public function onWpDashboardSetup() {
334
  if ( $this->getIsValidAdminArea() ) {
335
  wp_add_dashboard_widget(
336
+ $this->prefix( 'dashboard_widget' ),
337
+ apply_filters( $this->prefix( 'dashboard_widget_title' ), $this->getHumanName() ),
338
  array( $this, 'displayDashboardWidget' )
339
  );
340
  }
341
  }
342
 
343
  public function displayDashboardWidget() {
344
+ $aContent = apply_filters( $this->prefix( 'dashboard_widget_content' ), array() );
345
  echo implode( '', $aContent );
346
  }
347
 
351
  * @return bool
352
  */
353
  public function getHasPermissionToManage() {
354
+ if ( apply_filters( $this->prefix( 'bypass_permission_to_manage' ), false ) ) {
355
  return true;
356
  }
357
+ return ( $this->getMeetsBasePermissions() && apply_filters( $this->prefix( 'has_permission_to_manage' ), true ) );
358
  }
359
 
360
  /**
376
  */
377
  private function downloadOptionsExport() {
378
  $oDp = $this->loadDataProcessor();
379
+ if ( $oDp->query( 'icwp_shield_export' ) == 1 ) {
380
+ $aExportOptions = apply_filters( $this->prefix( 'gather_options_for_export' ), array() );
381
  if ( !empty( $aExportOptions ) && is_array( $aExportOptions ) ) {
382
  $oDp->downloadStringAsFile(
383
  wp_json_encode( $aExportOptions ),
389
  }
390
  }
391
 
392
+ public function ajaxAction() {
393
+ $sNonceAction = $this->loadDP()->request( 'exec' );
394
+ check_ajax_referer( $sNonceAction, 'exec_nonce' );
395
+
396
+ $sAction = $this->loadWpUsers()->isUserLoggedIn() ? 'ajaxAuthAction' : 'ajaxNonAuthAction';
397
+ $aResponse = apply_filters( $this->prefix( $sAction ), array() );
398
+ $aResponse = apply_filters( $this->prefix( 'ajaxAction' ), $aResponse );
399
+
400
+ if ( !empty( $aResponse ) && is_array( $aResponse ) && isset( $aResponse[ 'success' ] ) ) {
401
+ $bSuccess = $aResponse[ 'success' ];
402
+ wp_send_json(
403
+ array(
404
+ 'success' => $bSuccess,
405
+ 'data' => $aResponse
406
+ )
407
+ );
408
+ }
409
+ }
410
+
411
  /**
412
  * @return string
413
  */
445
  */
446
  protected function createPluginMenu() {
447
 
448
+ $bHideMenu = apply_filters( $this->prefix( 'filter_hidePluginMenu' ), !$this->getPluginSpec_Menu( 'show' ) );
449
  if ( $bHideMenu ) {
450
  return true;
451
  }
452
 
453
  if ( $this->getPluginSpec_Menu( 'top_level' ) ) {
454
 
455
+ $aLabels = $this->getPluginLabels();
456
+ $sMenuTitle = empty( $aLabels[ 'MenuTitle' ] ) ? $this->getPluginSpec_Menu( 'title' ) : $aLabels[ 'MenuTitle' ];
 
457
  if ( is_null( $sMenuTitle ) ) {
458
  $sMenuTitle = $this->getHumanName();
459
  }
460
 
461
  $sMenuIcon = $this->getPluginUrl_Image( $this->getPluginSpec_Menu( 'icon_image' ) );
462
+ $sIconUrl = empty( $aLabels[ 'icon_url_16x16' ] ) ? $sMenuIcon : $aLabels[ 'icon_url_16x16' ];
463
 
464
  $sFullParentMenuId = $this->getPluginPrefix();
465
  add_menu_page(
473
 
474
  if ( $this->getPluginSpec_Menu( 'has_submenu' ) ) {
475
 
476
+ $aPluginMenuItems = apply_filters( $this->prefix( 'filter_plugin_submenu_items' ), array() );
477
  if ( !empty( $aPluginMenuItems ) ) {
478
  foreach ( $aPluginMenuItems as $sMenuTitle => $aMenu ) {
479
  list( $sMenuItemText, $sMenuItemId, $aMenuCallBack, $bShowItem ) = $aMenu;
553
  $sSettingsLink = sprintf( $sLinkTemplate, $this->{$sMethod}(), "_top", $aLink[ 'name' ] );;
554
  $aActionLinks = array_merge(
555
  array(
556
+ $this->prefix( 'dashboard' ) => $sSettingsLink
557
  ),
558
  $aActionLinks
559
  );
563
  $sSettingsLink = sprintf( $sLinkTemplate, $aLink[ 'href' ], "_blank", $aLink[ 'name' ] );
564
  $aActionLinks = array_merge(
565
  array(
566
+ $this->prefix( 'dashboard' ) => $sSettingsLink
567
  ),
568
  $aActionLinks
569
  );
579
  $aFrontendIncludes = $this->getPluginSpec_Include( 'frontend' );
580
  if ( isset( $aFrontendIncludes[ 'css' ] ) && !empty( $aFrontendIncludes[ 'css' ] ) && is_array( $aFrontendIncludes[ 'css' ] ) ) {
581
  foreach ( $aFrontendIncludes[ 'css' ] as $sCssAsset ) {
582
+ $sUnique = $this->prefix( $sCssAsset );
583
  wp_register_style( $sUnique, $this->getPluginUrl_Css( $sCssAsset.'.css' ), ( empty( $sDependent ) ? false : $sDependent ), $this->getVersion() );
584
  wp_enqueue_style( $sUnique );
585
  $sDependent = $sUnique;
596
  foreach ( $aAdminJs[ 'css' ] as $sAsset ) {
597
  $sUrl = $this->getPluginUrl_Js( $sAsset.'.js' );
598
  if ( !empty( $sUrl ) ) {
599
+ $sUnique = $this->prefix( $sAsset );
600
  wp_register_script( $sUnique, $sUrl, $sDependent, $this->getVersion().rand() );
601
  wp_enqueue_script( $sUnique );
602
  $sDependent = $sUnique;
612
  foreach ( $aAdminJs[ 'js' ] as $sJsAsset ) {
613
  $sUrl = $this->getPluginUrl_Js( $sJsAsset.'.js' );
614
  if ( !empty( $sUrl ) ) {
615
+ $sUnique = $this->prefix( $sJsAsset );
616
  wp_register_script( $sUnique, $sUrl, $sDependent, $this->getVersion() );
617
  wp_enqueue_script( $sUnique );
618
  $sDependent = $sUnique;
631
  foreach ( $aAdminCss[ 'css' ] as $sCssAsset ) {
632
  $sUrl = $this->getPluginUrl_Css( $sCssAsset.'.css' );
633
  if ( !empty( $sUrl ) ) {
634
+ $sUnique = $this->prefix( $sCssAsset );
635
  wp_register_style( $sUnique, $sUrl, $sDependent, $this->getVersion().rand() );
636
  wp_enqueue_style( $sUnique );
637
  $sDependent = $sUnique;
647
  foreach ( $aAdminCss[ 'css' ] as $sCssAsset ) {
648
  $sUrl = $this->getPluginUrl_Css( $sCssAsset.'.css' );
649
  if ( !empty( $sUrl ) ) {
650
+ $sUnique = $this->prefix( $sCssAsset );
651
  wp_register_style( $sUnique, $sUrl, $sDependent, $this->getVersion().rand() );
652
  wp_enqueue_style( $sUnique );
653
  $sDependent = $sUnique;
662
  */
663
  public function onWpPluginUpdateMessage() {
664
  $sDefault = sprintf( 'Upgrade Now To Get The Latest Available %s Features.', $this->getHumanName() );
665
+ $sMessage = apply_filters( $this->prefix( 'plugin_update_message' ), $sDefault );
666
  if ( empty( $sMessage ) ) {
667
  $sMessage = '';
668
  }
795
  * @return array
796
  */
797
  public function getPluginLabels() {
798
+ return array_map( 'stripslashes', apply_filters( $this->prefix( 'plugin_labels' ), $this->getPluginSpec_Labels() ) );
799
  }
800
 
801
  /**
802
  * Hooked to 'shutdown'
803
  */
804
  public function onWpShutdown() {
805
+ do_action( $this->prefix( 'pre_plugin_shutdown' ) );
806
+ do_action( $this->prefix( 'plugin_shutdown' ) );
807
  $this->saveCurrentPluginControllerOptions();
808
  $this->deleteFlags();
809
  }
836
  */
837
  public function filter_hidePluginFromTableList( $aPlugins ) {
838
 
839
+ $bHide = apply_filters( $this->prefix( 'hide_plugin' ), false );
840
  if ( !$bHide ) {
841
  return $aPlugins;
842
  }
862
  if ( $this->loadWp()->isCron() ) {
863
  return $oPlugins;
864
  }
865
+ if ( !apply_filters( $this->prefix( 'hide_plugin_updates' ), false ) ) {
866
  return $oPlugins;
867
  }
868
  if ( isset( $oPlugins->response[ $this->getPluginBaseFile() ] ) ) {
890
  }
891
 
892
  // do all the plugin feature/options saving
893
+ do_action( $this->prefix( 'form_submit' ) );
894
 
895
  if ( $this->getIsPage_PluginAdmin() ) {
896
  $oWp = $this->loadWp();
904
  * @param string $sGlue
905
  * @return string
906
  */
907
+ public function prefix( $sSuffix = '', $sGlue = '-' ) {
908
  $sPrefix = $this->getPluginPrefix( $sGlue );
909
 
910
  if ( $sSuffix == $sPrefix || strpos( $sSuffix, $sPrefix.$sGlue ) === 0 ) { //it already has the full prefix
918
  * @param string $sSuffix
919
  * @return string
920
  */
921
+ public function prefixOption( $sSuffix = '' ) {
922
+ return $this->prefix( $sSuffix, '_' );
923
  }
924
 
925
  /**
1431
  protected function saveCurrentPluginControllerOptions() {
1432
  $oOptions = $this->getPluginControllerOptions();
1433
  if ( $this->sConfigOptionsHashWhenLoaded != md5( serialize( $oOptions ) ) ) {
1434
+ add_filter( $this->prefix( 'bypass_permission_to_manage' ), '__return_true' );
1435
  $this->loadWp()->updateOption( $this->getPluginControllerOptionsKey(), $oOptions );
1436
+ remove_filter( $this->prefix( 'bypass_permission_to_manage' ), '__return_true' );
1437
  }
1438
  }
1439
 
1578
  }
1579
  }
1580
 
1581
+ do_action( $this->prefix( 'run_processors' ) );
1582
 
1583
  return $bSuccess;
1584
  }
icwp-wpsf.php CHANGED
@@ -3,11 +3,11 @@
3
  * Plugin Name: Shield Security
4
  * Plugin URI: http://icwp.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
- * Version: 6.5.0
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages/
9
- * Author: iControlWP
10
- * Author URI: http://icwp.io/2e
11
  */
12
 
13
  /**
3
  * Plugin Name: Shield Security
4
  * Plugin URI: http://icwp.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
+ * Version: 6.6.0
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages/
9
+ * Author: One Dollar Plugin
10
+ * Author URI: http://icwp.io/bv
11
  */
12
 
13
  /**
init.php CHANGED
@@ -25,7 +25,7 @@ class ICWP_Wordpress_Simple_Firewall extends ICWP_WPSF_Foundation {
25
  // All core values of the plugin are derived from the values stored in this value object.
26
  self::$oPluginController = $oController;
27
  $this->getController()->loadAllFeatures();
28
- add_filter( $oController->doPluginPrefix( 'plugin_update_message' ), array(
29
  $this,
30
  'getPluginsListUpdateMessage'
31
  ) );
25
  // All core values of the plugin are derived from the values stored in this value object.
26
  self::$oPluginController = $oController;
27
  $this->getController()->loadAllFeatures();
28
+ add_filter( $oController->prefix( 'plugin_update_message' ), array(
29
  $this,
30
  'getPluginsListUpdateMessage'
31
  ) );
languages/default.mo CHANGED
Binary file
languages/default.po CHANGED
@@ -1,15 +1,15 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WPSF v2.0\n"
4
- "POT-Creation-Date: 2016-08-15 12:11+0100\n"
5
- "PO-Revision-Date: 2016-08-15 12:11+0100\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: en_GB\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.8\n"
13
  "X-Poedit-KeywordsList: _wpsf__;gettext;gettext_noop;_wpsf_e\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
@@ -18,1154 +18,1379 @@ msgstr ""
18
  "X-Poedit-SearchPathExcluded-0: .git\n"
19
  "X-Poedit-SearchPathExcluded-1: .idea\n"
20
 
21
- #: icwp-wpsf.php:81
22
  msgid "Upgrade Now To Keep Your Firewall Up-To-Date With The Latest Features."
23
  msgstr ""
24
 
25
- #: src/config/feature-admin_access_restriction.php:175
26
- msgid "WordPress Security Admin"
27
  msgstr ""
28
 
29
- #: src/config/feature-admin_access_restriction.php:176
30
- msgid "Protect your security plugin not just your WordPress site"
31
- msgstr ""
32
-
33
- #: src/config/feature-admin_access_restriction.php:177
34
- #: src/features/admin_access_restriction.php:241
35
- #: src/features/admin_access_restriction.php:285
36
- msgid "Security Admin"
37
- msgstr ""
38
-
39
- #: src/config/feature-audit_trail.php:123 src/features/audit_trail.php:107
40
- msgid "Audit Trail"
41
- msgstr ""
42
-
43
- #: src/config/feature-audit_trail.php:124
44
- msgid "Get a view on what happens on your site, when it happens"
45
- msgstr ""
46
-
47
- #: src/config/feature-audit_trail.php:125 src/features/audit_trail.php:40
48
- msgid "Audit Trail Viewer"
49
- msgstr ""
50
-
51
- #: src/config/feature-autoupdates.php:130 src/features/autoupdates.php:31
52
- msgid "Automatic Updates"
53
- msgstr ""
54
-
55
- #: src/config/feature-autoupdates.php:131
56
- msgid "Take back full control of WordPress automatic updates"
57
- msgstr ""
58
-
59
- #: src/config/feature-comments_filter.php:211
60
- msgid "Comments SPAM"
61
- msgstr ""
62
-
63
- #: src/config/feature-comments_filter.php:212
64
- msgid "Block comment SPAM and retain your privacy"
65
- msgstr ""
66
-
67
- #: src/config/feature-email.php:32 src/features/login_protect.php:226
68
- msgid "Email"
69
- msgstr ""
70
-
71
- #: src/config/feature-firewall.php:226 src/features/firewall.php:48
72
- msgid "Firewall"
73
- msgstr ""
74
-
75
- #: src/config/feature-firewall.php:227
76
- msgid "Automatically block malicious URLs and data sent to your site"
77
- msgstr ""
78
-
79
- #: src/config/feature-hack_protect.php:74 src/features/hack_protect.php:23
80
- msgid "Hack Protection"
81
- msgstr ""
82
-
83
- #: src/config/feature-headers.php:131
84
- msgid "HTTP Headers"
85
- msgstr ""
86
-
87
- #: src/config/feature-headers.php:132
88
- msgid "Control HTTP Security Headers"
89
- msgstr ""
90
-
91
- #: src/config/feature-ips.php:105 src/features/ips.php:260
92
- msgid "IP Manager"
93
- msgstr ""
94
-
95
- #: src/config/feature-ips.php:106
96
- msgid "Manage Visitor IP Address"
97
- msgstr ""
98
-
99
- #: src/config/feature-lockdown.php:90 src/features/lockdown.php:36
100
- msgid "Lockdown"
101
- msgstr ""
102
-
103
- #: src/config/feature-lockdown.php:91
104
- msgid "Harden the more loosely controlled settings of your site"
105
- msgstr ""
106
-
107
- #: src/config/feature-login_protect.php:214 src/features/login_protect.php:125
108
- msgid "Login Protection"
109
- msgstr ""
110
-
111
- #: src/config/feature-login_protect.php:215
112
- msgid ""
113
- "Block brute force attacks and secure user identities with Two-Factor "
114
- "Authentication"
115
- msgstr ""
116
-
117
- #: src/config/feature-plugin.php:217
118
- msgid "Dashboard"
119
- msgstr ""
120
-
121
- #: src/config/feature-plugin.php:218
122
- msgid "Overview of the plugin settings"
123
- msgstr ""
124
-
125
- #: src/config/feature-statistics.php:46
126
- msgid "Statistics"
127
- msgstr ""
128
-
129
- #: src/config/feature-statistics.php:47
130
- msgid "Summary of the main security actions taken by this plugin"
131
- msgstr ""
132
-
133
- #: src/config/feature-statistics.php:48
134
- msgid "Stats Viewer"
135
- msgstr ""
136
-
137
- #: src/config/feature-support.php:39
138
- msgid "Premium Support"
139
- msgstr ""
140
-
141
- #: src/config/feature-support.php:40
142
- msgid "Premium Plugin Support Centre"
143
  msgstr ""
144
 
145
- #: src/config/feature-user_management.php:109
146
- #: src/features/user_management.php:93
147
- msgid "User Management"
148
  msgstr ""
149
 
150
- #: src/config/feature-user_management.php:110
151
- msgid ""
152
- "Get true user sessions and control account sharing, session duration and "
153
- "timeouts"
154
  msgstr ""
155
 
156
- #: src/features/admin_access_restriction.php:38
157
- msgid "Enter your Security Admin Access Key"
158
  msgstr ""
159
 
160
- #: src/features/admin_access_restriction.php:52
161
- msgid "Security Admin Access Key Accepted."
 
162
  msgstr ""
163
 
164
- #: src/features/admin_access_restriction.php:52
165
- msgid "Please wait"
 
166
  msgstr ""
167
 
168
- #: src/features/admin_access_restriction.php:55
169
- msgid "Error - Invalid Key"
 
170
  msgstr ""
171
 
172
- #: src/features/admin_access_restriction.php:238
173
- #: src/features/audit_trail.php:104 src/features/autoupdates.php:28
174
- #: src/features/comments_filter.php:40 src/features/firewall.php:45
175
- #: src/features/firewall.php:83 src/features/hack_protect.php:20
176
- #: src/features/headers.php:98 src/features/ips.php:257
177
- #: src/features/lockdown.php:33 src/features/login_protect.php:122
178
- #: src/features/statistics.php:20 src/features/support.php:81
179
- #: src/features/user_management.php:90
180
- #, php-format
181
- msgid "Enable Plugin Feature: %s"
182
- msgstr ""
183
-
184
- #: src/features/admin_access_restriction.php:240
185
- #: src/features/admin_access_restriction.php:250
186
- #: src/features/admin_access_restriction.php:259
187
- #: src/features/audit_trail.php:106 src/features/audit_trail.php:115
188
- #: src/features/audit_trail.php:124 src/features/autoupdates.php:30
189
- #: src/features/autoupdates.php:39 src/features/autoupdates.php:48
190
- #: src/features/autoupdates.php:57 src/features/autoupdates.php:66
191
- #: src/features/comments_filter.php:42 src/features/comments_filter.php:51
192
- #: src/features/comments_filter.php:60 src/features/comments_filter.php:70
193
- #: src/features/firewall.php:47 src/features/hack_protect.php:22
194
- #: src/features/hack_protect.php:31 src/features/hack_protect.php:40
195
- #: src/features/headers.php:100 src/features/headers.php:109
196
- #: src/features/headers.php:118 src/features/ips.php:259
197
- #: src/features/ips.php:269 src/features/lockdown.php:35
198
- #: src/features/lockdown.php:44 src/features/lockdown.php:53
199
- #: src/features/lockdown.php:62 src/features/login_protect.php:124
200
- #: src/features/login_protect.php:133 src/features/login_protect.php:142
201
- #: src/features/login_protect.php:151 src/features/login_protect.php:162
202
- #: src/features/login_protect.php:171 src/features/statistics.php:22
203
- #: src/features/statistics.php:31 src/features/support.php:83
204
- #: src/features/user_management.php:92 src/features/user_management.php:101
205
- #: src/features/user_management.php:110 src/features/user_management.php:119
206
- #: src/features/user_management.php:128
 
 
 
 
 
 
 
 
207
  #, php-format
208
  msgid "Purpose - %s"
209
  msgstr ""
210
 
211
- #: src/features/admin_access_restriction.php:240
 
212
  msgid ""
213
  "Restricts access to this plugin preventing unauthorized changes to your "
214
  "security settings."
215
  msgstr ""
216
 
217
- #: src/features/admin_access_restriction.php:241
218
- #: src/features/admin_access_restriction.php:251
219
- #: src/features/admin_access_restriction.php:260
220
- #: src/features/audit_trail.php:107 src/features/audit_trail.php:116
221
- #: src/features/audit_trail.php:125 src/features/autoupdates.php:31
222
- #: src/features/autoupdates.php:40 src/features/autoupdates.php:49
223
- #: src/features/autoupdates.php:58 src/features/comments_filter.php:43
224
- #: src/features/comments_filter.php:52 src/features/comments_filter.php:61
225
- #: src/features/comments_filter.php:71 src/features/firewall.php:48
226
- #: src/features/firewall.php:57 src/features/firewall.php:68
227
- #: src/features/firewall.php:77 src/features/hack_protect.php:23
228
- #: src/features/hack_protect.php:32 src/features/hack_protect.php:41
229
- #: src/features/headers.php:101 src/features/headers.php:110
230
- #: src/features/headers.php:119 src/features/ips.php:260
231
- #: src/features/ips.php:270 src/features/lockdown.php:36
232
- #: src/features/lockdown.php:45 src/features/lockdown.php:54
233
- #: src/features/lockdown.php:63 src/features/login_protect.php:125
234
- #: src/features/login_protect.php:134 src/features/login_protect.php:143
235
- #: src/features/login_protect.php:152 src/features/login_protect.php:163
236
- #: src/features/login_protect.php:172 src/features/plugin.php:360
237
- #: src/features/statistics.php:23 src/features/statistics.php:32
238
- #: src/features/support.php:84 src/features/user_management.php:93
239
- #: src/features/user_management.php:102 src/features/user_management.php:111
240
- #: src/features/user_management.php:120 src/features/user_management.php:129
 
 
 
 
241
  #, php-format
242
  msgid "Recommendation - %s"
243
  msgstr ""
244
 
245
- #: src/features/admin_access_restriction.php:241
246
- #: src/features/audit_trail.php:107 src/features/autoupdates.php:31
247
- #: src/features/comments_filter.php:43 src/features/firewall.php:48
248
- #: src/features/hack_protect.php:23 src/features/hack_protect.php:32
249
- #: src/features/hack_protect.php:41 src/features/ips.php:260
250
- #: src/features/ips.php:270 src/features/lockdown.php:36
251
- #: src/features/login_protect.php:125 src/features/statistics.php:23
252
- #: src/features/support.php:84 src/features/user_management.php:93
 
 
253
  #, php-format
254
  msgid "Keep the %s feature turned on."
255
  msgstr ""
256
 
257
- #: src/features/admin_access_restriction.php:242
 
 
 
 
 
 
258
  msgid "You need to also enter a new Access Key to enable this feature."
259
  msgstr ""
260
 
261
- #: src/features/admin_access_restriction.php:244
262
- #: src/features/audit_trail.php:109 src/features/autoupdates.php:33
263
- #: src/features/comments_filter.php:45 src/features/firewall.php:50
264
- #: src/features/firewall.php:84 src/features/hack_protect.php:25
265
- #: src/features/headers.php:103 src/features/headers.php:170
266
- #: src/features/ips.php:263 src/features/lockdown.php:38
267
- #: src/features/login_protect.php:127 src/features/statistics.php:25
268
- #: src/features/support.php:86 src/features/user_management.php:95
 
 
 
 
 
 
 
 
 
 
 
 
 
269
  msgid "Enable"
270
  msgstr ""
271
 
272
- #: src/features/admin_access_restriction.php:244
273
- #: src/features/audit_trail.php:109 src/features/autoupdates.php:33
274
- #: src/features/comments_filter.php:45 src/features/firewall.php:50
275
- #: src/features/firewall.php:84 src/features/hack_protect.php:25
276
- #: src/features/headers.php:103 src/features/headers.php:170
277
- #: src/features/ips.php:263 src/features/lockdown.php:38
278
- #: src/features/login_protect.php:127 src/features/statistics.php:25
279
- #: src/features/support.php:86 src/features/user_management.php:95
280
  msgid "Disable"
281
  msgstr ""
282
 
283
- #: src/features/admin_access_restriction.php:248
284
  msgid "Security Admin Restriction Settings"
285
  msgstr ""
286
 
287
- #: src/features/admin_access_restriction.php:250
288
- msgid "Restrict access using a simple Access Key."
289
- msgstr ""
290
-
291
- #: src/features/admin_access_restriction.php:251
292
- #: src/features/admin_access_restriction.php:260
293
- #: src/features/comments_filter.php:52 src/features/comments_filter.php:61
294
- #: src/features/login_protect.php:152 src/features/login_protect.php:163
295
- #: src/features/login_protect.php:172 src/features/user_management.php:111
296
- #: src/features/user_management.php:120 src/features/user_management.php:129
297
  msgid "Use of this feature is highly recommend."
298
  msgstr ""
299
 
300
- #: src/features/admin_access_restriction.php:253
301
  msgid "Security Admin Settings"
302
  msgstr ""
303
 
304
- #: src/features/admin_access_restriction.php:257
305
  msgid "Security Admin Restriction Zones"
306
  msgstr ""
307
 
308
- #: src/features/admin_access_restriction.php:259
309
  msgid ""
310
  "Restricts access to key WordPress areas for all users not authenticated with "
311
  "the Security Admin Access system."
312
  msgstr ""
313
 
314
- #: src/features/admin_access_restriction.php:262
315
  msgid "Access Restriction Zones"
316
  msgstr ""
317
 
318
- #: src/features/admin_access_restriction.php:285
319
- #: src/features/audit_trail.php:152 src/features/autoupdates.php:92
320
- #: src/features/comments_filter.php:96 src/features/firewall.php:105
321
- #: src/features/hack_protect.php:65 src/features/headers.php:144
322
- #: src/features/headers.php:169 src/features/ips.php:294
323
- #: src/features/lockdown.php:88 src/features/login_protect.php:196
324
- #: src/features/login_protect.php:219 src/features/login_protect.php:225
325
- #: src/features/plugin.php:227 src/features/statistics.php:59
326
- #: src/features/support.php:109 src/features/user_management.php:154
327
  #, php-format
328
- msgid "Enable %s"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  msgstr ""
330
 
331
- #: src/features/admin_access_restriction.php:286
332
  msgid "Enforce Security Admin Access Restriction"
333
  msgstr ""
334
 
335
- #: src/features/admin_access_restriction.php:287
336
  msgid ""
337
- "Enable this with great care and consideration. When this Access Key option "
338
- "is enabled, you must specify a key below and use it to gain access to this "
339
- "plugin."
340
  msgstr ""
341
 
342
- #: src/features/admin_access_restriction.php:291
343
  msgid "Security Admin Access Key"
344
  msgstr ""
345
 
346
- #: src/features/admin_access_restriction.php:292
347
  msgid "Provide/Update Security Admin Access Key"
348
  msgstr ""
349
 
350
- #: src/features/admin_access_restriction.php:293
351
- #: src/features/admin_access_restriction.php:308
352
- #: src/features/admin_access_restriction.php:315
353
- #: src/features/admin_access_restriction.php:322
354
- #: src/features/admin_access_restriction.php:328
355
- #: src/features/admin_access_restriction.php:334
356
  #, php-format
357
  msgid "Careful: %s"
358
  msgstr ""
359
 
360
- #: src/features/admin_access_restriction.php:293
361
  msgid ""
362
  "If you forget this, you could potentially lock yourself out from using this "
363
  "plugin."
364
  msgstr ""
365
 
366
- #: src/features/admin_access_restriction.php:298
 
 
 
 
 
 
 
 
367
  msgid "Security Admin Timeout"
368
  msgstr ""
369
 
370
- #: src/features/admin_access_restriction.php:299
371
  msgid "Specify An Automatic Timeout Interval For Security Admin Access"
372
  msgstr ""
373
 
374
- #: src/features/admin_access_restriction.php:300
375
  msgid "This will automatically expire your Security Admin Session."
376
  msgstr ""
377
 
378
- #: src/features/admin_access_restriction.php:301
379
- msgid "Does not apply until you enter the access key again."
380
- msgstr ""
381
-
382
- #: src/features/admin_access_restriction.php:302
383
  #, php-format
384
  msgid "Default: %s minutes."
385
  msgstr ""
386
 
387
- #: src/features/admin_access_restriction.php:306
388
  msgid "Pages"
389
  msgstr ""
390
 
391
- #: src/features/admin_access_restriction.php:307
392
  msgid "Restrict Access To Key WordPress Posts And Pages Actions"
393
  msgstr ""
394
 
395
- #: src/features/admin_access_restriction.php:308
396
  msgid "This will restrict access to page/post creation, editing and deletion."
397
  msgstr ""
398
 
399
- #: src/features/admin_access_restriction.php:309
400
- #: src/features/admin_access_restriction.php:316
401
- #: src/features/admin_access_restriction.php:337 src/features/headers.php:211
402
- #: src/features/login_protect.php:153 src/features/login_protect.php:234
 
403
  #, php-format
404
  msgid "Note: %s"
405
  msgstr ""
406
 
407
- #: src/features/admin_access_restriction.php:309
408
- #: src/features/admin_access_restriction.php:316
409
- #: src/features/admin_access_restriction.php:339
410
  #, php-format
411
  msgid "Selecting \"%s\" will also restrict all other options."
412
  msgstr ""
413
 
414
- #: src/features/admin_access_restriction.php:309
415
  msgid "Edit"
416
  msgstr ""
417
 
418
- #: src/features/admin_access_restriction.php:313
419
- #: src/features/audit_trail.php:70 src/features/audit_trail.php:170
420
- #: src/features/audit_trail.php:171 src/features/autoupdates.php:122
421
  msgid "Plugins"
422
  msgstr ""
423
 
424
- #: src/features/admin_access_restriction.php:314
425
  msgid "Restrict Access To Key WordPress Plugin Actions"
426
  msgstr ""
427
 
428
- #: src/features/admin_access_restriction.php:315
429
  msgid ""
430
  "This will restrict access to plugin installation, update, activation and "
431
  "deletion."
432
  msgstr ""
433
 
434
- #: src/features/admin_access_restriction.php:316
435
- #: src/features/admin_access_restriction.php:342
436
  msgid "Activate"
437
  msgstr ""
438
 
439
- #: src/features/admin_access_restriction.php:320
440
  msgid "WordPress Options"
441
  msgstr ""
442
 
443
- #: src/features/admin_access_restriction.php:321
444
  msgid "Restrict Access To Certain WordPress Admin Options"
445
  msgstr ""
446
 
447
- #: src/features/admin_access_restriction.php:322
448
  msgid ""
449
  "This will restrict the ability of WordPress administrators from changing key "
450
  "WordPress settings."
451
  msgstr ""
452
 
453
- #: src/features/admin_access_restriction.php:326
454
  msgid "Admin Users"
455
  msgstr ""
456
 
457
- #: src/features/admin_access_restriction.php:327
458
  msgid "Restrict Access To Create/Delete/Modify Other Admin Users"
459
  msgstr ""
460
 
461
- #: src/features/admin_access_restriction.php:328
462
  msgid ""
463
  "This will restrict the ability of WordPress administrators from creating, "
464
  "modifying or promoting other administrators."
465
  msgstr ""
466
 
467
- #: src/features/admin_access_restriction.php:332
468
- #: src/features/audit_trail.php:71 src/features/audit_trail.php:176
469
- #: src/features/audit_trail.php:177 src/features/autoupdates.php:128
470
  msgid "Themes"
471
  msgstr ""
472
 
473
- #: src/features/admin_access_restriction.php:333
474
  msgid "Restrict Access To WordPress Theme Actions"
475
  msgstr ""
476
 
477
- #: src/features/admin_access_restriction.php:334
478
  msgid ""
479
  "This will restrict access to theme installation, update, activation and "
480
  "deletion."
481
  msgstr ""
482
 
483
- #: src/features/admin_access_restriction.php:341
484
  #, php-format
485
  msgid "%s and %s"
486
  msgstr ""
487
 
488
- #: src/features/admin_access_restriction.php:343
489
  msgid "Edit Theme Options"
490
  msgstr ""
491
 
492
- #: src/features/audit_trail.php:69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  msgid "Users"
494
  msgstr ""
495
 
496
- #: src/features/audit_trail.php:72
497
  msgid "WordPress"
498
  msgstr ""
499
 
500
- #: src/features/audit_trail.php:73
501
  msgid "Posts"
502
  msgstr ""
503
 
504
- #: src/features/audit_trail.php:74 src/features/audit_trail.php:194
505
- #: src/features/audit_trail.php:195
506
  msgid "Emails"
507
  msgstr ""
508
 
509
- #: src/features/audit_trail.php:75
510
  msgid "Time"
511
  msgstr ""
512
 
513
- #: src/features/audit_trail.php:76
514
  msgid "Event"
515
  msgstr ""
516
 
517
- #: src/features/audit_trail.php:77
518
  msgid "Message"
519
  msgstr ""
520
 
521
- #: src/features/audit_trail.php:78 src/features/user_management.php:69
522
  msgid "Username"
523
  msgstr ""
524
 
525
- #: src/features/audit_trail.php:79
526
  msgid "Category"
527
  msgstr ""
528
 
529
- #: src/features/audit_trail.php:80 src/features/plugin.php:366
530
  msgid "IP Address"
531
  msgstr ""
532
 
533
- #: src/features/audit_trail.php:81
534
  msgid "You"
535
  msgstr ""
536
 
537
- #: src/features/audit_trail.php:82
538
  msgid "There are currently no audit entries this is section."
539
  msgstr ""
540
 
541
- #: src/features/audit_trail.php:106
542
  msgid ""
543
  "The Audit Trail is designed so you can look back on events and analyse what "
544
  "happened and what may have gone wrong."
545
  msgstr ""
546
 
547
- #: src/features/audit_trail.php:113
 
 
 
 
 
548
  msgid "Audit Trail Options"
549
  msgstr ""
550
 
551
- #: src/features/audit_trail.php:115
552
  msgid "Provides finer control over the audit trail itself."
553
  msgstr ""
554
 
555
- #: src/features/audit_trail.php:116 src/features/audit_trail.php:125
556
  msgid "These settings are dependent on your requirements."
557
  msgstr ""
558
 
559
- #: src/features/audit_trail.php:118
 
560
  msgid "Options"
561
  msgstr ""
562
 
563
- #: src/features/audit_trail.php:122
564
  msgid "Enable Audit Contexts"
565
  msgstr ""
566
 
567
- #: src/features/audit_trail.php:124
568
  msgid "Specify which types of actions on your site are logged."
569
  msgstr ""
570
 
571
- #: src/features/audit_trail.php:127
572
  msgid "Audit Contexts"
573
  msgstr ""
574
 
575
- #: src/features/audit_trail.php:153 src/features/autoupdates.php:93
576
- #: src/features/firewall.php:106 src/features/hack_protect.php:66
577
- #: src/features/headers.php:145 src/features/ips.php:295
578
- #: src/features/lockdown.php:89 src/features/login_protect.php:197
579
- #: src/features/statistics.php:60 src/features/support.php:110
580
- #: src/features/user_management.php:155
581
  #, php-format
582
- msgid "Enable (or Disable) The %s Feature"
583
  msgstr ""
584
 
585
- #: src/features/audit_trail.php:154 src/features/autoupdates.php:94
586
- #: src/features/comments_filter.php:98 src/features/firewall.php:107
587
- #: src/features/hack_protect.php:67 src/features/headers.php:146
588
- #: src/features/ips.php:296 src/features/lockdown.php:90
589
- #: src/features/login_protect.php:198 src/features/statistics.php:61
590
- #: src/features/support.php:111 src/features/user_management.php:156
 
591
  #, php-format
 
 
 
 
 
 
 
 
 
 
 
 
592
  msgid ""
593
- "Checking/Un-Checking this option will completely turn on/off the whole %s "
594
- "feature."
595
  msgstr ""
596
 
597
- #: src/features/audit_trail.php:158
598
  msgid "Auto Clean"
599
  msgstr ""
600
 
601
- #: src/features/audit_trail.php:159
602
  msgid "Enable Audit Auto Cleaning"
603
  msgstr ""
604
 
605
- #: src/features/audit_trail.php:160
606
  msgid ""
607
  "Events older than the number of days specified will be automatically cleaned "
608
  "from the database."
609
  msgstr ""
610
 
611
- #: src/features/audit_trail.php:164 src/features/audit_trail.php:165
612
- #: src/features/audit_trail.php:166
613
  msgid "Users And Logins"
614
  msgstr ""
615
 
616
- #: src/features/audit_trail.php:165 src/features/audit_trail.php:171
617
- #: src/features/audit_trail.php:177 src/features/audit_trail.php:183
618
- #: src/features/audit_trail.php:189 src/features/audit_trail.php:195
619
- #: src/features/audit_trail.php:201
620
  #, php-format
621
  msgid "Enable Audit Context - %s"
622
  msgstr ""
623
 
624
- #: src/features/audit_trail.php:166 src/features/audit_trail.php:172
625
- #: src/features/audit_trail.php:178 src/features/audit_trail.php:184
626
- #: src/features/audit_trail.php:190 src/features/audit_trail.php:196
627
- #: src/features/audit_trail.php:202
628
  #, php-format
629
  msgid ""
630
  "When this context is enabled, the audit trail will track activity relating "
631
  "to: %s"
632
  msgstr ""
633
 
634
- #: src/features/audit_trail.php:172
635
  msgid "WordPress Plugins"
636
  msgstr ""
637
 
638
- #: src/features/audit_trail.php:178
639
  msgid "WordPress Themes"
640
  msgstr ""
641
 
642
- #: src/features/audit_trail.php:182 src/features/audit_trail.php:183
643
  msgid "Posts And Pages"
644
  msgstr ""
645
 
646
- #: src/features/audit_trail.php:184
647
  msgid "Editing and publishing of posts and pages"
648
  msgstr ""
649
 
650
- #: src/features/audit_trail.php:188 src/features/audit_trail.php:189
651
  msgid "WordPress And Settings"
652
  msgstr ""
653
 
654
- #: src/features/audit_trail.php:190
655
  msgid "WordPress upgrades and changes to particular WordPress settings"
656
  msgstr ""
657
 
658
- #: src/features/audit_trail.php:196
659
  msgid "Email Sending"
660
  msgstr ""
661
 
662
- #: src/features/autoupdates.php:30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
663
  msgid ""
664
  "Automatic Updates lets you manage the WordPress automatic updates engine so "
665
  "you choose what exactly gets updated automatically."
666
  msgstr ""
667
 
668
- #: src/features/autoupdates.php:37
 
 
 
 
 
669
  msgid "Disable ALL WordPress Automatic Updates"
670
  msgstr ""
671
 
672
- #: src/features/autoupdates.php:39
673
  msgid ""
674
  "If you never want WordPress to automatically update anything on your site, "
675
  "turn on this option."
676
  msgstr ""
677
 
678
- #: src/features/autoupdates.php:40
679
  msgid "Do not turn on this option unless you really need to block updates."
680
  msgstr ""
681
 
682
- #: src/features/autoupdates.php:42
683
  msgid "Turn Off"
684
  msgstr ""
685
 
686
- #: src/features/autoupdates.php:46
687
  msgid "Automatic Plugin Self-Update"
688
  msgstr ""
689
 
690
- #: src/features/autoupdates.php:48
691
  #, php-format
692
  msgid ""
693
  "Allows the %s plugin to automatically update itself when an update is "
694
  "available."
695
  msgstr ""
696
 
697
- #: src/features/autoupdates.php:49
698
  msgid "Keep this option turned on."
699
  msgstr ""
700
 
701
- #: src/features/autoupdates.php:51
702
  msgid "Self-Update"
703
  msgstr ""
704
 
705
- #: src/features/autoupdates.php:55
706
  msgid "Automatic Updates For WordPress Components"
707
  msgstr ""
708
 
709
- #: src/features/autoupdates.php:57
710
  msgid "Control how automatic updates for each WordPress component is handled."
711
  msgstr ""
712
 
713
- #: src/features/autoupdates.php:58
714
  msgid "You should at least allow minor updates for the WordPress core."
715
  msgstr ""
716
 
717
- #: src/features/autoupdates.php:60
718
  msgid "WordPress Components"
719
  msgstr ""
720
 
721
- #: src/features/autoupdates.php:64
722
- msgid "Automatic Update Email Notifications"
723
  msgstr ""
724
 
725
- #: src/features/autoupdates.php:66
726
- msgid "Control how you are notified of automatic updates that have occurred."
727
  msgstr ""
728
 
729
- #: src/features/autoupdates.php:68 src/features/user_management.php:113
730
- msgid "Notifications"
731
- msgstr ""
732
-
733
- #: src/features/autoupdates.php:98
734
  msgid "Disable All"
735
  msgstr ""
736
 
737
- #: src/features/autoupdates.php:99
738
  msgid "Completely Disable WordPress Automatic Updates"
739
  msgstr ""
740
 
741
- #: src/features/autoupdates.php:100
742
  msgid ""
743
  "When selected, regardless of any other settings, all WordPress automatic "
744
  "updates on this site will be completely disabled!"
745
  msgstr ""
746
 
747
- #: src/features/autoupdates.php:104
748
  msgid "Auto Update Plugin"
749
  msgstr ""
750
 
751
- #: src/features/autoupdates.php:105
752
  msgid "Always Automatically Update This Plugin"
753
  msgstr ""
754
 
755
- #: src/features/autoupdates.php:106
756
  #, php-format
757
  msgid ""
758
  "Regardless of any component settings below, automatically update the \"%s\" "
759
  "plugin."
760
  msgstr ""
761
 
762
- #: src/features/autoupdates.php:110
763
  msgid "WordPress Core Updates"
764
  msgstr ""
765
 
766
- #: src/features/autoupdates.php:111
767
  msgid "Decide how the WordPress Core will automatically update, if at all"
768
  msgstr ""
769
 
770
- #: src/features/autoupdates.php:112
771
  msgid ""
772
  "At least automatically upgrading minor versions is recommended (and is the "
773
  "WordPress default)."
774
  msgstr ""
775
 
776
- #: src/features/autoupdates.php:116
777
  msgid "Translations"
778
  msgstr ""
779
 
780
- #: src/features/autoupdates.php:117
781
  msgid "Automatically Update Translations"
782
  msgstr ""
783
 
784
- #: src/features/autoupdates.php:118
785
  msgid ""
786
  "Note: Automatic updates for translations are enabled on WordPress by default."
787
  msgstr ""
788
 
789
- #: src/features/autoupdates.php:123
790
- msgid "Automatically Update Plugins"
791
  msgstr ""
792
 
793
- #: src/features/autoupdates.php:124
794
  msgid ""
795
  "Note: Automatic updates for plugins are disabled on WordPress by default."
796
  msgstr ""
797
 
798
- #: src/features/autoupdates.php:129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
799
  msgid "Automatically Update Themes"
800
  msgstr ""
801
 
802
- #: src/features/autoupdates.php:130
803
  msgid ""
804
  "Note: Automatic updates for themes are disabled on WordPress by default."
805
  msgstr ""
806
 
807
- #: src/features/autoupdates.php:134
808
  msgid "Ignore Version Control"
809
  msgstr ""
810
 
811
- #: src/features/autoupdates.php:135
812
  msgid "Ignore Version Control Systems Such As GIT and SVN"
813
  msgstr ""
814
 
815
- #: src/features/autoupdates.php:136
816
  msgid ""
817
  "If you use SVN or GIT and WordPress detects it, automatic updates are "
818
  "disabled by default. Check this box to ignore version control systems and "
819
  "allow automatic updates."
820
  msgstr ""
821
 
822
- #: src/features/autoupdates.php:140
823
  msgid "Send Report Email"
824
  msgstr ""
825
 
826
- #: src/features/autoupdates.php:141
827
  msgid "Send email notices after automatic updates"
828
  msgstr ""
829
 
830
- #: src/features/autoupdates.php:142
831
  msgid ""
832
  "You can turn on/off email notices from automatic updates by un/checking this "
833
  "box."
834
  msgstr ""
835
 
836
- #: src/features/autoupdates.php:146
837
  msgid "Report Email Address"
838
  msgstr ""
839
 
840
- #: src/features/autoupdates.php:147
841
  msgid "Where to send upgrade notification reports"
842
  msgstr ""
843
 
844
- #: src/features/autoupdates.php:148
845
  msgid "If this is empty, it will default to the Site Admin email address"
846
  msgstr ""
847
 
848
- #: src/features/base_wpsf.php:42
849
- msgid "Settings"
850
  msgstr ""
851
 
852
- #: src/features/base_wpsf.php:43
853
- msgid "On"
854
  msgstr ""
855
 
856
- #: src/features/base_wpsf.php:44
857
- msgid "Off"
 
 
858
  msgstr ""
859
 
860
- #: src/features/base_wpsf.php:45
861
- #: src/processors/hackprotect_corechecksumscan.php:181
862
- #: src/processors/hackprotect_corechecksumscan.php:210
863
- #: src/processors/hackprotect_pluginvulnerabilities.php:153
864
- msgid "More Info"
865
  msgstr ""
866
 
867
- #: src/features/base_wpsf.php:46
868
- msgid "Blog"
869
  msgstr ""
870
 
871
- #: src/features/base_wpsf.php:47
872
- msgid "Plugin Activated Features Summary:"
 
873
  msgstr ""
874
 
875
- #: src/features/base_wpsf.php:48 templates/php/snippets/options_form.php:161
876
- msgid "Save All Settings"
 
877
  msgstr ""
878
 
879
- #: src/features/base_wpsf.php:50
880
- msgid "What should you enter here?"
 
 
 
881
  msgstr ""
882
 
883
- #: src/features/base_wpsf.php:51
884
- msgid ""
885
- "At some point you entered a Security Admin Access Key - to manage this "
886
- "plugin, you must supply it here first."
887
  msgstr ""
888
 
889
- #: src/features/base_wpsf.php:52
890
- msgid "To manage this plugin you must enter the access key."
891
  msgstr ""
892
 
893
- #: src/features/base_wpsf.php:53
894
- msgid "Enter Access Key"
895
  msgstr ""
896
 
897
- #: src/features/base_wpsf.php:54
898
- msgid "Submit Access Key"
 
 
 
 
899
  msgstr ""
900
 
901
- #: src/features/base_wpsf.php:63 src/features/ips.php:203
902
- msgid "Nonce security checking failed - the nonce value was empty."
903
  msgstr ""
904
 
905
- #: src/features/base_wpsf.php:64 src/features/ips.php:206
906
- #, php-format
907
- msgid "Nonce security checking failed - the nonce supplied was \"%s\"."
908
  msgstr ""
909
 
910
- #: src/features/comments_filter.php:40 src/features/comments_filter.php:98
911
- msgid "SPAM Comments Protection Filter"
912
  msgstr ""
913
 
914
- #: src/features/comments_filter.php:42
915
- #, php-format
916
- msgid ""
917
- "The Comments Filter can block 100% of automated spam bots and also offer the "
918
- "option to analyse human-generated spam."
919
  msgstr ""
920
 
921
- #: src/features/comments_filter.php:43
922
- msgid "Comments Filter"
923
  msgstr ""
924
 
925
- #: src/features/comments_filter.php:49 src/features/comments_filter.php:58
926
- #, php-format
927
- msgid "%s Comment SPAM Protection Filter"
928
  msgstr ""
929
 
930
- #: src/features/comments_filter.php:49
931
- msgid "Automatic Bot"
932
  msgstr ""
933
 
934
- #: src/features/comments_filter.php:51
935
- #, php-format
936
- msgid "Blocks 100% of all automated bot-generated comment SPAM."
937
  msgstr ""
938
 
939
- #: src/features/comments_filter.php:54
940
- msgid "Bot SPAM"
 
 
941
  msgstr ""
942
 
943
- #: src/features/comments_filter.php:58
944
- msgid "Human"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
945
  msgstr ""
946
 
947
  #: src/features/comments_filter.php:60
948
- msgid "Uses a 3rd party SPAM dictionary to detect human-based comment SPAM."
949
  msgstr ""
950
 
951
- #: src/features/comments_filter.php:62
 
 
 
 
 
952
  msgid ""
953
- "This tool, unlike other SPAM tools such as Akismet, will not send your "
954
- "comment data to 3rd party services for analysis."
955
  msgstr ""
956
 
957
- #: src/features/comments_filter.php:64
958
- msgid "Human SPAM"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
959
  msgstr ""
960
 
961
- #: src/features/comments_filter.php:68
962
- msgid "Customize Messages Shown To User"
963
  msgstr ""
964
 
965
- #: src/features/comments_filter.php:70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
966
  msgid ""
967
- "Customize the messages shown to visitors when they view and use comment "
968
- "forms."
969
  msgstr ""
970
 
971
- #: src/features/comments_filter.php:71
972
- msgid "Be sure to change the messages to suit your audience."
973
  msgstr ""
974
 
975
- #: src/features/comments_filter.php:73
976
- msgid "Visitor Messages"
977
  msgstr ""
978
 
979
- #: src/features/comments_filter.php:97
980
- msgid "Enable (or Disable) The SPAM Comments Protection Filter Feature"
 
981
  msgstr ""
982
 
983
- #: src/features/comments_filter.php:102
984
  msgid "Human SPAM Filter"
985
  msgstr ""
986
 
987
- #: src/features/comments_filter.php:103
988
- msgid "Enable (or Disable) The Human SPAM Filter Feature."
 
989
  msgstr ""
990
 
991
- #: src/features/comments_filter.php:104
992
  msgid ""
993
  "Scans the content of WordPress comments for keywords that are indicative of "
994
  "SPAM and marks the comment according to your preferred setting below."
995
  msgstr ""
996
 
997
- #: src/features/comments_filter.php:108
998
  msgid "Comment Filter Items"
999
  msgstr ""
1000
 
1001
- #: src/features/comments_filter.php:109
1002
  msgid "Select The Items To Scan For SPAM"
1003
  msgstr ""
1004
 
1005
- #: src/features/comments_filter.php:110
1006
  msgid ""
1007
  "When a user submits a comment, only the selected parts of the comment data "
1008
  "will be scanned for SPAM content."
1009
  msgstr ""
1010
 
1011
- #: src/features/comments_filter.php:110 src/features/login_protect.php:255
1012
- #: src/features/login_protect.php:269
1013
  #, php-format
1014
  msgid "Recommended: %s"
1015
  msgstr ""
1016
 
1017
- #: src/features/comments_filter.php:110
1018
  msgid "All"
1019
  msgstr ""
1020
 
1021
- #: src/features/comments_filter.php:114 src/features/comments_filter.php:132
1022
  msgid "Default SPAM Action"
1023
  msgstr ""
1024
 
1025
- #: src/features/comments_filter.php:115 src/features/comments_filter.php:133
1026
  msgid "How To Categorise Comments When Identified To Be SPAM"
1027
  msgstr ""
1028
 
1029
- #: src/features/comments_filter.php:116 src/features/comments_filter.php:134
1030
  #, php-format
1031
  msgid ""
1032
  "When a comment is detected as being SPAM from %s, the comment will be "
1033
  "categorised based on this setting."
1034
  msgstr ""
1035
 
1036
- #: src/features/comments_filter.php:116
1037
  msgid "a human commenter"
1038
  msgstr ""
1039
 
1040
- #: src/features/comments_filter.php:121
1041
- msgid "Enable Google reCAPTCHA For Comments"
1042
- msgstr ""
1043
-
1044
- #: src/features/comments_filter.php:122
1045
- msgid "Use Google reCAPTCHA on the comments form to prevent bot-spam comments."
1046
- msgstr ""
1047
-
1048
- #: src/features/comments_filter.php:126
1049
- msgid "GASP Protection"
1050
  msgstr ""
1051
 
1052
- #: src/features/comments_filter.php:127
1053
- msgid "Add Growmap Anti Spambot Protection to your comments"
1054
  msgstr ""
1055
 
1056
- #: src/features/comments_filter.php:128
1057
  msgid ""
1058
- "Taking the lead from the original GASP plugin for WordPress, we have "
1059
- "extended it to include advanced spam-bot protection."
1060
  msgstr ""
1061
 
1062
- #: src/features/comments_filter.php:134
1063
  msgid "an automatic bot"
1064
  msgstr ""
1065
 
1066
- #: src/features/comments_filter.php:138
1067
  msgid "Comments Cooldown"
1068
  msgstr ""
1069
 
1070
- #: src/features/comments_filter.php:139
1071
  msgid "Limit posting comments to X seconds after the page has loaded"
1072
  msgstr ""
1073
 
1074
- #: src/features/comments_filter.php:140
1075
  msgid ""
1076
  "By forcing a comments cooldown period, you restrict a Spambot's ability to "
1077
  "post multiple times to your posts."
1078
  msgstr ""
1079
 
1080
- #: src/features/comments_filter.php:144
1081
  msgid "Comment Token Expire"
1082
  msgstr ""
1083
 
1084
- #: src/features/comments_filter.php:145
1085
  msgid "A visitor has X seconds within which to post a comment"
1086
  msgstr ""
1087
 
1088
- #: src/features/comments_filter.php:146
1089
  msgid ""
1090
  "Default: 600 seconds (10 minutes). Each visitor is given a unique 'Token' so "
1091
  "they can comment. This restricts spambots, but we need to force these tokens "
1092
  "to expire and at the same time not bother the visitors."
1093
  msgstr ""
1094
 
1095
- #: src/features/comments_filter.php:150
1096
- msgid "Custom Checkbox Message"
1097
  msgstr ""
1098
 
1099
- #: src/features/comments_filter.php:151
1100
  msgid "If you want a custom checkbox message, please provide this here"
1101
  msgstr ""
1102
 
1103
- #: src/features/comments_filter.php:152
1104
  msgid "You can customise the message beside the checkbox."
1105
  msgstr ""
1106
 
1107
- #: src/features/comments_filter.php:153 src/features/comments_filter.php:160
1108
- #: src/features/comments_filter.php:167 src/features/comments_filter.php:174
1109
  #, php-format
1110
  msgid "Default Message: %s"
1111
  msgstr ""
1112
 
1113
- #: src/features/comments_filter.php:153 src/features/comments_filter.php:160
1114
  msgid "Please check the box to confirm you're not a spammer"
1115
  msgstr ""
1116
 
1117
- #: src/features/comments_filter.php:157
1118
- msgid "Custom Alert Message"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1119
  msgstr ""
1120
 
1121
- #: src/features/comments_filter.php:158
1122
  msgid "If you want a custom alert message, please provide this here"
1123
  msgstr ""
1124
 
1125
- #: src/features/comments_filter.php:159
1126
  msgid ""
1127
  "This alert message is displayed when a visitor attempts to submit a comment "
1128
  "without checking the box."
1129
  msgstr ""
1130
 
1131
- #: src/features/comments_filter.php:164
1132
- msgid "Custom Wait Message"
1133
  msgstr ""
1134
 
1135
- #: src/features/comments_filter.php:165
1136
  msgid ""
1137
  "If you want a custom submit-button wait message, please provide this here."
1138
  msgstr ""
1139
 
1140
- #: src/features/comments_filter.php:166
1141
  #, php-format
1142
  msgid ""
1143
  "Where you see the '%s' this will be the number of seconds. You must ensure "
1144
  "you include 1, and only 1, of these."
1145
  msgstr ""
1146
 
1147
- #: src/features/comments_filter.php:167
1148
  #, php-format
1149
  msgid "Please wait %s seconds before posting your comment"
1150
  msgstr ""
1151
 
1152
- #: src/features/comments_filter.php:171
1153
- msgid "Custom Reload Message"
1154
  msgstr ""
1155
 
1156
- #: src/features/comments_filter.php:172
1157
  msgid ""
1158
  "If you want a custom message when the comment token has expired, please "
1159
  "provide this here."
1160
  msgstr ""
1161
 
1162
- #: src/features/comments_filter.php:173
1163
  msgid ""
1164
  "This message is displayed on the submit-button when the comment token is "
1165
  "expired"
1166
  msgstr ""
1167
 
1168
- #: src/features/comments_filter.php:174
1169
  msgid "Please reload this page to post a comment"
1170
  msgstr ""
1171
 
@@ -1173,2911 +1398,4438 @@ msgstr ""
1173
  msgid "Email Options"
1174
  msgstr ""
1175
 
1176
- #: src/features/email.php:65 src/features/plugin.php:235
1177
- msgid "Report Email"
1178
- msgstr ""
1179
-
1180
- #: src/features/email.php:66 src/features/plugin.php:236
1181
- msgid "Where to send email reports"
1182
- msgstr ""
1183
-
1184
- #: src/features/email.php:67
1185
- msgid "If this is empty, it will default to the blog admin email address."
1186
- msgstr ""
1187
-
1188
- #: src/features/email.php:71
1189
  msgid "Email Throttle Limit"
1190
  msgstr ""
1191
 
1192
- #: src/features/email.php:72
1193
  msgid "Limit Emails Per Second"
1194
  msgstr ""
1195
 
1196
- #: src/features/email.php:73
1197
  msgid ""
1198
  "You throttle emails sent by this plugin by limiting the number of emails "
1199
  "sent every second. This is useful in case you get hit by a bot attack. Zero "
1200
  "(0) turns this off. Suggested: 10"
1201
  msgstr ""
1202
 
1203
- #: src/features/firewall.php:47
 
 
 
 
 
1204
  msgid ""
1205
  "The Firewall is designed to analyse data sent to your website and block any "
1206
  "requests that appear to be malicious."
1207
  msgstr ""
1208
 
1209
- #: src/features/firewall.php:54
 
 
 
 
1210
  msgid "Firewall Blocking Options"
1211
  msgstr ""
1212
 
1213
- #: src/features/firewall.php:56
1214
  msgid "Here you choose what kind of malicious data to scan for."
1215
  msgstr ""
1216
 
1217
- #: src/features/firewall.php:58
1218
  msgid "Turn on as many options here as you can."
1219
  msgstr ""
1220
 
1221
- #: src/features/firewall.php:59
1222
  msgid ""
1223
  "If you find an incompatibility or something stops working, un-check 1 option "
1224
  "at a time until you find the problem or review the Audit Trail."
1225
  msgstr ""
1226
 
1227
- #: src/features/firewall.php:61
1228
  msgid "Firewall Blocking"
1229
  msgstr ""
1230
 
1231
- #: src/features/firewall.php:65
1232
  msgid "Choose Firewall Block Response"
1233
  msgstr ""
1234
 
1235
- #: src/features/firewall.php:67
1236
  msgid ""
1237
  "Here you choose how the plugin will respond when it detects malicious data."
1238
  msgstr ""
1239
 
1240
- #: src/features/firewall.php:68
1241
  #, php-format
1242
  msgid "Choose the option \"%s\"."
1243
  msgstr ""
1244
 
1245
- #: src/features/firewall.php:68
1246
  msgid "Die With Message"
1247
  msgstr ""
1248
 
1249
- #: src/features/firewall.php:70
1250
  msgid "Firewall Response"
1251
  msgstr ""
1252
 
1253
- #: src/features/firewall.php:74
1254
  msgid ""
1255
  "Whitelists - IPs, Pages, Parameters, and Users that by-pass the Firewall"
1256
  msgstr ""
1257
 
1258
- #: src/features/firewall.php:76
1259
  msgid ""
1260
  "In principle you should not need to whitelist anything or anyone unless you "
1261
  "have discovered a collision with another plugin."
1262
  msgstr ""
1263
 
1264
- #: src/features/firewall.php:77
1265
  msgid ""
1266
  "Do not whitelist anything unless you are confident in what you are doing."
1267
  msgstr ""
1268
 
1269
- #: src/features/firewall.php:79
1270
  msgid "Whitelist"
1271
  msgstr ""
1272
 
1273
- #: src/features/firewall.php:111
1274
  msgid "Include Cookies"
1275
  msgstr ""
1276
 
1277
- #: src/features/firewall.php:112
1278
  msgid "Also Test Cookie Values In Firewall Tests"
1279
  msgstr ""
1280
 
1281
- #: src/features/firewall.php:113
1282
  msgid ""
1283
  "The firewall tests GET and POST, but with this option checked it will also "
1284
  "check COOKIE values."
1285
  msgstr ""
1286
 
1287
- #: src/features/firewall.php:117
1288
  msgid "Directory Traversals"
1289
  msgstr ""
1290
 
1291
- #: src/features/firewall.php:118
1292
  msgid "Block Directory Traversals"
1293
  msgstr ""
1294
 
1295
- #: src/features/firewall.php:119
 
1296
  msgid ""
1297
- "This will block directory traversal paths in in application parameters (e."
1298
- "g. ../, ../../etc/passwd, etc.)."
1299
  msgstr ""
1300
 
1301
- #: src/features/firewall.php:123 src/processors/firewall.php:541
1302
  msgid "SQL Queries"
1303
  msgstr ""
1304
 
1305
- #: src/features/firewall.php:124
1306
  msgid "Block SQL Queries"
1307
  msgstr ""
1308
 
1309
- #: src/features/firewall.php:125
1310
- msgid ""
1311
- "This will block sql in application parameters (e.g. union select, concat(, /"
1312
- "**/, etc.)."
1313
  msgstr ""
1314
 
1315
- #: src/features/firewall.php:129 src/processors/firewall.php:535
1316
  msgid "WordPress Terms"
1317
  msgstr ""
1318
 
1319
- #: src/features/firewall.php:130
1320
  msgid "Block WordPress Specific Terms"
1321
  msgstr ""
1322
 
1323
- #: src/features/firewall.php:131
1324
  msgid ""
1325
  "This will block WordPress specific terms in application parameters (wp_, "
1326
  "user_login, etc.)."
1327
  msgstr ""
1328
 
1329
- #: src/features/firewall.php:135 src/processors/firewall.php:538
1330
  msgid "Field Truncation"
1331
  msgstr ""
1332
 
1333
- #: src/features/firewall.php:136
1334
  msgid "Block Field Truncation Attacks"
1335
  msgstr ""
1336
 
1337
- #: src/features/firewall.php:137
1338
  msgid "This will block field truncation attacks in application parameters."
1339
  msgstr ""
1340
 
1341
- #: src/features/firewall.php:141 src/processors/firewall.php:550
1342
  msgid "PHP Code"
1343
  msgstr ""
1344
 
1345
- #: src/features/firewall.php:142
1346
  #, php-format
1347
  msgid "Block %s"
1348
  msgstr ""
1349
 
1350
- #: src/features/firewall.php:142
1351
  msgid "PHP Code Includes"
1352
  msgstr ""
1353
 
1354
- #: src/features/firewall.php:143
1355
  msgid "This will block any data that appears to try and include PHP files."
1356
  msgstr ""
1357
 
1358
- #: src/features/firewall.php:144
1359
  msgid "Will probably block saving within the Plugin/Theme file editors."
1360
  msgstr ""
1361
 
1362
- #: src/features/firewall.php:148
1363
  msgid "Exe File Uploads"
1364
  msgstr ""
1365
 
1366
- #: src/features/firewall.php:149
1367
  msgid "Block Executable File Uploads"
1368
  msgstr ""
1369
 
1370
- #: src/features/firewall.php:150
1371
  msgid "This will block executable file uploads (.php, .exe, etc.)."
1372
  msgstr ""
1373
 
1374
- #: src/features/firewall.php:154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1375
  msgid "Aggressive Scan"
1376
  msgstr ""
1377
 
1378
- #: src/features/firewall.php:155
1379
  msgid "Aggressively Block Data"
1380
  msgstr ""
1381
 
1382
- #: src/features/firewall.php:156
1383
  msgid ""
1384
  "Employs a set of aggressive rules to detect and block malicious data "
1385
  "submitted to your site."
1386
  msgstr ""
1387
 
1388
- #: src/features/firewall.php:157
1389
- #: src/processors/hackprotect_corechecksumscan.php:214
1390
- #: src/processors/hackprotect_pluginvulnerabilities.php:108
1391
- #: src/processors/ips.php:191 src/processors/plugin.php:195
 
 
1392
  #, php-format
1393
  msgid "Warning - %s"
1394
  msgstr ""
1395
 
1396
- #: src/features/firewall.php:157
1397
  msgid "May cause an increase in false-positive firewall blocks."
1398
  msgstr ""
1399
 
1400
- #: src/features/firewall.php:161
1401
- msgid "Leading Schemas"
1402
- msgstr ""
1403
-
1404
- #: src/features/firewall.php:162
1405
- msgid "Block Leading Schemas (HTTPS / HTTP)"
1406
- msgstr ""
1407
-
1408
- #: src/features/firewall.php:163
1409
- msgid ""
1410
- "This will block leading schemas http:// and https:// in application "
1411
- "parameters (off by default; may cause problems with other plugins)."
1412
- msgstr ""
1413
-
1414
- #: src/features/firewall.php:167
1415
  msgid "Block Response"
1416
  msgstr ""
1417
 
1418
- #: src/features/firewall.php:168
1419
  msgid "Choose how the firewall responds when it blocks a request"
1420
  msgstr ""
1421
 
1422
- #: src/features/firewall.php:169
1423
  msgid ""
1424
  "We recommend dying with a message so you know what might have occurred when "
1425
  "the firewall blocks you"
1426
  msgstr ""
1427
 
1428
- #: src/features/firewall.php:173
1429
  msgid "Send Email Report"
1430
  msgstr ""
1431
 
1432
- #: src/features/firewall.php:174
1433
  msgid ""
1434
  "When a visitor is blocked the firewall will send an email to the configured "
1435
  "email address"
1436
  msgstr ""
1437
 
1438
- #: src/features/firewall.php:175
1439
  msgid ""
1440
  "Use with caution - if you get hit by automated bots you may send out too "
1441
  "many emails and you could get blocked by your host"
1442
  msgstr ""
1443
 
1444
- #: src/features/firewall.php:179
1445
  msgid "Whitelist Parameters"
1446
  msgstr ""
1447
 
1448
- #: src/features/firewall.php:180
1449
  msgid ""
1450
  "Detail pages and parameters that are whitelisted (ignored by the firewall)"
1451
  msgstr ""
1452
 
1453
- #: src/features/firewall.php:181
1454
  msgid ""
1455
  "This should be used with caution and you should only provide parameter names "
1456
  "that you must have excluded"
1457
  msgstr ""
1458
 
1459
- #: src/features/firewall.php:185 src/features/firewall.php:186
1460
- #: src/features/firewall.php:191
1461
  #, php-format
1462
  msgid "Ignore %s"
1463
  msgstr ""
1464
 
1465
- #: src/features/firewall.php:185 src/features/firewall.php:186
1466
- #: src/features/login_protect.php:328
1467
  msgid "Administrators"
1468
  msgstr ""
1469
 
1470
- #: src/features/firewall.php:187
1471
  msgid ""
1472
  "Authenticated administrator users will not be processed by the firewall "
1473
  "rules."
1474
  msgstr ""
1475
 
1476
- #: src/features/firewall.php:191
1477
  msgid "Search Engines"
1478
  msgstr ""
1479
 
1480
- #: src/features/firewall.php:192
1481
  msgid "Ignore Search Engine Bot Traffic"
1482
  msgstr ""
1483
 
1484
- #: src/features/firewall.php:193
1485
  msgid ""
1486
  "The firewall will try to recognise search engine spiders/bots and not apply "
1487
  "firewall rules to them."
1488
  msgstr ""
1489
 
1490
- #: src/features/firewall.php:197
1491
- msgid "Firewall Logging"
1492
- msgstr ""
1493
-
1494
- #: src/features/firewall.php:198
1495
- msgid "Turn on Firewall Log"
1496
  msgstr ""
1497
 
1498
- #: src/features/firewall.php:199
1499
- msgid ""
1500
- "Will log every visit to the site and how the firewall processes it. Not "
1501
- "recommended to leave on unless you want to debug something and check the "
1502
- "firewall is working as you expect"
1503
  msgstr ""
1504
 
1505
- #: src/features/hack_protect.php:22
1506
- msgid ""
1507
- "The Hack Protection system is a set of tools to warn you and protect you "
1508
- "against hacks on your site."
1509
  msgstr ""
1510
 
1511
- #: src/features/hack_protect.php:29 src/features/hack_protect.php:32
1512
- #: src/features/hack_protect.php:71
1513
- msgid "Plugin Vulnerabilities Scanner"
1514
  msgstr ""
1515
 
1516
- #: src/features/hack_protect.php:31
 
1517
  msgid ""
1518
- "Regularly scan your plugins against a database of known vulnerabilities."
 
1519
  msgstr ""
1520
 
1521
- #: src/features/hack_protect.php:34
1522
- msgid "Plugin Vulnerabilities"
1523
  msgstr ""
1524
 
1525
- #: src/features/hack_protect.php:38 src/features/hack_protect.php:41
1526
- msgid "Core File Integrity Scanner"
1527
  msgstr ""
1528
 
1529
- #: src/features/hack_protect.php:40
1530
  msgid ""
1531
- "Regularly scan your WordPress core files for changes compared to official "
1532
- "WordPress files."
1533
- msgstr ""
1534
-
1535
- #: src/features/hack_protect.php:43 src/features/hack_protect.php:77
1536
- msgid "Core File Scanner"
1537
  msgstr ""
1538
 
1539
- #: src/features/hack_protect.php:72 src/features/hack_protect.php:78
1540
- #, php-format
1541
- msgid "Daily Cron - %s"
1542
  msgstr ""
1543
 
1544
- #: src/features/hack_protect.php:72
1545
- msgid "Scans Plugins For Known Vulnerabilities"
1546
  msgstr ""
1547
 
1548
- #: src/features/hack_protect.php:73
1549
  msgid ""
1550
- "Runs a scan of all your plugins against a database of known WordPress plugin "
1551
  "vulnerabilities."
1552
  msgstr ""
1553
 
1554
- #: src/features/hack_protect.php:78
1555
- msgid "Scans WordPress Core Files For Alterations"
 
1556
  msgstr ""
1557
 
1558
- #: src/features/hack_protect.php:79
1559
  msgid ""
1560
- "Compares all WordPress core files on your site against the official "
1561
- "WordPress files."
1562
  msgstr ""
1563
 
1564
- #: src/features/hack_protect.php:80
1565
- msgid "WordPress Core files should never be altered for any reason."
 
1566
  msgstr ""
1567
 
1568
- #: src/features/hack_protect.php:84
1569
- msgid "Auto Repair"
1570
  msgstr ""
1571
 
1572
- #: src/features/hack_protect.php:85
1573
- msgid "Automatically Repair WordPress Core Files That Have Been Altered"
1574
  msgstr ""
1575
 
1576
- #: src/features/hack_protect.php:86
1577
  msgid ""
1578
- "Attempts to automatically repair WordPress Core files with the official "
1579
- "WordPress file data, for files that have been altered or are missing."
1580
  msgstr ""
1581
 
1582
- #: src/features/headers.php:100 src/features/headers.php:109
1583
- msgid ""
1584
- "Protect visitors to your site by implementing increased security response "
1585
- "headers."
1586
  msgstr ""
1587
 
1588
- #: src/features/headers.php:101 src/features/headers.php:110
1589
- #: src/features/headers.php:119
1590
- msgid ""
1591
- "Enabling these features are advised, but you must test them on your site "
1592
- "thoroughly."
1593
  msgstr ""
1594
 
1595
- #: src/features/headers.php:107
1596
- msgid "Advanced Security Headers"
1597
  msgstr ""
1598
 
1599
- #: src/features/headers.php:112
1600
- msgid "Security Headers"
1601
  msgstr ""
1602
 
1603
- #: src/features/headers.php:116 src/features/headers.php:121
1604
- #: src/features/headers.php:169
1605
- msgid "Content Security Policy"
1606
  msgstr ""
1607
 
1608
- #: src/features/headers.php:118
1609
- msgid ""
1610
- "Restrict the sources and types of content that may be loaded and processed "
1611
- "by visitor browsers."
1612
  msgstr ""
1613
 
1614
- #: src/features/headers.php:150
1615
- msgid "Block iFrames"
1616
  msgstr ""
1617
 
1618
- #: src/features/headers.php:151
1619
- msgid "Block Remote iFrames Of This Site"
1620
  msgstr ""
1621
 
1622
- #: src/features/headers.php:152
1623
- msgid ""
1624
- "The setting prevents any external website from embedding your site in an "
1625
- "iFrame."
1626
  msgstr ""
1627
 
1628
- #: src/features/headers.php:153
1629
- msgid "This is useful for preventing so-called \"ClickJack attacks\"."
1630
  msgstr ""
1631
 
1632
- #: src/features/headers.php:157
1633
- msgid "XSS Protection"
1634
  msgstr ""
1635
 
1636
- #: src/features/headers.php:158
1637
- msgid "Employ Built-In Browser XSS Protection"
1638
  msgstr ""
1639
 
1640
- #: src/features/headers.php:159
1641
- msgid ""
1642
- "Directs compatible browser to block what they detect as Reflective XSS "
1643
- "attacks."
1644
  msgstr ""
1645
 
1646
- #: src/features/headers.php:163
1647
- msgid "Prevent Mime-Sniff"
 
 
1648
  msgstr ""
1649
 
1650
- #: src/features/headers.php:164
1651
- msgid "Turn-Off Browser Mime-Sniff"
 
1652
  msgstr ""
1653
 
1654
- #: src/features/headers.php:165
1655
- msgid "Reduces visitor exposure to malicious user-uploaded content."
1656
  msgstr ""
1657
 
1658
- #: src/features/headers.php:171
1659
  msgid ""
1660
- "Allows for permission and restriction of all resources loaded on your site."
 
1661
  msgstr ""
1662
 
1663
- #: src/features/headers.php:175
1664
- msgid "Self"
1665
  msgstr ""
1666
 
1667
- #: src/features/headers.php:176
1668
- msgid "Allow 'self' Directive"
1669
  msgstr ""
1670
 
1671
- #: src/features/headers.php:177
1672
- msgid "Using 'self' is generally recommended."
 
 
1673
  msgstr ""
1674
 
1675
- #: src/features/headers.php:178
1676
- msgid ""
1677
- "It essentially means that resources from your own host:protocol are "
1678
- "permitted."
1679
  msgstr ""
1680
 
1681
- #: src/features/headers.php:182
1682
- msgid "Inline Entities"
 
 
1683
  msgstr ""
1684
 
1685
- #: src/features/headers.php:183
1686
- msgid "Allow Inline Scripts and CSS"
1687
  msgstr ""
1688
 
1689
- #: src/features/headers.php:184
1690
- msgid "Prevents loading of any assets from any domains you do not specify."
1691
  msgstr ""
1692
 
1693
- #: src/features/headers.php:188
1694
- msgid "Embedded Data"
1695
  msgstr ""
1696
 
1697
- #: src/features/headers.php:189
1698
- msgid "Allow \"data:\" Directives"
1699
  msgstr ""
1700
 
1701
- #: src/features/headers.php:190
1702
  msgid ""
1703
- "Allows use of embedded data directives, most commonly used for images and "
1704
- "fonts."
1705
  msgstr ""
1706
 
1707
- #: src/features/headers.php:194
1708
- msgid "Allow eval()"
1709
  msgstr ""
1710
 
1711
- #: src/features/headers.php:195
1712
- msgid "Allow Javascript eval()"
1713
  msgstr ""
1714
 
1715
- #: src/features/headers.php:196
1716
- msgid "Permits the use of Javascript the eval() function."
1717
  msgstr ""
1718
 
1719
- #: src/features/headers.php:200
1720
- msgid "HTTPS"
 
 
1721
  msgstr ""
1722
 
1723
- #: src/features/headers.php:201
1724
- msgid "HTTPS Resource Loading"
1725
  msgstr ""
1726
 
1727
- #: src/features/headers.php:202
1728
- msgid "Allows loading of any content provided over HTTPS."
 
 
1729
  msgstr ""
1730
 
1731
- #: src/features/headers.php:206
1732
- msgid "Permitted Hosts"
1733
  msgstr ""
1734
 
1735
- #: src/features/headers.php:207
1736
- msgid "Permitted Hosts and Domains"
1737
  msgstr ""
1738
 
1739
- #: src/features/headers.php:208
1740
  msgid ""
1741
- "You can explicitly state which hosts/domain from which content may be loaded."
1742
  msgstr ""
1743
 
1744
- #: src/features/headers.php:209
1745
  msgid ""
1746
- "Take great care and test your site as you may block legitimate resources."
 
1747
  msgstr ""
1748
 
1749
- #: src/features/headers.php:210
1750
- msgid "If in-doubt, leave blank or use \"*\" only."
1751
  msgstr ""
1752
 
1753
- #: src/features/headers.php:211
1754
- msgid ""
1755
- "You can force only HTTPS for a given domain by prefixing it with \"https://"
1756
- "\"."
1757
  msgstr ""
1758
 
1759
- #: src/features/ips.php:200
1760
- msgid ""
1761
- "You need to authenticate with the plugin Admin Access Protection system."
1762
  msgstr ""
1763
 
1764
- #: src/features/ips.php:222 src/features/user_management.php:57
1765
- #, php-format
1766
- msgid "now: %s"
1767
  msgstr ""
1768
 
1769
- #: src/features/ips.php:259
1770
- msgid ""
1771
- "The IP Manager allows you to whitelist, blacklist and configure auto-"
1772
- "blacklist rules."
1773
  msgstr ""
1774
 
1775
- #: src/features/ips.php:261
1776
- msgid "You should also carefully review the automatic black list settings."
1777
  msgstr ""
1778
 
1779
- #: src/features/ips.php:267 src/features/ips.php:270 src/features/ips.php:304
1780
- msgid "Automatic IP Black List"
1781
  msgstr ""
1782
 
1783
- #: src/features/ips.php:269
1784
- msgid ""
1785
- "The Automatic IP Black List system will block the IP addresses of naughty "
1786
- "visitors after a specified number of transgressions."
1787
  msgstr ""
1788
 
1789
- #: src/features/ips.php:272
1790
- msgid "Auto Black List"
1791
  msgstr ""
1792
 
1793
- #: src/features/ips.php:300
1794
- msgid "Transgression Limit"
 
 
1795
  msgstr ""
1796
 
1797
- #: src/features/ips.php:301
1798
- msgid ""
1799
- "Visitor IP address will be Black Listed after X bad actions on your site"
1800
  msgstr ""
1801
 
1802
- #: src/features/ips.php:302
 
 
1803
  #, php-format
1804
- msgid ""
1805
- "A black mark is set against an IP address each time a visitor trips the "
1806
- "defenses of the %s plugin."
1807
  msgstr ""
1808
 
1809
- #: src/features/ips.php:303
1810
  msgid ""
1811
- "When the number of these transgressions exceeds specified limit, they are "
1812
- "automatically blocked from accessing the site."
1813
  msgstr ""
1814
 
1815
- #: src/features/ips.php:304
1816
- #, php-format
1817
- msgid "Set this to \"0\" to turn off the %s feature."
 
1818
  msgstr ""
1819
 
1820
- #: src/features/ips.php:308
1821
- msgid "Auto Block Expiration"
 
 
 
1822
  msgstr ""
1823
 
1824
- #: src/features/ips.php:309
1825
- msgid "After 1 \"X\" a black listed IP will be removed from the black list"
1826
  msgstr ""
1827
 
1828
- #: src/features/ips.php:310
1829
- msgid "Permanent and lengthy IP Black Lists are harmful to performance."
1830
  msgstr ""
1831
 
1832
- #: src/features/ips.php:311
1833
  msgid ""
1834
- "You should allow IP addresses on the black list to be eventually removed "
1835
- "over time."
1836
  msgstr ""
1837
 
1838
- #: src/features/ips.php:312
1839
- msgid ""
1840
- "Shorter IP black lists are more efficient and a more intelligent use of an "
1841
- "IP-based blocking system."
1842
  msgstr ""
1843
 
1844
- #: src/features/ips.php:355
1845
- #, php-format
1846
- msgid ""
1847
- "Sorry, the %s feature may not be disabled while there are IP addresses in "
1848
- "the White List"
1849
  msgstr ""
1850
 
1851
- #: src/features/lockdown.php:35
1852
  msgid ""
1853
- "Lockdown helps secure-up certain loosely-controlled WordPress settings on "
1854
- "your site."
1855
  msgstr ""
1856
 
1857
- #: src/features/lockdown.php:42
1858
- msgid "WordPress System Lockdown"
 
 
 
1859
  msgstr ""
1860
 
1861
- #: src/features/lockdown.php:44
1862
- msgid "Lockdown certain core WordPress system features."
1863
  msgstr ""
1864
 
1865
- #: src/features/lockdown.php:45
1866
- msgid ""
1867
- "This depends on your usage and needs for certain WordPress functions and "
1868
- "features."
1869
  msgstr ""
1870
 
1871
- #: src/features/lockdown.php:47
1872
- msgid "System"
1873
  msgstr ""
1874
 
1875
- #: src/features/lockdown.php:51
1876
- msgid "Permissions and Access Options"
1877
  msgstr ""
1878
 
1879
- #: src/features/lockdown.php:53
1880
- msgid "Provides finer control of certain WordPress permissions."
1881
  msgstr ""
1882
 
1883
- #: src/features/lockdown.php:54
1884
- msgid "Only enable SSL if you have a valid certificate installed."
1885
  msgstr ""
1886
 
1887
- #: src/features/lockdown.php:56
1888
- msgid "Permissions"
1889
  msgstr ""
1890
 
1891
- #: src/features/lockdown.php:60
1892
- msgid "WordPress Obscurity Options"
 
 
1893
  msgstr ""
1894
 
1895
- #: src/features/lockdown.php:62
1896
- msgid "Obscures certain WordPress settings from public view."
 
 
1897
  msgstr ""
1898
 
1899
- #: src/features/lockdown.php:63
 
1900
  msgid ""
1901
- "Obscurity is not true security and so these settings are down to your "
1902
- "personal tastes."
1903
  msgstr ""
1904
 
1905
- #: src/features/lockdown.php:65
1906
- msgid "Obscurity"
1907
  msgstr ""
1908
 
1909
- #: src/features/lockdown.php:94
1910
- #, php-format
1911
- msgid "Disable %s"
1912
  msgstr ""
1913
 
1914
- #: src/features/lockdown.php:95
1915
- #, php-format
1916
- msgid "Disable The %s System"
1917
  msgstr ""
1918
 
1919
- #: src/features/lockdown.php:96
1920
- #, php-format
1921
- msgid "Checking this option will completely turn off the whole %s system."
 
1922
  msgstr ""
1923
 
1924
- #: src/features/lockdown.php:100
1925
- msgid "Disable File Editing"
1926
  msgstr ""
1927
 
1928
- #: src/features/lockdown.php:101
1929
- msgid "Disable Ability To Edit Files From Within WordPress"
1930
  msgstr ""
1931
 
1932
- #: src/features/lockdown.php:102
1933
  msgid ""
1934
- "Removes the option to directly edit any files from within the WordPress "
1935
- "admin area."
1936
  msgstr ""
1937
 
1938
- #: src/features/lockdown.php:103
1939
- msgid "Equivalent to setting \"DISALLOW_FILE_EDIT\" to TRUE."
1940
  msgstr ""
1941
 
1942
- #: src/features/lockdown.php:107
1943
- msgid "Force SSL Admin"
1944
  msgstr ""
1945
 
1946
- #: src/features/lockdown.php:108
1947
- msgid "Forces WordPress Admin Dashboard To Be Delivered Over SSL"
1948
  msgstr ""
1949
 
1950
- #: src/features/lockdown.php:109
1951
  msgid ""
1952
- "Please only enable this option if you have a valid SSL certificate installed."
1953
- msgstr ""
1954
-
1955
- #: src/features/lockdown.php:110
1956
- msgid "Equivalent to setting \"FORCE_SSL_ADMIN\" to TRUE."
1957
  msgstr ""
1958
 
1959
- #: src/features/lockdown.php:114
1960
- msgid "Mask WordPress Version"
1961
  msgstr ""
1962
 
1963
- #: src/features/lockdown.php:115
1964
- msgid "Prevents Public Display Of Your WordPress Version"
1965
  msgstr ""
1966
 
1967
- #: src/features/lockdown.php:116
1968
  msgid ""
1969
- "Enter how you would like your WordPress version displayed publicly. Leave "
1970
- "blank to disable this feature."
1971
  msgstr ""
1972
 
1973
- #: src/features/lockdown.php:117
1974
- msgid ""
1975
- "Warning: This may interfere with WordPress plugins that rely on the "
1976
- "$wp_version variable."
1977
  msgstr ""
1978
 
1979
- #: src/features/lockdown.php:121
1980
- msgid "WP Generator Tag"
1981
  msgstr ""
1982
 
1983
- #: src/features/lockdown.php:122
1984
- msgid "Remove WP Generator Meta Tag"
1985
  msgstr ""
1986
 
1987
- #: src/features/lockdown.php:123
1988
  msgid ""
1989
- "Remove a meta tag from your WordPress pages that publicly displays that your "
1990
- "site is WordPress and its current version."
1991
  msgstr ""
1992
 
1993
- #: src/features/lockdown.php:127
1994
- msgid "Block Username Fishing"
1995
  msgstr ""
1996
 
1997
- #: src/features/lockdown.php:128
1998
- msgid "Block the ability to discover WordPress usernames based on author IDs"
1999
  msgstr ""
2000
 
2001
- #: src/features/lockdown.php:129
2002
- #, php-format
2003
- msgid "When enabled, any URL requests containing \"%s\" will be killed."
2004
  msgstr ""
2005
 
2006
- #: src/features/lockdown.php:130 src/processors/ips.php:75
2007
- #, php-format
2008
- msgid "Warning: %s"
 
2009
  msgstr ""
2010
 
2011
- #: src/features/lockdown.php:130
2012
- msgid ""
2013
- "Enabling this option may interfere with expected operations of your site."
2014
  msgstr ""
2015
 
2016
- #: src/features/login_protect.php:80
2017
- msgid ""
2018
- "Before enabling 2-factor email authentication for your WordPress site, you "
2019
- "must verify you can receive this email."
2020
  msgstr ""
2021
 
2022
- #: src/features/login_protect.php:81
2023
  msgid ""
2024
- "This verifies your website can send email and that your account can receive "
2025
- "emails sent from your site."
2026
  msgstr ""
2027
 
2028
- #: src/features/login_protect.php:82
2029
- #, php-format
2030
- msgid "Verify Link: %s"
2031
  msgstr ""
2032
 
2033
- #: src/features/login_protect.php:84
2034
- #, php-format
2035
- msgid "Email Sending Verification For %s"
2036
  msgstr ""
2037
 
2038
- #: src/features/login_protect.php:124
2039
  msgid ""
2040
- "Login Protection blocks all automated and brute force attempts to log in to "
2041
- "your site."
2042
  msgstr ""
2043
 
2044
- #: src/features/login_protect.php:131
2045
- msgid "By-Pass Login Protection"
2046
  msgstr ""
2047
 
2048
- #: src/features/login_protect.php:133 src/features/user_management.php:101
2049
- msgid ""
2050
- "Compatibility with XML-RPC services such as the WordPress iPhone and Android "
2051
- "Apps."
2052
  msgstr ""
2053
 
2054
- #: src/features/login_protect.php:134 src/features/user_management.php:102
2055
- msgid "Keep this turned off unless you know you need it."
2056
  msgstr ""
2057
 
2058
- #: src/features/login_protect.php:136 src/features/user_management.php:104
2059
- msgid "By-Pass"
2060
  msgstr ""
2061
 
2062
- #: src/features/login_protect.php:140
2063
- msgid "Rename WP Login Page"
2064
  msgstr ""
2065
 
2066
- #: src/features/login_protect.php:142
2067
- msgid ""
2068
- "To hide your wp-login.php page from brute force attacks and hacking attempts "
2069
- "- if your login page cannot be found, no-one can login."
2070
  msgstr ""
2071
 
2072
- #: src/features/login_protect.php:143
2073
- msgid ""
2074
- "This is not required for complete security and if your site has irregular or "
2075
- "inconsistent configuration it may not work for you."
2076
  msgstr ""
2077
 
2078
- #: src/features/login_protect.php:145
2079
- #, php-format
2080
- msgid "Rename \"%s\""
2081
  msgstr ""
2082
 
2083
- #: src/features/login_protect.php:149 src/features/user_management.php:122
2084
- msgid "Multi-Factor Authentication"
 
2085
  msgstr ""
2086
 
2087
- #: src/features/login_protect.php:151 src/features/login_protect.php:171
2088
- #: src/features/user_management.php:119
2089
  msgid ""
2090
- "Verifies the identity of users who log in to your site - i.e. they are who "
2091
- "they say they are."
2092
  msgstr ""
2093
 
2094
- #: src/features/login_protect.php:152 src/features/user_management.php:120
2095
- msgid "However, if your host blocks email sending you may lock yourself out."
2096
  msgstr ""
2097
 
2098
- #: src/features/login_protect.php:153
2099
- msgid "You may combine multiple authentication factors for increased security."
 
 
2100
  msgstr ""
2101
 
2102
- #: src/features/login_protect.php:155
2103
- msgid "Two-Factor Authentication"
2104
  msgstr ""
2105
 
2106
- #: src/features/login_protect.php:156 src/features/plugin.php:370
2107
- msgid "2-Factor Auth"
2108
  msgstr ""
2109
 
2110
- #: src/features/login_protect.php:160
2111
- msgid "Brute Force Login Protection"
 
2112
  msgstr ""
2113
 
2114
- #: src/features/login_protect.php:162
2115
  msgid ""
2116
- "Blocks brute force hacking attacks against your login and registration pages."
 
2117
  msgstr ""
2118
 
2119
- #: src/features/login_protect.php:165
2120
- msgid "Brute Force"
 
 
 
2121
  msgstr ""
2122
 
2123
- #: src/features/login_protect.php:169
2124
- msgid "Yubikey Authentication"
2125
  msgstr ""
2126
 
2127
- #: src/features/login_protect.php:172
2128
- msgid "Note: you must own the appropriate Yubikey hardware device."
 
 
2129
  msgstr ""
2130
 
2131
- #: src/features/login_protect.php:174
2132
- msgid "Yubikey"
 
2133
  msgstr ""
2134
 
2135
- #: src/features/login_protect.php:202 src/features/user_management.php:160
2136
- msgid "XML-RPC Compatibility"
2137
  msgstr ""
2138
 
2139
- #: src/features/login_protect.php:203
2140
- msgid "Allow Login Through XML-RPC To By-Pass Login Protection Rules"
2141
  msgstr ""
2142
 
2143
- #: src/features/login_protect.php:204 src/features/user_management.php:162
2144
  msgid ""
2145
- "Enable this if you need XML-RPC functionality e.g. if you use the WordPress "
2146
- "iPhone/Android App."
2147
- msgstr ""
2148
-
2149
- #: src/features/login_protect.php:208
2150
- msgid "Rename WP Login"
2151
  msgstr ""
2152
 
2153
- #: src/features/login_protect.php:209
2154
- msgid "Rename The WordPress Login Page"
2155
  msgstr ""
2156
 
2157
- #: src/features/login_protect.php:210
2158
- msgid "Creating a path here will disable your wp-login.php"
2159
  msgstr ""
2160
 
2161
- #: src/features/login_protect.php:212
2162
- #, php-format
2163
- msgid "Only letters and numbers are permitted: %s"
2164
  msgstr ""
2165
 
2166
- #: src/features/login_protect.php:214
2167
- #, php-format
2168
- msgid "Your current login URL is: %s"
2169
  msgstr ""
2170
 
2171
- #: src/features/login_protect.php:219
2172
- #: src/processors/loginprotect_googleauthenticator.php:50
2173
- msgid "Google Authenticator"
 
2174
  msgstr ""
2175
 
2176
- #: src/features/login_protect.php:220
2177
- msgid "Allow Users To Use Google Authenticator"
2178
  msgstr ""
2179
 
2180
- #: src/features/login_protect.php:221
2181
  msgid ""
2182
- "When enabled, users will have the option to add Google Authenticator "
2183
- "authentication to their WordPress user profile"
2184
- msgstr ""
2185
-
2186
- #: src/features/login_protect.php:225 src/features/login_protect.php:231
2187
- #: src/features/login_protect.php:234
2188
- #: src/processors/loginprotect_twofactorauth.php:338
2189
- #: src/processors/loginprotect_twofactorauth.php:339
2190
- msgid "Email Authentication"
2191
  msgstr ""
2192
 
2193
- #: src/features/login_protect.php:226
2194
  #, php-format
2195
- msgid "Two-Factor Login Authentication By %s"
 
 
2196
  msgstr ""
2197
 
2198
- #: src/features/login_protect.php:227
2199
  msgid ""
2200
- "All users will be required to authenticate their login by email-based two-"
2201
- "factor authentication."
2202
  msgstr ""
2203
 
2204
- #: src/features/login_protect.php:231
2205
  #, php-format
2206
- msgid "Enforce - %s"
2207
  msgstr ""
2208
 
2209
- #: src/features/login_protect.php:232
2210
- msgid "All User Roles Subject To Email Authentication"
2211
  msgstr ""
2212
 
2213
- #: src/features/login_protect.php:233
2214
- msgid ""
2215
- "Enforces email-based authentication on all users with the selected roles."
2216
  msgstr ""
2217
 
2218
- #: src/features/login_protect.php:234
2219
- #, php-format
2220
- msgid "This setting only applies to %s."
2221
  msgstr ""
2222
 
2223
- #: src/features/login_protect.php:238
2224
- msgid "User Registration"
 
 
2225
  msgstr ""
2226
 
2227
- #: src/features/login_protect.php:239
2228
- msgid "Apply Brute Force Protection To User Registration And Lost Passwords"
 
 
2229
  msgstr ""
2230
 
2231
- #: src/features/login_protect.php:240
2232
- msgid ""
2233
- "When enabled, settings in this section will also apply to new user "
2234
- "registration and users trying to reset passwords."
2235
  msgstr ""
2236
 
2237
- #: src/features/login_protect.php:244
2238
- msgid "Login Cooldown Interval"
2239
  msgstr ""
2240
 
2241
- #: src/features/login_protect.php:245
2242
- msgid "Limit login attempts to every X seconds"
2243
  msgstr ""
2244
 
2245
- #: src/features/login_protect.php:246
2246
- msgid ""
2247
- "WordPress will process only ONE login attempt for every number of seconds "
2248
- "specified."
2249
  msgstr ""
2250
 
2251
- #: src/features/login_protect.php:247
2252
- msgid "Zero (0) turns this off."
2253
  msgstr ""
2254
 
2255
- #: src/features/login_protect.php:248
2256
- #, php-format
2257
- msgid "Default: \"%s\"."
2258
  msgstr ""
2259
 
2260
- #: src/features/login_protect.php:252
2261
- msgid "G.A.S.P Protection"
2262
  msgstr ""
2263
 
2264
- #: src/features/login_protect.php:253
2265
- msgid "Use G.A.S.P. Protection To Prevent Login Attempts By Bots"
2266
  msgstr ""
2267
 
2268
- #: src/features/login_protect.php:254
2269
  msgid ""
2270
- "Adds a dynamically (Javascript) generated checkbox to the login form that "
2271
- "prevents bots using automated login techniques."
2272
  msgstr ""
2273
 
2274
- #: src/features/login_protect.php:255 src/features/login_protect.php:269
2275
- msgid "ON"
 
 
 
2276
  msgstr ""
2277
 
2278
- #: src/features/login_protect.php:259
2279
- msgid "Google reCAPTCHA"
2280
  msgstr ""
2281
 
2282
- #: src/features/login_protect.php:260
2283
- msgid "Enable Google reCAPTCHA"
2284
  msgstr ""
2285
 
2286
- #: src/features/login_protect.php:261
2287
- msgid "Use Google reCAPTCHA on the login screen."
2288
  msgstr ""
2289
 
2290
- #: src/features/login_protect.php:265
2291
- msgid "Prevent Remote Login"
2292
  msgstr ""
2293
 
2294
- #: src/features/login_protect.php:266
2295
- msgid "Prevents Remote Login Attempts From Anywhere Except Your Site"
2296
  msgstr ""
2297
 
2298
- #: src/features/login_protect.php:267
2299
- msgid "Prevents login by bots attempting to login remotely to your site."
2300
  msgstr ""
2301
 
2302
- #: src/features/login_protect.php:268
2303
- msgid ""
2304
- "You will not be able to enable this option if your web server does not "
2305
- "support it."
2306
  msgstr ""
2307
 
2308
- #: src/features/login_protect.php:273
2309
- msgid "Enable Yubikey Authentication"
2310
  msgstr ""
2311
 
2312
- #: src/features/login_protect.php:274
2313
- msgid "Turn On / Off Yubikey Authentication On This Site"
2314
  msgstr ""
2315
 
2316
- #: src/features/login_protect.php:275
2317
- msgid ""
2318
- "Combined with your Yubikey API Key (below) this will form the basis of your "
2319
- "Yubikey Authentication"
2320
  msgstr ""
2321
 
2322
- #: src/features/login_protect.php:279
2323
- msgid "Yubikey App ID"
2324
  msgstr ""
2325
 
2326
- #: src/features/login_protect.php:280
2327
- msgid "Your Unique Yubikey App ID"
 
2328
  msgstr ""
2329
 
2330
- #: src/features/login_protect.php:281
2331
  msgid ""
2332
- "Combined with your Yubikey API Key this will form the basis of your Yubikey "
2333
- "Authentication"
2334
  msgstr ""
2335
 
2336
- #: src/features/login_protect.php:282
2337
- msgid ""
2338
- "Please review the info link on how to obtain your own Yubikey App ID and API "
2339
- "Key."
2340
  msgstr ""
2341
 
2342
- #: src/features/login_protect.php:286
2343
- msgid "Yubikey API Key"
2344
  msgstr ""
2345
 
2346
- #: src/features/login_protect.php:287
2347
- msgid "Your Unique Yubikey App API Key"
2348
  msgstr ""
2349
 
2350
- #: src/features/login_protect.php:288
2351
  msgid ""
2352
- "Combined with your Yubikey App ID this will form the basis of your Yubikey "
2353
- "Authentication."
2354
  msgstr ""
2355
 
2356
- #: src/features/login_protect.php:289
2357
- msgid ""
2358
- "Please review the info link on how to get your own Yubikey App ID and API "
2359
- "Key."
2360
  msgstr ""
2361
 
2362
- #: src/features/login_protect.php:293
2363
- msgid "Yubikey Unique Keys"
2364
  msgstr ""
2365
 
2366
- #: src/features/login_protect.php:294
2367
- msgid "Permitted \"Username - Yubikey\" Pairs For This Site"
2368
  msgstr ""
2369
 
2370
- #: src/features/login_protect.php:295
2371
- #, php-format
2372
- msgid "Format: %s"
2373
  msgstr ""
2374
 
2375
- #: src/features/login_protect.php:296
2376
- msgid "Provide Username<->Yubikey Pairs that are usable for this site."
2377
  msgstr ""
2378
 
2379
- #: src/features/login_protect.php:297
2380
- msgid ""
2381
- "If a Username if not assigned a Yubikey, Yubikey Authentication is OFF for "
2382
- "that user."
2383
  msgstr ""
2384
 
2385
- #: src/features/login_protect.php:298
2386
  msgid ""
2387
- "Each [Username,Key] pair should be separated by a new line: you only need to "
2388
- "provide the first 12 characters of the yubikey."
2389
- msgstr ""
2390
-
2391
- #: src/features/login_protect.php:324
2392
- msgid "Subscribers"
2393
  msgstr ""
2394
 
2395
- #: src/features/login_protect.php:325
2396
- msgid "Contributors"
2397
  msgstr ""
2398
 
2399
- #: src/features/login_protect.php:326
2400
- msgid "Authors"
 
2401
  msgstr ""
2402
 
2403
- #: src/features/login_protect.php:327
2404
- msgid "Editors"
 
2405
  msgstr ""
2406
 
2407
- #: src/features/plugin.php:59
2408
  #, php-format
2409
- msgid "%s Plugin options updated successfully."
2410
  msgstr ""
2411
 
2412
- #: src/features/plugin.php:99
2413
- msgid "Sorry, you do not have permission to disable this plugin."
2414
  msgstr ""
2415
 
2416
- #: src/features/plugin.php:100
2417
- msgid "You need to authenticate first."
2418
  msgstr ""
2419
 
2420
- #: src/features/plugin.php:182
2421
- msgid "Global Plugin Security Options"
2422
  msgstr ""
2423
 
2424
- #: src/features/plugin.php:183
2425
- msgid "Global Options"
2426
  msgstr ""
2427
 
2428
- #: src/features/plugin.php:187
2429
- msgid "General Plugin Options"
 
 
2430
  msgstr ""
2431
 
2432
- #: src/features/plugin.php:188
2433
- msgid "General Options"
2434
  msgstr ""
2435
 
2436
- #: src/features/plugin.php:192 src/features/plugin.php:193
2437
- msgid "Google"
2438
  msgstr ""
2439
 
2440
- #: src/features/plugin.php:197 src/features/plugin.php:198
2441
- msgid "Duo Security"
 
 
2442
  msgstr ""
2443
 
2444
- #: src/features/plugin.php:221
2445
- msgid "Enable Features"
2446
  msgstr ""
2447
 
2448
- #: src/features/plugin.php:222
2449
- msgid "Global Plugin On/Off Switch"
2450
  msgstr ""
2451
 
2452
- #: src/features/plugin.php:223
2453
- #, php-format
2454
- msgid "Uncheck this option to disable all %s features."
2455
  msgstr ""
2456
 
2457
- #: src/features/plugin.php:227
2458
- msgid "Information Gathering"
 
2459
  msgstr ""
2460
 
2461
- #: src/features/plugin.php:228
2462
- msgid "Permit Anonymous Usage Information Gathering"
2463
  msgstr ""
2464
 
2465
- #: src/features/plugin.php:229
2466
- msgid ""
2467
- "Allows us to gather information on statistics and features in-use across our "
2468
- "client installations."
2469
  msgstr ""
2470
 
2471
- #: src/features/plugin.php:230
2472
- msgid ""
2473
- "This information is strictly anonymous and contains no personally, or "
2474
- "otherwise, identifiable data."
2475
  msgstr ""
2476
 
2477
- #: src/features/plugin.php:231
2478
- msgid "Click to see the exact data that would be sent."
 
 
2479
  msgstr ""
2480
 
2481
- #: src/features/plugin.php:237
2482
- #, php-format
2483
- msgid "If this is empty, it will default to the blog admin email address: %s"
 
2484
  msgstr ""
2485
 
2486
- #: src/features/plugin.php:241
2487
- msgid "In-Plugin Notices"
2488
  msgstr ""
2489
 
2490
- #: src/features/plugin.php:242
2491
- msgid "Display Plugin Specific Notices"
2492
  msgstr ""
2493
 
2494
- #: src/features/plugin.php:243
2495
  msgid ""
2496
- "Disable this option to hide certain plugin admin notices about available "
2497
- "updates and post-update notices."
2498
  msgstr ""
2499
 
2500
- #: src/features/plugin.php:247
2501
- msgid "Show Plugin Badge"
2502
  msgstr ""
2503
 
2504
- #: src/features/plugin.php:248
2505
- msgid "Display Plugin Badge On Your Site"
2506
  msgstr ""
2507
 
2508
- #: src/features/plugin.php:249
2509
- msgid ""
2510
- "Enabling this option helps support the plugin by spreading the word about it "
2511
- "on your website."
2512
  msgstr ""
2513
 
2514
- #: src/features/plugin.php:250
2515
  msgid ""
2516
- "The plugin badge also lets visitors know your are taking your website "
2517
- "security seriously."
2518
  msgstr ""
2519
 
2520
- #: src/features/plugin.php:251
2521
- msgid "Read this carefully before enabling this option."
2522
  msgstr ""
2523
 
2524
- #: src/features/plugin.php:255
2525
- msgid "Installation ID"
2526
  msgstr ""
2527
 
2528
- #: src/features/plugin.php:256
2529
- msgid "Unique Plugin Installation ID"
 
 
2530
  msgstr ""
2531
 
2532
- #: src/features/plugin.php:257
2533
- msgid "Keep this ID private."
 
 
2534
  msgstr ""
2535
 
2536
- #: src/features/plugin.php:261
2537
- msgid "Delete Plugin Settings"
 
2538
  msgstr ""
2539
 
2540
- #: src/features/plugin.php:262
2541
- msgid "Delete All Plugin Settings Upon Plugin Deactivation"
 
2542
  msgstr ""
2543
 
2544
- #: src/features/plugin.php:263 src/features/plugin.php:275
2545
- msgid "Careful: Removes all plugin options when you deactivate the plugin"
2546
  msgstr ""
2547
 
2548
- #: src/features/plugin.php:267
2549
- msgid "reCAPTCHA Secret"
2550
  msgstr ""
2551
 
2552
- #: src/features/plugin.php:268
2553
- msgid "Google reCAPTCHA Secret Key"
2554
  msgstr ""
2555
 
2556
- #: src/features/plugin.php:269
2557
- msgid "Enter your Google reCAPTCHA site key for use throughout the plugin."
2558
  msgstr ""
2559
 
2560
- #: src/features/plugin.php:273
2561
- msgid "reCAPTCHA Site Key"
2562
  msgstr ""
2563
 
2564
- #: src/features/plugin.php:274
2565
- msgid "Google reCAPTCHA Site Key"
2566
  msgstr ""
2567
 
2568
- #: src/features/plugin.php:355
2569
- msgid "IP Whitelist"
2570
  msgstr ""
2571
 
2572
- #: src/features/plugin.php:356
2573
- msgid "IP Address White List"
 
 
2574
  msgstr ""
2575
 
2576
- #: src/features/plugin.php:357
2577
- msgid ""
2578
- "Any IP addresses on this list will by-pass all Plugin Security Checking."
2579
  msgstr ""
2580
 
2581
- #: src/features/plugin.php:358 src/processors/ips.php:90
2582
- #: src/processors/plugin.php:108 src/processors/plugin.php:181
2583
- #, php-format
2584
- msgid "Your IP address is: %s"
2585
  msgstr ""
2586
 
2587
- #: src/features/plugin.php:359
2588
- msgid "Choose IP Addresses To Blacklist"
2589
  msgstr ""
2590
 
2591
- #: src/features/plugin.php:361
2592
- msgid "Blacklist"
 
2593
  msgstr ""
2594
 
2595
- #: src/features/plugin.php:362
2596
- msgid "Logging"
2597
  msgstr ""
2598
 
2599
- #: src/features/plugin.php:363
2600
- #, php-format
2601
  msgid ""
2602
- "User \"%s\" was forcefully logged out as they were not verified by either "
2603
- "cookie or IP address (or both)."
2604
  msgstr ""
2605
 
2606
- #: src/features/plugin.php:364
2607
- #, php-format
2608
  msgid ""
2609
- "User \"%s\" was found to be un-verified at the given IP Address: \"%s\"."
 
2610
  msgstr ""
2611
 
2612
- #: src/features/plugin.php:365
2613
- msgid "Cookie"
 
2614
  msgstr ""
2615
 
2616
- #: src/features/plugin.php:367
2617
- msgid "IP"
2618
  msgstr ""
2619
 
2620
- #: src/features/plugin.php:368
2621
  msgid ""
2622
- "This will restrict all user login sessions to a single browser. Use this if "
2623
- "your users have dynamic IP addresses."
2624
  msgstr ""
2625
 
2626
- #: src/features/plugin.php:369
2627
- msgid ""
2628
- "All users will be required to authenticate their login by email-based two-"
2629
- "factor authentication, when logging in from a new IP address"
2630
  msgstr ""
2631
 
2632
- #: src/features/plugin.php:371
2633
- msgid "Include Logged-In Users"
2634
  msgstr ""
2635
 
2636
- #: src/features/plugin.php:372
2637
- msgid "You may also enable GASP for logged in users"
2638
  msgstr ""
2639
 
2640
- #: src/features/plugin.php:373
2641
  msgid ""
2642
- "Since logged-in users would be expected to be vetted already, this is off by "
2643
- "default."
2644
  msgstr ""
2645
 
2646
- #: src/features/statistics.php:22
2647
- msgid "Helps you see at a glance how effective the plugin has been."
2648
  msgstr ""
2649
 
2650
- #: src/features/statistics.php:29
2651
- msgid "Statistics Sharing"
2652
  msgstr ""
2653
 
2654
- #: src/features/statistics.php:31
2655
- msgid ""
2656
- "Help us to provide globally accessible statistics on the effectiveness of "
2657
- "the plugin."
2658
  msgstr ""
2659
 
2660
- #: src/features/statistics.php:32
2661
- msgid "Enabling this option helps us improve our plugin over time."
 
 
2662
  msgstr ""
2663
 
2664
- #: src/features/statistics.php:33
2665
- msgid "All statistics data collection is 100% anonymous."
2666
  msgstr ""
2667
 
2668
- #: src/features/statistics.php:33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2669
  msgid ""
2670
- "Neither we nor anyone else will be able to trace the data back to the "
2671
- "originating site."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2672
  msgstr ""
2673
 
2674
- #: src/features/statistics.php:36
2675
- msgid "Sharing"
2676
  msgstr ""
2677
 
2678
- #: src/features/statistics.php:65
2679
- msgid "Enable Statistic Sharing"
2680
  msgstr ""
2681
 
2682
- #: src/features/statistics.php:66
2683
- msgid ""
2684
- "The plugin will share its statistics to allow for global data gathering and "
2685
- "analysis"
2686
  msgstr ""
2687
 
2688
- #: src/features/statistics.php:67
2689
- msgid ""
2690
- "Sharing the statistics garnered from the plugin will help show how effective "
2691
- "we are and areas we can improve."
2692
  msgstr ""
2693
 
2694
- #: src/features/support.php:83
2695
- msgid "Contact Plugin Premium Support Centre."
 
2696
  msgstr ""
2697
 
2698
- #: src/features/user_management.php:68
2699
- msgid "Current User Sessions"
2700
  msgstr ""
2701
 
2702
- #: src/features/user_management.php:70
2703
- msgid "Logged In At"
 
2704
  msgstr ""
2705
 
2706
- #: src/features/user_management.php:71
2707
- msgid "Last Activity At"
 
2708
  msgstr ""
2709
 
2710
- #: src/features/user_management.php:72
2711
- msgid "Last Activity URI"
2712
  msgstr ""
2713
 
2714
- #: src/features/user_management.php:73
2715
- msgid "Login IP"
2716
  msgstr ""
2717
 
2718
- #: src/features/user_management.php:74
2719
- msgid "Login Attempts"
 
2720
  msgstr ""
2721
 
2722
- #: src/features/user_management.php:75
2723
- msgid ""
2724
- "You need to enable the User Management feature to view and manage user "
2725
- "sessions."
2726
  msgstr ""
2727
 
2728
- #: src/features/user_management.php:92
2729
- msgid ""
2730
- "User Management offers real user sessions, finer control over user session "
2731
- "time-out, and ensures users have logged-in in a correct manner."
2732
  msgstr ""
2733
 
2734
- #: src/features/user_management.php:99
2735
- msgid "By-Pass User Accounts Management"
2736
  msgstr ""
2737
 
2738
- #: src/features/user_management.php:108
2739
- msgid "Admin Login Notification"
 
2740
  msgstr ""
2741
 
2742
- #: src/features/user_management.php:110
2743
- msgid ""
2744
- "So you can be made aware of when a WordPress administrator has logged into "
2745
- "your site when you are not expecting it."
2746
  msgstr ""
2747
 
2748
- #: src/features/user_management.php:117
2749
- msgid "Multi-Factor User Authentication"
2750
  msgstr ""
2751
 
2752
- #: src/features/user_management.php:126
2753
- msgid "User Session Management"
2754
  msgstr ""
2755
 
2756
- #: src/features/user_management.php:128
2757
- msgid ""
2758
- "Allows you to better control user sessions on your site and expire idle "
2759
- "sessions and prevent account sharing."
2760
  msgstr ""
2761
 
2762
- #: src/features/user_management.php:131
2763
- msgid "Session Options"
2764
  msgstr ""
2765
 
2766
- #: src/features/user_management.php:161
2767
- msgid "Allow Login Through XML-RPC To By-Pass Accounts Management Rules"
 
2768
  msgstr ""
2769
 
2770
- #: src/features/user_management.php:166
2771
- msgid "Admin Login Notification Email"
 
2772
  msgstr ""
2773
 
2774
- #: src/features/user_management.php:167
2775
- msgid "Send An Notification Email When Administrator Logs In"
 
2776
  msgstr ""
2777
 
2778
- #: src/features/user_management.php:168
2779
- msgid ""
2780
- "If you would like to be notified every time an administrator user logs into "
2781
- "this WordPress site, enter a notification email address."
2782
  msgstr ""
2783
 
2784
- #: src/features/user_management.php:169
2785
- msgid "No email address - No Notification."
2786
  msgstr ""
2787
 
2788
- #: src/features/user_management.php:173
2789
- msgid "Session Timeout"
 
 
 
2790
  msgstr ""
2791
 
2792
- #: src/features/user_management.php:174
2793
- msgid "Specify How Many Days After Login To Automatically Force Re-Login"
 
2794
  msgstr ""
2795
 
2796
- #: src/features/user_management.php:175
2797
- msgid ""
2798
- "WordPress default is 2 days, or 14 days if you check the \"Remember Me\" box."
2799
  msgstr ""
2800
 
2801
- #: src/features/user_management.php:176
2802
- #, php-format
2803
- msgid "This cannot be less than %s."
 
 
 
 
 
 
 
 
 
 
 
2804
  msgstr ""
2805
 
2806
- #: src/features/user_management.php:177
2807
  #, php-format
2808
- msgid "Default: %s."
2809
  msgstr ""
2810
 
2811
- #: src/features/user_management.php:181
2812
- msgid "Idle Timeout"
2813
  msgstr ""
2814
 
2815
- #: src/features/user_management.php:182
2816
- msgid "Specify How Many Hours After Inactivity To Automatically Logout User"
2817
  msgstr ""
2818
 
2819
- #: src/features/user_management.php:183
2820
- msgid ""
2821
- "If the user is inactive for the number of hours specified, they will be "
2822
- "forcefully logged out next time they return."
2823
  msgstr ""
2824
 
2825
- #: src/features/user_management.php:184
 
 
2826
  #, php-format
2827
- msgid "Set to %s to turn off this option."
2828
  msgstr ""
2829
 
2830
- #: src/features/user_management.php:188
2831
- msgid "Lock To Location"
 
2832
  msgstr ""
2833
 
2834
- #: src/features/user_management.php:189
2835
- msgid "Locks A User Session To IP address"
2836
  msgstr ""
2837
 
2838
- #: src/features/user_management.php:190
2839
- msgid ""
2840
- "When selected, a session is restricted to the same IP address as when the "
2841
- "user logged in."
 
 
 
 
2842
  msgstr ""
2843
 
2844
- #: src/features/user_management.php:191
 
2845
  msgid ""
2846
- "If a logged-in user's IP address changes, the session will be invalidated "
2847
- "and they'll be forced to re-login to WordPress."
2848
  msgstr ""
2849
 
2850
- #: src/features/user_management.php:195
2851
- msgid "Max Simultaneous Sessions"
 
2852
  msgstr ""
2853
 
2854
- #: src/features/user_management.php:196
2855
- msgid "Limit Simultaneous Sessions For The Same Username"
2856
  msgstr ""
2857
 
2858
- #: src/features/user_management.php:197
 
 
 
 
 
2859
  msgid ""
2860
- "The number provided here is the maximum number of simultaneous, distinct, "
2861
- "sessions allowed for any given username."
2862
  msgstr ""
2863
 
2864
- #: src/features/user_management.php:198
2865
- msgid "Zero (0) will allow unlimited simultaneous sessions."
 
 
2866
  msgstr ""
2867
 
2868
- #: src/processors/admin_access_restriction.php:168
2869
  msgid ""
2870
- "Altering certain options has been restricted by your WordPress security "
2871
- "administrator."
2872
  msgstr ""
2873
 
2874
- #: src/processors/admin_access_restriction.php:169
2875
  msgid ""
2876
- "Repeated failed attempts to authenticate will probably lock you out of this "
2877
- "site."
2878
  msgstr ""
2879
 
2880
- #: src/processors/admin_access_restriction.php:175
2881
- msgid "Admin Access Login"
 
2882
  msgstr ""
2883
 
2884
- #: src/processors/admin_access_restriction.php:176
2885
- #: src/processors/admin_access_restriction.php:211
 
 
 
 
2886
  #, php-format
2887
- msgid "Go here to manage settings and authenticate with the %s plugin."
2888
  msgstr ""
2889
 
2890
- #: src/processors/admin_access_restriction.php:202
2891
- msgid ""
2892
- "Editing existing administrators, promoting existing users to the "
2893
- "administrator role, or deleting administrator users is currently restricted."
2894
  msgstr ""
2895
 
2896
- #: src/processors/admin_access_restriction.php:203
2897
- msgid ""
2898
- "Please authenticate with the Security Admin system before attempting any "
2899
- "administrator user modifications."
2900
  msgstr ""
2901
 
2902
- #: src/processors/admin_access_restriction.php:204
2903
- msgid "Unlock Now"
 
 
2904
  msgstr ""
2905
 
2906
- #: src/processors/admin_access_restriction.php:210
2907
- #: src/processors/admin_access_restriction.php:417
2908
- msgid "Security Admin Login"
 
2909
  msgstr ""
2910
 
2911
- #: src/processors/admin_access_restriction.php:394
2912
- msgid "Editing this option is currently restricted."
 
 
2913
  msgstr ""
2914
 
2915
- #: src/processors/admin_access_restriction.php:412
2916
- msgid "Unlock"
 
2917
  msgstr ""
2918
 
2919
- #: src/processors/audit_trail_emails.php:29
 
2920
  #, php-format
2921
- msgid "There was an attempt to send an email using the \"%s\" function."
2922
  msgstr ""
2923
 
2924
- #: src/processors/audit_trail_emails.php:30
2925
  #, php-format
2926
- msgid "It was sent to \"%s\" with the subject \"%s\"."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2927
  msgstr ""
2928
 
2929
- #: src/processors/audit_trail_plugins.php:32
 
2930
  #, php-format
2931
- msgid "Plugin \"%s\" was activated."
2932
  msgstr ""
2933
 
2934
- #: src/processors/audit_trail_plugins.php:49
 
2935
  #, php-format
2936
- msgid "Plugin \"%s\" was deactivated."
2937
  msgstr ""
2938
 
2939
- #: src/processors/audit_trail_plugins.php:71
2940
  #, php-format
2941
  msgid ""
2942
- "An attempt was made to edit the plugin file \"%s\" directly through the "
2943
- "WordPress editor."
 
 
 
 
 
2944
  msgstr ""
2945
 
2946
- #: src/processors/audit_trail_posts.php:34
 
 
 
 
 
 
 
 
2947
  #, php-format
2948
- msgid "WordPress Post entitled \"%s\" was permanently deleted from trash."
 
2949
  msgstr ""
2950
 
2951
- #: src/processors/audit_trail_posts.php:54
2952
- msgid "moved to trash"
 
 
2953
  msgstr ""
2954
 
2955
- #: src/processors/audit_trail_posts.php:58
2956
- msgid "recovered from trash"
2957
  msgstr ""
2958
 
2959
- #: src/processors/audit_trail_posts.php:62
2960
- msgid "published"
2961
  msgstr ""
2962
 
2963
- #: src/processors/audit_trail_posts.php:66
2964
- msgid "unpublished"
2965
  msgstr ""
2966
 
2967
- #: src/processors/audit_trail_posts.php:70
2968
- msgid "updated"
 
 
 
 
2969
  msgstr ""
2970
 
2971
- #: src/processors/audit_trail_posts.php:78
2972
  #, php-format
2973
- msgid "Post entitled \"%s\" was %s."
2974
  msgstr ""
2975
 
2976
- #: src/processors/audit_trail_themes.php:32
2977
  #, php-format
2978
- msgid "Theme \"%s\" was activated."
 
 
 
 
2979
  msgstr ""
2980
 
2981
- #: src/processors/audit_trail_themes.php:54
2982
  #, php-format
2983
  msgid ""
2984
- "An attempt was made to edit the theme file \"%s\" directly through the "
2985
- "WordPress editor."
 
 
 
 
 
 
 
 
2986
  msgstr ""
2987
 
2988
- #: src/processors/audit_trail_users.php:34
2989
  #, php-format
2990
- msgid "Attempted user login by \"%s\" was successful."
2991
  msgstr ""
2992
 
2993
- #: src/processors/audit_trail_users.php:53
2994
  #, php-format
2995
- msgid "Attempted user login by \"%s\" failed."
2996
  msgstr ""
2997
 
2998
- #: src/processors/audit_trail_users.php:72
2999
- msgid "New WordPress user registered."
 
3000
  msgstr ""
3001
 
3002
- #: src/processors/audit_trail_users.php:74
3003
  #, php-format
3004
- msgid "New username is \"%s\" with email address \"%s\"."
3005
  msgstr ""
3006
 
3007
- #: src/processors/audit_trail_users.php:96
3008
- msgid "WordPress user deleted."
 
3009
  msgstr ""
3010
 
3011
- #: src/processors/audit_trail_users.php:98
3012
  #, php-format
3013
- msgid "Username was \"%s\" with email address \"%s\"."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3014
  msgstr ""
3015
 
3016
- #: src/processors/audit_trail_users.php:103
3017
- msgid "Their posts were not reassigned to another user."
 
 
3018
  msgstr ""
3019
 
3020
- #: src/processors/audit_trail_users.php:107
3021
  #, php-format
3022
- msgid "Their posts were reassigned to user \"%s\"."
3023
  msgstr ""
3024
 
3025
- #: src/processors/audit_trail_wordpress.php:30
3026
- #, php-format
3027
- msgid "WordPress Core was updated from \"v%s\" to \"v%s\"."
3028
  msgstr ""
3029
 
3030
- #: src/processors/audit_trail_wordpress.php:45
3031
- #, php-format
3032
- msgid "WordPress Permalinks Structure was updated from \"%s\" to \"%s\"."
3033
  msgstr ""
3034
 
3035
- #: src/processors/autoupdates.php:315
3036
  #, php-format
3037
- msgid ""
3038
- "This is a quick notification from the %s that WordPress Automatic Updates "
3039
- "just completed on your site with the following results."
3040
  msgstr ""
3041
 
3042
- #: src/processors/autoupdates.php:323
3043
- msgid "Plugins Updated:"
 
 
 
3044
  msgstr ""
3045
 
3046
- #: src/processors/autoupdates.php:340
3047
- msgid "Themes Updated:"
3048
  msgstr ""
3049
 
3050
- #: src/processors/autoupdates.php:357
3051
- msgid "WordPress Core Updated:"
3052
  msgstr ""
3053
 
3054
- #: src/processors/autoupdates.php:376
3055
- msgid "Thank you."
 
 
3056
  msgstr ""
3057
 
3058
- #: src/processors/autoupdates.php:379 src/processors/ips.php:92
3059
- #: src/processors/user_management.php:193
3060
- #, php-format
3061
- msgid "Notice - %s"
3062
  msgstr ""
3063
 
3064
- #: src/processors/base_commentsfilter.php:113
3065
- #: src/processors/commentsfilter_antibotspam.php:497
3066
  #, php-format
3067
- msgid "%s plugin marked this comment as \"%s\"."
3068
  msgstr ""
3069
 
3070
- #: src/processors/base_commentsfilter.php:113
3071
- #: src/processors/commentsfilter_antibotspam.php:497
3072
- #, php-format
3073
- msgid "Reason: %s"
3074
  msgstr ""
3075
 
3076
- #: src/processors/base_plugin.php:58
3077
- msgid "I'd rather not show this support"
3078
  msgstr ""
3079
 
3080
- #: src/processors/base_plugin.php:58
3081
- msgid "I've done this already"
3082
  msgstr ""
3083
 
3084
- #: src/processors/base_plugin.php:82
3085
  #, php-format
3086
- msgid "Your PHP version is very (10+ years) old: %s"
3087
  msgstr ""
3088
 
3089
- #: src/processors/base_plugin.php:83
3090
- #, php-format
3091
- msgid "Future versions of the %s plugin will not support your PHP version."
3092
  msgstr ""
3093
 
3094
- #: src/processors/base_plugin.php:84
3095
- msgid ""
3096
- "You should ask your host to upgrade or provide a much newer PHP version."
3097
  msgstr ""
3098
 
3099
- #: src/processors/base_plugin.php:85
3100
- msgid "If you have any questions, please leave us a message in the forums."
3101
  msgstr ""
3102
 
3103
- #: src/processors/base_plugin.php:86 src/processors/base_plugin.php:124
3104
- #: src/processors/base_plugin.php:147
3105
- msgid "Dismiss this notice"
3106
  msgstr ""
3107
 
3108
- #: src/processors/base_plugin.php:122
3109
  #, php-format
3110
- msgid "There is an update available for the \"%s\" plugin."
3111
  msgstr ""
3112
 
3113
- #: src/processors/base_plugin.php:123
3114
- msgid "Please click to update immediately"
 
3115
  msgstr ""
3116
 
3117
- #: src/processors/base_plugin.php:144
3118
- #, php-format
3119
- msgid "Would you like to help translate the %s plugin into your language?"
3120
  msgstr ""
3121
 
3122
- #: src/processors/base_plugin.php:145
3123
  #, php-format
3124
- msgid "Head over to: %s"
3125
- msgstr ""
3126
-
3127
- #: src/processors/comments_filter.php:62
3128
- msgid ""
3129
- "It appears you have Akismet Anti-SPAM running alongside the our human Anti-"
3130
- "SPAM filter."
3131
  msgstr ""
3132
 
3133
- #: src/processors/comments_filter.php:63
3134
- msgid "This is not recommended and you should disable Akismet."
 
3135
  msgstr ""
3136
 
3137
- #: src/processors/comments_filter.php:64
3138
- msgid "Click to deactivate Akismet now."
3139
  msgstr ""
3140
 
3141
- #: src/processors/commentsfilter_antibotspam.php:181
3142
- #: src/processors/commentsfilter_antibotspam.php:186
3143
- #: src/processors/commentsfilter_antibotspam.php:191
3144
- #, php-format
3145
- msgid "Failed GASP Bot Filter Test (%s)"
3146
  msgstr ""
3147
 
3148
- #: src/processors/commentsfilter_antibotspam.php:181
3149
- msgid "checkbox"
 
 
3150
  msgstr ""
3151
 
3152
- #: src/processors/commentsfilter_antibotspam.php:186
3153
- msgid "honeypot"
 
 
3154
  msgstr ""
3155
 
3156
- #: src/processors/commentsfilter_antibotspam.php:191
3157
- msgid "comment token failure"
3158
  msgstr ""
3159
 
3160
- #: src/processors/commentsfilter_googlerecaptcha.php:71
3161
- #: src/processors/loginprotect_googlerecaptcha.php:80
3162
- msgid "Google reCAPTCHA was not submitted."
3163
  msgstr ""
3164
 
3165
- #: src/processors/commentsfilter_googlerecaptcha.php:79
3166
- #: src/processors/loginprotect_googlerecaptcha.php:88
3167
- msgid "Google reCAPTCHA verification failed."
3168
  msgstr ""
3169
 
3170
- #: src/processors/commentsfilter_humanspam.php:129
3171
- #, php-format
3172
- msgid "Human SPAM filter found \"%s\" in \"%s\""
3173
  msgstr ""
3174
 
3175
- #: src/processors/email.php:57
3176
- msgid "Hi !"
3177
  msgstr ""
3178
 
3179
- #: src/processors/email.php:68
 
3180
  #, php-format
3181
- msgid "This email was sent from the %s plugin, provided by %s."
3182
  msgstr ""
3183
 
3184
- #: src/processors/email.php:73
 
3185
  #, php-format
3186
- msgid "WordPress Site URL- %s."
 
 
3187
  msgstr ""
3188
 
3189
- #: src/processors/email.php:74
 
 
3190
  #, php-format
3191
- msgid "Current Plugin Version- %s."
3192
  msgstr ""
3193
 
3194
- #: src/processors/firewall.php:73 src/processors/firewall.php:86
3195
- #, php-format
3196
- msgid "Skipping firewall checking for this visit: %s."
3197
  msgstr ""
3198
 
3199
- #: src/processors/firewall.php:73
3200
- msgid "Parsing the URI failed"
 
3201
  msgstr ""
3202
 
3203
- #: src/processors/firewall.php:86
3204
- msgid "Visitor detected as Search Engine Bot"
 
 
3205
  msgstr ""
3206
 
3207
- #: src/processors/firewall.php:161 src/processors/firewall.php:220
3208
- #, php-format
3209
- msgid "Firewall Trigger: %s."
3210
  msgstr ""
3211
 
3212
- #: src/processors/firewall.php:161 src/processors/firewall.php:544
3213
- msgid "EXE File Uploads"
 
3214
  msgstr ""
3215
 
3216
- #: src/processors/firewall.php:213
3217
- msgid "Something in the URL, Form or Cookie data wasn't appropriate."
 
 
3218
  msgstr ""
3219
 
3220
- #: src/processors/firewall.php:214
3221
- msgid "Page parameter failed firewall check."
 
 
3222
  msgstr ""
3223
 
3224
- #: src/processors/firewall.php:215
 
3225
  #, php-format
3226
- msgid "The offending parameter was \"%s\" with a value of \"%s\"."
3227
  msgstr ""
3228
 
3229
- #: src/processors/firewall.php:261
3230
- msgid "Visitor connection was killed with wp_die()"
3231
  msgstr ""
3232
 
3233
- #: src/processors/firewall.php:264
3234
- msgid "Visitor connection was killed with wp_die() and a message"
3235
  msgstr ""
3236
 
3237
- #: src/processors/firewall.php:267
3238
- msgid "Visitor was sent HOME"
3239
  msgstr ""
3240
 
3241
- #: src/processors/firewall.php:270
3242
- msgid "Visitor was sent 404"
3243
  msgstr ""
3244
 
3245
- #: src/processors/firewall.php:273
3246
- msgid "Unknown"
 
 
3247
  msgstr ""
3248
 
3249
- #: src/processors/firewall.php:276
3250
- #, php-format
3251
- msgid "Firewall Block Response: %s."
3252
  msgstr ""
3253
 
3254
- #: src/processors/firewall.php:283
3255
- #, php-format
3256
- msgid "Successfully sent Firewall Block email alert to: %s"
3257
  msgstr ""
3258
 
3259
- #: src/processors/firewall.php:286
3260
- #, php-format
3261
- msgid "Failed to send Firewall Block email alert to: %s"
3262
  msgstr ""
3263
 
3264
- #: src/processors/firewall.php:330
3265
  #, php-format
3266
- msgid "You were blocked by the %s."
 
 
3267
  msgstr ""
3268
 
3269
- #: src/processors/firewall.php:471
3270
  #, php-format
3271
- msgid "%s has blocked a page visit to your site."
3272
- msgstr ""
3273
-
3274
- #: src/processors/firewall.php:472
3275
- msgid "Log details for this visitor are below:"
3276
  msgstr ""
3277
 
3278
- #: src/processors/firewall.php:473
3279
- #: src/processors/loginprotect_twofactorauth.php:306
3280
- #: src/processors/user_management.php:187
3281
- #, php-format
3282
- msgid "IP Address: %s"
3283
  msgstr ""
3284
 
3285
- #: src/processors/firewall.php:477
3286
- #, php-format
3287
- msgid "You can look up the offending IP Address here: %s"
3288
  msgstr ""
3289
 
3290
- #: src/processors/firewall.php:478
3291
- #, php-format
3292
- msgid "Firewall Block Email Alert for %s"
3293
  msgstr ""
3294
 
3295
- #: src/processors/firewall.php:532
3296
- msgid "Directory Traversal"
3297
  msgstr ""
3298
 
3299
- #: src/processors/firewall.php:547
3300
- msgid "Leading Schema"
3301
  msgstr ""
3302
 
3303
- #: src/processors/firewall.php:553
3304
- msgid "Aggressive Rules"
3305
  msgstr ""
3306
 
3307
- #: src/processors/firewall.php:556
3308
- msgid "Unknown Rules"
3309
  msgstr ""
3310
 
3311
- #: src/processors/hack_protect.php:52
3312
- #, php-format
3313
- msgid "%s escaped HTML the following comment due to its size: %s"
3314
  msgstr ""
3315
 
3316
- #: src/processors/hackprotect_corechecksumscan.php:179
3317
- #, php-format
3318
- msgid "%s has detected files on your site with potential problems."
3319
  msgstr ""
3320
 
3321
- #: src/processors/hackprotect_corechecksumscan.php:180
3322
- msgid ""
3323
- "This is part of the Hack Protection feature for the WordPress Core File "
3324
- "Scanner."
3325
  msgstr ""
3326
 
3327
- #: src/processors/hackprotect_corechecksumscan.php:182
3328
- #, php-format
3329
- msgid "Site Home URL - %s"
3330
  msgstr ""
3331
 
3332
- #: src/processors/hackprotect_corechecksumscan.php:184
3333
- msgid "Details for the problem files are below:"
3334
  msgstr ""
3335
 
3336
- #: src/processors/hackprotect_corechecksumscan.php:189
3337
- msgid ""
3338
- "The MD5 Checksum Hashes for following core files do not match the official "
3339
- "WordPress.org Checksum Hashes:"
3340
  msgstr ""
3341
 
3342
- #: src/processors/hackprotect_corechecksumscan.php:196
3343
- msgid "The following official WordPress core files are missing from your site:"
 
3344
  msgstr ""
3345
 
3346
- #: src/processors/hackprotect_corechecksumscan.php:204
 
3347
  msgid ""
3348
- "We have already attempted to repair these files based on your current "
3349
- "settings."
3350
  msgstr ""
3351
 
3352
- #: src/processors/hackprotect_corechecksumscan.php:205
 
3353
  msgid ""
3354
- "But, you should always check these files to ensure everything is as you "
3355
- "expect."
3356
  msgstr ""
3357
 
3358
- #: src/processors/hackprotect_corechecksumscan.php:208
3359
- msgid ""
3360
- "You should review these files and replace them with official versions if "
3361
- "required."
3362
  msgstr ""
3363
 
3364
- #: src/processors/hackprotect_corechecksumscan.php:209
3365
- msgid ""
3366
- "Alternatively you can have the plugin attempt to repair/replace these files "
3367
- "automatically."
3368
  msgstr ""
3369
 
3370
- #: src/processors/hackprotect_corechecksumscan.php:214
3371
- msgid "Core WordPress Files(s) Discovered That May Have Been Modified."
3372
  msgstr ""
3373
 
3374
- #: src/processors/hackprotect_corechecksumscan.php:218
3375
- #, php-format
3376
- msgid "Successfully sent Checksum Scan Notification email alert to: %s"
3377
  msgstr ""
3378
 
3379
- #: src/processors/hackprotect_corechecksumscan.php:221
3380
  #, php-format
3381
- msgid "Failed to send Checksum Scan Notification email alert to: %s"
3382
- msgstr ""
3383
-
3384
- #: src/processors/hackprotect_corechecksumscan.php:239
3385
- msgid "Repair file now"
3386
  msgstr ""
3387
 
3388
- #: src/processors/hackprotect_corechecksumscan.php:241
3389
- msgid "WordPress.org source file"
3390
  msgstr ""
3391
 
3392
- #: src/processors/hackprotect_pluginvulnerabilities.php:80
3393
  #, php-format
3394
- msgid "Plugin Name: %s"
3395
  msgstr ""
3396
 
3397
- #: src/processors/hackprotect_pluginvulnerabilities.php:81
 
3398
  #, php-format
3399
- msgid "Vulnerability Type: %s"
3400
  msgstr ""
3401
 
3402
- #: src/processors/hackprotect_pluginvulnerabilities.php:82
3403
- #, php-format
3404
- msgid "Vulnerable Plugin Version Range: %s"
3405
  msgstr ""
3406
 
3407
- #: src/processors/hackprotect_pluginvulnerabilities.php:83
3408
- #, php-format
3409
- msgid "Further Information: %s"
3410
  msgstr ""
3411
 
3412
- #: src/processors/hackprotect_pluginvulnerabilities.php:100
3413
  #, php-format
3414
  msgid ""
3415
- "%s has detected a plugin with a known security vulnerability on your site."
 
3416
  msgstr ""
3417
 
3418
- #: src/processors/hackprotect_pluginvulnerabilities.php:101
3419
- msgid "Details for the plugin(s) are below:"
 
 
 
3420
  msgstr ""
3421
 
3422
- #: src/processors/hackprotect_pluginvulnerabilities.php:106
3423
- msgid "You should update or remove these plugins at your earliest convenience."
3424
  msgstr ""
3425
 
3426
- #: src/processors/hackprotect_pluginvulnerabilities.php:108
3427
- msgid "Plugin(s) Discovered With Known Security Vulnerabilities."
 
 
3428
  msgstr ""
3429
 
3430
- #: src/processors/hackprotect_pluginvulnerabilities.php:113
 
3431
  #, php-format
3432
- msgid "Successfully sent Plugin Vulnerability Notification email alert to: %s"
 
 
3433
  msgstr ""
3434
 
3435
- #: src/processors/hackprotect_pluginvulnerabilities.php:116
3436
  #, php-format
3437
- msgid "Failed to send Plugin Vulnerability Notification email alert to: %s"
 
3438
  msgstr ""
3439
 
3440
- #: src/processors/hackprotect_pluginvulnerabilities.php:149
3441
  #, php-format
3442
  msgid ""
3443
- "%s has discovered that the currently installed version of the \"%s\" plugin "
3444
- "has a known security vulnerability."
3445
- msgstr ""
3446
-
3447
- #: src/processors/hackprotect_pluginvulnerabilities.php:150
3448
- msgid "Vulnerability Type"
3449
- msgstr ""
3450
-
3451
- #: src/processors/hackprotect_pluginvulnerabilities.php:152
3452
- msgid "Vulnerable Versions"
3453
  msgstr ""
3454
 
3455
- #: src/processors/ips.php:75
3456
  msgid ""
3457
- "Repeated login attempts that fail will result in a complete ban of your IP "
3458
- "Address."
3459
  msgstr ""
3460
 
3461
- #: src/processors/ips.php:93
3462
- msgid ""
3463
- "You should know that your IP address is whitelisted and features you "
3464
- "activate do not apply to you."
3465
  msgstr ""
3466
 
3467
- #: src/processors/ips.php:95
3468
- msgid "Including the Rename WP Login feature."
3469
  msgstr ""
3470
 
3471
- #: src/processors/ips.php:193
3472
- #, php-format
3473
- msgid ""
3474
- "You have %s remaining transgression(s) against this site and then you will "
3475
- "be black listed."
3476
  msgstr ""
3477
 
3478
- #: src/processors/ips.php:196
3479
- msgid "Seriously, stop repeating what you are doing or you will be locked out."
3480
  msgstr ""
3481
 
3482
- #: src/processors/ips.php:243
3483
- #, php-format
3484
- msgid ""
3485
- "Visitor was found to be on the Black List with IP address \"%s\" and their "
3486
- "connection was killed."
3487
  msgstr ""
3488
 
3489
- #: src/processors/ips.php:251
3490
- #, php-format
3491
- msgid "You have been black listed by the %s plugin."
3492
  msgstr ""
3493
 
3494
- #: src/processors/ips.php:254
3495
- #, php-format
3496
- msgid ""
3497
- "You tripped the security plugin defenses a total of %s times making you a "
3498
- "suspect."
3499
  msgstr ""
3500
 
3501
- #: src/processors/ips.php:255
3502
- msgid "If you believe this to be in error, please contact the site owner."
 
 
 
 
 
 
 
3503
  msgstr ""
3504
 
3505
- #: src/processors/ips.php:256
3506
  #, php-format
3507
  msgid ""
3508
- "Time remaining until you are automatically removed from the black list: %s "
3509
- "minute(s)"
3510
  msgstr ""
3511
 
3512
- #: src/processors/ips.php:257
 
3513
  msgid ""
3514
- "If you attempt to access the site within this period the counter will be "
3515
- "reset."
3516
  msgstr ""
3517
 
3518
- #: src/processors/ips.php:259
3519
- msgid "Click here if you are the site owner."
 
 
3520
  msgstr ""
3521
 
3522
- #: src/processors/ips.php:304
3523
- #, php-format
3524
  msgid ""
3525
- "Auto Black List transgression counter was incremented from \"%s\" for "
3526
- "visitor at IP address \"%s\"."
3527
  msgstr ""
3528
 
3529
- #: src/processors/ips.php:313
 
3530
  #, php-format
3531
  msgid ""
3532
- "Auto Black List transgression counter was started for visitor at IP address "
3533
- "\"%s\"."
3534
- msgstr ""
3535
-
3536
- #: src/processors/ips.php:480
3537
- msgid "No Label"
3538
  msgstr ""
3539
 
3540
- #: src/processors/lockdown.php:152
3541
  #, php-format
3542
  msgid ""
3543
- "The \"author\" query parameter has been blocked by %s to protect against "
3544
- "user login name fishing."
3545
  msgstr ""
3546
 
3547
- #: src/processors/lockdown.php:153 src/processors/plugin_tracking.php:37
3548
- msgid "Learn More."
3549
  msgstr ""
3550
 
3551
- #: src/processors/login_protect.php:80
 
3552
  msgid ""
3553
- "Before completing activation of email-based two-factor authentication we "
3554
- "need you to confirm your site can send emails."
3555
  msgstr ""
3556
 
3557
- #: src/processors/login_protect.php:81
3558
- msgid "Please click the link in the email you received."
3559
  msgstr ""
3560
 
3561
- #: src/processors/login_protect.php:82
3562
  #, php-format
3563
- msgid "The email has been sent to you at blog admin address: %s"
3564
- msgstr ""
3565
-
3566
- #: src/processors/login_protect.php:83
3567
- msgid "To have this email resent, re-save your Login Protection settings."
3568
  msgstr ""
3569
 
3570
- #: src/processors/login_protect.php:84
3571
- msgid "To turn this notice off, disable Two Factor authentication."
 
3572
  msgstr ""
3573
 
3574
- #: src/processors/login_protect.php:104
3575
- msgid ""
3576
- "Your Two-Factor Authentication was un-verified or invalidated by a login "
3577
- "from another location or browser."
3578
  msgstr ""
3579
 
3580
- #: src/processors/login_protect.php:104
3581
- #: src/processors/usermanagement_sessions.php:419
3582
- msgid "Please login again."
3583
  msgstr ""
3584
 
3585
- #: src/processors/loginprotect_cooldown.php:49
3586
- msgid "Login Cooldown in effect."
 
3587
  msgstr ""
3588
 
3589
- #: src/processors/loginprotect_cooldown.php:51
3590
  #, php-format
3591
- msgid "You must wait %s seconds before attempting to %s again."
3592
  msgstr ""
3593
 
3594
- #: src/processors/loginprotect_cooldown.php:53
3595
- #: src/processors/loginprotect_gasp.php:62
3596
- msgid "login"
3597
  msgstr ""
3598
 
3599
- #: src/processors/loginprotect_cooldown.php:53
3600
- #: src/processors/loginprotect_gasp.php:74
3601
- msgid "register"
 
3602
  msgstr ""
3603
 
3604
- #: src/processors/loginprotect_gasp.php:66
3605
- #: src/processors/loginprotect_gasp.php:78
3606
- #: src/processors/loginprotect_gasp.php:90
3607
- msgid "G.A.S.P. Checking Failed."
3608
  msgstr ""
3609
 
3610
- #: src/processors/loginprotect_gasp.php:86
3611
- msgid "reset-password"
 
3612
  msgstr ""
3613
 
3614
- #: src/processors/loginprotect_gasp.php:98
3615
- msgid "I'm a human."
3616
  msgstr ""
3617
 
3618
- #: src/processors/loginprotect_gasp.php:99
3619
- msgid "Please check the box to show us you're a human."
3620
  msgstr ""
3621
 
3622
- #: src/processors/loginprotect_gasp.php:144
3623
- msgid "You MUST enable Javascript to be able to login"
 
3624
  msgstr ""
3625
 
3626
- #: src/processors/loginprotect_gasp.php:171
3627
  #, php-format
3628
- msgid "User \"%s\" attempted to %s but GASP checkbox was not present."
3629
  msgstr ""
3630
 
3631
- #: src/processors/loginprotect_gasp.php:171
3632
- #: src/processors/loginprotect_gasp.php:182
3633
- msgid "Probably a BOT."
3634
  msgstr ""
3635
 
3636
- #: src/processors/loginprotect_gasp.php:178
3637
- msgid "You must check that box to say you're not a bot."
 
3638
  msgstr ""
3639
 
3640
- #: src/processors/loginprotect_gasp.php:182
3641
  #, php-format
3642
- msgid "User \"%s\" attempted to %s but they were caught by the GASP honeypot."
3643
  msgstr ""
3644
 
3645
- #: src/processors/loginprotect_gasp.php:189
3646
  #, php-format
3647
- msgid "You appear to be a bot - terminating %s attempt."
3648
  msgstr ""
3649
 
3650
- #: src/processors/loginprotect_googleauthenticator.php:42
3651
- msgid "Provide the current code generated by your Google Authenticator app."
3652
  msgstr ""
3653
 
3654
- #: src/processors/loginprotect_googleauthenticator.php:43
3655
  msgid ""
3656
- "Use your Google Authenticator app to scan this QR code and enter the one "
3657
- "time password below."
3658
  msgstr ""
3659
 
3660
- #: src/processors/loginprotect_googleauthenticator.php:44
3661
- msgid ""
3662
- "If you have a problem with scanning the QR code enter this code manually "
3663
- "into the app."
3664
  msgstr ""
3665
 
3666
- #: src/processors/loginprotect_googleauthenticator.php:45
3667
- msgid "Check the box to remove Google Authenticator login authentication."
3668
  msgstr ""
3669
 
3670
- #: src/processors/loginprotect_googleauthenticator.php:46
3671
- msgid "Remove Google Authenticator"
3672
  msgstr ""
3673
 
3674
- #: src/processors/loginprotect_googleauthenticator.php:47
3675
- #: src/processors/loginprotect_googleauthenticator.php:167
3676
- msgid "Google Authenticator Code"
3677
  msgstr ""
3678
 
3679
- #: src/processors/loginprotect_googleauthenticator.php:48
3680
- msgid "Manual Code"
3681
  msgstr ""
3682
 
3683
- #: src/processors/loginprotect_googleauthenticator.php:49
3684
- msgid "Scan This QR Code"
3685
  msgstr ""
3686
 
3687
- #: src/processors/loginprotect_googleauthenticator.php:51
3688
- msgid "Sorry, Google Authenticator may not be added to another user's account."
3689
  msgstr ""
3690
 
3691
- #: src/processors/loginprotect_googleauthenticator.php:52
3692
- msgid ""
3693
- "Sorry, Google Authenticator may not be removed from another administrator's "
3694
- "account."
3695
  msgstr ""
3696
 
3697
- #: src/processors/loginprotect_googleauthenticator.php:53
3698
- #: src/processors/loginprotect_twofactorauth.php:341
3699
- #, php-format
3700
- msgid "Provided by %s"
3701
  msgstr ""
3702
 
3703
- #: src/processors/loginprotect_googleauthenticator.php:130
3704
- #: src/processors/loginprotect_googlerecaptcha.php:79
3705
- #: src/processors/loginprotect_googlerecaptcha.php:87
3706
- msgid "Whoops."
3707
  msgstr ""
3708
 
3709
- #: src/processors/loginprotect_googleauthenticator.php:131
3710
- msgid "Did we forget to use the Google Authenticator?"
3711
  msgstr ""
3712
 
3713
- #: src/processors/loginprotect_googleauthenticator.php:137
3714
- msgid "Oh dear."
3715
  msgstr ""
3716
 
3717
- #: src/processors/loginprotect_googleauthenticator.php:138
3718
- msgid "Google Authenticator Code Failed."
3719
  msgstr ""
3720
 
3721
- #: src/processors/loginprotect_googleauthenticator.php:169
3722
- msgid "Use only if setup on your account"
3723
  msgstr ""
3724
 
3725
- #: src/processors/loginprotect_twofactorauth.php:77
3726
  #, php-format
3727
- msgid "User \"%s\" verified their identity using Two-Factor Authentication."
 
 
3728
  msgstr ""
3729
 
3730
- #: src/processors/loginprotect_twofactorauth.php:141
3731
- msgid "Login is protected by 2-factor authentication."
 
3732
  msgstr ""
3733
 
3734
- #: src/processors/loginprotect_twofactorauth.php:142
3735
  msgid ""
3736
- "If your login details were correct, you will have received an email to "
3737
- "complete the login process."
3738
  msgstr ""
3739
 
3740
- #: src/processors/loginprotect_twofactorauth.php:302
3741
- msgid ""
3742
- "You, or someone pretending to be you, just attempted to login into your "
3743
- "WordPress site."
3744
  msgstr ""
3745
 
3746
- #: src/processors/loginprotect_twofactorauth.php:303
3747
- msgid ""
3748
- "The IP Address / Cookie from which they tried to login is not currently "
3749
- "verified."
3750
  msgstr ""
3751
 
3752
- #: src/processors/loginprotect_twofactorauth.php:304
3753
- msgid "Click the following link to validate and complete the login process."
 
3754
  msgstr ""
3755
 
3756
- #: src/processors/loginprotect_twofactorauth.php:304
3757
- msgid "You will be logged in automatically upon successful authentication."
3758
  msgstr ""
3759
 
3760
- #: src/processors/loginprotect_twofactorauth.php:305
3761
- #: src/processors/user_management.php:185
3762
  #, php-format
3763
- msgid "Username: %s"
3764
  msgstr ""
3765
 
3766
- #: src/processors/loginprotect_twofactorauth.php:307
3767
  #, php-format
3768
- msgid "Authentication Link: %s"
3769
  msgstr ""
3770
 
3771
- #: src/processors/loginprotect_twofactorauth.php:309
3772
- #, php-format
3773
- msgid "Two-Factor Login Verification for %s"
 
3774
  msgstr ""
3775
 
3776
- #: src/processors/loginprotect_twofactorauth.php:313
3777
- #, php-format
3778
  msgid ""
3779
- "User \"%s\" was sent an email to verify their Identity using Two-Factor "
3780
- "Login Auth for IP address \"%s\"."
3781
  msgstr ""
3782
 
3783
- #: src/processors/loginprotect_twofactorauth.php:317
3784
  #, php-format
3785
- msgid ""
3786
- "Tried to send email to User \"%s\" to verify their identity using Two-Factor "
3787
- "Login Auth for IP address \"%s\", but email sending failed."
3788
  msgstr ""
3789
 
3790
- #: src/processors/loginprotect_twofactorauth.php:340
3791
- msgid "Check the box to enable email-based login authentication."
 
3792
  msgstr ""
3793
 
3794
- #: src/processors/loginprotect_wplogin.php:48
3795
- msgid ""
3796
- "Your login URL is unchanged because the Rename WP Login feature is not "
3797
- "currently supported on WPMS."
3798
  msgstr ""
3799
 
3800
- #: src/processors/loginprotect_wplogin.php:52
3801
- #: src/processors/loginprotect_wplogin.php:56
3802
  #, php-format
3803
- msgid ""
3804
- "Can not use the Rename WP Login feature because you have the \"%s\" plugin "
3805
- "installed and it is active."
3806
  msgstr ""
3807
 
3808
- #: src/processors/loginprotect_wplogin.php:60
3809
- #, php-format
3810
- msgid ""
3811
- "Can not use the Rename WP Login feature because you have not enabled %s."
3812
  msgstr ""
3813
 
3814
- #: src/processors/loginprotect_wplogin.php:64
3815
- #, php-format
3816
- msgid ""
3817
- "Can not use the Rename WP Login feature because you have chosen a path (\"%s"
3818
- "\") that is reserved on your WordPress site."
3819
  msgstr ""
3820
 
3821
- #: src/processors/loginprotect_wplogin.php:70
3822
- #: src/processors/loginprotect_wplogin.php:89
3823
- msgid "Warning"
3824
  msgstr ""
3825
 
3826
- #: src/processors/loginprotect_wplogin.php:90
3827
- msgid ""
3828
- "Your login URL is unchanged because your current hosting/PHP configuration "
3829
- "cannot parse the necessary information."
3830
  msgstr ""
3831
 
3832
- #: src/processors/loginprotect_yubikey.php:57
3833
- #, php-format
3834
- msgid ""
3835
- "User \"%s\" logged in without a Yubikey One Time Password because no "
3836
- "username-yubikey pair was found for this user."
3837
  msgstr ""
3838
 
3839
- #: src/processors/loginprotect_yubikey.php:66
3840
- #: src/processors/loginprotect_yubikey.php:86
3841
- #: src/processors/loginprotect_yubikey.php:102
3842
- #, php-format
3843
- msgid "ERROR: %s"
3844
  msgstr ""
3845
 
3846
- #: src/processors/loginprotect_yubikey.php:66
3847
- msgid ""
3848
- "The Yubikey provided is not on the list of permitted keys for this user."
3849
  msgstr ""
3850
 
3851
- #: src/processors/loginprotect_yubikey.php:68
 
 
 
 
3852
  #, php-format
3853
- msgid ""
3854
- "User \"%s\" attempted to login but Yubikey ID \"%s\" used was not in list of "
3855
- "authorised keys."
3856
  msgstr ""
3857
 
3858
- #: src/processors/loginprotect_yubikey.php:86
3859
- #: src/processors/loginprotect_yubikey.php:102
3860
- msgid "The Yubikey authentication was not validated successfully."
3861
  msgstr ""
3862
 
3863
- #: src/processors/loginprotect_yubikey.php:88
3864
- #, php-format
3865
- msgid ""
3866
- "User \"%s\" attempted to login but Yubikey One Time Password failed to "
3867
- "validate due to invalid Yubi API."
3868
  msgstr ""
3869
 
3870
- #: src/processors/loginprotect_yubikey.php:104
3871
  #, php-format
3872
- msgid ""
3873
- "User \"%s\" attempted to login but Yubikey One Time Password failed to "
3874
- "validate due to invalid Yubi API response status: \"%s\"."
3875
  msgstr ""
3876
 
3877
- #: src/processors/loginprotect_yubikey.php:109
3878
- #, php-format
3879
- msgid ""
3880
- "User \"%s\" successfully logged in using a validated Yubikey One Time "
3881
- "Password."
3882
  msgstr ""
3883
 
3884
- #: src/processors/loginprotect_yubikey.php:124
3885
- msgid "Yubikey OTP"
3886
  msgstr ""
3887
 
3888
- #: src/processors/plugin.php:104
3889
  #, php-format
3890
- msgid "%s is provided by %s"
3891
  msgstr ""
3892
 
3893
- #: src/processors/plugin.php:106
3894
- #, php-format
3895
- msgid "Days Installed: %s"
3896
  msgstr ""
3897
 
3898
- #: src/processors/plugin.php:169
3899
- #, php-format
3900
- msgid "This Site Is Protected By %s"
3901
  msgstr ""
3902
 
3903
- #: src/processors/plugin.php:195
3904
- #, php-format
3905
- msgid "%s is not currently running"
3906
  msgstr ""
3907
 
3908
- #: src/processors/plugin.php:196
3909
  #, php-format
3910
- msgid "Please delete the \"%s\" file to reactivate the Firewall processing"
3911
  msgstr ""
3912
 
3913
- #: src/processors/plugin.php:217
3914
- msgid "Your Name"
3915
  msgstr ""
3916
 
3917
- #: src/processors/plugin.php:218
3918
- msgid "Your Email"
3919
  msgstr ""
3920
 
3921
- #: src/processors/plugin_badgewidget.php:16
3922
  #, php-format
3923
- msgid "%s Plugin Badge"
3924
  msgstr ""
3925
 
3926
- #: src/processors/plugin_badgewidget.php:18
3927
- #, php-format
3928
- msgid ""
3929
- "You can now help spread the word about the %s plugin anywhere on your site"
3930
  msgstr ""
3931
 
3932
- #: src/processors/plugin_badgewidget.php:64
3933
- msgid "Site Secured"
3934
  msgstr ""
3935
 
3936
- #: src/processors/plugin_tracking.php:31
3937
- #, php-format
3938
- msgid "Will you help us to make %s even better?"
3939
  msgstr ""
3940
 
3941
- #: src/processors/plugin_tracking.php:32
3942
- msgid ""
3943
- "We're working to understand how people, just like you, use this plugin every "
3944
- "day."
3945
  msgstr ""
3946
 
3947
- #: src/processors/plugin_tracking.php:33
3948
- msgid ""
3949
- "We'd like to understand better the features used most and how effective we "
3950
- "are on a global scale."
3951
  msgstr ""
3952
 
3953
- #: src/processors/plugin_tracking.php:34
3954
- msgid ""
3955
- "The data sent will be always completely anonymous and we will never be able "
3956
- "to track you or your website."
3957
  msgstr ""
3958
 
3959
- #: src/processors/plugin_tracking.php:35
3960
- msgid ""
3961
- "You can easily turn it off at any time within the plugin options if you "
3962
- "change your mind."
3963
  msgstr ""
3964
 
3965
- #: src/processors/plugin_tracking.php:36
3966
- msgid "Click to see the RAW data that would be sent"
3967
  msgstr ""
3968
 
3969
- #: src/processors/plugin_tracking.php:39
3970
- msgid "Absolutely"
 
3971
  msgstr ""
3972
 
3973
- #: src/processors/statistics.php:111
3974
- msgid "Comment Blocks"
 
 
3975
  msgstr ""
3976
 
3977
- #: src/processors/statistics.php:112
3978
- msgid "Firewall Blocks"
 
 
3979
  msgstr ""
3980
 
3981
- #: src/processors/statistics.php:113
3982
- msgid "Login Blocks"
3983
  msgstr ""
3984
 
3985
- #: src/processors/statistics.php:114
3986
- msgid "Login Verified"
 
 
3987
  msgstr ""
3988
 
3989
- #: src/processors/statistics.php:115
3990
- msgid "User Sessions"
 
3991
  msgstr ""
3992
 
3993
- #: src/processors/statistics.php:117
3994
- msgid "IP Auto Black-Listed"
3995
  msgstr ""
3996
 
3997
- #: src/processors/statistics.php:118
3998
- msgid "Total Transgressions"
 
 
3999
  msgstr ""
4000
 
4001
- #: src/processors/statistics.php:122
4002
- msgid "Shield Statistics"
 
 
4003
  msgstr ""
4004
 
4005
- #: src/processors/user_management.php:65
4006
- msgid "It appears you're already logged-in."
4007
  msgstr ""
4008
 
4009
- #: src/processors/user_management.php:66
4010
- msgid "Go To Admin"
4011
  msgstr ""
4012
 
4013
- #: src/processors/user_management.php:108
4014
- msgid "Last Login"
4015
  msgstr ""
4016
 
4017
- #: src/processors/user_management.php:130
4018
- msgid "Not Recorded"
4019
  msgstr ""
4020
 
4021
- #: src/processors/user_management.php:179
4022
- #, php-format
 
 
 
 
 
 
 
4023
  msgid ""
4024
- "As requested, %s is notifying you of %s login to a WordPress site that you "
4025
- "manage."
4026
  msgstr ""
4027
 
4028
- #: src/processors/user_management.php:183
4029
- msgid "Details for this user are below:"
4030
  msgstr ""
4031
 
4032
- #: src/processors/user_management.php:184
4033
- #, php-format
4034
- msgid "Site URL: %s"
4035
  msgstr ""
4036
 
4037
- #: src/processors/user_management.php:186
4038
- #, php-format
4039
- msgid "User Email: %s"
4040
  msgstr ""
4041
 
4042
- #: src/processors/user_management.php:188
4043
- msgid "Thanks."
4044
  msgstr ""
4045
 
4046
- #: src/processors/user_management.php:193
4047
  #, php-format
4048
- msgid "%s Just Logged Into %s"
4049
  msgstr ""
4050
 
4051
- #: src/processors/usermanagement_sessions.php:390
4052
- msgid "Your session has expired."
4053
  msgstr ""
4054
 
4055
- #: src/processors/usermanagement_sessions.php:394
4056
- msgid "Your session was idle for too long."
4057
  msgstr ""
4058
 
4059
- #: src/processors/usermanagement_sessions.php:398
4060
- msgid "Your session was locked to another IP Address."
 
 
4061
  msgstr ""
4062
 
4063
- #: src/processors/usermanagement_sessions.php:402
4064
- #, php-format
4065
- msgid "You do not currently have a %s user session."
4066
  msgstr ""
4067
 
4068
- #: src/processors/usermanagement_sessions.php:406
4069
- msgid "An administrator has terminated this session."
 
4070
  msgstr ""
4071
 
4072
- #: src/processors/usermanagement_sessions.php:410
4073
- msgid "Not a user."
 
 
4074
  msgstr ""
4075
 
4076
- #: src/processors/usermanagement_sessions.php:414
4077
- msgid "Your session was terminated."
4078
  msgstr ""
4079
 
4080
- #: templates/php/snippets/icwp_options_helper.php:9
4081
- #, php-format
4082
- msgid "Shield (from %s)"
4083
  msgstr ""
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WPSF v2.0\n"
4
+ "POT-Creation-Date: 2018-03-01 10:55+0000\n"
5
+ "PO-Revision-Date: 2018-03-01 10:55+0000\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: en_GB\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.0.6\n"
13
  "X-Poedit-KeywordsList: _wpsf__;gettext;gettext_noop;_wpsf_e\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
18
  "X-Poedit-SearchPathExcluded-0: .git\n"
19
  "X-Poedit-SearchPathExcluded-1: .idea\n"
20
 
21
+ #: init.php:43
22
  msgid "Upgrade Now To Keep Your Firewall Up-To-Date With The Latest Features."
23
  msgstr ""
24
 
25
+ #: src/common/Components/Tables/AuditTrailTable.php:15
26
+ msgid "Refresh"
27
  msgstr ""
28
 
29
+ #: src/features/admin_access_restriction.php:42
30
+ msgid "Enter your Security Admin Access Key"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  msgstr ""
32
 
33
+ #: src/features/admin_access_restriction.php:54
34
+ #: src/features/admin_access_restriction.php:72
35
+ msgid "Security Admin Access Key Accepted."
36
  msgstr ""
37
 
38
+ #: src/features/admin_access_restriction.php:54
39
+ #: src/features/admin_access_restriction.php:72
40
+ msgid "Please wait"
 
41
  msgstr ""
42
 
43
+ #: src/features/admin_access_restriction.php:57
44
+ msgid "Failed to process key - you may need to re-login to WordPress."
45
  msgstr ""
46
 
47
+ #: src/features/admin_access_restriction.php:61
48
+ #: src/features/admin_access_restriction.php:75
49
+ msgid "Error - Invalid Key"
50
  msgstr ""
51
 
52
+ #: src/features/admin_access_restriction.php:209
53
+ #, php-format
54
+ msgid "%s Security Admin key accepted."
55
  msgstr ""
56
 
57
+ #: src/features/admin_access_restriction.php:212
58
+ #, php-format
59
+ msgid "%s Security Admin key not accepted."
60
  msgstr ""
61
 
62
+ #: src/features/admin_access_restriction.php:333
63
+ #: src/features/audit_trail.php:217 src/features/autoupdates.php:162
64
+ #: src/features/comments_filter.php:110 src/features/firewall.php:66
65
+ #: src/features/hack_protect.php:554 src/features/headers.php:127
66
+ #: src/features/ips.php:273 src/features/lockdown.php:64
67
+ #: src/features/login_protect.php:438 src/features/sessions.php:51
68
+ #: src/features/statistics.php:43 src/features/statistics.php:52
69
+ #: src/features/user_management.php:211
70
+ #, php-format
71
+ msgid "Enable Module: %s"
72
+ msgstr ""
73
+
74
+ #: src/features/admin_access_restriction.php:335
75
+ #: src/features/admin_access_restriction.php:345
76
+ #: src/features/admin_access_restriction.php:354
77
+ #: src/features/admin_access_restriction.php:363
78
+ #: src/features/audit_trail.php:219 src/features/audit_trail.php:228
79
+ #: src/features/audit_trail.php:237 src/features/autoupdates.php:164
80
+ #: src/features/autoupdates.php:173 src/features/autoupdates.php:182
81
+ #: src/features/autoupdates.php:192 src/features/autoupdates.php:202
82
+ #: src/features/base_wpsf.php:221 src/features/comments_filter.php:112
83
+ #: src/features/comments_filter.php:121 src/features/comments_filter.php:131
84
+ #: src/features/comments_filter.php:140 src/features/firewall.php:68
85
+ #: src/features/hack_protect.php:549 src/features/hack_protect.php:556
86
+ #: src/features/hack_protect.php:565 src/features/hack_protect.php:575
87
+ #: src/features/hack_protect.php:584 src/features/hack_protect.php:593
88
+ #: src/features/hack_protect.php:603 src/features/hack_protect.php:613
89
+ #: src/features/headers.php:129 src/features/headers.php:138
90
+ #: src/features/headers.php:147 src/features/ips.php:275
91
+ #: src/features/ips.php:285 src/features/ips.php:295
92
+ #: src/features/license.php:560 src/features/lockdown.php:66
93
+ #: src/features/lockdown.php:75 src/features/lockdown.php:84
94
+ #: src/features/lockdown.php:93 src/features/login_protect.php:441
95
+ #: src/features/login_protect.php:450 src/features/login_protect.php:461
96
+ #: src/features/login_protect.php:470 src/features/login_protect.php:479
97
+ #: src/features/login_protect.php:489 src/features/login_protect.php:498
98
+ #: src/features/login_protect.php:507 src/features/plugin.php:661
99
+ #: src/features/plugin.php:668 src/features/plugin.php:683
100
+ #: src/features/sessions.php:53 src/features/statistics.php:45
101
+ #: src/features/statistics.php:54 src/features/statistics.php:63
102
+ #: src/features/user_management.php:213 src/features/user_management.php:223
103
+ #: src/features/user_management.php:232 src/features/user_management.php:241
104
+ #: src/features/user_management.php:250
105
  #, php-format
106
  msgid "Purpose - %s"
107
  msgstr ""
108
 
109
+ #: src/features/admin_access_restriction.php:335
110
+ #: src/features/admin_access_restriction.php:345
111
  msgid ""
112
  "Restricts access to this plugin preventing unauthorized changes to your "
113
  "security settings."
114
  msgstr ""
115
 
116
+ #: src/features/admin_access_restriction.php:336
117
+ #: src/features/admin_access_restriction.php:346
118
+ #: src/features/admin_access_restriction.php:355
119
+ #: src/features/audit_trail.php:220 src/features/audit_trail.php:229
120
+ #: src/features/audit_trail.php:238 src/features/autoupdates.php:165
121
+ #: src/features/autoupdates.php:174 src/features/autoupdates.php:184
122
+ #: src/features/autoupdates.php:193 src/features/base_wpsf.php:222
123
+ #: src/features/comments_filter.php:113 src/features/comments_filter.php:122
124
+ #: src/features/comments_filter.php:132 src/features/comments_filter.php:141
125
+ #: src/features/firewall.php:69 src/features/firewall.php:78
126
+ #: src/features/firewall.php:89 src/features/firewall.php:98
127
+ #: src/features/hack_protect.php:557 src/features/hack_protect.php:566
128
+ #: src/features/hack_protect.php:576 src/features/hack_protect.php:585
129
+ #: src/features/hack_protect.php:594 src/features/hack_protect.php:604
130
+ #: src/features/hack_protect.php:614 src/features/headers.php:130
131
+ #: src/features/headers.php:139 src/features/headers.php:148
132
+ #: src/features/ips.php:276 src/features/ips.php:286 src/features/ips.php:296
133
+ #: src/features/license.php:561 src/features/lockdown.php:67
134
+ #: src/features/lockdown.php:76 src/features/lockdown.php:85
135
+ #: src/features/lockdown.php:94 src/features/login_protect.php:442
136
+ #: src/features/login_protect.php:451 src/features/login_protect.php:462
137
+ #: src/features/login_protect.php:480 src/features/login_protect.php:499
138
+ #: src/features/plugin.php:684 src/features/plugin.php:847
139
+ #: src/features/sessions.php:54 src/features/statistics.php:46
140
+ #: src/features/statistics.php:55 src/features/statistics.php:64
141
+ #: src/features/user_management.php:214 src/features/user_management.php:224
142
+ #: src/features/user_management.php:233 src/features/user_management.php:242
143
+ #: src/features/user_management.php:251
144
  #, php-format
145
  msgid "Recommendation - %s"
146
  msgstr ""
147
 
148
+ #: src/features/admin_access_restriction.php:336
149
+ #: src/features/audit_trail.php:220 src/features/autoupdates.php:165
150
+ #: src/features/comments_filter.php:113 src/features/firewall.php:69
151
+ #: src/features/hack_protect.php:557 src/features/hack_protect.php:566
152
+ #: src/features/hack_protect.php:576 src/features/hack_protect.php:585
153
+ #: src/features/hack_protect.php:594 src/features/ips.php:276
154
+ #: src/features/ips.php:286 src/features/lockdown.php:67
155
+ #: src/features/login_protect.php:442 src/features/sessions.php:54
156
+ #: src/features/statistics.php:46 src/features/statistics.php:55
157
+ #: src/features/user_management.php:214
158
  #, php-format
159
  msgid "Keep the %s feature turned on."
160
  msgstr ""
161
 
162
+ #: src/features/admin_access_restriction.php:336
163
+ #: src/features/admin_access_restriction.php:390 src/features/plugin.php:861
164
+ #: src/features/plugin.php:863 src/wizards/base_wpsf.php:65
165
+ msgid "Security Admin"
166
+ msgstr ""
167
+
168
+ #: src/features/admin_access_restriction.php:337
169
  msgid "You need to also enter a new Access Key to enable this feature."
170
  msgstr ""
171
 
172
+ #: src/features/admin_access_restriction.php:339
173
+ #: src/features/audit_trail.php:222 src/features/autoupdates.php:167
174
+ #: src/features/comments_filter.php:115 src/features/firewall.php:71
175
+ #: src/features/hack_protect.php:559 src/features/headers.php:132
176
+ #: src/features/ips.php:279 src/features/lockdown.php:69
177
+ #: src/features/login_protect.php:439 src/features/sessions.php:56
178
+ #: src/features/statistics.php:48 src/features/statistics.php:57
179
+ #: src/features/user_management.php:216
180
+ #, php-format
181
+ msgid "%s/%s Module"
182
+ msgstr ""
183
+
184
+ #: src/features/admin_access_restriction.php:339
185
+ #: src/features/admin_access_restriction.php:455
186
+ #: src/features/audit_trail.php:222 src/features/autoupdates.php:167
187
+ #: src/features/comments_filter.php:115 src/features/firewall.php:71
188
+ #: src/features/hack_protect.php:559 src/features/headers.php:132
189
+ #: src/features/ips.php:279 src/features/lockdown.php:69
190
+ #: src/features/login_protect.php:439 src/features/sessions.php:56
191
+ #: src/features/statistics.php:48 src/features/statistics.php:57
192
+ #: src/features/user_management.php:216
193
  msgid "Enable"
194
  msgstr ""
195
 
196
+ #: src/features/admin_access_restriction.php:339
197
+ #: src/features/audit_trail.php:222 src/features/autoupdates.php:167
198
+ #: src/features/comments_filter.php:115 src/features/firewall.php:71
199
+ #: src/features/hack_protect.php:559 src/features/headers.php:132
200
+ #: src/features/ips.php:279 src/features/lockdown.php:69
201
+ #: src/features/login_protect.php:439 src/features/sessions.php:56
202
+ #: src/features/statistics.php:48 src/features/statistics.php:57
203
+ #: src/features/user_management.php:216
204
  msgid "Disable"
205
  msgstr ""
206
 
207
+ #: src/features/admin_access_restriction.php:343
208
  msgid "Security Admin Restriction Settings"
209
  msgstr ""
210
 
211
+ #: src/features/admin_access_restriction.php:346
212
+ #: src/features/admin_access_restriction.php:355
213
+ #: src/features/comments_filter.php:122 src/features/comments_filter.php:141
214
+ #: src/features/login_protect.php:480 src/features/login_protect.php:499
215
+ #: src/features/plugin.php:684 src/features/user_management.php:224
216
+ #: src/features/user_management.php:233 src/features/user_management.php:242
217
+ #: src/features/user_management.php:251
 
 
 
218
  msgid "Use of this feature is highly recommend."
219
  msgstr ""
220
 
221
+ #: src/features/admin_access_restriction.php:348
222
  msgid "Security Admin Settings"
223
  msgstr ""
224
 
225
+ #: src/features/admin_access_restriction.php:352
226
  msgid "Security Admin Restriction Zones"
227
  msgstr ""
228
 
229
+ #: src/features/admin_access_restriction.php:354
230
  msgid ""
231
  "Restricts access to key WordPress areas for all users not authenticated with "
232
  "the Security Admin Access system."
233
  msgstr ""
234
 
235
+ #: src/features/admin_access_restriction.php:357
236
  msgid "Access Restriction Zones"
237
  msgstr ""
238
 
239
+ #: src/features/admin_access_restriction.php:361
240
+ msgid "Shield White Label"
241
+ msgstr ""
242
+
243
+ #: src/features/admin_access_restriction.php:364
 
 
 
 
244
  #, php-format
245
+ msgid "Rename and re-brand the %s plugin for your client site installations."
246
+ msgstr ""
247
+
248
+ #: src/features/admin_access_restriction.php:367
249
+ #: src/features/admin_access_restriction.php:455
250
+ msgid "White Label"
251
+ msgstr ""
252
+
253
+ #: src/features/admin_access_restriction.php:390
254
+ #: src/features/audit_trail.php:265 src/features/autoupdates.php:226
255
+ #: src/features/comments_filter.php:195 src/features/firewall.php:122
256
+ #: src/features/hack_protect.php:637 src/features/headers.php:173
257
+ #: src/features/ips.php:318 src/features/lockdown.php:119
258
+ #: src/features/login_protect.php:532 src/features/plugin.php:721
259
+ #: src/features/sessions.php:79 src/features/statistics.php:91
260
+ #: src/features/statistics.php:97 src/features/user_management.php:276
261
+ #, php-format
262
+ msgid "Enable %s Module"
263
  msgstr ""
264
 
265
+ #: src/features/admin_access_restriction.php:391
266
  msgid "Enforce Security Admin Access Restriction"
267
  msgstr ""
268
 
269
+ #: src/features/admin_access_restriction.php:392
270
  msgid ""
271
+ "Enable this with great care and consideration. Ensure that you set a key "
272
+ "that you have set an access key that you will remember."
 
273
  msgstr ""
274
 
275
+ #: src/features/admin_access_restriction.php:396
276
  msgid "Security Admin Access Key"
277
  msgstr ""
278
 
279
+ #: src/features/admin_access_restriction.php:397
280
  msgid "Provide/Update Security Admin Access Key"
281
  msgstr ""
282
 
283
+ #: src/features/admin_access_restriction.php:398
284
+ #: src/features/admin_access_restriction.php:413
285
+ #: src/features/admin_access_restriction.php:420
286
+ #: src/features/admin_access_restriction.php:427
287
+ #: src/features/admin_access_restriction.php:433
288
+ #: src/features/admin_access_restriction.php:439
289
  #, php-format
290
  msgid "Careful: %s"
291
  msgstr ""
292
 
293
+ #: src/features/admin_access_restriction.php:398
294
  msgid ""
295
  "If you forget this, you could potentially lock yourself out from using this "
296
  "plugin."
297
  msgstr ""
298
 
299
+ #: src/features/admin_access_restriction.php:399
300
+ msgid "Security Key Currently Set"
301
+ msgstr ""
302
+
303
+ #: src/features/admin_access_restriction.php:399
304
+ msgid "Security Key NOT Currently Set"
305
+ msgstr ""
306
+
307
+ #: src/features/admin_access_restriction.php:403
308
  msgid "Security Admin Timeout"
309
  msgstr ""
310
 
311
+ #: src/features/admin_access_restriction.php:404
312
  msgid "Specify An Automatic Timeout Interval For Security Admin Access"
313
  msgstr ""
314
 
315
+ #: src/features/admin_access_restriction.php:405
316
  msgid "This will automatically expire your Security Admin Session."
317
  msgstr ""
318
 
319
+ #: src/features/admin_access_restriction.php:406
 
 
 
 
320
  #, php-format
321
  msgid "Default: %s minutes."
322
  msgstr ""
323
 
324
+ #: src/features/admin_access_restriction.php:411
325
  msgid "Pages"
326
  msgstr ""
327
 
328
+ #: src/features/admin_access_restriction.php:412
329
  msgid "Restrict Access To Key WordPress Posts And Pages Actions"
330
  msgstr ""
331
 
332
+ #: src/features/admin_access_restriction.php:413
333
  msgid "This will restrict access to page/post creation, editing and deletion."
334
  msgstr ""
335
 
336
+ #: src/features/admin_access_restriction.php:414
337
+ #: src/features/admin_access_restriction.php:421
338
+ #: src/features/admin_access_restriction.php:442 src/features/headers.php:246
339
+ #: src/features/login_protect.php:481 src/features/login_protect.php:490
340
+ #: src/features/login_protect.php:508 src/features/login_protect.php:575
341
  #, php-format
342
  msgid "Note: %s"
343
  msgstr ""
344
 
345
+ #: src/features/admin_access_restriction.php:414
346
+ #: src/features/admin_access_restriction.php:421
347
+ #: src/features/admin_access_restriction.php:444
348
  #, php-format
349
  msgid "Selecting \"%s\" will also restrict all other options."
350
  msgstr ""
351
 
352
+ #: src/features/admin_access_restriction.php:414
353
  msgid "Edit"
354
  msgstr ""
355
 
356
+ #: src/features/admin_access_restriction.php:418
357
+ #: src/features/audit_trail.php:182 src/features/audit_trail.php:289
358
+ #: src/features/audit_trail.php:290 src/features/autoupdates.php:257
359
  msgid "Plugins"
360
  msgstr ""
361
 
362
+ #: src/features/admin_access_restriction.php:419
363
  msgid "Restrict Access To Key WordPress Plugin Actions"
364
  msgstr ""
365
 
366
+ #: src/features/admin_access_restriction.php:420
367
  msgid ""
368
  "This will restrict access to plugin installation, update, activation and "
369
  "deletion."
370
  msgstr ""
371
 
372
+ #: src/features/admin_access_restriction.php:421
373
+ #: src/features/admin_access_restriction.php:447
374
  msgid "Activate"
375
  msgstr ""
376
 
377
+ #: src/features/admin_access_restriction.php:425
378
  msgid "WordPress Options"
379
  msgstr ""
380
 
381
+ #: src/features/admin_access_restriction.php:426
382
  msgid "Restrict Access To Certain WordPress Admin Options"
383
  msgstr ""
384
 
385
+ #: src/features/admin_access_restriction.php:427
386
  msgid ""
387
  "This will restrict the ability of WordPress administrators from changing key "
388
  "WordPress settings."
389
  msgstr ""
390
 
391
+ #: src/features/admin_access_restriction.php:431
392
  msgid "Admin Users"
393
  msgstr ""
394
 
395
+ #: src/features/admin_access_restriction.php:432
396
  msgid "Restrict Access To Create/Delete/Modify Other Admin Users"
397
  msgstr ""
398
 
399
+ #: src/features/admin_access_restriction.php:433
400
  msgid ""
401
  "This will restrict the ability of WordPress administrators from creating, "
402
  "modifying or promoting other administrators."
403
  msgstr ""
404
 
405
+ #: src/features/admin_access_restriction.php:437
406
+ #: src/features/audit_trail.php:183 src/features/audit_trail.php:295
407
+ #: src/features/audit_trail.php:296 src/features/autoupdates.php:269
408
  msgid "Themes"
409
  msgstr ""
410
 
411
+ #: src/features/admin_access_restriction.php:438
412
  msgid "Restrict Access To WordPress Theme Actions"
413
  msgstr ""
414
 
415
+ #: src/features/admin_access_restriction.php:439
416
  msgid ""
417
  "This will restrict access to theme installation, update, activation and "
418
  "deletion."
419
  msgstr ""
420
 
421
+ #: src/features/admin_access_restriction.php:446
422
  #, php-format
423
  msgid "%s and %s"
424
  msgstr ""
425
 
426
+ #: src/features/admin_access_restriction.php:448
427
  msgid "Edit Theme Options"
428
  msgstr ""
429
 
430
+ #: src/features/admin_access_restriction.php:456
431
+ msgid "Activate Your White Label Settings"
432
+ msgstr ""
433
+
434
+ #: src/features/admin_access_restriction.php:457
435
+ msgid "Turn on/off the application of your White Label settings."
436
+ msgstr ""
437
+
438
+ #: src/features/admin_access_restriction.php:460
439
+ msgid "Hide Updates"
440
+ msgstr ""
441
+
442
+ #: src/features/admin_access_restriction.php:461
443
+ msgid "Hide Plugin Updates From Non-Security Admins"
444
+ msgstr ""
445
+
446
+ #: src/features/admin_access_restriction.php:462
447
+ msgid "Do not show the availability of updates to non-security administrators."
448
+ msgstr ""
449
+
450
+ #: src/features/admin_access_restriction.php:465
451
+ #: src/features/admin_access_restriction.php:472
452
+ msgid "Plugin Name"
453
+ msgstr ""
454
+
455
+ #: src/features/admin_access_restriction.php:466
456
+ msgid "The Name Of The Plugin"
457
+ msgstr ""
458
+
459
+ #: src/features/admin_access_restriction.php:467
460
+ msgid "The name of the plugin that will be displayed to your site users."
461
+ msgstr ""
462
+
463
+ #: src/features/admin_access_restriction.php:470
464
+ msgid "Menu Title"
465
+ msgstr ""
466
+
467
+ #: src/features/admin_access_restriction.php:471
468
+ msgid "The Main Menu Title Of The Plugin"
469
+ msgstr ""
470
+
471
+ #: src/features/admin_access_restriction.php:472
472
+ #, php-format
473
+ msgid ""
474
+ "The Main Menu Title Of The Plugin. If left empty, the \"%s\" will be used."
475
+ msgstr ""
476
+
477
+ #: src/features/admin_access_restriction.php:475
478
+ msgid "Description"
479
+ msgstr ""
480
+
481
+ #: src/features/admin_access_restriction.php:476
482
+ msgid "The Description Of The Plugin"
483
+ msgstr ""
484
+
485
+ #: src/features/admin_access_restriction.php:477
486
+ msgid "The description of the plugin displayed on the plugins page."
487
+ msgstr ""
488
+
489
+ #: src/features/admin_access_restriction.php:480
490
+ msgid "Home URL"
491
+ msgstr ""
492
+
493
+ #: src/features/admin_access_restriction.php:481
494
+ msgid "Plugin Home Page URL"
495
+ msgstr ""
496
+
497
+ #: src/features/admin_access_restriction.php:482
498
+ msgid ""
499
+ "When a user clicks the home link for this plugin, this is where they'll be "
500
+ "directed."
501
+ msgstr ""
502
+
503
+ #: src/features/admin_access_restriction.php:485
504
+ msgid "Icon URL"
505
+ msgstr ""
506
+
507
+ #: src/features/admin_access_restriction.php:486
508
+ msgid "Plugin Icon URL"
509
+ msgstr ""
510
+
511
+ #: src/features/admin_access_restriction.php:487
512
+ msgid "The URL of the icon displayed in the menu and in the admin pages."
513
+ msgstr ""
514
+
515
+ #: src/features/audit_trail.php:134
516
+ msgid "Your IP"
517
+ msgstr ""
518
+
519
+ #: src/features/audit_trail.php:165 src/features/audit_trail.php:178
520
+ #: src/features/license.php:80 src/features/plugin.php:866
521
+ msgid "Audit Trail Viewer"
522
+ msgstr ""
523
+
524
+ #: src/features/audit_trail.php:179 src/features/license.php:81
525
+ msgid "Review audit trail logs "
526
+ msgstr ""
527
+
528
+ #: src/features/audit_trail.php:181
529
  msgid "Users"
530
  msgstr ""
531
 
532
+ #: src/features/audit_trail.php:184
533
  msgid "WordPress"
534
  msgstr ""
535
 
536
+ #: src/features/audit_trail.php:185
537
  msgid "Posts"
538
  msgstr ""
539
 
540
+ #: src/features/audit_trail.php:186 src/features/audit_trail.php:313
541
+ #: src/features/audit_trail.php:314
542
  msgid "Emails"
543
  msgstr ""
544
 
545
+ #: src/features/audit_trail.php:187
546
  msgid "Time"
547
  msgstr ""
548
 
549
+ #: src/features/audit_trail.php:188
550
  msgid "Event"
551
  msgstr ""
552
 
553
+ #: src/features/audit_trail.php:189
554
  msgid "Message"
555
  msgstr ""
556
 
557
+ #: src/features/audit_trail.php:190 src/features/user_management.php:113
558
  msgid "Username"
559
  msgstr ""
560
 
561
+ #: src/features/audit_trail.php:191
562
  msgid "Category"
563
  msgstr ""
564
 
565
+ #: src/features/audit_trail.php:192 src/features/plugin.php:853
566
  msgid "IP Address"
567
  msgstr ""
568
 
569
+ #: src/features/audit_trail.php:193
570
  msgid "You"
571
  msgstr ""
572
 
573
+ #: src/features/audit_trail.php:194
574
  msgid "There are currently no audit entries this is section."
575
  msgstr ""
576
 
577
+ #: src/features/audit_trail.php:219
578
  msgid ""
579
  "The Audit Trail is designed so you can look back on events and analyse what "
580
  "happened and what may have gone wrong."
581
  msgstr ""
582
 
583
+ #: src/features/audit_trail.php:220 src/features/plugin.php:864
584
+ #: src/wizards/plugin.php:438 src/wizards/plugin.php:443
585
+ msgid "Audit Trail"
586
+ msgstr ""
587
+
588
+ #: src/features/audit_trail.php:226
589
  msgid "Audit Trail Options"
590
  msgstr ""
591
 
592
+ #: src/features/audit_trail.php:228
593
  msgid "Provides finer control over the audit trail itself."
594
  msgstr ""
595
 
596
+ #: src/features/audit_trail.php:229 src/features/audit_trail.php:238
597
  msgid "These settings are dependent on your requirements."
598
  msgstr ""
599
 
600
+ #: src/features/audit_trail.php:231 src/features/base_wpsf.php:107
601
+ #: src/features/base_wpsf.php:146
602
  msgid "Options"
603
  msgstr ""
604
 
605
+ #: src/features/audit_trail.php:235
606
  msgid "Enable Audit Contexts"
607
  msgstr ""
608
 
609
+ #: src/features/audit_trail.php:237
610
  msgid "Specify which types of actions on your site are logged."
611
  msgstr ""
612
 
613
+ #: src/features/audit_trail.php:240
614
  msgid "Audit Contexts"
615
  msgstr ""
616
 
617
+ #: src/features/audit_trail.php:266 src/features/autoupdates.php:227
618
+ #: src/features/firewall.php:123 src/features/hack_protect.php:638
619
+ #: src/features/headers.php:174 src/features/ips.php:319
620
+ #: src/features/lockdown.php:120 src/features/login_protect.php:533
621
+ #: src/features/sessions.php:80 src/features/statistics.php:92
622
+ #: src/features/statistics.php:98 src/features/user_management.php:277
623
  #, php-format
624
+ msgid "Enable (or Disable) The %s Module"
625
  msgstr ""
626
 
627
+ #: src/features/audit_trail.php:267 src/features/autoupdates.php:228
628
+ #: src/features/comments_filter.php:197 src/features/firewall.php:124
629
+ #: src/features/hack_protect.php:639 src/features/headers.php:175
630
+ #: src/features/ips.php:320 src/features/lockdown.php:121
631
+ #: src/features/login_protect.php:534 src/features/sessions.php:81
632
+ #: src/features/statistics.php:93 src/features/statistics.php:99
633
+ #: src/features/user_management.php:278
634
  #, php-format
635
+ msgid "Un-Checking this option will completely disable the %s module."
636
+ msgstr ""
637
+
638
+ #: src/features/audit_trail.php:271
639
+ msgid "Max Trail Length"
640
+ msgstr ""
641
+
642
+ #: src/features/audit_trail.php:272
643
+ msgid "Maximum Audit Trail Length To Keep"
644
+ msgstr ""
645
+
646
+ #: src/features/audit_trail.php:273
647
  msgid ""
648
+ "Automatically remove any audit trail entries when this limit is exceeded."
 
649
  msgstr ""
650
 
651
+ #: src/features/audit_trail.php:277
652
  msgid "Auto Clean"
653
  msgstr ""
654
 
655
+ #: src/features/audit_trail.php:278
656
  msgid "Enable Audit Auto Cleaning"
657
  msgstr ""
658
 
659
+ #: src/features/audit_trail.php:279
660
  msgid ""
661
  "Events older than the number of days specified will be automatically cleaned "
662
  "from the database."
663
  msgstr ""
664
 
665
+ #: src/features/audit_trail.php:283 src/features/audit_trail.php:284
666
+ #: src/features/audit_trail.php:285
667
  msgid "Users And Logins"
668
  msgstr ""
669
 
670
+ #: src/features/audit_trail.php:284 src/features/audit_trail.php:290
671
+ #: src/features/audit_trail.php:296 src/features/audit_trail.php:302
672
+ #: src/features/audit_trail.php:308 src/features/audit_trail.php:314
673
+ #: src/features/audit_trail.php:320
674
  #, php-format
675
  msgid "Enable Audit Context - %s"
676
  msgstr ""
677
 
678
+ #: src/features/audit_trail.php:285 src/features/audit_trail.php:291
679
+ #: src/features/audit_trail.php:297 src/features/audit_trail.php:303
680
+ #: src/features/audit_trail.php:309 src/features/audit_trail.php:315
681
+ #: src/features/audit_trail.php:321
682
  #, php-format
683
  msgid ""
684
  "When this context is enabled, the audit trail will track activity relating "
685
  "to: %s"
686
  msgstr ""
687
 
688
+ #: src/features/audit_trail.php:291
689
  msgid "WordPress Plugins"
690
  msgstr ""
691
 
692
+ #: src/features/audit_trail.php:297
693
  msgid "WordPress Themes"
694
  msgstr ""
695
 
696
+ #: src/features/audit_trail.php:301 src/features/audit_trail.php:302
697
  msgid "Posts And Pages"
698
  msgstr ""
699
 
700
+ #: src/features/audit_trail.php:303
701
  msgid "Editing and publishing of posts and pages"
702
  msgstr ""
703
 
704
+ #: src/features/audit_trail.php:307 src/features/audit_trail.php:308
705
  msgid "WordPress And Settings"
706
  msgstr ""
707
 
708
+ #: src/features/audit_trail.php:309
709
  msgid "WordPress upgrades and changes to particular WordPress settings"
710
  msgstr ""
711
 
712
+ #: src/features/audit_trail.php:315
713
  msgid "Email Sending"
714
  msgstr ""
715
 
716
+ #: src/features/autoupdates.php:116
717
+ #, php-format
718
+ msgid "Plugin \"%s\" will %s."
719
+ msgstr ""
720
+
721
+ #: src/features/autoupdates.php:119
722
+ msgid "update automatically"
723
+ msgstr ""
724
+
725
+ #: src/features/autoupdates.php:119
726
+ msgid "not update automatically"
727
+ msgstr ""
728
+
729
+ #: src/features/autoupdates.php:124
730
+ msgid "Failed to change the update status of the plugin."
731
+ msgstr ""
732
+
733
+ #: src/features/autoupdates.php:128
734
+ msgid "Nonce security checking failed. Please reload."
735
+ msgstr ""
736
+
737
+ #: src/features/autoupdates.php:164
738
  msgid ""
739
  "Automatic Updates lets you manage the WordPress automatic updates engine so "
740
  "you choose what exactly gets updated automatically."
741
  msgstr ""
742
 
743
+ #: src/features/autoupdates.php:165 src/features/hack_protect.php:661
744
+ #: src/features/plugin.php:867
745
+ msgid "Automatic Updates"
746
+ msgstr ""
747
+
748
+ #: src/features/autoupdates.php:171
749
  msgid "Disable ALL WordPress Automatic Updates"
750
  msgstr ""
751
 
752
+ #: src/features/autoupdates.php:173
753
  msgid ""
754
  "If you never want WordPress to automatically update anything on your site, "
755
  "turn on this option."
756
  msgstr ""
757
 
758
+ #: src/features/autoupdates.php:174
759
  msgid "Do not turn on this option unless you really need to block updates."
760
  msgstr ""
761
 
762
+ #: src/features/autoupdates.php:176
763
  msgid "Turn Off"
764
  msgstr ""
765
 
766
+ #: src/features/autoupdates.php:180
767
  msgid "Automatic Plugin Self-Update"
768
  msgstr ""
769
 
770
+ #: src/features/autoupdates.php:182
771
  #, php-format
772
  msgid ""
773
  "Allows the %s plugin to automatically update itself when an update is "
774
  "available."
775
  msgstr ""
776
 
777
+ #: src/features/autoupdates.php:184
778
  msgid "Keep this option turned on."
779
  msgstr ""
780
 
781
+ #: src/features/autoupdates.php:186
782
  msgid "Self-Update"
783
  msgstr ""
784
 
785
+ #: src/features/autoupdates.php:190
786
  msgid "Automatic Updates For WordPress Components"
787
  msgstr ""
788
 
789
+ #: src/features/autoupdates.php:192
790
  msgid "Control how automatic updates for each WordPress component is handled."
791
  msgstr ""
792
 
793
+ #: src/features/autoupdates.php:193
794
  msgid "You should at least allow minor updates for the WordPress core."
795
  msgstr ""
796
 
797
+ #: src/features/autoupdates.php:195
798
  msgid "WordPress Components"
799
  msgstr ""
800
 
801
+ #: src/features/autoupdates.php:199 src/features/autoupdates.php:200
802
+ msgid "Auto-Update Options"
803
  msgstr ""
804
 
805
+ #: src/features/autoupdates.php:202
806
+ msgid "Make adjustments to how automatic updates are handled on your site."
807
  msgstr ""
808
 
809
+ #: src/features/autoupdates.php:232
 
 
 
 
810
  msgid "Disable All"
811
  msgstr ""
812
 
813
+ #: src/features/autoupdates.php:233
814
  msgid "Completely Disable WordPress Automatic Updates"
815
  msgstr ""
816
 
817
+ #: src/features/autoupdates.php:234
818
  msgid ""
819
  "When selected, regardless of any other settings, all WordPress automatic "
820
  "updates on this site will be completely disabled!"
821
  msgstr ""
822
 
823
+ #: src/features/autoupdates.php:238
824
  msgid "Auto Update Plugin"
825
  msgstr ""
826
 
827
+ #: src/features/autoupdates.php:239
828
  msgid "Always Automatically Update This Plugin"
829
  msgstr ""
830
 
831
+ #: src/features/autoupdates.php:240
832
  #, php-format
833
  msgid ""
834
  "Regardless of any component settings below, automatically update the \"%s\" "
835
  "plugin."
836
  msgstr ""
837
 
838
+ #: src/features/autoupdates.php:245
839
  msgid "WordPress Core Updates"
840
  msgstr ""
841
 
842
+ #: src/features/autoupdates.php:246
843
  msgid "Decide how the WordPress Core will automatically update, if at all"
844
  msgstr ""
845
 
846
+ #: src/features/autoupdates.php:247
847
  msgid ""
848
  "At least automatically upgrading minor versions is recommended (and is the "
849
  "WordPress default)."
850
  msgstr ""
851
 
852
+ #: src/features/autoupdates.php:251
853
  msgid "Translations"
854
  msgstr ""
855
 
856
+ #: src/features/autoupdates.php:252
857
  msgid "Automatically Update Translations"
858
  msgstr ""
859
 
860
+ #: src/features/autoupdates.php:253
861
  msgid ""
862
  "Note: Automatic updates for translations are enabled on WordPress by default."
863
  msgstr ""
864
 
865
+ #: src/features/autoupdates.php:258
866
+ msgid "Automatically Update All Plugins"
867
  msgstr ""
868
 
869
+ #: src/features/autoupdates.php:259
870
  msgid ""
871
  "Note: Automatic updates for plugins are disabled on WordPress by default."
872
  msgstr ""
873
 
874
+ #: src/features/autoupdates.php:263
875
+ msgid "Individually Select Plugins"
876
+ msgstr ""
877
+
878
+ #: src/features/autoupdates.php:264
879
+ msgid "Select Individual Plugins To Automatically Update"
880
+ msgstr ""
881
+
882
+ #: src/features/autoupdates.php:265
883
+ msgid ""
884
+ "Turning this on will provide an option on the plugins page to select whether "
885
+ "a plugin is automatically updated."
886
+ msgstr ""
887
+
888
+ #: src/features/autoupdates.php:270
889
  msgid "Automatically Update Themes"
890
  msgstr ""
891
 
892
+ #: src/features/autoupdates.php:271
893
  msgid ""
894
  "Note: Automatic updates for themes are disabled on WordPress by default."
895
  msgstr ""
896
 
897
+ #: src/features/autoupdates.php:275
898
  msgid "Ignore Version Control"
899
  msgstr ""
900
 
901
+ #: src/features/autoupdates.php:276
902
  msgid "Ignore Version Control Systems Such As GIT and SVN"
903
  msgstr ""
904
 
905
+ #: src/features/autoupdates.php:277
906
  msgid ""
907
  "If you use SVN or GIT and WordPress detects it, automatic updates are "
908
  "disabled by default. Check this box to ignore version control systems and "
909
  "allow automatic updates."
910
  msgstr ""
911
 
912
+ #: src/features/autoupdates.php:281
913
  msgid "Send Report Email"
914
  msgstr ""
915
 
916
+ #: src/features/autoupdates.php:282
917
  msgid "Send email notices after automatic updates"
918
  msgstr ""
919
 
920
+ #: src/features/autoupdates.php:283
921
  msgid ""
922
  "You can turn on/off email notices from automatic updates by un/checking this "
923
  "box."
924
  msgstr ""
925
 
926
+ #: src/features/autoupdates.php:287
927
  msgid "Report Email Address"
928
  msgstr ""
929
 
930
+ #: src/features/autoupdates.php:288
931
  msgid "Where to send upgrade notification reports"
932
  msgstr ""
933
 
934
+ #: src/features/autoupdates.php:289
935
  msgid "If this is empty, it will default to the Site Admin email address"
936
  msgstr ""
937
 
938
+ #: src/features/autoupdates.php:293
939
+ msgid "Update Delay"
940
  msgstr ""
941
 
942
+ #: src/features/autoupdates.php:294
943
+ msgid "Delay Automatic Updates For Period Of Stability"
944
  msgstr ""
945
 
946
+ #: src/features/autoupdates.php:295
947
+ msgid ""
948
+ "Shield will delay upgrades until the new update has been available for the "
949
+ "set number of days."
950
  msgstr ""
951
 
952
+ #: src/features/autoupdates.php:296
953
+ msgid ""
954
+ "This helps ensure updates are more stable before they're automatically "
955
+ "applied to your site."
 
956
  msgstr ""
957
 
958
+ #: src/features/base.php:946
959
+ msgid "Unfortunately your PHP version is too low to support this feature."
960
  msgstr ""
961
 
962
+ #: src/features/base.php:1086
963
+ #, php-format
964
+ msgid "Failed up to update %s plugin options."
965
  msgstr ""
966
 
967
+ #: src/features/base.php:1091 src/features/base.php:1153
968
+ #, php-format
969
+ msgid "%s Plugin options updated successfully."
970
  msgstr ""
971
 
972
+ #: src/features/base.php:1095
973
+ #, php-format
974
+ msgid ""
975
+ "Failed to update %s options as you are not authenticated with %s as a "
976
+ "Security Admin."
977
  msgstr ""
978
 
979
+ #: src/features/base_wpsf.php:101 src/features/base_wpsf.php:140
980
+ msgid "Settings"
 
 
981
  msgstr ""
982
 
983
+ #: src/features/base_wpsf.php:102 src/features/base_wpsf.php:141
984
+ msgid "On"
985
  msgstr ""
986
 
987
+ #: src/features/base_wpsf.php:103 src/features/base_wpsf.php:142
988
+ msgid "Off"
989
  msgstr ""
990
 
991
+ #: src/features/base_wpsf.php:104 src/features/base_wpsf.php:143
992
+ #: src/processors/hackprotect_corechecksumscan.php:332
993
+ #: src/processors/hackprotect_pluginvulnerabilities.php:155
994
+ #: src/processors/hackprotect_wpvulnscan.php:147
995
+ #: src/processors/loginprotect_intent.php:265
996
+ msgid "More Info"
997
  msgstr ""
998
 
999
+ #: src/features/base_wpsf.php:105 src/features/base_wpsf.php:144
1000
+ msgid "Blog"
1001
  msgstr ""
1002
 
1003
+ #: src/features/base_wpsf.php:106 src/features/base_wpsf.php:145
1004
+ msgid "Save All Settings"
 
1005
  msgstr ""
1006
 
1007
+ #: src/features/base_wpsf.php:108 src/features/base_wpsf.php:147
1008
+ msgid "Configure Module"
1009
  msgstr ""
1010
 
1011
+ #: src/features/base_wpsf.php:109 src/features/base_wpsf.php:148
1012
+ msgid "Actions and Info"
 
 
 
1013
  msgstr ""
1014
 
1015
+ #: src/features/base_wpsf.php:110 src/features/base_wpsf.php:149
1016
+ msgid "Perform actions for this module"
1017
  msgstr ""
1018
 
1019
+ #: src/features/base_wpsf.php:111 src/features/base_wpsf.php:150
1020
+ msgid "Help"
 
1021
  msgstr ""
1022
 
1023
+ #: src/features/base_wpsf.php:112 src/features/base_wpsf.php:151
1024
+ msgid "Learn More"
1025
  msgstr ""
1026
 
1027
+ #: src/features/base_wpsf.php:114 src/features/base_wpsf.php:153
1028
+ msgid "Plugin Access Restricted"
 
1029
  msgstr ""
1030
 
1031
+ #: src/features/base_wpsf.php:115 src/features/base_wpsf.php:154
1032
+ msgid ""
1033
+ "This security plugin is restricted to administrators with the Security "
1034
+ "Access Key."
1035
  msgstr ""
1036
 
1037
+ #: src/features/base_wpsf.php:116 src/features/base_wpsf.php:155
1038
+ msgid "Please provide the Security Access Key to manage this plugin."
1039
+ msgstr ""
1040
+
1041
+ #: src/features/base_wpsf.php:117 src/features/base_wpsf.php:156
1042
+ msgid "To manage this plugin you must enter the access key."
1043
+ msgstr ""
1044
+
1045
+ #: src/features/base_wpsf.php:118 src/features/base_wpsf.php:157
1046
+ msgid "Enter Access Key"
1047
+ msgstr ""
1048
+
1049
+ #: src/features/base_wpsf.php:119 src/features/base_wpsf.php:158
1050
+ msgid "Submit Security Admin Key"
1051
+ msgstr ""
1052
+
1053
+ #: src/features/base_wpsf.php:120 src/features/base_wpsf.php:159
1054
+ msgid "Forgotten Key"
1055
+ msgstr ""
1056
+
1057
+ #: src/features/base_wpsf.php:166
1058
+ msgid "Nonce security checking failed - the nonce value was empty."
1059
+ msgstr ""
1060
+
1061
+ #: src/features/base_wpsf.php:167
1062
+ #, php-format
1063
+ msgid "Nonce security checking failed - the nonce supplied was \"%s\"."
1064
+ msgstr ""
1065
+
1066
+ #: src/features/base_wpsf.php:218 src/features/base_wpsf.php:219
1067
+ msgid "User Messages"
1068
+ msgstr ""
1069
+
1070
+ #: src/features/base_wpsf.php:221
1071
+ msgid "Customize the messages displayed to the user."
1072
+ msgstr ""
1073
+
1074
+ #: src/features/base_wpsf.php:222
1075
+ msgid ""
1076
+ "Use this section if you need to communicate to the user in a particular "
1077
+ "manner."
1078
+ msgstr ""
1079
+
1080
+ #: src/features/base_wpsf.php:223
1081
+ #, php-format
1082
+ msgid "Hint - %s"
1083
+ msgstr ""
1084
+
1085
+ #: src/features/base_wpsf.php:223
1086
+ #, php-format
1087
+ msgid "To reset any message to its default, enter the text exactly: %s"
1088
+ msgstr ""
1089
+
1090
+ #: src/features/comments_filter.php:51
1091
+ msgid "I'm not a spammer."
1092
+ msgstr ""
1093
+
1094
+ #: src/features/comments_filter.php:54
1095
+ msgid "Please check the box to confirm you're not a spammer."
1096
+ msgstr ""
1097
+
1098
+ #: src/features/comments_filter.php:57
1099
+ #, php-format
1100
+ msgid "Please wait %s seconds before posting your comment."
1101
  msgstr ""
1102
 
1103
  #: src/features/comments_filter.php:60
1104
+ msgid "Please reload this page to post a comment."
1105
  msgstr ""
1106
 
1107
+ #: src/features/comments_filter.php:110
1108
+ msgid "Comments SPAM Protection"
1109
+ msgstr ""
1110
+
1111
+ #: src/features/comments_filter.php:112
1112
+ #, php-format
1113
  msgid ""
1114
+ "The Comments Filter can block 100% of automated spam bots and also offer the "
1115
+ "option to analyse human-generated spam."
1116
  msgstr ""
1117
 
1118
+ #: src/features/comments_filter.php:113
1119
+ msgid "Comments Filter"
1120
+ msgstr ""
1121
+
1122
+ #: src/features/comments_filter.php:119
1123
+ #, php-format
1124
+ msgid "%s Comment SPAM Protection"
1125
+ msgstr ""
1126
+
1127
+ #: src/features/comments_filter.php:119
1128
+ msgid "Automatic Bot"
1129
+ msgstr ""
1130
+
1131
+ #: src/features/comments_filter.php:121
1132
+ #, php-format
1133
+ msgid "Blocks 100% of all automated bot-generated comment SPAM."
1134
+ msgstr ""
1135
+
1136
+ #: src/features/comments_filter.php:124
1137
+ msgid "Bot SPAM"
1138
  msgstr ""
1139
 
1140
+ #: src/features/comments_filter.php:131
1141
+ msgid "Adds Google reCAPTCHA to the Comment Forms."
1142
  msgstr ""
1143
 
1144
+ #: src/features/comments_filter.php:132 src/features/login_protect.php:451
1145
+ msgid "Keep this turned on."
1146
+ msgstr ""
1147
+
1148
+ #: src/features/comments_filter.php:133 src/features/hack_protect.php:605
1149
+ #: src/features/login_protect.php:452 src/features/plugin.php:685
1150
+ #: src/features/user_management.php:225
1151
+ #, php-format
1152
+ msgid "Note - %s"
1153
+ msgstr ""
1154
+
1155
+ #: src/features/comments_filter.php:133 src/features/login_protect.php:452
1156
+ msgid ""
1157
+ "You will need to register for Google reCAPTCHA keys and store them in the "
1158
+ "Shield 'Dashboard' settings."
1159
+ msgstr ""
1160
+
1161
+ #: src/features/comments_filter.php:138
1162
+ #, php-format
1163
+ msgid "%s Comment SPAM Protection Filter"
1164
+ msgstr ""
1165
+
1166
+ #: src/features/comments_filter.php:138
1167
+ msgid "Human"
1168
+ msgstr ""
1169
+
1170
+ #: src/features/comments_filter.php:140
1171
+ msgid "Uses a 3rd party SPAM dictionary to detect human-based comment SPAM."
1172
+ msgstr ""
1173
+
1174
+ #: src/features/comments_filter.php:142
1175
  msgid ""
1176
+ "This tool, unlike other SPAM tools such as Akismet, will not send your "
1177
+ "comment data to 3rd party services for analysis."
1178
  msgstr ""
1179
 
1180
+ #: src/features/comments_filter.php:144
1181
+ msgid "Human SPAM"
1182
  msgstr ""
1183
 
1184
+ #: src/features/comments_filter.php:196
1185
+ msgid "Enable (or Disable) The Comment SPAM Protection Feature"
1186
  msgstr ""
1187
 
1188
+ #: src/features/comments_filter.php:197 src/wizards/plugin.php:581
1189
+ #: src/wizards/plugin.php:586
1190
+ msgid "Comment SPAM Protection"
1191
  msgstr ""
1192
 
1193
+ #: src/features/comments_filter.php:201 src/features/comments_filter.php:202
1194
  msgid "Human SPAM Filter"
1195
  msgstr ""
1196
 
1197
+ #: src/features/comments_filter.php:202
1198
+ #, php-format
1199
+ msgid "Enable (or Disable) The %s Feature"
1200
  msgstr ""
1201
 
1202
+ #: src/features/comments_filter.php:203
1203
  msgid ""
1204
  "Scans the content of WordPress comments for keywords that are indicative of "
1205
  "SPAM and marks the comment according to your preferred setting below."
1206
  msgstr ""
1207
 
1208
+ #: src/features/comments_filter.php:207
1209
  msgid "Comment Filter Items"
1210
  msgstr ""
1211
 
1212
+ #: src/features/comments_filter.php:208
1213
  msgid "Select The Items To Scan For SPAM"
1214
  msgstr ""
1215
 
1216
+ #: src/features/comments_filter.php:209
1217
  msgid ""
1218
  "When a user submits a comment, only the selected parts of the comment data "
1219
  "will be scanned for SPAM content."
1220
  msgstr ""
1221
 
1222
+ #: src/features/comments_filter.php:209 src/features/login_protect.php:594
 
1223
  #, php-format
1224
  msgid "Recommended: %s"
1225
  msgstr ""
1226
 
1227
+ #: src/features/comments_filter.php:209
1228
  msgid "All"
1229
  msgstr ""
1230
 
1231
+ #: src/features/comments_filter.php:213 src/features/comments_filter.php:225
1232
  msgid "Default SPAM Action"
1233
  msgstr ""
1234
 
1235
+ #: src/features/comments_filter.php:214 src/features/comments_filter.php:226
1236
  msgid "How To Categorise Comments When Identified To Be SPAM"
1237
  msgstr ""
1238
 
1239
+ #: src/features/comments_filter.php:215 src/features/comments_filter.php:227
1240
  #, php-format
1241
  msgid ""
1242
  "When a comment is detected as being SPAM from %s, the comment will be "
1243
  "categorised based on this setting."
1244
  msgstr ""
1245
 
1246
+ #: src/features/comments_filter.php:215
1247
  msgid "a human commenter"
1248
  msgstr ""
1249
 
1250
+ #: src/features/comments_filter.php:219
1251
+ msgid "SPAM Bot Protection"
 
 
 
 
 
 
 
 
1252
  msgstr ""
1253
 
1254
+ #: src/features/comments_filter.php:220
1255
+ msgid "Block Automatic Comment SPAM By Bots"
1256
  msgstr ""
1257
 
1258
+ #: src/features/comments_filter.php:221
1259
  msgid ""
1260
+ "Simple, yet highly effective SPAM Bot protection for your WordPress comments."
 
1261
  msgstr ""
1262
 
1263
+ #: src/features/comments_filter.php:227
1264
  msgid "an automatic bot"
1265
  msgstr ""
1266
 
1267
+ #: src/features/comments_filter.php:231
1268
  msgid "Comments Cooldown"
1269
  msgstr ""
1270
 
1271
+ #: src/features/comments_filter.php:232
1272
  msgid "Limit posting comments to X seconds after the page has loaded"
1273
  msgstr ""
1274
 
1275
+ #: src/features/comments_filter.php:233
1276
  msgid ""
1277
  "By forcing a comments cooldown period, you restrict a Spambot's ability to "
1278
  "post multiple times to your posts."
1279
  msgstr ""
1280
 
1281
+ #: src/features/comments_filter.php:237
1282
  msgid "Comment Token Expire"
1283
  msgstr ""
1284
 
1285
+ #: src/features/comments_filter.php:238
1286
  msgid "A visitor has X seconds within which to post a comment"
1287
  msgstr ""
1288
 
1289
+ #: src/features/comments_filter.php:239
1290
  msgid ""
1291
  "Default: 600 seconds (10 minutes). Each visitor is given a unique 'Token' so "
1292
  "they can comment. This restricts spambots, but we need to force these tokens "
1293
  "to expire and at the same time not bother the visitors."
1294
  msgstr ""
1295
 
1296
+ #: src/features/comments_filter.php:243
1297
+ msgid "GASP Checkbox Message"
1298
  msgstr ""
1299
 
1300
+ #: src/features/comments_filter.php:244
1301
  msgid "If you want a custom checkbox message, please provide this here"
1302
  msgstr ""
1303
 
1304
+ #: src/features/comments_filter.php:245
1305
  msgid "You can customise the message beside the checkbox."
1306
  msgstr ""
1307
 
1308
+ #: src/features/comments_filter.php:246 src/features/comments_filter.php:265
1309
+ #: src/features/comments_filter.php:272 src/features/comments_filter.php:279
1310
  #, php-format
1311
  msgid "Default Message: %s"
1312
  msgstr ""
1313
 
1314
+ #: src/features/comments_filter.php:246 src/features/comments_filter.php:265
1315
  msgid "Please check the box to confirm you're not a spammer"
1316
  msgstr ""
1317
 
1318
+ #: src/features/comments_filter.php:251
1319
+ msgid "Enable Google reCAPTCHA For Comments"
1320
+ msgstr ""
1321
+
1322
+ #: src/features/comments_filter.php:252
1323
+ msgid "Use Google reCAPTCHA on the comments form to prevent bot-spam comments."
1324
+ msgstr ""
1325
+
1326
+ #: src/features/comments_filter.php:256 src/features/login_protect.php:585
1327
+ #: src/features/plugin.php:823
1328
+ msgid "reCAPTCHA Style"
1329
+ msgstr ""
1330
+
1331
+ #: src/features/comments_filter.php:257 src/features/login_protect.php:586
1332
+ msgid "How Google reCAPTCHA Will Be Displayed"
1333
+ msgstr ""
1334
+
1335
+ #: src/features/comments_filter.php:258 src/features/login_protect.php:587
1336
+ #: src/features/plugin.php:825
1337
+ msgid ""
1338
+ "You can choose the reCAPTCHA display format that best suits your site, "
1339
+ "including the new Invisible Recaptcha"
1340
+ msgstr ""
1341
+
1342
+ #: src/features/comments_filter.php:262
1343
+ msgid "GASP Alert Message"
1344
  msgstr ""
1345
 
1346
+ #: src/features/comments_filter.php:263
1347
  msgid "If you want a custom alert message, please provide this here"
1348
  msgstr ""
1349
 
1350
+ #: src/features/comments_filter.php:264
1351
  msgid ""
1352
  "This alert message is displayed when a visitor attempts to submit a comment "
1353
  "without checking the box."
1354
  msgstr ""
1355
 
1356
+ #: src/features/comments_filter.php:269
1357
+ msgid "GASP Wait Message"
1358
  msgstr ""
1359
 
1360
+ #: src/features/comments_filter.php:270
1361
  msgid ""
1362
  "If you want a custom submit-button wait message, please provide this here."
1363
  msgstr ""
1364
 
1365
+ #: src/features/comments_filter.php:271
1366
  #, php-format
1367
  msgid ""
1368
  "Where you see the '%s' this will be the number of seconds. You must ensure "
1369
  "you include 1, and only 1, of these."
1370
  msgstr ""
1371
 
1372
+ #: src/features/comments_filter.php:272
1373
  #, php-format
1374
  msgid "Please wait %s seconds before posting your comment"
1375
  msgstr ""
1376
 
1377
+ #: src/features/comments_filter.php:276
1378
+ msgid "GASP Reload Message"
1379
  msgstr ""
1380
 
1381
+ #: src/features/comments_filter.php:277
1382
  msgid ""
1383
  "If you want a custom message when the comment token has expired, please "
1384
  "provide this here."
1385
  msgstr ""
1386
 
1387
+ #: src/features/comments_filter.php:278
1388
  msgid ""
1389
  "This message is displayed on the submit-button when the comment token is "
1390
  "expired"
1391
  msgstr ""
1392
 
1393
+ #: src/features/comments_filter.php:279
1394
  msgid "Please reload this page to post a comment"
1395
  msgstr ""
1396
 
1398
  msgid "Email Options"
1399
  msgstr ""
1400
 
1401
+ #: src/features/email.php:64
 
 
 
 
 
 
 
 
 
 
 
 
1402
  msgid "Email Throttle Limit"
1403
  msgstr ""
1404
 
1405
+ #: src/features/email.php:65
1406
  msgid "Limit Emails Per Second"
1407
  msgstr ""
1408
 
1409
+ #: src/features/email.php:66
1410
  msgid ""
1411
  "You throttle emails sent by this plugin by limiting the number of emails "
1412
  "sent every second. This is useful in case you get hit by a bot attack. Zero "
1413
  "(0) turns this off. Suggested: 10"
1414
  msgstr ""
1415
 
1416
+ #: src/features/firewall.php:43
1417
+ #, php-format
1418
+ msgid "You were blocked by the %s."
1419
+ msgstr ""
1420
+
1421
+ #: src/features/firewall.php:68
1422
  msgid ""
1423
  "The Firewall is designed to analyse data sent to your website and block any "
1424
  "requests that appear to be malicious."
1425
  msgstr ""
1426
 
1427
+ #: src/features/firewall.php:69 src/features/plugin.php:872
1428
+ msgid "Firewall"
1429
+ msgstr ""
1430
+
1431
+ #: src/features/firewall.php:75
1432
  msgid "Firewall Blocking Options"
1433
  msgstr ""
1434
 
1435
+ #: src/features/firewall.php:77
1436
  msgid "Here you choose what kind of malicious data to scan for."
1437
  msgstr ""
1438
 
1439
+ #: src/features/firewall.php:79
1440
  msgid "Turn on as many options here as you can."
1441
  msgstr ""
1442
 
1443
+ #: src/features/firewall.php:80
1444
  msgid ""
1445
  "If you find an incompatibility or something stops working, un-check 1 option "
1446
  "at a time until you find the problem or review the Audit Trail."
1447
  msgstr ""
1448
 
1449
+ #: src/features/firewall.php:82
1450
  msgid "Firewall Blocking"
1451
  msgstr ""
1452
 
1453
+ #: src/features/firewall.php:86
1454
  msgid "Choose Firewall Block Response"
1455
  msgstr ""
1456
 
1457
+ #: src/features/firewall.php:88
1458
  msgid ""
1459
  "Here you choose how the plugin will respond when it detects malicious data."
1460
  msgstr ""
1461
 
1462
+ #: src/features/firewall.php:89
1463
  #, php-format
1464
  msgid "Choose the option \"%s\"."
1465
  msgstr ""
1466
 
1467
+ #: src/features/firewall.php:89
1468
  msgid "Die With Message"
1469
  msgstr ""
1470
 
1471
+ #: src/features/firewall.php:91
1472
  msgid "Firewall Response"
1473
  msgstr ""
1474
 
1475
+ #: src/features/firewall.php:95
1476
  msgid ""
1477
  "Whitelists - IPs, Pages, Parameters, and Users that by-pass the Firewall"
1478
  msgstr ""
1479
 
1480
+ #: src/features/firewall.php:97
1481
  msgid ""
1482
  "In principle you should not need to whitelist anything or anyone unless you "
1483
  "have discovered a collision with another plugin."
1484
  msgstr ""
1485
 
1486
+ #: src/features/firewall.php:98
1487
  msgid ""
1488
  "Do not whitelist anything unless you are confident in what you are doing."
1489
  msgstr ""
1490
 
1491
+ #: src/features/firewall.php:100
1492
  msgid "Whitelist"
1493
  msgstr ""
1494
 
1495
+ #: src/features/firewall.php:128
1496
  msgid "Include Cookies"
1497
  msgstr ""
1498
 
1499
+ #: src/features/firewall.php:129
1500
  msgid "Also Test Cookie Values In Firewall Tests"
1501
  msgstr ""
1502
 
1503
+ #: src/features/firewall.php:130
1504
  msgid ""
1505
  "The firewall tests GET and POST, but with this option checked it will also "
1506
  "check COOKIE values."
1507
  msgstr ""
1508
 
1509
+ #: src/features/firewall.php:134
1510
  msgid "Directory Traversals"
1511
  msgstr ""
1512
 
1513
+ #: src/features/firewall.php:135
1514
  msgid "Block Directory Traversals"
1515
  msgstr ""
1516
 
1517
+ #: src/features/firewall.php:136
1518
+ #, php-format
1519
  msgid ""
1520
+ "This will block directory traversal paths in in application parameters (e.g. "
1521
+ "%s, etc)."
1522
  msgstr ""
1523
 
1524
+ #: src/features/firewall.php:140 src/processors/firewall.php:539
1525
  msgid "SQL Queries"
1526
  msgstr ""
1527
 
1528
+ #: src/features/firewall.php:141
1529
  msgid "Block SQL Queries"
1530
  msgstr ""
1531
 
1532
+ #: src/features/firewall.php:142
1533
+ #, php-format
1534
+ msgid "This will block sql in application parameters (e.g. %s, etc)."
 
1535
  msgstr ""
1536
 
1537
+ #: src/features/firewall.php:146 src/processors/firewall.php:533
1538
  msgid "WordPress Terms"
1539
  msgstr ""
1540
 
1541
+ #: src/features/firewall.php:147
1542
  msgid "Block WordPress Specific Terms"
1543
  msgstr ""
1544
 
1545
+ #: src/features/firewall.php:148
1546
  msgid ""
1547
  "This will block WordPress specific terms in application parameters (wp_, "
1548
  "user_login, etc.)."
1549
  msgstr ""
1550
 
1551
+ #: src/features/firewall.php:152 src/processors/firewall.php:536
1552
  msgid "Field Truncation"
1553
  msgstr ""
1554
 
1555
+ #: src/features/firewall.php:153
1556
  msgid "Block Field Truncation Attacks"
1557
  msgstr ""
1558
 
1559
+ #: src/features/firewall.php:154
1560
  msgid "This will block field truncation attacks in application parameters."
1561
  msgstr ""
1562
 
1563
+ #: src/features/firewall.php:158 src/processors/firewall.php:548
1564
  msgid "PHP Code"
1565
  msgstr ""
1566
 
1567
+ #: src/features/firewall.php:159
1568
  #, php-format
1569
  msgid "Block %s"
1570
  msgstr ""
1571
 
1572
+ #: src/features/firewall.php:159
1573
  msgid "PHP Code Includes"
1574
  msgstr ""
1575
 
1576
+ #: src/features/firewall.php:160
1577
  msgid "This will block any data that appears to try and include PHP files."
1578
  msgstr ""
1579
 
1580
+ #: src/features/firewall.php:161
1581
  msgid "Will probably block saving within the Plugin/Theme file editors."
1582
  msgstr ""
1583
 
1584
+ #: src/features/firewall.php:165
1585
  msgid "Exe File Uploads"
1586
  msgstr ""
1587
 
1588
+ #: src/features/firewall.php:166
1589
  msgid "Block Executable File Uploads"
1590
  msgstr ""
1591
 
1592
+ #: src/features/firewall.php:167
1593
  msgid "This will block executable file uploads (.php, .exe, etc.)."
1594
  msgstr ""
1595
 
1596
+ #: src/features/firewall.php:171
1597
+ msgid "Leading Schemas"
1598
+ msgstr ""
1599
+
1600
+ #: src/features/firewall.php:172
1601
+ msgid "Block Leading Schemas (HTTPS / HTTP)"
1602
+ msgstr ""
1603
+
1604
+ #: src/features/firewall.php:173
1605
+ msgid ""
1606
+ "This will block leading schemas http:// and https:// in application "
1607
+ "parameters (off by default; may cause problems with other plugins)."
1608
+ msgstr ""
1609
+
1610
+ #: src/features/firewall.php:177
1611
  msgid "Aggressive Scan"
1612
  msgstr ""
1613
 
1614
+ #: src/features/firewall.php:178
1615
  msgid "Aggressively Block Data"
1616
  msgstr ""
1617
 
1618
+ #: src/features/firewall.php:179
1619
  msgid ""
1620
  "Employs a set of aggressive rules to detect and block malicious data "
1621
  "submitted to your site."
1622
  msgstr ""
1623
 
1624
+ #: src/features/firewall.php:180 src/features/hack_protect.php:694
1625
+ #: src/processors/hackprotect_corechecksumscan.php:253
1626
+ #: src/processors/hackprotect_filecleanerscan.php:237
1627
+ #: src/processors/hackprotect_pluginvulnerabilities.php:109
1628
+ #: src/processors/hackprotect_ptguard.php:486
1629
+ #: src/processors/hackprotect_wpvulnscan.php:218 src/processors/plugin.php:159
1630
  #, php-format
1631
  msgid "Warning - %s"
1632
  msgstr ""
1633
 
1634
+ #: src/features/firewall.php:180
1635
  msgid "May cause an increase in false-positive firewall blocks."
1636
  msgstr ""
1637
 
1638
+ #: src/features/firewall.php:184
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1639
  msgid "Block Response"
1640
  msgstr ""
1641
 
1642
+ #: src/features/firewall.php:185
1643
  msgid "Choose how the firewall responds when it blocks a request"
1644
  msgstr ""
1645
 
1646
+ #: src/features/firewall.php:186
1647
  msgid ""
1648
  "We recommend dying with a message so you know what might have occurred when "
1649
  "the firewall blocks you"
1650
  msgstr ""
1651
 
1652
+ #: src/features/firewall.php:190
1653
  msgid "Send Email Report"
1654
  msgstr ""
1655
 
1656
+ #: src/features/firewall.php:191
1657
  msgid ""
1658
  "When a visitor is blocked the firewall will send an email to the configured "
1659
  "email address"
1660
  msgstr ""
1661
 
1662
+ #: src/features/firewall.php:192
1663
  msgid ""
1664
  "Use with caution - if you get hit by automated bots you may send out too "
1665
  "many emails and you could get blocked by your host"
1666
  msgstr ""
1667
 
1668
+ #: src/features/firewall.php:196
1669
  msgid "Whitelist Parameters"
1670
  msgstr ""
1671
 
1672
+ #: src/features/firewall.php:197
1673
  msgid ""
1674
  "Detail pages and parameters that are whitelisted (ignored by the firewall)"
1675
  msgstr ""
1676
 
1677
+ #: src/features/firewall.php:198
1678
  msgid ""
1679
  "This should be used with caution and you should only provide parameter names "
1680
  "that you must have excluded"
1681
  msgstr ""
1682
 
1683
+ #: src/features/firewall.php:202 src/features/firewall.php:203
1684
+ #: src/features/firewall.php:208
1685
  #, php-format
1686
  msgid "Ignore %s"
1687
  msgstr ""
1688
 
1689
+ #: src/features/firewall.php:202 src/features/firewall.php:203
1690
+ #: src/features/login_protect.php:162
1691
  msgid "Administrators"
1692
  msgstr ""
1693
 
1694
+ #: src/features/firewall.php:204
1695
  msgid ""
1696
  "Authenticated administrator users will not be processed by the firewall "
1697
  "rules."
1698
  msgstr ""
1699
 
1700
+ #: src/features/firewall.php:208
1701
  msgid "Search Engines"
1702
  msgstr ""
1703
 
1704
+ #: src/features/firewall.php:209
1705
  msgid "Ignore Search Engine Bot Traffic"
1706
  msgstr ""
1707
 
1708
+ #: src/features/firewall.php:210
1709
  msgid ""
1710
  "The firewall will try to recognise search engine spiders/bots and not apply "
1711
  "firewall rules to them."
1712
  msgstr ""
1713
 
1714
+ #: src/features/firewall.php:214
1715
+ msgid "Firewall Block Message"
 
 
 
 
1716
  msgstr ""
1717
 
1718
+ #: src/features/firewall.php:215
1719
+ msgid "Message Displayed To Visitor When A Firewall Block Is Triggered"
 
 
 
1720
  msgstr ""
1721
 
1722
+ #: src/features/firewall.php:216
1723
+ msgid "This is the message displayed to visitors that trigger the firewall."
 
 
1724
  msgstr ""
1725
 
1726
+ #: src/features/hack_protect.php:79
1727
+ #, php-format
1728
+ msgid "%s per day"
1729
  msgstr ""
1730
 
1731
+ #: src/features/hack_protect.php:528
1732
+ #, php-format
1733
  msgid ""
1734
+ "Sorry, this feature is not available because we cannot write to disk at this "
1735
+ "location: \"%s\""
1736
  msgstr ""
1737
 
1738
+ #: src/features/hack_protect.php:546 src/features/hack_protect.php:547
1739
+ msgid "Scan Schedule"
1740
  msgstr ""
1741
 
1742
+ #: src/features/hack_protect.php:549
1743
+ msgid "Set how frequently the Hack Guard scans will run."
1744
  msgstr ""
1745
 
1746
+ #: src/features/hack_protect.php:556
1747
  msgid ""
1748
+ "Hack Guard is a set of tools to warn you and protect you against hacks on "
1749
+ "your site."
 
 
 
 
1750
  msgstr ""
1751
 
1752
+ #: src/features/hack_protect.php:557 src/features/plugin.php:874
1753
+ msgid "Hack Guard"
 
1754
  msgstr ""
1755
 
1756
+ #: src/features/hack_protect.php:563 src/features/hack_protect.php:569
1757
+ msgid "Vulnerabilities Scanner"
1758
  msgstr ""
1759
 
1760
+ #: src/features/hack_protect.php:565
1761
  msgid ""
1762
+ "Regularly scan your WordPress plugins and themes for known security "
1763
  "vulnerabilities."
1764
  msgstr ""
1765
 
1766
+ #: src/features/hack_protect.php:566 src/features/hack_protect.php:573
1767
+ #: src/features/hack_protect.php:576 src/features/hack_protect.php:649
1768
+ msgid "Plugin Vulnerabilities Scanner"
1769
  msgstr ""
1770
 
1771
+ #: src/features/hack_protect.php:567
1772
  msgid ""
1773
+ "Ensure this is turned on and you will always know if any of your assets have "
1774
+ "known security vulnerabilities."
1775
  msgstr ""
1776
 
1777
+ #: src/features/hack_protect.php:575
1778
+ msgid ""
1779
+ "Regularly scan your plugins against a database of known vulnerabilities."
1780
  msgstr ""
1781
 
1782
+ #: src/features/hack_protect.php:578
1783
+ msgid "Plugin Vulnerabilities"
1784
  msgstr ""
1785
 
1786
+ #: src/features/hack_protect.php:582 src/features/hack_protect.php:585
1787
+ msgid "Core File Integrity Scanner"
1788
  msgstr ""
1789
 
1790
+ #: src/features/hack_protect.php:584
1791
  msgid ""
1792
+ "Regularly scan your WordPress core files for changes compared to official "
1793
+ "WordPress files."
1794
  msgstr ""
1795
 
1796
+ #: src/features/hack_protect.php:587 src/features/hack_protect.php:673
1797
+ msgid "Core File Scanner"
 
 
1798
  msgstr ""
1799
 
1800
+ #: src/features/hack_protect.php:591 src/features/hack_protect.php:594
1801
+ #: src/features/hack_protect.php:596 src/features/hack_protect.php:686
1802
+ msgid "Unrecognised Files Scanner"
 
 
1803
  msgstr ""
1804
 
1805
+ #: src/features/hack_protect.php:593
1806
+ msgid "Regularly scan your WordPress core folders for files that don't belong."
1807
  msgstr ""
1808
 
1809
+ #: src/features/hack_protect.php:600
1810
+ msgid "Plugins and Themes Guard"
1811
  msgstr ""
1812
 
1813
+ #: src/features/hack_protect.php:601
1814
+ msgid "Plugins/Themes Guard"
 
1815
  msgstr ""
1816
 
1817
+ #: src/features/hack_protect.php:603
1818
+ msgid "Detect malicious changes to your themes and plugins."
 
 
1819
  msgstr ""
1820
 
1821
+ #: src/features/hack_protect.php:604
1822
+ msgid "Keep the Plugins/Theme Guard feature turned on."
1823
  msgstr ""
1824
 
1825
+ #: src/features/hack_protect.php:605 src/features/user_management.php:225
1826
+ msgid "Requires PHP v5.4 and above."
1827
  msgstr ""
1828
 
1829
+ #: src/features/hack_protect.php:610 src/features/hack_protect.php:611
1830
+ msgid "Integrity Checks"
 
 
1831
  msgstr ""
1832
 
1833
+ #: src/features/hack_protect.php:613
1834
+ msgid "Monitor for unrecognised changes to your system."
1835
  msgstr ""
1836
 
1837
+ #: src/features/hack_protect.php:614
1838
+ msgid "Enable these to prevent unauthorized changes to your WordPress site."
1839
  msgstr ""
1840
 
1841
+ #: src/features/hack_protect.php:643
1842
+ msgid "Daily Scan Frequency"
1843
  msgstr ""
1844
 
1845
+ #: src/features/hack_protect.php:644
1846
+ msgid "Number Of Times To Automatically Run File Scan In 24hrs"
 
 
1847
  msgstr ""
1848
 
1849
+ #: src/features/hack_protect.php:645
1850
+ msgid ""
1851
+ "Default: Once every 24hrs. To improve security, increase the number of scans "
1852
+ "per day."
1853
  msgstr ""
1854
 
1855
+ #: src/features/hack_protect.php:650
1856
+ #, php-format
1857
+ msgid "Daily Cron - %s"
1858
  msgstr ""
1859
 
1860
+ #: src/features/hack_protect.php:650
1861
+ msgid "Scans Plugins For Known Vulnerabilities"
1862
  msgstr ""
1863
 
1864
+ #: src/features/hack_protect.php:651
1865
  msgid ""
1866
+ "Runs a scan of all your plugins against a database of known WordPress plugin "
1867
+ "vulnerabilities."
1868
  msgstr ""
1869
 
1870
+ #: src/features/hack_protect.php:655
1871
+ msgid "Vulnerability Scanner"
1872
  msgstr ""
1873
 
1874
+ #: src/features/hack_protect.php:656
1875
+ msgid "Enable The Vulnerability Scanner"
1876
  msgstr ""
1877
 
1878
+ #: src/features/hack_protect.php:657
1879
+ msgid ""
1880
+ "Runs a scan of all your plugins against a database of known WordPress "
1881
+ "vulnerabilities."
1882
  msgstr ""
1883
 
1884
+ #: src/features/hack_protect.php:662
1885
+ msgid "Apply Updates Automatically To Vulnerable Plugins"
 
 
1886
  msgstr ""
1887
 
1888
+ #: src/features/hack_protect.php:663
1889
+ msgid ""
1890
+ "When an update becomes available, automatically apply updates to items with "
1891
+ "known vulnerabilities."
1892
  msgstr ""
1893
 
1894
+ #: src/features/hack_protect.php:667
1895
+ msgid "Highlight Plugins"
1896
  msgstr ""
1897
 
1898
+ #: src/features/hack_protect.php:668
1899
+ msgid "Highlight Vulnerable Plugins Upon Display"
1900
  msgstr ""
1901
 
1902
+ #: src/features/hack_protect.php:669
1903
+ msgid "Vulnerable plugins will be highlighted on the main plugins page."
1904
  msgstr ""
1905
 
1906
+ #: src/features/hack_protect.php:674
1907
+ msgid "Scans WordPress Core Files For Alterations"
1908
  msgstr ""
1909
 
1910
+ #: src/features/hack_protect.php:675
1911
  msgid ""
1912
+ "Compares all WordPress core files on your site against the official "
1913
+ "WordPress files."
1914
  msgstr ""
1915
 
1916
+ #: src/features/hack_protect.php:676
1917
+ msgid "WordPress Core files should never be altered for any reason."
1918
  msgstr ""
1919
 
1920
+ #: src/features/hack_protect.php:680
1921
+ msgid "Auto Repair"
1922
  msgstr ""
1923
 
1924
+ #: src/features/hack_protect.php:681
1925
+ msgid "Automatically Repair WordPress Core Files That Have Been Altered"
1926
  msgstr ""
1927
 
1928
+ #: src/features/hack_protect.php:682
1929
+ msgid ""
1930
+ "Attempts to automatically repair WordPress Core files with the official "
1931
+ "WordPress file data, for files that have been altered or are missing."
1932
  msgstr ""
1933
 
1934
+ #: src/features/hack_protect.php:687
1935
+ msgid "Daily Scan For Unrecognised Files In Core Directories"
1936
  msgstr ""
1937
 
1938
+ #: src/features/hack_protect.php:688
1939
+ msgid ""
1940
+ "Scans for, and automatically deletes, any files in your core WordPress "
1941
+ "folders that are not part of your WordPress installation."
1942
  msgstr ""
1943
 
1944
+ #: src/features/hack_protect.php:692
1945
+ msgid "Scan Uploads"
1946
  msgstr ""
1947
 
1948
+ #: src/features/hack_protect.php:693
1949
+ msgid "Scan Uploads Folder For PHP and Javascript"
1950
  msgstr ""
1951
 
1952
+ #: src/features/hack_protect.php:694
1953
  msgid ""
1954
+ "Take care when turning on this option - if you are unsure, leave it disabled."
1955
  msgstr ""
1956
 
1957
+ #: src/features/hack_protect.php:695
1958
  msgid ""
1959
+ "The Uploads folder is primarily for media, but could be used to store "
1960
+ "nefarious files."
1961
  msgstr ""
1962
 
1963
+ #: src/features/hack_protect.php:699
1964
+ msgid "File Exclusions"
1965
  msgstr ""
1966
 
1967
+ #: src/features/hack_protect.php:700
1968
+ msgid "Provide A List Of Files To Be Excluded From The Scan"
 
 
1969
  msgstr ""
1970
 
1971
+ #: src/features/hack_protect.php:702
1972
+ msgid "Take a new line for each file you wish to exclude from the scan."
 
1973
  msgstr ""
1974
 
1975
+ #: src/features/hack_protect.php:703
1976
+ msgid "No commas are necessary."
 
1977
  msgstr ""
1978
 
1979
+ #: src/features/hack_protect.php:708
1980
+ msgid "Enable Integrity Scan"
 
 
1981
  msgstr ""
1982
 
1983
+ #: src/features/hack_protect.php:709
1984
+ msgid "Scans For Critical Changes Made To Your WordPress Site"
1985
  msgstr ""
1986
 
1987
+ #: src/features/hack_protect.php:710
1988
+ msgid "Detects changes made to your WordPress site outside of WordPress."
1989
  msgstr ""
1990
 
1991
+ #: src/features/hack_protect.php:714
1992
+ msgid "Monitor User Accounts"
 
 
1993
  msgstr ""
1994
 
1995
+ #: src/features/hack_protect.php:715
1996
+ msgid "Scans For Critical Changes Made To User Accounts"
1997
  msgstr ""
1998
 
1999
+ #: src/features/hack_protect.php:716
2000
+ msgid ""
2001
+ "Detects changes made to critical user account information that were made "
2002
+ "directly on the database and outside of the WordPress system."
2003
  msgstr ""
2004
 
2005
+ #: src/features/hack_protect.php:717
2006
+ msgid "An example of this might be some form of SQL Injection attack."
 
2007
  msgstr ""
2008
 
2009
+ #: src/features/hack_protect.php:718 src/features/hack_protect.php:719
2010
+ #: src/features/ips.php:243 src/features/ips.php:250
2011
+ #: src/features/lockdown.php:173
2012
  #, php-format
2013
+ msgid "Warning: %s"
 
 
2014
  msgstr ""
2015
 
2016
+ #: src/features/hack_protect.php:718
2017
  msgid ""
2018
+ "Enabling this option for every page low may slow down your site with large "
2019
+ "numbers of users."
2020
  msgstr ""
2021
 
2022
+ #: src/features/hack_protect.php:719
2023
+ msgid ""
2024
+ "This option may cause critial problem with 3rd party plugins that manage "
2025
+ "user accounts."
2026
  msgstr ""
2027
 
2028
+ #: src/features/hack_protect.php:723 src/features/headers.php:204
2029
+ #: src/features/headers.php:205 src/features/login_protect.php:548
2030
+ #: src/features/login_protect.php:560 src/features/login_protect.php:566
2031
+ #, php-format
2032
+ msgid "Enable %s"
2033
  msgstr ""
2034
 
2035
+ #: src/features/hack_protect.php:723
2036
+ msgid "Guard"
2037
  msgstr ""
2038
 
2039
+ #: src/features/hack_protect.php:724
2040
+ msgid "Enable The Guard For Plugin And Theme Files"
2041
  msgstr ""
2042
 
2043
+ #: src/features/hack_protect.php:725
2044
  msgid ""
2045
+ "When enabled the Guard will automatically scan for changes to your Plugin "
2046
+ "and Theme files."
2047
  msgstr ""
2048
 
2049
+ #: src/features/hack_protect.php:729
2050
+ msgid "Guard/Scan Depth"
 
 
2051
  msgstr ""
2052
 
2053
+ #: src/features/hack_protect.php:730
2054
+ msgid "How Deep Into The Plugin Directories To Scan And Guard"
 
 
 
2055
  msgstr ""
2056
 
2057
+ #: src/features/hack_protect.php:731
2058
  msgid ""
2059
+ "The Guard normally scans only the top level of a folder. Increasing depth "
2060
+ "will increase scan times."
2061
  msgstr ""
2062
 
2063
+ #: src/features/hack_protect.php:732
2064
+ #, php-format
2065
+ msgid ""
2066
+ "Setting it to %s will remove this limit and all sub-folders will be scanned "
2067
+ "- not recommended"
2068
  msgstr ""
2069
 
2070
+ #: src/features/hack_protect.php:736
2071
+ msgid "Included File Types"
2072
  msgstr ""
2073
 
2074
+ #: src/features/hack_protect.php:737
2075
+ msgid "The File Types (by File Extension) Included In The Scan"
 
 
2076
  msgstr ""
2077
 
2078
+ #: src/features/hack_protect.php:738
2079
+ msgid "Take a new line for each file extension."
2080
  msgstr ""
2081
 
2082
+ #: src/features/hack_protect.php:739
2083
+ msgid "No commas(,) or periods(.) necessary."
2084
  msgstr ""
2085
 
2086
+ #: src/features/hack_protect.php:740
2087
+ msgid "Remove all extensions to scan all file type (not recommended)."
2088
  msgstr ""
2089
 
2090
+ #: src/features/hack_protect.php:744
2091
+ msgid "Show Re-Install Links"
2092
  msgstr ""
2093
 
2094
+ #: src/features/hack_protect.php:745
2095
+ msgid "Show Re-Install Links For Plugins"
2096
  msgstr ""
2097
 
2098
+ #: src/features/hack_protect.php:746
2099
+ msgid ""
2100
+ "Show links to re-install plugins and offer re-install when activating "
2101
+ "plugins."
2102
  msgstr ""
2103
 
2104
+ #: src/features/headers.php:129 src/features/headers.php:138
2105
+ msgid ""
2106
+ "Protect visitors to your site by implementing increased security response "
2107
+ "headers."
2108
  msgstr ""
2109
 
2110
+ #: src/features/headers.php:130 src/features/headers.php:139
2111
+ #: src/features/headers.php:148
2112
  msgid ""
2113
+ "Enabling these features are advised, but you must test them on your site "
2114
+ "thoroughly."
2115
  msgstr ""
2116
 
2117
+ #: src/features/headers.php:136
2118
+ msgid "Advanced Security Headers"
2119
  msgstr ""
2120
 
2121
+ #: src/features/headers.php:141
2122
+ msgid "Security Headers"
 
2123
  msgstr ""
2124
 
2125
+ #: src/features/headers.php:145 src/features/headers.php:150
2126
+ #: src/features/headers.php:205
2127
+ msgid "Content Security Policy"
2128
  msgstr ""
2129
 
2130
+ #: src/features/headers.php:147
2131
+ msgid ""
2132
+ "Restrict the sources and types of content that may be loaded and processed "
2133
+ "by visitor browsers."
2134
  msgstr ""
2135
 
2136
+ #: src/features/headers.php:179
2137
+ msgid "Block iFrames"
2138
  msgstr ""
2139
 
2140
+ #: src/features/headers.php:180
2141
+ msgid "Block Remote iFrames Of This Site"
2142
  msgstr ""
2143
 
2144
+ #: src/features/headers.php:181
2145
  msgid ""
2146
+ "The setting prevents any external website from embedding your site in an "
2147
+ "iFrame."
2148
  msgstr ""
2149
 
2150
+ #: src/features/headers.php:182
2151
+ msgid "This is useful for preventing so-called \"ClickJack attacks\"."
2152
  msgstr ""
2153
 
2154
+ #: src/features/headers.php:186
2155
+ msgid "Referrer Policy"
2156
  msgstr ""
2157
 
2158
+ #: src/features/headers.php:187
2159
+ msgid "Referrer Policy Header"
2160
  msgstr ""
2161
 
2162
+ #: src/features/headers.php:188
2163
  msgid ""
2164
+ "The Referrer Policy Header allows you to control when and what referral "
2165
+ "information a browser may pass along with links clicked on your site."
 
 
 
2166
  msgstr ""
2167
 
2168
+ #: src/features/headers.php:192
2169
+ msgid "XSS Protection"
2170
  msgstr ""
2171
 
2172
+ #: src/features/headers.php:193
2173
+ msgid "Employ Built-In Browser XSS Protection"
2174
  msgstr ""
2175
 
2176
+ #: src/features/headers.php:194
2177
  msgid ""
2178
+ "Directs compatible browsers to block what they detect as Reflective XSS "
2179
+ "attacks."
2180
  msgstr ""
2181
 
2182
+ #: src/features/headers.php:198
2183
+ msgid "Prevent Mime-Sniff"
 
 
2184
  msgstr ""
2185
 
2186
+ #: src/features/headers.php:199
2187
+ msgid "Turn-Off Browser Mime-Sniff"
2188
  msgstr ""
2189
 
2190
+ #: src/features/headers.php:200
2191
+ msgid "Reduces visitor exposure to malicious user-uploaded content."
2192
  msgstr ""
2193
 
2194
+ #: src/features/headers.php:206
2195
  msgid ""
2196
+ "Allows for permission and restriction of all resources loaded on your site."
 
2197
  msgstr ""
2198
 
2199
+ #: src/features/headers.php:210
2200
+ msgid "Self"
2201
  msgstr ""
2202
 
2203
+ #: src/features/headers.php:211
2204
+ msgid "Allow 'self' Directive"
2205
  msgstr ""
2206
 
2207
+ #: src/features/headers.php:212
2208
+ msgid "Using 'self' is generally recommended."
 
2209
  msgstr ""
2210
 
2211
+ #: src/features/headers.php:213
2212
+ msgid ""
2213
+ "It essentially means that resources from your own host:protocol are "
2214
+ "permitted."
2215
  msgstr ""
2216
 
2217
+ #: src/features/headers.php:217
2218
+ msgid "Inline Entities"
 
2219
  msgstr ""
2220
 
2221
+ #: src/features/headers.php:218
2222
+ msgid "Allow Inline Scripts and CSS"
 
 
2223
  msgstr ""
2224
 
2225
+ #: src/features/headers.php:219
2226
  msgid ""
2227
+ "Allows parsing of Javascript and CSS declared in-line in your html document."
 
2228
  msgstr ""
2229
 
2230
+ #: src/features/headers.php:223
2231
+ msgid "Embedded Data"
 
2232
  msgstr ""
2233
 
2234
+ #: src/features/headers.php:224
2235
+ msgid "Allow \"data:\" Directives"
 
2236
  msgstr ""
2237
 
2238
+ #: src/features/headers.php:225
2239
  msgid ""
2240
+ "Allows use of embedded data directives, most commonly used for images and "
2241
+ "fonts."
2242
  msgstr ""
2243
 
2244
+ #: src/features/headers.php:229
2245
+ msgid "Allow eval()"
2246
  msgstr ""
2247
 
2248
+ #: src/features/headers.php:230
2249
+ msgid "Allow Javascript eval()"
 
 
2250
  msgstr ""
2251
 
2252
+ #: src/features/headers.php:231
2253
+ msgid "Permits the use of Javascript the eval() function."
2254
  msgstr ""
2255
 
2256
+ #: src/features/headers.php:235
2257
+ msgid "HTTPS"
2258
  msgstr ""
2259
 
2260
+ #: src/features/headers.php:236
2261
+ msgid "HTTPS Resource Loading"
2262
  msgstr ""
2263
 
2264
+ #: src/features/headers.php:237
2265
+ msgid "Allows loading of any content provided over HTTPS."
 
 
2266
  msgstr ""
2267
 
2268
+ #: src/features/headers.php:241
2269
+ msgid "Permitted Hosts"
 
 
2270
  msgstr ""
2271
 
2272
+ #: src/features/headers.php:242
2273
+ msgid "Permitted Hosts and Domains"
 
2274
  msgstr ""
2275
 
2276
+ #: src/features/headers.php:243
2277
+ msgid ""
2278
+ "You can explicitly state which hosts/domain from which content may be loaded."
2279
  msgstr ""
2280
 
2281
+ #: src/features/headers.php:244
 
2282
  msgid ""
2283
+ "Take great care and test your site as you may block legitimate resources."
 
2284
  msgstr ""
2285
 
2286
+ #: src/features/headers.php:245
2287
+ msgid "If in-doubt, leave blank or use \"*\" only."
2288
  msgstr ""
2289
 
2290
+ #: src/features/headers.php:246
2291
+ msgid ""
2292
+ "You can force only HTTPS for a given domain by prefixing it with \"https://"
2293
+ "\"."
2294
  msgstr ""
2295
 
2296
+ #: src/features/ips.php:22
2297
+ msgid "Manage IP Lists"
2298
  msgstr ""
2299
 
2300
+ #: src/features/ips.php:23
2301
+ msgid "Add/Remove IPs"
2302
  msgstr ""
2303
 
2304
+ #: src/features/ips.php:199 src/features/user_management.php:44
2305
+ #, php-format
2306
+ msgid "now: %s"
2307
  msgstr ""
2308
 
2309
+ #: src/features/ips.php:244
2310
  msgid ""
2311
+ "Repeated login attempts that fail will result in a complete ban of your IP "
2312
+ "Address."
2313
  msgstr ""
2314
 
2315
+ #: src/features/ips.php:251
2316
+ #, php-format
2317
+ msgid ""
2318
+ "You have %s remaining transgression(s) against this site and then you will "
2319
+ "be black listed."
2320
  msgstr ""
2321
 
2322
+ #: src/features/ips.php:252
2323
+ msgid "Seriously, stop repeating what you are doing or you will be locked out."
2324
  msgstr ""
2325
 
2326
+ #: src/features/ips.php:275
2327
+ msgid ""
2328
+ "The IP Manager allows you to whitelist, blacklist and configure auto-"
2329
+ "blacklist rules."
2330
  msgstr ""
2331
 
2332
+ #: src/features/ips.php:276 src/features/plugin.php:877
2333
+ #: src/wizards/plugin.php:471 src/wizards/plugin.php:476
2334
+ msgid "IP Manager"
2335
  msgstr ""
2336
 
2337
+ #: src/features/ips.php:277
2338
+ msgid "You should also carefully review the automatic black list settings."
2339
  msgstr ""
2340
 
2341
+ #: src/features/ips.php:283 src/features/ips.php:286 src/features/ips.php:329
2342
+ msgid "Automatic IP Black List"
2343
  msgstr ""
2344
 
2345
+ #: src/features/ips.php:285
2346
  msgid ""
2347
+ "The Automatic IP Black List system will block the IP addresses of naughty "
2348
+ "visitors after a specified number of transgressions."
 
 
 
 
2349
  msgstr ""
2350
 
2351
+ #: src/features/ips.php:288
2352
+ msgid "Auto Black List"
2353
  msgstr ""
2354
 
2355
+ #: src/features/ips.php:292
2356
+ msgid "Bad Request Tracking"
2357
  msgstr ""
2358
 
2359
+ #: src/features/ips.php:293
2360
+ msgid "Request Tracking"
 
2361
  msgstr ""
2362
 
2363
+ #: src/features/ips.php:295
2364
+ msgid "Track strange behaviour to determine whether visitors are legitimate."
 
2365
  msgstr ""
2366
 
2367
+ #: src/features/ips.php:296
2368
+ msgid ""
2369
+ "These aren't security issues in their own right, but may indicate probing "
2370
+ "bots."
2371
  msgstr ""
2372
 
2373
+ #: src/features/ips.php:324
2374
+ msgid "Transgression Limit"
2375
  msgstr ""
2376
 
2377
+ #: src/features/ips.php:325
2378
  msgid ""
2379
+ "Visitor IP address will be Black Listed after X bad actions on your site"
 
 
 
 
 
 
 
 
2380
  msgstr ""
2381
 
2382
+ #: src/features/ips.php:326
2383
  #, php-format
2384
+ msgid ""
2385
+ "A black mark is set against an IP address each time a visitor trips the "
2386
+ "defenses of the %s plugin."
2387
  msgstr ""
2388
 
2389
+ #: src/features/ips.php:328
2390
  msgid ""
2391
+ "When the number of these transgressions exceeds specified limit, they are "
2392
+ "automatically blocked from accessing the site."
2393
  msgstr ""
2394
 
2395
+ #: src/features/ips.php:329
2396
  #, php-format
2397
+ msgid "Set this to \"0\" to turn off the %s feature."
2398
  msgstr ""
2399
 
2400
+ #: src/features/ips.php:333
2401
+ msgid "Auto Block Expiration"
2402
  msgstr ""
2403
 
2404
+ #: src/features/ips.php:334
2405
+ msgid "After 1 \"X\" a black listed IP will be removed from the black list"
 
2406
  msgstr ""
2407
 
2408
+ #: src/features/ips.php:335
2409
+ msgid "Permanent and lengthy IP Black Lists are harmful to performance."
 
2410
  msgstr ""
2411
 
2412
+ #: src/features/ips.php:336
2413
+ msgid ""
2414
+ "You should allow IP addresses on the black list to be eventually removed "
2415
+ "over time."
2416
  msgstr ""
2417
 
2418
+ #: src/features/ips.php:337
2419
+ msgid ""
2420
+ "Shorter IP black lists are more efficient and a more intelligent use of an "
2421
+ "IP-based blocking system."
2422
  msgstr ""
2423
 
2424
+ #: src/features/ips.php:341
2425
+ msgid "Track 404s"
 
 
2426
  msgstr ""
2427
 
2428
+ #: src/features/ips.php:342
2429
+ msgid "Use 404s As An Transgression"
2430
  msgstr ""
2431
 
2432
+ #: src/features/ips.php:343
2433
+ msgid "Repeated 404s may indicate a probing bot."
2434
  msgstr ""
2435
 
2436
+ #: src/features/ips.php:347
2437
+ msgid "Login Failed"
 
 
2438
  msgstr ""
2439
 
2440
+ #: src/features/ips.php:348
2441
+ msgid "Visitor Triggers The IP Transgression System Through A Failed Login"
2442
  msgstr ""
2443
 
2444
+ #: src/features/ips.php:349
2445
+ msgid "This message is displayed if the visitor fails a login attempt."
 
2446
  msgstr ""
2447
 
2448
+ #: src/features/ips.php:353
2449
+ msgid "Remaining Transgressions"
2450
  msgstr ""
2451
 
2452
+ #: src/features/ips.php:354
2453
+ msgid "Visitor Triggers The IP Transgression System Through A Firewall Block"
2454
  msgstr ""
2455
 
2456
+ #: src/features/ips.php:355
2457
  msgid ""
2458
+ "This message is displayed if the visitor triggered the IP Transgression "
2459
+ "system and reports how many transgressions remain before being blocked."
2460
  msgstr ""
2461
 
2462
+ #: src/features/ips.php:398
2463
+ #, php-format
2464
+ msgid ""
2465
+ "Sorry, the %s feature may not be disabled while there are IP addresses in "
2466
+ "the White List"
2467
  msgstr ""
2468
 
2469
+ #: src/features/license.php:83
2470
+ msgid "Name"
2471
  msgstr ""
2472
 
2473
+ #: src/features/license.php:84
2474
+ msgid "Active"
2475
  msgstr ""
2476
 
2477
+ #: src/features/license.php:85
2478
+ msgid "Status"
2479
  msgstr ""
2480
 
2481
+ #: src/features/license.php:86
2482
+ msgid "Key"
2483
  msgstr ""
2484
 
2485
+ #: src/features/license.php:87
2486
+ msgid "Expires"
2487
  msgstr ""
2488
 
2489
+ #: src/features/license.php:88
2490
+ msgid "Owner"
2491
  msgstr ""
2492
 
2493
+ #: src/features/license.php:89
2494
+ msgid "Checked"
 
 
2495
  msgstr ""
2496
 
2497
+ #: src/features/license.php:90
2498
+ msgid "Error"
2499
  msgstr ""
2500
 
2501
+ #: src/features/license.php:557 src/features/license.php:558
2502
+ msgid "License Options"
2503
  msgstr ""
2504
 
2505
+ #: src/features/license.php:560
2506
+ msgid "Activate Shield Pro Extensions."
 
 
2507
  msgstr ""
2508
 
2509
+ #: src/features/license.php:561
2510
+ msgid "TODO."
2511
  msgstr ""
2512
 
2513
+ #: src/features/license.php:585 src/features/license.php:586
2514
+ #: src/features/license.php:587
2515
+ msgid "License Key"
2516
  msgstr ""
2517
 
2518
+ #: src/features/lockdown.php:66
2519
  msgid ""
2520
+ "Lockdown helps secure-up certain loosely-controlled WordPress settings on "
2521
+ "your site."
2522
  msgstr ""
2523
 
2524
+ #: src/features/lockdown.php:67 src/features/plugin.php:879
2525
+ msgid "Lockdown"
 
 
2526
  msgstr ""
2527
 
2528
+ #: src/features/lockdown.php:73 src/features/lockdown.php:78
2529
+ msgid "API & XML-RPC"
2530
  msgstr ""
2531
 
2532
+ #: src/features/lockdown.php:75
2533
+ msgid "Lockdown certain core WordPress system features."
2534
  msgstr ""
2535
 
2536
+ #: src/features/lockdown.php:76
2537
  msgid ""
2538
+ "This depends on your usage and needs for certain WordPress functions and "
2539
+ "features."
2540
  msgstr ""
2541
 
2542
+ #: src/features/lockdown.php:82
2543
+ msgid "Permissions and Access Options"
 
 
2544
  msgstr ""
2545
 
2546
+ #: src/features/lockdown.php:84
2547
+ msgid "Provides finer control of certain WordPress permissions."
2548
  msgstr ""
2549
 
2550
+ #: src/features/lockdown.php:85
2551
+ msgid "Only enable SSL if you have a valid certificate installed."
2552
  msgstr ""
2553
 
2554
+ #: src/features/lockdown.php:87
2555
+ msgid "Permissions"
 
2556
  msgstr ""
2557
 
2558
+ #: src/features/lockdown.php:91
2559
+ msgid "WordPress Obscurity Options"
2560
  msgstr ""
2561
 
2562
+ #: src/features/lockdown.php:93
2563
+ msgid "Obscures certain WordPress settings from public view."
 
 
2564
  msgstr ""
2565
 
2566
+ #: src/features/lockdown.php:94
2567
  msgid ""
2568
+ "Obscurity is not true security and so these settings are down to your "
2569
+ "personal tastes."
 
 
 
 
2570
  msgstr ""
2571
 
2572
+ #: src/features/lockdown.php:96
2573
+ msgid "Obscurity"
2574
  msgstr ""
2575
 
2576
+ #: src/features/lockdown.php:125 src/features/plugin.php:654
2577
+ #, php-format
2578
+ msgid "Disable %s"
2579
  msgstr ""
2580
 
2581
+ #: src/features/lockdown.php:126 src/features/lockdown.php:132
2582
+ #, php-format
2583
+ msgid "Disable The %s System"
2584
  msgstr ""
2585
 
2586
+ #: src/features/lockdown.php:127
2587
  #, php-format
2588
+ msgid "Checking this option will completely turn off the whole %s system."
2589
  msgstr ""
2590
 
2591
+ #: src/features/lockdown.php:131 src/features/lockdown.php:132
2592
+ msgid "Anonymous Rest API"
2593
  msgstr ""
2594
 
2595
+ #: src/features/lockdown.php:133
2596
+ msgid "You can choose to completely disable anonymous access to the REST API."
2597
  msgstr ""
2598
 
2599
+ #: src/features/lockdown.php:137
2600
+ msgid "Rest API Exclusions"
2601
  msgstr ""
2602
 
2603
+ #: src/features/lockdown.php:138
2604
+ msgid "Anonymous REST API Exclusions"
2605
  msgstr ""
2606
 
2607
+ #: src/features/lockdown.php:139
2608
+ msgid ""
2609
+ "Any namespaces provided here will be excluded from the Anonymous API "
2610
+ "restriction."
2611
  msgstr ""
2612
 
2613
+ #: src/features/lockdown.php:143
2614
+ msgid "Disable File Editing"
2615
  msgstr ""
2616
 
2617
+ #: src/features/lockdown.php:144
2618
+ msgid "Disable Ability To Edit Files From Within WordPress"
2619
  msgstr ""
2620
 
2621
+ #: src/features/lockdown.php:145
2622
+ msgid ""
2623
+ "Removes the option to directly edit any files from within the WordPress "
2624
+ "admin area."
2625
  msgstr ""
2626
 
2627
+ #: src/features/lockdown.php:146
2628
+ msgid "Equivalent to setting \"DISALLOW_FILE_EDIT\" to TRUE."
2629
  msgstr ""
2630
 
2631
+ #: src/features/lockdown.php:150
2632
+ msgid "Force SSL Admin"
2633
  msgstr ""
2634
 
2635
+ #: src/features/lockdown.php:151
2636
+ msgid "Forces WordPress Admin Dashboard To Be Delivered Over SSL"
 
2637
  msgstr ""
2638
 
2639
+ #: src/features/lockdown.php:152
2640
+ msgid ""
2641
+ "Please only enable this option if you have a valid SSL certificate installed."
2642
  msgstr ""
2643
 
2644
+ #: src/features/lockdown.php:153
2645
+ msgid "Equivalent to setting \"FORCE_SSL_ADMIN\" to TRUE."
2646
  msgstr ""
2647
 
2648
+ #: src/features/lockdown.php:157
2649
+ msgid "Mask WordPress Version"
 
 
2650
  msgstr ""
2651
 
2652
+ #: src/features/lockdown.php:158
2653
+ msgid "Prevents Public Display Of Your WordPress Version"
 
 
2654
  msgstr ""
2655
 
2656
+ #: src/features/lockdown.php:159
2657
+ msgid ""
2658
+ "Enter how you would like your WordPress version displayed publicly. Leave "
2659
+ "blank to disable this feature."
2660
  msgstr ""
2661
 
2662
+ #: src/features/lockdown.php:160
2663
+ msgid ""
2664
+ "Warning: This may interfere with WordPress plugins that rely on the "
2665
+ "$wp_version variable."
2666
  msgstr ""
2667
 
2668
+ #: src/features/lockdown.php:164
2669
+ msgid "WP Generator Tag"
2670
  msgstr ""
2671
 
2672
+ #: src/features/lockdown.php:165
2673
+ msgid "Remove WP Generator Meta Tag"
2674
  msgstr ""
2675
 
2676
+ #: src/features/lockdown.php:166
2677
  msgid ""
2678
+ "Remove a meta tag from your WordPress pages that publicly displays that your "
2679
+ "site is WordPress and its current version."
2680
  msgstr ""
2681
 
2682
+ #: src/features/lockdown.php:170
2683
+ msgid "Block Username Fishing"
2684
  msgstr ""
2685
 
2686
+ #: src/features/lockdown.php:171
2687
+ msgid "Block the ability to discover WordPress usernames based on author IDs"
2688
  msgstr ""
2689
 
2690
+ #: src/features/lockdown.php:172
2691
+ #, php-format
2692
+ msgid "When enabled, any URL requests containing \"%s\" will be killed."
 
2693
  msgstr ""
2694
 
2695
+ #: src/features/lockdown.php:173
2696
  msgid ""
2697
+ "Enabling this option may interfere with expected operations of your site."
 
2698
  msgstr ""
2699
 
2700
+ #: src/features/login_protect.php:27
2701
+ msgid "Email verification completed successfully."
2702
  msgstr ""
2703
 
2704
+ #: src/features/login_protect.php:32
2705
+ msgid "Email verification could not be completed."
2706
  msgstr ""
2707
 
2708
+ #: src/features/login_protect.php:117
2709
+ msgid ""
2710
+ "Before enabling 2-factor email authentication for your WordPress site, you "
2711
+ "must verify you can receive this email."
2712
  msgstr ""
2713
 
2714
+ #: src/features/login_protect.php:118
2715
+ msgid ""
2716
+ "This verifies your website can send email and that your account can receive "
2717
+ "emails sent from your site."
2718
  msgstr ""
2719
 
2720
+ #: src/features/login_protect.php:123
2721
+ #, php-format
2722
+ msgid "Click the verify link: %s"
2723
  msgstr ""
2724
 
2725
+ #: src/features/login_protect.php:126
2726
+ #, php-format
2727
+ msgid "Here's your code for the guided wizard: %s"
2728
  msgstr ""
2729
 
2730
+ #: src/features/login_protect.php:129
2731
+ msgid "Email Sending Verification"
2732
  msgstr ""
2733
 
2734
+ #: src/features/login_protect.php:158
2735
+ msgid "Subscribers"
2736
  msgstr ""
2737
 
2738
+ #: src/features/login_protect.php:159
2739
+ msgid "Contributors"
2740
  msgstr ""
2741
 
2742
+ #: src/features/login_protect.php:160
2743
+ msgid "Authors"
2744
  msgstr ""
2745
 
2746
+ #: src/features/login_protect.php:161
2747
+ msgid "Editors"
2748
  msgstr ""
2749
 
2750
+ #: src/features/login_protect.php:399
2751
+ msgid "I'm a human."
2752
  msgstr ""
2753
 
2754
+ #: src/features/login_protect.php:403
2755
+ msgid "Please check the box to show us you're a human."
2756
  msgstr ""
2757
 
2758
+ #: src/features/login_protect.php:441
2759
+ msgid ""
2760
+ "Login Guard blocks all automated and brute force attempts to log in to your "
2761
+ "site."
2762
  msgstr ""
2763
 
2764
+ #: src/features/login_protect.php:442 src/features/plugin.php:881
2765
+ #: src/wizards/plugin.php:507 src/wizards/plugin.php:512
2766
+ msgid "Login Guard"
2767
  msgstr ""
2768
 
2769
+ #: src/features/login_protect.php:450
2770
+ msgid "Adds Google reCAPTCHA to the Login Forms."
 
 
2771
  msgstr ""
2772
 
2773
+ #: src/features/login_protect.php:457
2774
+ msgid "Hide WordPress Login Page"
2775
  msgstr ""
2776
 
2777
+ #: src/features/login_protect.php:458
2778
+ #, php-format
2779
+ msgid "Rename \"%s\""
2780
  msgstr ""
2781
 
2782
+ #: src/features/login_protect.php:459
2783
+ msgid "Hide Login Page"
2784
  msgstr ""
2785
 
2786
+ #: src/features/login_protect.php:461
 
2787
  msgid ""
2788
+ "To hide your wp-login.php page from brute force attacks and hacking attempts "
2789
+ "- if your login page cannot be found, no-one can login."
2790
  msgstr ""
2791
 
2792
+ #: src/features/login_protect.php:462
 
2793
  msgid ""
2794
+ "This is not required for complete security and if your site has irregular or "
2795
+ "inconsistent configuration it may not work for you."
2796
  msgstr ""
2797
 
2798
+ #: src/features/login_protect.php:467 src/features/login_protect.php:548
2799
+ #: src/features/user_management.php:244
2800
+ msgid "Multi-Factor Authentication"
2801
  msgstr ""
2802
 
2803
+ #: src/features/login_protect.php:468
2804
+ msgid "Multi-Factor Auth"
2805
  msgstr ""
2806
 
2807
+ #: src/features/login_protect.php:470 src/features/user_management.php:241
2808
  msgid ""
2809
+ "Verifies the identity of users who log in to your site - i.e. they are who "
2810
+ "they say they are."
2811
  msgstr ""
2812
 
2813
+ #: src/features/login_protect.php:471 src/features/login_protect.php:481
2814
+ #: src/features/login_protect.php:490 src/features/login_protect.php:508
2815
+ msgid "You may combine multiple authentication factors for increased security."
 
2816
  msgstr ""
2817
 
2818
+ #: src/features/login_protect.php:476
2819
+ msgid "Email Two-Factor Authentication"
2820
  msgstr ""
2821
 
2822
+ #: src/features/login_protect.php:477
2823
+ msgid "2FA - Email"
2824
  msgstr ""
2825
 
2826
+ #: src/features/login_protect.php:479
2827
  msgid ""
2828
+ "Verifies the identity of users who log in to your site using email-based one-"
2829
+ "time-passwords."
2830
  msgstr ""
2831
 
2832
+ #: src/features/login_protect.php:480 src/features/user_management.php:242
2833
+ msgid "However, if your host blocks email sending you may lock yourself out."
2834
  msgstr ""
2835
 
2836
+ #: src/features/login_protect.php:486
2837
+ msgid "Google Authenticator Two-Factor Authentication"
2838
  msgstr ""
2839
 
2840
+ #: src/features/login_protect.php:487
2841
+ msgid "2FA - Google Authenticator"
 
 
2842
  msgstr ""
2843
 
2844
+ #: src/features/login_protect.php:489
2845
+ msgid ""
2846
+ "Verifies the identity of users who log in to your site using Google "
2847
+ "Authenticator one-time-passwords."
2848
  msgstr ""
2849
 
2850
+ #: src/features/login_protect.php:495
2851
+ msgid "Brute Force Login Protection"
2852
  msgstr ""
2853
 
2854
+ #: src/features/login_protect.php:496
2855
+ msgid "Brute Force"
2856
+ msgstr ""
2857
+
2858
+ #: src/features/login_protect.php:498
2859
+ msgid ""
2860
+ "Blocks brute force hacking attacks against your login and registration pages."
2861
+ msgstr ""
2862
+
2863
+ #: src/features/login_protect.php:504
2864
+ msgid "Yubikey Two-Factor Authentication"
2865
+ msgstr ""
2866
+
2867
+ #: src/features/login_protect.php:505
2868
+ msgid "2FA -Yubikey"
2869
+ msgstr ""
2870
+
2871
+ #: src/features/login_protect.php:507
2872
+ msgid ""
2873
+ "Verifies the identity of users who log in to your site using Yubikey one-"
2874
+ "time-passwords."
2875
+ msgstr ""
2876
+
2877
+ #: src/features/login_protect.php:538
2878
+ msgid "Hide WP Login Page"
2879
+ msgstr ""
2880
+
2881
+ #: src/features/login_protect.php:539
2882
+ msgid "Hide The WordPress Login Page"
2883
+ msgstr ""
2884
+
2885
+ #: src/features/login_protect.php:540
2886
+ msgid "Creating a path here will disable your wp-login.php"
2887
+ msgstr ""
2888
+
2889
+ #: src/features/login_protect.php:542
2890
+ #, php-format
2891
+ msgid "Only letters and numbers are permitted: %s"
2892
+ msgstr ""
2893
+
2894
+ #: src/features/login_protect.php:544
2895
+ #, php-format
2896
+ msgid "Your current login URL is: %s"
2897
+ msgstr ""
2898
+
2899
+ #: src/features/login_protect.php:549
2900
+ msgid "Require All Active Authentication Factors"
2901
+ msgstr ""
2902
+
2903
+ #: src/features/login_protect.php:550
2904
+ msgid ""
2905
+ "When enabled, all multi-factor authentication methods will be applied to a "
2906
+ "user login. Disable to require only one to login."
2907
+ msgstr ""
2908
+
2909
+ #: src/features/login_protect.php:554
2910
+ msgid "Multi-Factor By-Pass"
2911
+ msgstr ""
2912
+
2913
+ #: src/features/login_protect.php:555
2914
+ msgid ""
2915
+ "A User Can By-Pass Multi-Factor Authentication (MFA) For The Set Number Of "
2916
+ "Days"
2917
+ msgstr ""
2918
+
2919
+ #: src/features/login_protect.php:556
2920
+ msgid ""
2921
+ "Enter the number of days a user can by-pass future MFA after a successful "
2922
+ "MFA-login. 0 to disable."
2923
+ msgstr ""
2924
+
2925
+ #: src/features/login_protect.php:560
2926
+ #: src/processors/loginprotect_googleauthenticator.php:41
2927
+ #: src/processors/loginprotect_googleauthenticator.php:45
2928
+ #: src/processors/loginprotect_googleauthenticator.php:47
2929
+ #: src/processors/loginprotect_googleauthenticator.php:194
2930
+ msgid "Google Authenticator"
2931
+ msgstr ""
2932
+
2933
+ #: src/features/login_protect.php:561
2934
+ msgid "Allow Users To Use Google Authenticator"
2935
+ msgstr ""
2936
+
2937
+ #: src/features/login_protect.php:562
2938
+ msgid ""
2939
+ "When enabled, users will have the option to add Google Authenticator to "
2940
+ "their WordPress user profile"
2941
+ msgstr ""
2942
+
2943
+ #: src/features/login_protect.php:566 src/features/login_protect.php:572
2944
+ #: src/features/login_protect.php:575
2945
+ #: src/processors/loginprotect_twofactorauth.php:224
2946
+ #: src/processors/loginprotect_twofactorauth.php:225
2947
+ msgid "Email Authentication"
2948
+ msgstr ""
2949
+
2950
+ #: src/features/login_protect.php:567
2951
+ #, php-format
2952
+ msgid "Two-Factor Login Authentication By %s"
2953
+ msgstr ""
2954
+
2955
+ #: src/features/login_protect.php:567 src/features/plugin.php:871
2956
+ msgid "Email"
2957
+ msgstr ""
2958
+
2959
+ #: src/features/login_protect.php:568
2960
+ msgid ""
2961
+ "All users will be required to verify their login by email-based two-factor "
2962
+ "authentication."
2963
+ msgstr ""
2964
+
2965
+ #: src/features/login_protect.php:572
2966
+ #, php-format
2967
+ msgid "Enforce - %s"
2968
+ msgstr ""
2969
+
2970
+ #: src/features/login_protect.php:573
2971
+ msgid "All User Roles Subject To Email Authentication"
2972
+ msgstr ""
2973
+
2974
+ #: src/features/login_protect.php:574
2975
+ msgid ""
2976
+ "Enforces email-based authentication on all users with the selected roles."
2977
+ msgstr ""
2978
+
2979
+ #: src/features/login_protect.php:575
2980
+ #, php-format
2981
+ msgid "This setting only applies to %s."
2982
+ msgstr ""
2983
+
2984
+ #: src/features/login_protect.php:579
2985
+ msgid "Google reCAPTCHA"
2986
+ msgstr ""
2987
+
2988
+ #: src/features/login_protect.php:580
2989
+ msgid "Enable Google reCAPTCHA"
2990
+ msgstr ""
2991
+
2992
+ #: src/features/login_protect.php:581
2993
+ msgid "Use Google reCAPTCHA on the login screen."
2994
+ msgstr ""
2995
+
2996
+ #: src/features/login_protect.php:591
2997
+ msgid "Bot Protection"
2998
+ msgstr ""
2999
+
3000
+ #: src/features/login_protect.php:592
3001
+ msgid "Protect WP Login From Automated Login Attempts By Bots"
3002
+ msgstr ""
3003
+
3004
+ #: src/features/login_protect.php:593
3005
+ msgid ""
3006
+ "Adds a dynamically (Javascript) generated checkbox to the login form that "
3007
+ "prevents bots using automated login techniques."
3008
+ msgstr ""
3009
+
3010
+ #: src/features/login_protect.php:594
3011
+ msgid "ON"
3012
+ msgstr ""
3013
+
3014
+ #: src/features/login_protect.php:598
3015
+ msgid "Login Cooldown Interval"
3016
+ msgstr ""
3017
+
3018
+ #: src/features/login_protect.php:599
3019
+ msgid "Limit login attempts to every X seconds"
3020
+ msgstr ""
3021
+
3022
+ #: src/features/login_protect.php:600
3023
+ msgid ""
3024
+ "WordPress will process only ONE login attempt for every number of seconds "
3025
+ "specified."
3026
+ msgstr ""
3027
+
3028
+ #: src/features/login_protect.php:601
3029
+ msgid "Zero (0) turns this off."
3030
+ msgstr ""
3031
+
3032
+ #: src/features/login_protect.php:602 src/features/login_protect.php:645
3033
+ #: src/features/login_protect.php:652
3034
+ #, php-format
3035
+ msgid "Default: \"%s\"."
3036
+ msgstr ""
3037
+
3038
+ #: src/features/login_protect.php:607
3039
+ msgid "User Registration"
3040
+ msgstr ""
3041
+
3042
+ #: src/features/login_protect.php:608
3043
+ msgid "Apply Brute Force Protection To User Registration And Lost Passwords"
3044
+ msgstr ""
3045
+
3046
+ #: src/features/login_protect.php:609
3047
+ msgid ""
3048
+ "When enabled, settings in this section will also apply to new user "
3049
+ "registration and users trying to reset passwords."
3050
+ msgstr ""
3051
+
3052
+ #: src/features/login_protect.php:613
3053
+ msgid "Enable Yubikey Authentication"
3054
+ msgstr ""
3055
+
3056
+ #: src/features/login_protect.php:614
3057
+ msgid "Turn On / Off Yubikey Authentication On This Site"
3058
+ msgstr ""
3059
+
3060
+ #: src/features/login_protect.php:615
3061
+ msgid ""
3062
+ "Combined with your Yubikey API details this will form the basis of your "
3063
+ "Yubikey Authentication"
3064
+ msgstr ""
3065
+
3066
+ #: src/features/login_protect.php:619
3067
+ msgid "Yubikey App ID"
3068
+ msgstr ""
3069
+
3070
+ #: src/features/login_protect.php:620
3071
+ msgid "Your Unique Yubikey App ID"
3072
+ msgstr ""
3073
+
3074
+ #: src/features/login_protect.php:621
3075
+ msgid ""
3076
+ "Combined with your Yubikey API Key this will form the basis of your Yubikey "
3077
+ "Authentication"
3078
+ msgstr ""
3079
+
3080
+ #: src/features/login_protect.php:622
3081
+ msgid ""
3082
+ "Please review the info link on how to obtain your own Yubikey App ID and API "
3083
+ "Key."
3084
+ msgstr ""
3085
+
3086
+ #: src/features/login_protect.php:626
3087
+ msgid "Yubikey API Key"
3088
+ msgstr ""
3089
+
3090
+ #: src/features/login_protect.php:627
3091
+ msgid "Your Unique Yubikey App API Key"
3092
+ msgstr ""
3093
+
3094
+ #: src/features/login_protect.php:628
3095
+ msgid ""
3096
+ "Combined with your Yubikey App ID this will form the basis of your Yubikey "
3097
+ "Authentication."
3098
+ msgstr ""
3099
+
3100
+ #: src/features/login_protect.php:629
3101
+ msgid ""
3102
+ "Please review the info link on how to get your own Yubikey App ID and API "
3103
+ "Key."
3104
+ msgstr ""
3105
+
3106
+ #: src/features/login_protect.php:633
3107
+ msgid "Yubikey Unique Keys"
3108
+ msgstr ""
3109
+
3110
+ #: src/features/login_protect.php:634
3111
+ msgid ""
3112
+ "This method for Yubikeys is no longer supported. Please see your user profile"
3113
+ msgstr ""
3114
+
3115
+ #: src/features/login_protect.php:635
3116
+ #, php-format
3117
+ msgid "Format: %s"
3118
+ msgstr ""
3119
+
3120
+ #: src/features/login_protect.php:636
3121
+ msgid "Provide Username<->Yubikey Pairs that are usable for this site."
3122
+ msgstr ""
3123
+
3124
+ #: src/features/login_protect.php:637
3125
+ msgid ""
3126
+ "If a Username if not assigned a Yubikey, Yubikey Authentication is OFF for "
3127
+ "that user."
3128
+ msgstr ""
3129
+
3130
+ #: src/features/login_protect.php:638
3131
+ msgid ""
3132
+ "Each [Username,Key] pair should be separated by a new line: you only need to "
3133
+ "provide the first 12 characters of the yubikey."
3134
+ msgstr ""
3135
+
3136
+ #: src/features/login_protect.php:642
3137
+ msgid "GASP Checkbox Text"
3138
+ msgstr ""
3139
+
3140
+ #: src/features/login_protect.php:643
3141
+ msgid "The User Message Displayed Next To The GASP Checkbox"
3142
+ msgstr ""
3143
+
3144
+ #: src/features/login_protect.php:644
3145
+ msgid ""
3146
+ "You can change the text displayed to the user beside the checkbox if you "
3147
+ "need a custom message."
3148
+ msgstr ""
3149
+
3150
+ #: src/features/login_protect.php:649
3151
+ msgid "GASP Alert Text"
3152
+ msgstr ""
3153
+
3154
+ #: src/features/login_protect.php:650
3155
+ msgid "The Message Displayed If The User Doesn't Check The Box"
3156
+ msgstr ""
3157
+
3158
+ #: src/features/login_protect.php:651
3159
+ msgid ""
3160
+ "You can change the text displayed to the user in the alert message if they "
3161
+ "don't check the box."
3162
+ msgstr ""
3163
+
3164
+ #: src/features/plugin.php:263
3165
+ msgid "Sorry, you do not have permission to disable this plugin."
3166
+ msgstr ""
3167
+
3168
+ #: src/features/plugin.php:264
3169
+ msgid "You need to authenticate first."
3170
+ msgstr ""
3171
+
3172
+ #: src/features/plugin.php:606
3173
+ #, php-format
3174
+ msgid "This Site Is Protected By %s"
3175
+ msgstr ""
3176
+
3177
+ #: src/features/plugin.php:629
3178
+ msgid "Plugin Actions"
3179
+ msgstr ""
3180
+
3181
+ #: src/features/plugin.php:630
3182
+ msgid "E.g. Import/Export"
3183
+ msgstr ""
3184
+
3185
+ #: src/features/plugin.php:653
3186
+ msgid "Global Security Plugin Disable"
3187
+ msgstr ""
3188
+
3189
+ #: src/features/plugin.php:658 src/features/plugin.php:659
3190
+ msgid "Plugin Defaults"
3191
+ msgstr ""
3192
+
3193
+ #: src/features/plugin.php:661
3194
+ msgid "Important default settings used throughout the plugin."
3195
+ msgstr ""
3196
+
3197
+ #: src/features/plugin.php:666 src/features/plugin.php:671
3198
+ msgid "Import"
3199
+ msgstr ""
3200
+
3201
+ #: src/features/plugin.php:666 src/features/plugin.php:671
3202
+ msgid "Export"
3203
+ msgstr ""
3204
+
3205
+ #: src/features/plugin.php:668
3206
+ msgid ""
3207
+ "Automatically import options, and deploy configurations across your entire "
3208
+ "network."
3209
+ msgstr ""
3210
+
3211
+ #: src/features/plugin.php:669
3212
+ msgid "This is a Pro-only feature."
3213
+ msgstr ""
3214
+
3215
+ #: src/features/plugin.php:675
3216
+ msgid "General Plugin Options"
3217
+ msgstr ""
3218
+
3219
+ #: src/features/plugin.php:676
3220
+ msgid "General Options"
3221
+ msgstr ""
3222
+
3223
+ #: src/features/plugin.php:680 src/features/plugin.php:681
3224
+ msgid "Google"
3225
+ msgstr ""
3226
+
3227
+ #: src/features/plugin.php:683
3228
+ msgid "Setup Google reCAPTCHA for use across Shield."
3229
+ msgstr ""
3230
+
3231
+ #: src/features/plugin.php:684
3232
+ msgid "Note: you must create your own Google reCAPTCHA API Keys."
3233
+ msgstr ""
3234
+
3235
+ #: src/features/plugin.php:685
3236
+ msgid "Invisible Google reCAPTCHA is available with Shield Pro."
3237
+ msgstr ""
3238
+
3239
+ #: src/features/plugin.php:690 src/features/plugin.php:691
3240
+ msgid "Duo Security"
3241
+ msgstr ""
3242
+
3243
+ #: src/features/plugin.php:714
3244
+ msgid "Enable/Disable Plugin Modules"
3245
+ msgstr ""
3246
+
3247
+ #: src/features/plugin.php:715
3248
+ msgid "Enable/Disable All Plugin Modules"
3249
+ msgstr ""
3250
+
3251
+ #: src/features/plugin.php:716
3252
+ #, php-format
3253
+ msgid "Uncheck this option to disable all %s features."
3254
+ msgstr ""
3255
+
3256
+ #: src/features/plugin.php:721
3257
+ msgid "Information Gathering"
3258
+ msgstr ""
3259
+
3260
+ #: src/features/plugin.php:722
3261
+ msgid "Permit Anonymous Usage Information Gathering"
3262
+ msgstr ""
3263
+
3264
+ #: src/features/plugin.php:723
3265
+ msgid ""
3266
+ "Allows us to gather information on statistics and features in-use across our "
3267
+ "client installations."
3268
+ msgstr ""
3269
+
3270
+ #: src/features/plugin.php:724
3271
+ msgid ""
3272
+ "This information is strictly anonymous and contains no personally, or "
3273
+ "otherwise, identifiable data."
3274
+ msgstr ""
3275
+
3276
+ #: src/features/plugin.php:725
3277
+ msgid "Click to see the exact data that would be sent."
3278
+ msgstr ""
3279
+
3280
+ #: src/features/plugin.php:729
3281
+ msgid "IP Source"
3282
+ msgstr ""
3283
+
3284
+ #: src/features/plugin.php:730
3285
+ msgid "Which IP Address Is Yours"
3286
+ msgstr ""
3287
+
3288
+ #: src/features/plugin.php:731
3289
+ msgid ""
3290
+ "There are many possible ways to detect visitor IP addresses. If Auto-Detect "
3291
+ "is not working, please select yours from the list."
3292
+ msgstr ""
3293
+
3294
+ #: src/features/plugin.php:732
3295
+ msgid ""
3296
+ "If the option you select becomes unavailable, we will revert to auto "
3297
+ "detection."
3298
+ msgstr ""
3299
+
3300
+ #: src/features/plugin.php:733
3301
+ #, php-format
3302
+ msgid "Current source is: %s"
3303
+ msgstr ""
3304
+
3305
+ #: src/features/plugin.php:738
3306
+ msgid "Report Email"
3307
+ msgstr ""
3308
+
3309
+ #: src/features/plugin.php:739
3310
+ msgid "Where to send email reports"
3311
+ msgstr ""
3312
+
3313
+ #: src/features/plugin.php:740
3314
+ #, php-format
3315
+ msgid "If this is empty, it will default to the blog admin email address: %s"
3316
+ msgstr ""
3317
+
3318
+ #: src/features/plugin.php:744
3319
+ msgid "In-Plugin Notices"
3320
+ msgstr ""
3321
+
3322
+ #: src/features/plugin.php:745
3323
+ msgid "Display Plugin Specific Notices"
3324
+ msgstr ""
3325
+
3326
+ #: src/features/plugin.php:746
3327
+ msgid ""
3328
+ "Disable this option to hide certain plugin admin notices about available "
3329
+ "updates and post-update notices."
3330
+ msgstr ""
3331
+
3332
+ #: src/features/plugin.php:750
3333
+ msgid "Show Plugin Badge"
3334
+ msgstr ""
3335
+
3336
+ #: src/features/plugin.php:751
3337
+ msgid "Display Plugin Badge On Your Site"
3338
+ msgstr ""
3339
+
3340
+ #: src/features/plugin.php:752
3341
+ msgid ""
3342
+ "Enabling this option helps support the plugin by spreading the word about it "
3343
+ "on your website."
3344
+ msgstr ""
3345
+
3346
+ #: src/features/plugin.php:753
3347
+ msgid ""
3348
+ "The plugin badge also lets visitors know your are taking your website "
3349
+ "security seriously."
3350
+ msgstr ""
3351
+
3352
+ #: src/features/plugin.php:754
3353
+ msgid "Read this carefully before enabling this option."
3354
+ msgstr ""
3355
+
3356
+ #: src/features/plugin.php:758
3357
+ msgid "Delete Plugin Settings"
3358
+ msgstr ""
3359
+
3360
+ #: src/features/plugin.php:759
3361
+ msgid "Delete All Plugin Settings Upon Plugin Deactivation"
3362
+ msgstr ""
3363
+
3364
+ #: src/features/plugin.php:760
3365
+ msgid "Careful: Removes all plugin options when you deactivate the plugin"
3366
+ msgstr ""
3367
+
3368
+ #: src/features/plugin.php:764
3369
+ msgid "XML-RPC Compatibility"
3370
+ msgstr ""
3371
+
3372
+ #: src/features/plugin.php:765
3373
+ msgid "Allow Login Through XML-RPC To By-Pass Accounts Management Rules"
3374
+ msgstr ""
3375
+
3376
+ #: src/features/plugin.php:766
3377
+ msgid ""
3378
+ "Enable this if you need XML-RPC functionality e.g. if you use the WordPress "
3379
+ "iPhone/Android App."
3380
+ msgstr ""
3381
+
3382
+ #: src/features/plugin.php:770
3383
+ msgid "Allow Import/Export"
3384
+ msgstr ""
3385
+
3386
+ #: src/features/plugin.php:771
3387
+ msgid "Allow Import And Export Of Options On This Site"
3388
+ msgstr ""
3389
+
3390
+ #: src/features/plugin.php:772
3391
+ msgid "Uncheck this box to completely disable import and export of options."
3392
+ msgstr ""
3393
+
3394
+ #: src/features/plugin.php:773
3395
+ msgid "Note"
3396
+ msgstr ""
3397
+
3398
+ #: src/features/plugin.php:773
3399
+ msgid "Import/Export is a premium-only feature."
3400
+ msgstr ""
3401
+
3402
+ #: src/features/plugin.php:777
3403
+ msgid "Export Whitelist"
3404
+ msgstr ""
3405
+
3406
+ #: src/features/plugin.php:778
3407
+ msgid "Whitelisted Sites To Export Options From This Site"
3408
+ msgstr ""
3409
+
3410
+ #: src/features/plugin.php:779
3411
+ msgid "Whitelisted sites may export options from this site without the key."
3412
+ msgstr ""
3413
+
3414
+ #: src/features/plugin.php:780
3415
+ msgid "List each site URL on a new line."
3416
+ msgstr ""
3417
+
3418
+ #: src/features/plugin.php:781
3419
+ msgid "This is to be used in conjunction with the Master Import Site feature."
3420
+ msgstr ""
3421
+
3422
+ #: src/features/plugin.php:785
3423
+ msgid "Master Import Site"
3424
+ msgstr ""
3425
+
3426
+ #: src/features/plugin.php:786
3427
+ msgid "Automatically Import Options From This Site URL"
3428
+ msgstr ""
3429
+
3430
+ #: src/features/plugin.php:787
3431
+ msgid "Supplying a site URL here will make this site an 'Options Slave'."
3432
+ msgstr ""
3433
+
3434
+ #: src/features/plugin.php:788
3435
+ msgid ""
3436
+ "Options will be automatically imported from the Master Import site each day."
3437
+ msgstr ""
3438
+
3439
+ #: src/features/plugin.php:789 src/processors/loginprotect_wplogin.php:74
3440
+ #: src/processors/loginprotect_wplogin.php:93
3441
+ msgid "Warning"
3442
+ msgstr ""
3443
+
3444
+ #: src/features/plugin.php:789
3445
+ msgid ""
3446
+ "Use of this feature will overwrite existing options and replace them with "
3447
+ "those from the Master Import Site."
3448
+ msgstr ""
3449
+
3450
+ #: src/features/plugin.php:793
3451
+ msgid "Notify Whitelist"
3452
+ msgstr ""
3453
+
3454
+ #: src/features/plugin.php:794
3455
+ msgid "Notify Sites On The Whitelist To Update Options From Master"
3456
+ msgstr ""
3457
+
3458
+ #: src/features/plugin.php:795
3459
+ msgid ""
3460
+ "When enabled, manual options saving will notify sites on the whitelist to "
3461
+ "export options from the Master site."
3462
+ msgstr ""
3463
+
3464
+ #: src/features/plugin.php:799
3465
+ msgid "Secret Key"
3466
+ msgstr ""
3467
+
3468
+ #: src/features/plugin.php:800
3469
+ msgid "Import/Export Secret Key"
3470
+ msgstr ""
3471
+
3472
+ #: src/features/plugin.php:801
3473
+ msgid ""
3474
+ "Keep this Secret Key private as it will allow the import and export of "
3475
+ "options."
3476
+ msgstr ""
3477
+
3478
+ #: src/features/plugin.php:805
3479
+ msgid "Installation ID"
3480
+ msgstr ""
3481
+
3482
+ #: src/features/plugin.php:806
3483
+ msgid "Unique Plugin Installation ID"
3484
+ msgstr ""
3485
+
3486
+ #: src/features/plugin.php:807
3487
+ msgid "Keep this ID private."
3488
+ msgstr ""
3489
+
3490
+ #: src/features/plugin.php:811
3491
+ msgid "reCAPTCHA Secret"
3492
+ msgstr ""
3493
+
3494
+ #: src/features/plugin.php:812
3495
+ msgid "Google reCAPTCHA Secret Key"
3496
+ msgstr ""
3497
+
3498
+ #: src/features/plugin.php:813
3499
+ msgid "Enter your Google reCAPTCHA secret key for use throughout the plugin."
3500
+ msgstr ""
3501
+
3502
+ #: src/features/plugin.php:817
3503
+ msgid "reCAPTCHA Site Key"
3504
+ msgstr ""
3505
+
3506
+ #: src/features/plugin.php:818
3507
+ msgid "Google reCAPTCHA Site Key"
3508
+ msgstr ""
3509
+
3510
+ #: src/features/plugin.php:819
3511
+ msgid "Enter your Google reCAPTCHA site key for use throughout the plugin"
3512
+ msgstr ""
3513
+
3514
+ #: src/features/plugin.php:824
3515
+ msgid "How Google reCAPTCHA Will Be Displayed By Default"
3516
+ msgstr ""
3517
+
3518
+ #: src/features/plugin.php:842
3519
+ msgid "IP Whitelist"
3520
+ msgstr ""
3521
+
3522
+ #: src/features/plugin.php:843
3523
+ msgid "IP Address White List"
3524
+ msgstr ""
3525
+
3526
+ #: src/features/plugin.php:844
3527
+ msgid ""
3528
+ "Any IP addresses on this list will by-pass all Plugin Security Checking."
3529
+ msgstr ""
3530
+
3531
+ #: src/features/plugin.php:845 src/processors/ips.php:113
3532
+ #: src/processors/plugin.php:144 src/processors/plugin_badge.php:37
3533
+ #, php-format
3534
+ msgid "Your IP address is: %s"
3535
+ msgstr ""
3536
+
3537
+ #: src/features/plugin.php:846
3538
+ msgid "Choose IP Addresses To Blacklist"
3539
+ msgstr ""
3540
+
3541
+ #: src/features/plugin.php:848
3542
+ msgid "Blacklist"
3543
+ msgstr ""
3544
+
3545
+ #: src/features/plugin.php:849
3546
+ msgid "Logging"
3547
+ msgstr ""
3548
+
3549
+ #: src/features/plugin.php:850
3550
+ #, php-format
3551
+ msgid ""
3552
+ "User \"%s\" was forcefully logged out as they were not verified by either "
3553
+ "cookie or IP address (or both)."
3554
+ msgstr ""
3555
+
3556
+ #: src/features/plugin.php:851
3557
+ #, php-format
3558
+ msgid ""
3559
+ "User \"%s\" was found to be un-verified at the given IP Address: \"%s\"."
3560
+ msgstr ""
3561
+
3562
+ #: src/features/plugin.php:852
3563
+ msgid "Cookie"
3564
+ msgstr ""
3565
+
3566
+ #: src/features/plugin.php:854
3567
+ msgid "IP"
3568
+ msgstr ""
3569
+
3570
+ #: src/features/plugin.php:855
3571
+ msgid ""
3572
+ "This will restrict all user login sessions to a single browser. Use this if "
3573
+ "your users have dynamic IP addresses."
3574
+ msgstr ""
3575
+
3576
+ #: src/features/plugin.php:856
3577
+ msgid ""
3578
+ "All users will be required to authenticate their login by email-based two-"
3579
+ "factor authentication, when logging in from a new IP address"
3580
+ msgstr ""
3581
+
3582
+ #: src/features/plugin.php:857
3583
+ msgid "2-Factor Auth"
3584
+ msgstr ""
3585
+
3586
+ #: src/features/plugin.php:858
3587
+ msgid "Include Logged-In Users"
3588
+ msgstr ""
3589
+
3590
+ #: src/features/plugin.php:859
3591
+ msgid "You may also enable GASP for logged in users"
3592
+ msgstr ""
3593
+
3594
+ #: src/features/plugin.php:860
3595
+ msgid ""
3596
+ "Since logged-in users would be expected to be vetted already, this is off by "
3597
+ "default."
3598
+ msgstr ""
3599
+
3600
+ #: src/features/plugin.php:862
3601
+ msgid "Protect your security plugin not just your WordPress site"
3602
+ msgstr ""
3603
+
3604
+ #: src/features/plugin.php:865
3605
+ msgid "Get a view on what happens on your site, when it happens"
3606
+ msgstr ""
3607
+
3608
+ #: src/features/plugin.php:868
3609
+ msgid "Take back full control of WordPress automatic updates"
3610
+ msgstr ""
3611
+
3612
+ #: src/features/plugin.php:869
3613
+ msgid "Comments SPAM"
3614
+ msgstr ""
3615
+
3616
+ #: src/features/plugin.php:870
3617
+ msgid "Block comment SPAM and retain your privacy"
3618
+ msgstr ""
3619
+
3620
+ #: src/features/plugin.php:873
3621
+ msgid "Automatically block malicious URLs and data sent to your site"
3622
+ msgstr ""
3623
+
3624
+ #: src/features/plugin.php:875
3625
+ msgid "HTTP Headers"
3626
+ msgstr ""
3627
+
3628
+ #: src/features/plugin.php:876
3629
+ msgid "Control HTTP Security Headers"
3630
+ msgstr ""
3631
+
3632
+ #: src/features/plugin.php:878
3633
+ msgid "Manage Visitor IP Address"
3634
+ msgstr ""
3635
+
3636
+ #: src/features/plugin.php:880
3637
+ msgid "Harden the more loosely controlled settings of your site"
3638
+ msgstr ""
3639
+
3640
+ #: src/features/plugin.php:882
3641
+ msgid ""
3642
+ "Block brute force attacks and secure user identities with Two-Factor "
3643
+ "Authentication"
3644
+ msgstr ""
3645
+
3646
+ #: src/features/plugin.php:883
3647
+ msgid "Dashboard"
3648
+ msgstr ""
3649
+
3650
+ #: src/features/plugin.php:884
3651
+ msgid "General Plugin Settings"
3652
+ msgstr ""
3653
+
3654
+ #: src/features/plugin.php:885
3655
+ msgid "Statistics"
3656
+ msgstr ""
3657
+
3658
+ #: src/features/plugin.php:886
3659
+ msgid "Summary of the main security actions taken by this plugin"
3660
+ msgstr ""
3661
+
3662
+ #: src/features/plugin.php:887
3663
+ msgid "Stats Viewer"
3664
+ msgstr ""
3665
+
3666
+ #: src/features/plugin.php:888
3667
+ msgid "Premium Support"
3668
+ msgstr ""
3669
+
3670
+ #: src/features/plugin.php:889
3671
+ msgid "Premium Plugin Support Centre"
3672
+ msgstr ""
3673
+
3674
+ #: src/features/plugin.php:890 src/features/sessions.php:54
3675
+ #: src/features/user_management.php:214
3676
+ msgid "User Management"
3677
+ msgstr ""
3678
+
3679
+ #: src/features/plugin.php:891
3680
+ msgid ""
3681
+ "Get true user sessions and control account sharing, session duration and "
3682
+ "timeouts"
3683
+ msgstr ""
3684
+
3685
+ #: src/features/plugin.php:892
3686
+ msgid "Two-Factor Authentication"
3687
+ msgstr ""
3688
+
3689
+ #: src/features/sessions.php:53
3690
+ msgid "Creates and Manages User Sessions."
3691
+ msgstr ""
3692
+
3693
+ #: src/features/statistics.php:45
3694
+ msgid "Helps you see at a glance how effective the plugin has been."
3695
+ msgstr ""
3696
+
3697
+ #: src/features/statistics.php:54
3698
+ msgid "To track stats and issue reports."
3699
+ msgstr ""
3700
+
3701
+ #: src/features/statistics.php:61
3702
+ msgid "Statistics Sharing"
3703
+ msgstr ""
3704
+
3705
+ #: src/features/statistics.php:63
3706
+ msgid ""
3707
+ "Help us to provide globally accessible statistics on the effectiveness of "
3708
+ "the plugin."
3709
+ msgstr ""
3710
+
3711
+ #: src/features/statistics.php:64
3712
+ msgid "Enabling this option helps us improve our plugin over time."
3713
+ msgstr ""
3714
+
3715
+ #: src/features/statistics.php:65
3716
+ msgid "All statistics data collection is 100% anonymous."
3717
+ msgstr ""
3718
+
3719
+ #: src/features/statistics.php:65
3720
+ msgid ""
3721
+ "Neither we nor anyone else will be able to trace the data back to the "
3722
+ "originating site."
3723
+ msgstr ""
3724
+
3725
+ #: src/features/statistics.php:68
3726
+ msgid "Sharing"
3727
+ msgstr ""
3728
+
3729
+ #: src/features/user_management.php:109 src/processors/statistics.php:135
3730
+ msgid "User Sessions"
3731
+ msgstr ""
3732
+
3733
+ #: src/features/user_management.php:110
3734
+ msgid "Review user sessions"
3735
+ msgstr ""
3736
+
3737
+ #: src/features/user_management.php:112
3738
+ msgid "Current User Sessions"
3739
+ msgstr ""
3740
+
3741
+ #: src/features/user_management.php:114
3742
+ msgid "Logged In At"
3743
+ msgstr ""
3744
+
3745
+ #: src/features/user_management.php:115
3746
+ msgid "Last Activity At"
3747
+ msgstr ""
3748
+
3749
+ #: src/features/user_management.php:116
3750
+ msgid "Last Activity URI"
3751
+ msgstr ""
3752
+
3753
+ #: src/features/user_management.php:117
3754
+ msgid "Login IP"
3755
+ msgstr ""
3756
+
3757
+ #: src/features/user_management.php:118
3758
+ msgid ""
3759
+ "You need to enable the User Management feature to view and manage user "
3760
+ "sessions."
3761
+ msgstr ""
3762
+
3763
+ #: src/features/user_management.php:162 src/features/user_management.php:163
3764
+ msgid "Weak"
3765
+ msgstr ""
3766
+
3767
+ #: src/features/user_management.php:164
3768
+ msgid "Medium"
3769
+ msgstr ""
3770
+
3771
+ #: src/features/user_management.php:165
3772
+ msgid "Strong"
3773
+ msgstr ""
3774
+
3775
+ #: src/features/user_management.php:166
3776
+ msgid "Very Strong"
3777
+ msgstr ""
3778
+
3779
+ #: src/features/user_management.php:213
3780
+ msgid ""
3781
+ "User Management offers real user sessions, finer control over user session "
3782
+ "time-out, and ensures users have logged-in in a correct manner."
3783
+ msgstr ""
3784
+
3785
+ #: src/features/user_management.php:220 src/features/user_management.php:221
3786
+ msgid "Password Policies"
3787
+ msgstr ""
3788
+
3789
+ #: src/features/user_management.php:223
3790
+ msgid "Have full control over passwords used by users on the site."
3791
+ msgstr ""
3792
+
3793
+ #: src/features/user_management.php:230
3794
+ msgid "Admin Login Notification"
3795
+ msgstr ""
3796
+
3797
+ #: src/features/user_management.php:232
3798
+ msgid ""
3799
+ "So you can be made aware of when a WordPress administrator has logged into "
3800
+ "your site when you are not expecting it."
3801
+ msgstr ""
3802
+
3803
+ #: src/features/user_management.php:235
3804
+ msgid "Notifications"
3805
+ msgstr ""
3806
+
3807
+ #: src/features/user_management.php:239
3808
+ msgid "Multi-Factor User Authentication"
3809
+ msgstr ""
3810
+
3811
+ #: src/features/user_management.php:248
3812
+ msgid "User Session Management"
3813
+ msgstr ""
3814
+
3815
+ #: src/features/user_management.php:250
3816
+ msgid ""
3817
+ "Allows you to better control user sessions on your site and expire idle "
3818
+ "sessions and prevent account sharing."
3819
+ msgstr ""
3820
+
3821
+ #: src/features/user_management.php:253
3822
+ msgid "Session Options"
3823
+ msgstr ""
3824
+
3825
+ #: src/features/user_management.php:282
3826
+ msgid "Admin Login Notification Email"
3827
+ msgstr ""
3828
+
3829
+ #: src/features/user_management.php:283
3830
+ msgid "Send An Notification Email When Administrator Logs In"
3831
+ msgstr ""
3832
+
3833
+ #: src/features/user_management.php:284
3834
+ msgid ""
3835
+ "If you would like to be notified every time an administrator user logs into "
3836
+ "this WordPress site, enter a notification email address."
3837
+ msgstr ""
3838
+
3839
+ #: src/features/user_management.php:285
3840
+ msgid "No email address - No Notification."
3841
+ msgstr ""
3842
+
3843
+ #: src/features/user_management.php:289
3844
+ msgid "Session Timeout"
3845
+ msgstr ""
3846
+
3847
+ #: src/features/user_management.php:290
3848
+ msgid "Specify How Many Days After Login To Automatically Force Re-Login"
3849
+ msgstr ""
3850
+
3851
+ #: src/features/user_management.php:291
3852
+ msgid ""
3853
+ "WordPress default is 2 days, or 14 days if you check the \"Remember Me\" box."
3854
+ msgstr ""
3855
+
3856
+ #: src/features/user_management.php:292
3857
+ #, php-format
3858
+ msgid "This cannot be less than %s."
3859
+ msgstr ""
3860
+
3861
+ #: src/features/user_management.php:293
3862
+ #, php-format
3863
+ msgid "Default: %s."
3864
+ msgstr ""
3865
+
3866
+ #: src/features/user_management.php:298
3867
+ msgid "Idle Timeout"
3868
+ msgstr ""
3869
+
3870
+ #: src/features/user_management.php:299
3871
+ msgid "Specify How Many Hours After Inactivity To Automatically Logout User"
3872
+ msgstr ""
3873
+
3874
+ #: src/features/user_management.php:300
3875
+ msgid ""
3876
+ "If the user is inactive for the number of hours specified, they will be "
3877
+ "forcefully logged out next time they return."
3878
+ msgstr ""
3879
+
3880
+ #: src/features/user_management.php:301
3881
+ #, php-format
3882
+ msgid "Set to %s to turn off this option."
3883
+ msgstr ""
3884
+
3885
+ #: src/features/user_management.php:305
3886
+ msgid "Lock To Location"
3887
+ msgstr ""
3888
+
3889
+ #: src/features/user_management.php:306
3890
+ msgid "Locks A User Session To IP address"
3891
+ msgstr ""
3892
+
3893
+ #: src/features/user_management.php:307
3894
+ msgid ""
3895
+ "When selected, a session is restricted to the same IP address as when the "
3896
+ "user logged in."
3897
+ msgstr ""
3898
+
3899
+ #: src/features/user_management.php:308
3900
+ msgid ""
3901
+ "If a logged-in user's IP address changes, the session will be invalidated "
3902
+ "and they'll be forced to re-login to WordPress."
3903
+ msgstr ""
3904
+
3905
+ #: src/features/user_management.php:312
3906
+ msgid "Max Simultaneous Sessions"
3907
+ msgstr ""
3908
+
3909
+ #: src/features/user_management.php:313
3910
+ msgid "Limit Simultaneous Sessions For The Same Username"
3911
+ msgstr ""
3912
+
3913
+ #: src/features/user_management.php:314
3914
+ msgid ""
3915
+ "The number provided here is the maximum number of simultaneous, distinct, "
3916
+ "sessions allowed for any given username."
3917
+ msgstr ""
3918
+
3919
+ #: src/features/user_management.php:315
3920
+ msgid "Zero (0) will allow unlimited simultaneous sessions."
3921
+ msgstr ""
3922
+
3923
+ #: src/features/user_management.php:319
3924
+ msgid "Enable Password Policies"
3925
+ msgstr ""
3926
+
3927
+ #: src/features/user_management.php:320
3928
+ msgid "Enable The Password Policies Detailed Below"
3929
+ msgstr ""
3930
+
3931
+ #: src/features/user_management.php:321
3932
+ msgid "Turn on/off all password policy settings."
3933
+ msgstr ""
3934
+
3935
+ #: src/features/user_management.php:325
3936
+ msgid "Prevent Pwned Passwords"
3937
+ msgstr ""
3938
+
3939
+ #: src/features/user_management.php:326
3940
+ msgid "Prevent Use Of Any Pwned Passwords"
3941
+ msgstr ""
3942
+
3943
+ #: src/features/user_management.php:327
3944
+ msgid ""
3945
+ "Prevents users from using any passwords found on the public available list "
3946
+ "of \"pwned\" passwords."
3947
+ msgstr ""
3948
+
3949
+ #: src/features/user_management.php:331
3950
+ msgid "Minimum Length"
3951
+ msgstr ""
3952
+
3953
+ #: src/features/user_management.php:332
3954
+ msgid "Minimum Password Length"
3955
+ msgstr ""
3956
+
3957
+ #: src/features/user_management.php:333
3958
+ msgid ""
3959
+ "All passwords that a user sets must be at least this many characters in "
3960
+ "length."
3961
+ msgstr ""
3962
+
3963
+ #: src/features/user_management.php:337
3964
+ msgid "Minimum Strength"
3965
+ msgstr ""
3966
+
3967
+ #: src/features/user_management.php:338
3968
+ msgid "Minimum Password Strength"
3969
+ msgstr ""
3970
+
3971
+ #: src/features/user_management.php:339
3972
+ msgid "All passwords that a user sets must meet this minimum strength."
3973
+ msgstr ""
3974
+
3975
+ #: src/features/user_management.php:343
3976
+ msgid "Apply To Existing"
3977
+ msgstr ""
3978
+
3979
+ #: src/features/user_management.php:344
3980
+ msgid "Apply Password Policies To Existing Users and Their Passwords"
3981
+ msgstr ""
3982
+
3983
+ #: src/features/user_management.php:345
3984
+ msgid ""
3985
+ "Forces existing users to update their passwords if they don't meet "
3986
+ "requirements, after they next login."
3987
+ msgstr ""
3988
+
3989
+ #: src/features/user_management.php:346
3990
+ msgid "Note: You may want to warn users prior to enabling this option."
3991
+ msgstr ""
3992
+
3993
+ #: src/features/user_management.php:350
3994
+ msgid "Password Expiration"
3995
+ msgstr ""
3996
+
3997
+ #: src/features/user_management.php:351
3998
+ msgid "Passwords Expire After This Many Days"
3999
+ msgstr ""
4000
+
4001
+ #: src/features/user_management.php:352
4002
  msgid ""
4003
+ "Users will be forced to reset their passwords after the number of days "
4004
+ "specified."
4005
+ msgstr ""
4006
+
4007
+ #: src/features/user_management.php:353
4008
+ msgid "Set to Zero(0) to disable."
4009
+ msgstr ""
4010
+
4011
+ #: src/processors/admin_access_restriction.php:199
4012
+ #: src/processors/admin_access_restriction.php:235
4013
+ #, php-format
4014
+ msgid "%s Security Restrictions Applied"
4015
+ msgstr ""
4016
+
4017
+ #: src/processors/admin_access_restriction.php:200
4018
+ msgid ""
4019
+ "Altering certain options has been restricted by your WordPress security "
4020
+ "administrator."
4021
+ msgstr ""
4022
+
4023
+ #: src/processors/admin_access_restriction.php:201
4024
+ msgid ""
4025
+ "Repeated failed attempts to authenticate will probably lock you out of this "
4026
+ "site."
4027
+ msgstr ""
4028
+
4029
+ #: src/processors/admin_access_restriction.php:207
4030
+ msgid "Admin Access Login"
4031
+ msgstr ""
4032
+
4033
+ #: src/processors/admin_access_restriction.php:208
4034
+ #: src/processors/admin_access_restriction.php:245
4035
+ #, php-format
4036
+ msgid "Go here to manage settings and authenticate with the %s plugin."
4037
+ msgstr ""
4038
+
4039
+ #: src/processors/admin_access_restriction.php:236
4040
+ msgid ""
4041
+ "Editing existing administrators, promoting existing users to the "
4042
+ "administrator role, or deleting administrator users is currently restricted."
4043
+ msgstr ""
4044
+
4045
+ #: src/processors/admin_access_restriction.php:237
4046
+ msgid ""
4047
+ "Please authenticate with the Security Admin system before attempting any "
4048
+ "administrator user modifications."
4049
+ msgstr ""
4050
+
4051
+ #: src/processors/admin_access_restriction.php:238
4052
+ msgid "Unlock Now"
4053
+ msgstr ""
4054
+
4055
+ #: src/processors/admin_access_restriction.php:244
4056
+ #: src/processors/admin_access_restriction.php:468
4057
+ msgid "Security Admin Login"
4058
+ msgstr ""
4059
+
4060
+ #: src/processors/admin_access_restriction.php:445
4061
+ #: src/processors/hackprotect_ptguard.php:63
4062
+ msgid "Editing this option is currently restricted."
4063
+ msgstr ""
4064
+
4065
+ #: src/processors/admin_access_restriction.php:463
4066
+ msgid "Unlock"
4067
+ msgstr ""
4068
+
4069
+ #: src/processors/audit_trail_emails.php:27
4070
+ #, php-format
4071
+ msgid "There was an attempt to send an email using the \"%s\" function."
4072
+ msgstr ""
4073
+
4074
+ #: src/processors/audit_trail_emails.php:28
4075
+ #, php-format
4076
+ msgid "It was sent to \"%s\" with the subject \"%s\"."
4077
+ msgstr ""
4078
+
4079
+ #: src/processors/audit_trail_plugins.php:28
4080
+ #, php-format
4081
+ msgid "Plugin \"%s\" was activated."
4082
+ msgstr ""
4083
+
4084
+ #: src/processors/audit_trail_plugins.php:41
4085
+ #, php-format
4086
+ msgid "Plugin \"%s\" was deactivated."
4087
+ msgstr ""
4088
+
4089
+ #: src/processors/audit_trail_plugins.php:59
4090
+ #, php-format
4091
+ msgid ""
4092
+ "An attempt was made to edit the plugin file \"%s\" directly through the "
4093
+ "WordPress editor."
4094
+ msgstr ""
4095
+
4096
+ #: src/processors/audit_trail_posts.php:26
4097
+ #, php-format
4098
+ msgid "WordPress Post entitled \"%s\" was permanently deleted from trash."
4099
+ msgstr ""
4100
+
4101
+ #: src/processors/audit_trail_posts.php:47
4102
+ msgid "moved to trash"
4103
+ msgstr ""
4104
+
4105
+ #: src/processors/audit_trail_posts.php:51
4106
+ msgid "recovered from trash"
4107
+ msgstr ""
4108
+
4109
+ #: src/processors/audit_trail_posts.php:55
4110
+ msgid "published"
4111
+ msgstr ""
4112
+
4113
+ #: src/processors/audit_trail_posts.php:59
4114
+ msgid "unpublished"
4115
+ msgstr ""
4116
+
4117
+ #: src/processors/audit_trail_posts.php:63
4118
+ msgid "updated"
4119
+ msgstr ""
4120
+
4121
+ #: src/processors/audit_trail_posts.php:67
4122
+ #, php-format
4123
+ msgid "Post entitled \"%s\" was %s."
4124
+ msgstr ""
4125
+
4126
+ #: src/processors/audit_trail_themes.php:25
4127
+ #, php-format
4128
+ msgid "Theme \"%s\" was activated."
4129
+ msgstr ""
4130
+
4131
+ #: src/processors/audit_trail_themes.php:41
4132
+ #, php-format
4133
+ msgid ""
4134
+ "An attempt was made to edit the theme file \"%s\" directly through the "
4135
+ "WordPress editor."
4136
+ msgstr ""
4137
+
4138
+ #: src/processors/audit_trail_users.php:27
4139
+ #, php-format
4140
+ msgid "Attempted user login by \"%s\" was successful."
4141
+ msgstr ""
4142
+
4143
+ #: src/processors/audit_trail_users.php:40
4144
+ #, php-format
4145
+ msgid "Attempted user login by \"%s\" failed."
4146
+ msgstr ""
4147
+
4148
+ #: src/processors/audit_trail_users.php:55
4149
+ msgid "New WordPress user registered."
4150
+ msgstr ""
4151
+
4152
+ #: src/processors/audit_trail_users.php:57
4153
+ #, php-format
4154
+ msgid "New username is \"%s\" with email address \"%s\"."
4155
+ msgstr ""
4156
+
4157
+ #: src/processors/audit_trail_users.php:80
4158
+ msgid "WordPress user deleted."
4159
+ msgstr ""
4160
+
4161
+ #: src/processors/audit_trail_users.php:82
4162
+ #, php-format
4163
+ msgid "Username was \"%s\" with email address \"%s\"."
4164
+ msgstr ""
4165
+
4166
+ #: src/processors/audit_trail_users.php:87
4167
+ msgid "Their posts were not reassigned to another user."
4168
+ msgstr ""
4169
+
4170
+ #: src/processors/audit_trail_users.php:91
4171
+ #, php-format
4172
+ msgid "Their posts were reassigned to user \"%s\"."
4173
+ msgstr ""
4174
+
4175
+ #: src/processors/audit_trail_wordpress.php:24
4176
+ #, php-format
4177
+ msgid "WordPress Core was updated from \"v%s\" to \"v%s\"."
4178
+ msgstr ""
4179
+
4180
+ #: src/processors/audit_trail_wordpress.php:34
4181
+ #, php-format
4182
+ msgid "WordPress Permalinks Structure was updated from \"%s\" to \"%s\"."
4183
+ msgstr ""
4184
+
4185
+ #: src/processors/autoupdates.php:428
4186
+ #, php-format
4187
+ msgid ""
4188
+ "This is a quick notification from the %s that WordPress Automatic Updates "
4189
+ "just completed on your site with the following results."
4190
+ msgstr ""
4191
+
4192
+ #: src/processors/autoupdates.php:436
4193
+ msgid "Plugins Updated:"
4194
+ msgstr ""
4195
+
4196
+ #: src/processors/autoupdates.php:453
4197
+ msgid "Themes Updated:"
4198
+ msgstr ""
4199
+
4200
+ #: src/processors/autoupdates.php:470
4201
+ msgid "WordPress Core Updated:"
4202
+ msgstr ""
4203
+
4204
+ #: src/processors/autoupdates.php:489
4205
+ msgid "Thank you."
4206
+ msgstr ""
4207
+
4208
+ #: src/processors/autoupdates.php:491
4209
+ #, php-format
4210
+ msgid "Notice: %s"
4211
+ msgstr ""
4212
+
4213
+ #: src/processors/autoupdates.php:491
4214
+ msgid "Automatic Updates Completed"
4215
+ msgstr ""
4216
+
4217
+ #: src/processors/autoupdates.php:513
4218
+ msgid ""
4219
+ "Automatic updates for this plugin is controlled by another plugin or setting."
4220
+ msgstr ""
4221
+
4222
+ #: src/processors/base_commentsfilter.php:113
4223
+ #: src/processors/commentsfilter_antibotspam.php:499
4224
+ #, php-format
4225
+ msgid "%s plugin marked this comment as \"%s\"."
4226
+ msgstr ""
4227
+
4228
+ #: src/processors/base_commentsfilter.php:113
4229
+ #: src/processors/commentsfilter_antibotspam.php:499
4230
+ #, php-format
4231
+ msgid "Reason: %s"
4232
+ msgstr ""
4233
+
4234
+ #: src/processors/base_plugin.php:67
4235
+ msgid "I'd rather not show this support"
4236
+ msgstr ""
4237
+
4238
+ #: src/processors/base_plugin.php:67
4239
+ msgid "I've done this already"
4240
+ msgstr ""
4241
+
4242
+ #: src/processors/base_plugin.php:91
4243
+ msgid "I don't need the setup wizard just now"
4244
+ msgstr ""
4245
+
4246
+ #: src/processors/base_plugin.php:92
4247
+ #, php-format
4248
+ msgid "Get started quickly with the %s Setup Wizard"
4249
+ msgstr ""
4250
+
4251
+ #: src/processors/base_plugin.php:93
4252
+ #, php-format
4253
+ msgid ""
4254
+ "The welcome wizard will help you get setup quickly and become familiar with "
4255
+ "some of the core %s features"
4256
+ msgstr ""
4257
+
4258
+ #: src/processors/base_plugin.php:94
4259
+ #, php-format
4260
+ msgid ""
4261
+ "%s has a helpful setup wizard to walk you through the main features. "
4262
+ "Unfortunately your PHP version is reeeaally old as it needs PHP 5.4+"
4263
+ msgstr ""
4264
+
4265
+ #: src/processors/base_plugin.php:122
4266
+ #, php-format
4267
+ msgid "Your PHP version is very old: %s"
4268
+ msgstr ""
4269
+
4270
+ #: src/processors/base_plugin.php:123
4271
+ #, php-format
4272
+ msgid "Newer features of %s do not support your PHP version."
4273
+ msgstr ""
4274
+
4275
+ #: src/processors/base_plugin.php:124
4276
+ msgid ""
4277
+ "You should ask your host to upgrade or provide a much newer PHP version."
4278
+ msgstr ""
4279
+
4280
+ #: src/processors/base_plugin.php:125
4281
+ msgid "Please read here for further information:"
4282
+ msgstr ""
4283
+
4284
+ #: src/processors/base_plugin.php:126 src/processors/base_plugin.php:167
4285
+ #: src/processors/base_plugin.php:191
4286
+ msgid "Dismiss this notice"
4287
+ msgstr ""
4288
+
4289
+ #: src/processors/base_plugin.php:127
4290
+ msgid "Dropping support for PHP 5.2 and 5.3"
4291
+ msgstr ""
4292
+
4293
+ #: src/processors/base_plugin.php:164
4294
+ #, php-format
4295
+ msgid "Update available for the %s plugin."
4296
+ msgstr ""
4297
+
4298
+ #: src/processors/base_plugin.php:166
4299
+ msgid "Please click to update immediately"
4300
+ msgstr ""
4301
+
4302
+ #: src/processors/base_plugin.php:187
4303
+ #, php-format
4304
+ msgid "Can you help translate the %s plugin?"
4305
+ msgstr ""
4306
+
4307
+ #: src/processors/base_plugin.php:189
4308
+ #, php-format
4309
+ msgid "Head over to: %s"
4310
+ msgstr ""
4311
+
4312
+ #: src/processors/base_wpsf.php:70 src/processors/base_wpsf.php:77
4313
+ #: src/processors/loginprotect_googleauthenticator.php:233
4314
+ msgid "Whoops."
4315
+ msgstr ""
4316
+
4317
+ #: src/processors/base_wpsf.php:70
4318
+ msgid "Google reCAPTCHA was not submitted."
4319
+ msgstr ""
4320
+
4321
+ #: src/processors/base_wpsf.php:77
4322
+ msgid "Google reCAPTCHA verification failed."
4323
+ msgstr ""
4324
+
4325
+ #: src/processors/comments_filter.php:64
4326
+ msgid ""
4327
+ "It appears you have Akismet Anti-SPAM running alongside the our human Anti-"
4328
+ "SPAM filter."
4329
+ msgstr ""
4330
+
4331
+ #: src/processors/comments_filter.php:65
4332
+ msgid "This is not recommended and you should disable Akismet."
4333
+ msgstr ""
4334
+
4335
+ #: src/processors/comments_filter.php:66
4336
+ msgid "Click to deactivate Akismet now."
4337
+ msgstr ""
4338
+
4339
+ #: src/processors/commentsfilter_antibotspam.php:181
4340
+ #: src/processors/commentsfilter_antibotspam.php:186
4341
+ #: src/processors/commentsfilter_antibotspam.php:191
4342
+ #, php-format
4343
+ msgid "Failed GASP Bot Filter Test (%s)"
4344
+ msgstr ""
4345
+
4346
+ #: src/processors/commentsfilter_antibotspam.php:181
4347
+ msgid "checkbox"
4348
  msgstr ""
4349
 
4350
+ #: src/processors/commentsfilter_antibotspam.php:186
4351
+ msgid "honeypot"
4352
  msgstr ""
4353
 
4354
+ #: src/processors/commentsfilter_antibotspam.php:191
4355
+ msgid "comment token failure"
4356
  msgstr ""
4357
 
4358
+ #: src/processors/commentsfilter_humanspam.php:128
4359
+ #, php-format
4360
+ msgid "Human SPAM filter found \"%s\" in \"%s\""
 
4361
  msgstr ""
4362
 
4363
+ #: src/processors/email.php:65
4364
+ msgid "Hi !"
 
 
4365
  msgstr ""
4366
 
4367
+ #: src/processors/email.php:77
4368
+ #, php-format
4369
+ msgid "Email sent from the %s Plugin v%s, on %s."
4370
  msgstr ""
4371
 
4372
+ #: src/processors/email.php:82
4373
+ msgid "Note: Email delays are caused by website hosting and email providers."
4374
  msgstr ""
4375
 
4376
+ #: src/processors/email.php:83
4377
+ #, php-format
4378
+ msgid "Time Sent: %s"
4379
  msgstr ""
4380
 
4381
+ #: src/processors/firewall.php:75 src/processors/firewall.php:88
4382
+ #, php-format
4383
+ msgid "Skipping firewall checking for this visit: %s."
4384
  msgstr ""
4385
 
4386
+ #: src/processors/firewall.php:75
4387
+ msgid "Parsing the URI failed"
4388
  msgstr ""
4389
 
4390
+ #: src/processors/firewall.php:88
4391
+ msgid "Visitor detected as Search Engine Bot"
4392
  msgstr ""
4393
 
4394
+ #: src/processors/firewall.php:163 src/processors/firewall.php:221
4395
+ #, php-format
4396
+ msgid "Firewall Trigger: %s."
4397
  msgstr ""
4398
 
4399
+ #: src/processors/firewall.php:163 src/processors/firewall.php:542
4400
+ msgid "EXE File Uploads"
 
 
4401
  msgstr ""
4402
 
4403
+ #: src/processors/firewall.php:214
4404
+ msgid "Something in the URL, Form or Cookie data wasn't appropriate."
 
 
4405
  msgstr ""
4406
 
4407
+ #: src/processors/firewall.php:215
4408
+ msgid "Page parameter failed firewall check."
4409
  msgstr ""
4410
 
4411
+ #: src/processors/firewall.php:216
4412
+ #, php-format
4413
+ msgid "The offending parameter was \"%s\" with a value of \"%s\"."
4414
  msgstr ""
4415
 
4416
+ #: src/processors/firewall.php:262
4417
+ msgid "Visitor connection was killed with wp_die()"
 
 
4418
  msgstr ""
4419
 
4420
+ #: src/processors/firewall.php:265
4421
+ msgid "Visitor connection was killed with wp_die() and a message"
4422
  msgstr ""
4423
 
4424
+ #: src/processors/firewall.php:268
4425
+ msgid "Visitor was sent HOME"
4426
  msgstr ""
4427
 
4428
+ #: src/processors/firewall.php:271
4429
+ msgid "Visitor was sent 404"
 
 
4430
  msgstr ""
4431
 
4432
+ #: src/processors/firewall.php:274
4433
+ msgid "Unknown"
4434
  msgstr ""
4435
 
4436
+ #: src/processors/firewall.php:277
4437
+ #, php-format
4438
+ msgid "Firewall Block Response: %s."
4439
  msgstr ""
4440
 
4441
+ #: src/processors/firewall.php:283
4442
+ #, php-format
4443
+ msgid "Successfully sent Firewall Block email alert to: %s"
4444
  msgstr ""
4445
 
4446
+ #: src/processors/firewall.php:286
4447
+ #, php-format
4448
+ msgid "Failed to send Firewall Block email alert to: %s"
4449
  msgstr ""
4450
 
4451
+ #: src/processors/firewall.php:469
4452
+ #, php-format
4453
+ msgid "%s has blocked a page visit to your site."
 
4454
  msgstr ""
4455
 
4456
+ #: src/processors/firewall.php:470
4457
+ msgid "Log details for this visitor are below:"
4458
  msgstr ""
4459
 
4460
+ #: src/processors/firewall.php:471
4461
+ #: src/processors/loginprotect_twofactorauth.php:189
4462
+ #: src/processors/user_management.php:180
4463
+ #, php-format
4464
+ msgid "IP Address: %s"
4465
  msgstr ""
4466
 
4467
+ #: src/processors/firewall.php:475
4468
+ #, php-format
4469
+ msgid "You can look up the offending IP Address here: %s"
4470
  msgstr ""
4471
 
4472
+ #: src/processors/firewall.php:476
4473
+ msgid "Firewall Block Alert"
 
4474
  msgstr ""
4475
 
4476
+ #: src/processors/firewall.php:530
4477
+ msgid "Directory Traversal"
4478
+ msgstr ""
4479
+
4480
+ #: src/processors/firewall.php:545
4481
+ msgid "Leading Schema"
4482
+ msgstr ""
4483
+
4484
+ #: src/processors/firewall.php:551
4485
+ msgid "Aggressive Rules"
4486
+ msgstr ""
4487
+
4488
+ #: src/processors/firewall.php:554
4489
+ msgid "Unknown Rules"
4490
  msgstr ""
4491
 
4492
+ #: src/processors/hack_protect.php:156
4493
  #, php-format
4494
+ msgid "%s escaped HTML the following comment due to its size: %s"
4495
  msgstr ""
4496
 
4497
+ #: src/processors/hackprotect_corechecksumscan.php:28
4498
+ msgid "File was successfully replaced with an original from WordPress.org"
4499
  msgstr ""
4500
 
4501
+ #: src/processors/hackprotect_corechecksumscan.php:34
4502
+ msgid "File was not replaced"
4503
  msgstr ""
4504
 
4505
+ #: src/processors/hackprotect_corechecksumscan.php:240
4506
+ #, php-format
4507
+ msgid "The %s Core File Scanner found files with potential problems."
 
4508
  msgstr ""
4509
 
4510
+ #: src/processors/hackprotect_corechecksumscan.php:241
4511
+ #: src/processors/hackprotect_filecleanerscan.php:225
4512
+ #: src/processors/hackprotect_ptguard.php:455
4513
  #, php-format
4514
+ msgid "Site URL - %s"
4515
  msgstr ""
4516
 
4517
+ #: src/processors/hackprotect_corechecksumscan.php:248
4518
+ #: src/processors/hackprotect_filecleanerscan.php:232
4519
+ msgid "More Info On This Scanner"
4520
  msgstr ""
4521
 
4522
+ #: src/processors/hackprotect_corechecksumscan.php:253
4523
+ msgid "Modified Core WordPress Files Discovered"
4524
  msgstr ""
4525
 
4526
+ #: src/processors/hackprotect_corechecksumscan.php:258
4527
+ #, php-format
4528
+ msgid "Sent Checksum Scan Notification email alert to: %s"
4529
+ msgstr ""
4530
+
4531
+ #: src/processors/hackprotect_corechecksumscan.php:274
4532
+ #, php-format
4533
+ msgid "%s has already attempted to repair the files."
4534
  msgstr ""
4535
 
4536
+ #: src/processors/hackprotect_corechecksumscan.php:278
4537
+ #: src/processors/hackprotect_corechecksumscan.php:312
4538
  msgid ""
4539
+ "The contents of the core files listed below don't match official WordPress "
4540
+ "files:"
4541
  msgstr ""
4542
 
4543
+ #: src/processors/hackprotect_corechecksumscan.php:285
4544
+ #: src/processors/hackprotect_corechecksumscan.php:318
4545
+ msgid "The WordPress Core Files listed below are missing:"
4546
  msgstr ""
4547
 
4548
+ #: src/processors/hackprotect_corechecksumscan.php:293
4549
+ msgid "We recommend you run the scanner to review your site:"
4550
  msgstr ""
4551
 
4552
+ #: src/processors/hackprotect_corechecksumscan.php:297
4553
+ #: src/processors/hackprotect_filecleanerscan.php:271
4554
+ msgid "Run Scanner"
4555
+ msgstr ""
4556
+
4557
+ #: src/processors/hackprotect_corechecksumscan.php:326
4558
  msgid ""
4559
+ "We have already attempted to repair these files based on your current "
4560
+ "settings."
4561
  msgstr ""
4562
 
4563
+ #: src/processors/hackprotect_corechecksumscan.php:327
4564
+ msgid ""
4565
+ "But, you should always check these files to ensure everything is as you "
4566
+ "expect."
4567
  msgstr ""
4568
 
4569
+ #: src/processors/hackprotect_corechecksumscan.php:330
4570
  msgid ""
4571
+ "You should review these files and replace them with official versions if "
4572
+ "required."
4573
  msgstr ""
4574
 
4575
+ #: src/processors/hackprotect_corechecksumscan.php:331
4576
  msgid ""
4577
+ "Alternatively you can have the plugin attempt to repair/replace these files "
4578
+ "automatically."
4579
  msgstr ""
4580
 
4581
+ #: src/processors/hackprotect_corechecksumscan.php:351
4582
+ #: src/processors/hackprotect_filecleanerscan.php:326
4583
+ msgid "Repair file now"
4584
  msgstr ""
4585
 
4586
+ #: src/processors/hackprotect_corechecksumscan.php:354
4587
+ #: src/processors/hackprotect_filecleanerscan.php:329
4588
+ msgid "WordPress.org source file"
4589
+ msgstr ""
4590
+
4591
+ #: src/processors/hackprotect_filecleanerscan.php:224
4592
  #, php-format
4593
+ msgid "The %s Unrecognised File Scanner found files which you need to review."
4594
  msgstr ""
4595
 
4596
+ #: src/processors/hackprotect_filecleanerscan.php:237
4597
+ msgid "Unrecognised WordPress Files Detected"
 
 
4598
  msgstr ""
4599
 
4600
+ #: src/processors/hackprotect_filecleanerscan.php:242
4601
+ #, php-format
4602
+ msgid "Sent Unrecognised File Scan Notification email alert to: %s"
 
4603
  msgstr ""
4604
 
4605
+ #: src/processors/hackprotect_filecleanerscan.php:264
4606
+ #: src/processors/hackprotect_filecleanerscan.php:296
4607
+ #, php-format
4608
+ msgid "%s has attempted to delete these files based on your current settings."
4609
  msgstr ""
4610
 
4611
+ #: src/processors/hackprotect_pluginvulnerabilities.php:81
4612
+ #: src/processors/hackprotect_wpvulnscan.php:177
4613
+ #, php-format
4614
+ msgid "Plugin Name: %s"
4615
  msgstr ""
4616
 
4617
+ #: src/processors/hackprotect_pluginvulnerabilities.php:82
4618
+ #: src/processors/hackprotect_wpvulnscan.php:179
4619
+ #, php-format
4620
+ msgid "Vulnerability Type: %s"
4621
  msgstr ""
4622
 
4623
+ #: src/processors/hackprotect_pluginvulnerabilities.php:83
4624
+ #, php-format
4625
+ msgid "Vulnerable Plugin Version Range: %s"
4626
  msgstr ""
4627
 
4628
+ #: src/processors/hackprotect_pluginvulnerabilities.php:84
4629
+ #: src/processors/hackprotect_wpvulnscan.php:181
4630
  #, php-format
4631
+ msgid "Further Information: %s"
4632
  msgstr ""
4633
 
4634
+ #: src/processors/hackprotect_pluginvulnerabilities.php:101
4635
  #, php-format
4636
+ msgid ""
4637
+ "%s has detected a plugin with a known security vulnerability on your site."
4638
+ msgstr ""
4639
+
4640
+ #: src/processors/hackprotect_pluginvulnerabilities.php:102
4641
+ #: src/processors/hackprotect_wpvulnscan.php:210
4642
+ msgid "Details for the plugin(s) are below:"
4643
+ msgstr ""
4644
+
4645
+ #: src/processors/hackprotect_pluginvulnerabilities.php:107
4646
+ #: src/processors/hackprotect_wpvulnscan.php:215
4647
+ msgid "You should update or remove these plugins at your earliest convenience."
4648
+ msgstr ""
4649
+
4650
+ #: src/processors/hackprotect_pluginvulnerabilities.php:109
4651
+ #: src/processors/hackprotect_wpvulnscan.php:218
4652
+ msgid "Plugin(s) Discovered With Known Security Vulnerabilities."
4653
  msgstr ""
4654
 
4655
+ #: src/processors/hackprotect_pluginvulnerabilities.php:115
4656
+ #: src/processors/hackprotect_wpvulnscan.php:224
4657
  #, php-format
4658
+ msgid "Successfully sent Plugin Vulnerability Notification email alert to: %s"
4659
  msgstr ""
4660
 
4661
+ #: src/processors/hackprotect_pluginvulnerabilities.php:118
4662
+ #: src/processors/hackprotect_wpvulnscan.php:227
4663
  #, php-format
4664
+ msgid "Failed to send Plugin Vulnerability Notification email alert to: %s"
4665
  msgstr ""
4666
 
4667
+ #: src/processors/hackprotect_pluginvulnerabilities.php:151
4668
  #, php-format
4669
  msgid ""
4670
+ "%s has discovered that the currently installed version of the \"%s\" plugin "
4671
+ "has a known security vulnerability."
4672
+ msgstr ""
4673
+
4674
+ #: src/processors/hackprotect_pluginvulnerabilities.php:152
4675
+ #: src/processors/hackprotect_wpvulnscan.php:145
4676
+ msgid "Vulnerability Type"
4677
  msgstr ""
4678
 
4679
+ #: src/processors/hackprotect_pluginvulnerabilities.php:154
4680
+ msgid "Vulnerable Versions"
4681
+ msgstr ""
4682
+
4683
+ #: src/processors/hackprotect_ptguard.php:409
4684
+ msgid "Silenced repeated email alert from Plugin/Theme Scan Guard"
4685
+ msgstr ""
4686
+
4687
+ #: src/processors/hackprotect_ptguard.php:451
4688
  #, php-format
4689
+ msgid ""
4690
+ "%s has detected at least 1 Plugins/Themes have been modified on your site."
4691
  msgstr ""
4692
 
4693
+ #: src/processors/hackprotect_ptguard.php:453
4694
+ msgid ""
4695
+ "You will receive only 1 email notification about these changes in a 1 week "
4696
+ "period."
4697
  msgstr ""
4698
 
4699
+ #: src/processors/hackprotect_ptguard.php:457
4700
+ msgid "Details of the problem items are below:"
4701
  msgstr ""
4702
 
4703
+ #: src/processors/hackprotect_ptguard.php:462
4704
+ msgid "Modified Plugins:"
4705
  msgstr ""
4706
 
4707
+ #: src/processors/hackprotect_ptguard.php:470
4708
+ msgid "Modified Themes:"
4709
  msgstr ""
4710
 
4711
+ #: src/processors/hackprotect_ptguard.php:480
4712
+ msgid "Run the scanner"
4713
+ msgstr ""
4714
+
4715
+ #: src/processors/hackprotect_ptguard.php:486
4716
+ msgid "Plugins/Themes Have Been Altered"
4717
  msgstr ""
4718
 
4719
+ #: src/processors/hackprotect_ptguard.php:491
4720
  #, php-format
4721
+ msgid "Successfully sent Plugin/Theme Guard email alert to: %s"
4722
  msgstr ""
4723
 
4724
+ #: src/processors/hackprotect_ptguard.php:494
4725
  #, php-format
4726
+ msgid "Failed to send Plugin/Theme Guard email alert to: %s"
4727
+ msgstr ""
4728
+
4729
+ #: src/processors/hackprotect_wpvulnscan.php:112
4730
+ msgid "Vulnerable"
4731
  msgstr ""
4732
 
4733
+ #: src/processors/hackprotect_wpvulnscan.php:142
4734
  #, php-format
4735
  msgid ""
4736
+ "%s has discovered that the currently installed version of the %s plugin has "
4737
+ "known security vulnerabilities."
4738
+ msgstr ""
4739
+
4740
+ #: src/processors/hackprotect_wpvulnscan.php:144
4741
+ msgid "Vulnerability Name"
4742
+ msgstr ""
4743
+
4744
+ #: src/processors/hackprotect_wpvulnscan.php:146
4745
+ msgid "Fixed Versions"
4746
  msgstr ""
4747
 
4748
+ #: src/processors/hackprotect_wpvulnscan.php:178
4749
  #, php-format
4750
+ msgid "Vulnerability Title: %s"
4751
  msgstr ""
4752
 
4753
+ #: src/processors/hackprotect_wpvulnscan.php:180
4754
  #, php-format
4755
+ msgid "Fixed Version: %s"
4756
  msgstr ""
4757
 
4758
+ #: src/processors/hackprotect_wpvulnscan.php:209
4759
+ #, php-format
4760
+ msgid "%s has detected plugins with known security vulnerabilities."
4761
  msgstr ""
4762
 
4763
+ #: src/processors/hackprotect_wpvulnscan.php:216
4764
  #, php-format
4765
+ msgid "Go To Your Plugins: %s"
4766
  msgstr ""
4767
 
4768
+ #: src/processors/ips.php:82
4769
+ #, php-format
4770
+ msgid "404 detected at \"%s\""
4771
  msgstr ""
4772
 
4773
+ #: src/processors/ips.php:112
4774
  #, php-format
4775
+ msgid "%s is ignoring you"
4776
+ msgstr ""
4777
+
4778
+ #: src/processors/ips.php:114
4779
+ msgid ""
4780
+ "Your IP address is whitelisted and NO features you activate apply to you."
4781
+ msgstr ""
4782
+
4783
+ #: src/processors/ips.php:115
4784
+ msgid "Including the hiding the WP Login page."
4785
+ msgstr ""
4786
+
4787
+ #: src/processors/ips.php:247
4788
+ #, php-format
4789
+ msgid ""
4790
+ "Visitor was found to be on the Black List with IP address \"%s\" and their "
4791
+ "connection was killed."
4792
+ msgstr ""
4793
+
4794
+ #: src/processors/ips.php:255
4795
+ #, php-format
4796
+ msgid "You have been black listed by the %s plugin."
4797
+ msgstr ""
4798
+
4799
+ #: src/processors/ips.php:259
4800
+ #, php-format
4801
+ msgid ""
4802
+ "You tripped the security plugin defenses a total of %s times making you a "
4803
+ "suspect."
4804
+ msgstr ""
4805
+
4806
+ #: src/processors/ips.php:260
4807
+ msgid "If you believe this to be in error, please contact the site owner."
4808
+ msgstr ""
4809
+
4810
+ #: src/processors/ips.php:261
4811
+ #, php-format
4812
+ msgid ""
4813
+ "Time remaining until you are automatically removed from the black list: %s "
4814
+ "minute(s)"
4815
  msgstr ""
4816
 
4817
+ #: src/processors/ips.php:262
4818
+ msgid ""
4819
+ "If you attempt to access the site within this period the counter will be "
4820
+ "reset."
4821
  msgstr ""
4822
 
4823
+ #: src/processors/ips.php:308
4824
  #, php-format
4825
+ msgid "Auto Black List transgression counter was incremented from %s to %s."
4826
  msgstr ""
4827
 
4828
+ #: src/processors/ips.php:317
4829
+ msgid "Auto Black List transgression counter was started for visitor."
 
4830
  msgstr ""
4831
 
4832
+ #: src/processors/ips.php:486
4833
+ msgid "No Label"
 
4834
  msgstr ""
4835
 
4836
+ #: src/processors/lockdown.php:95
4837
  #, php-format
4838
+ msgid "Anonymous access to the WordPress Rest API has been restricted by %s."
 
 
4839
  msgstr ""
4840
 
4841
+ #: src/processors/lockdown.php:201
4842
+ #, php-format
4843
+ msgid ""
4844
+ "The \"author\" query parameter has been blocked by %s to protect against "
4845
+ "user login name fishing."
4846
  msgstr ""
4847
 
4848
+ #: src/processors/lockdown.php:204 src/processors/plugin_tracking.php:38
4849
+ msgid "Learn More."
4850
  msgstr ""
4851
 
4852
+ #: src/processors/login_protect.php:68
4853
+ msgid "Please verify email has been received"
4854
  msgstr ""
4855
 
4856
+ #: src/processors/login_protect.php:69
4857
+ msgid ""
4858
+ "Before we can activate email 2-factor authentication, we need you to confirm "
4859
+ "your website can send emails."
4860
  msgstr ""
4861
 
4862
+ #: src/processors/login_protect.php:70
4863
+ msgid "Please click the link in the email you received."
 
 
4864
  msgstr ""
4865
 
4866
+ #: src/processors/login_protect.php:72
 
4867
  #, php-format
4868
+ msgid "The email has been sent to you at blog admin address: %s"
4869
  msgstr ""
4870
 
4871
+ #: src/processors/login_protect.php:75
4872
+ msgid "To resend the email, re-save your Login Guard settings."
 
 
4873
  msgstr ""
4874
 
4875
+ #: src/processors/login_protect.php:76
4876
+ msgid "To turn this notice off, disable 2-Factor Authentication."
4877
  msgstr ""
4878
 
4879
+ #: src/processors/loginprotect_cooldown.php:51
4880
+ msgid "Login Cooldown in effect."
4881
  msgstr ""
4882
 
4883
+ #: src/processors/loginprotect_cooldown.php:53
4884
  #, php-format
4885
+ msgid "You must wait %s seconds before attempting to %s again."
4886
  msgstr ""
4887
 
4888
+ #: src/processors/loginprotect_cooldown.php:55
4889
+ #: src/processors/loginprotect_gasp.php:77
4890
+ msgid "login"
4891
  msgstr ""
4892
 
4893
+ #: src/processors/loginprotect_cooldown.php:55
4894
+ msgid "register"
 
4895
  msgstr ""
4896
 
4897
+ #: src/processors/loginprotect_gasp.php:81
4898
+ msgid "Bot Checking Failed."
4899
  msgstr ""
4900
 
4901
+ #: src/processors/loginprotect_gasp.php:154
4902
+ msgid "You MUST enable Javascript to be able to login"
 
4903
  msgstr ""
4904
 
4905
+ #: src/processors/loginprotect_gasp.php:182
4906
  #, php-format
4907
+ msgid "User \"%s\" attempted to %s but GASP checkbox was not present."
4908
  msgstr ""
4909
 
4910
+ #: src/processors/loginprotect_gasp.php:182
4911
+ #: src/processors/loginprotect_gasp.php:194
4912
+ msgid "Probably a BOT."
4913
  msgstr ""
4914
 
4915
+ #: src/processors/loginprotect_gasp.php:190
4916
+ msgid "You must check that box to say you're not a bot."
 
4917
  msgstr ""
4918
 
4919
+ #: src/processors/loginprotect_gasp.php:194
4920
  #, php-format
4921
+ msgid "User \"%s\" attempted to %s but they were caught by the GASP honeypot."
 
 
 
 
 
 
4922
  msgstr ""
4923
 
4924
+ #: src/processors/loginprotect_gasp.php:202
4925
+ #, php-format
4926
+ msgid "You appear to be a bot - terminating %s attempt."
4927
  msgstr ""
4928
 
4929
+ #: src/processors/loginprotect_googleauthenticator.php:36
4930
+ msgid "Provide the current code generated by your Google Authenticator app."
4931
  msgstr ""
4932
 
4933
+ #: src/processors/loginprotect_googleauthenticator.php:37
4934
+ msgid "To reset this QR Code enter fake data here."
 
 
 
4935
  msgstr ""
4936
 
4937
+ #: src/processors/loginprotect_googleauthenticator.php:38
4938
+ msgid ""
4939
+ "Use your Google Authenticator app to scan this QR code and enter the one "
4940
+ "time password below."
4941
  msgstr ""
4942
 
4943
+ #: src/processors/loginprotect_googleauthenticator.php:39
4944
+ msgid ""
4945
+ "If you have a problem with scanning the QR code enter this code manually "
4946
+ "into the app."
4947
  msgstr ""
4948
 
4949
+ #: src/processors/loginprotect_googleauthenticator.php:40
4950
+ msgid "Check the box to remove Google Authenticator login authentication."
4951
  msgstr ""
4952
 
4953
+ #: src/processors/loginprotect_googleauthenticator.php:41
4954
+ #, php-format
4955
+ msgid "Remove %s"
4956
  msgstr ""
4957
 
4958
+ #: src/processors/loginprotect_googleauthenticator.php:42
4959
+ #: src/processors/loginprotect_googleauthenticator.php:269
4960
+ msgid "Google Authenticator Code"
4961
  msgstr ""
4962
 
4963
+ #: src/processors/loginprotect_googleauthenticator.php:43
4964
+ msgid "Manual Code"
 
4965
  msgstr ""
4966
 
4967
+ #: src/processors/loginprotect_googleauthenticator.php:44
4968
+ msgid "Scan This QR Code"
4969
  msgstr ""
4970
 
4971
+ #: src/processors/loginprotect_googleauthenticator.php:46
4972
+ #: src/processors/loginprotect_yubikey.php:44
4973
  #, php-format
4974
+ msgid "Sorry, %s may not be added to another user's account."
4975
  msgstr ""
4976
 
4977
+ #: src/processors/loginprotect_googleauthenticator.php:47
4978
+ #: src/processors/loginprotect_yubikey.php:45
4979
  #, php-format
4980
+ msgid ""
4981
+ "Sorry, %s may only be removed from another user's account by a Security "
4982
+ "Administrator."
4983
  msgstr ""
4984
 
4985
+ #: src/processors/loginprotect_googleauthenticator.php:48
4986
+ #: src/processors/loginprotect_twofactorauth.php:227
4987
+ #: src/processors/loginprotect_yubikey.php:46
4988
  #, php-format
4989
+ msgid "Provided by %s"
4990
  msgstr ""
4991
 
4992
+ #: src/processors/loginprotect_googleauthenticator.php:49
4993
+ #: src/processors/loginprotect_yubikey.php:47
4994
+ msgid "Understand how to remove Google Authenticator"
4995
  msgstr ""
4996
 
4997
+ #: src/processors/loginprotect_googleauthenticator.php:112
4998
+ #: src/processors/loginprotect_googleauthenticator.php:163
4999
+ msgid "Google Authenticator was successfully removed from the account."
5000
  msgstr ""
5001
 
5002
+ #: src/processors/loginprotect_googleauthenticator.php:118
5003
+ msgid ""
5004
+ "Google Authenticator could not be removed from the account - ensure your "
5005
+ "code is correct."
5006
  msgstr ""
5007
 
5008
+ #: src/processors/loginprotect_googleauthenticator.php:154
5009
+ #: src/processors/loginprotect_yubikey.php:74
5010
+ msgid "One Time Password (OTP) was not valid."
5011
  msgstr ""
5012
 
5013
+ #: src/processors/loginprotect_googleauthenticator.php:154
5014
+ #: src/processors/loginprotect_yubikey.php:74
5015
+ msgid "Please try again."
5016
  msgstr ""
5017
 
5018
+ #: src/processors/loginprotect_googleauthenticator.php:170
5019
+ msgid ""
5020
+ "An email has been sent to you in order to confirm Google Authenticator "
5021
+ "removal"
5022
  msgstr ""
5023
 
5024
+ #: src/processors/loginprotect_googleauthenticator.php:173
5025
+ msgid ""
5026
+ "We tried to send an email for you to confirm Google Authenticator removal "
5027
+ "but it failed."
5028
  msgstr ""
5029
 
5030
+ #: src/processors/loginprotect_googleauthenticator.php:193
5031
+ #: src/processors/loginprotect_yubikey.php:92
5032
  #, php-format
5033
+ msgid "%s was successfully added to your account."
5034
  msgstr ""
5035
 
5036
+ #: src/processors/loginprotect_googleauthenticator.php:233
5037
+ msgid "Did we forget to use the Google Authenticator?"
5038
  msgstr ""
5039
 
5040
+ #: src/processors/loginprotect_googleauthenticator.php:240
5041
+ msgid "Oh dear."
5042
  msgstr ""
5043
 
5044
+ #: src/processors/loginprotect_googleauthenticator.php:240
5045
+ msgid "Google Authenticator Code Failed."
5046
  msgstr ""
5047
 
5048
+ #: src/processors/loginprotect_googleauthenticator.php:268
5049
+ msgid "Please use your Google Authenticator App to retrieve your code."
5050
  msgstr ""
5051
 
5052
+ #: src/processors/loginprotect_googleauthenticator.php:287
5053
+ msgid ""
5054
+ "You have requested the removal of Google Authenticator from your WordPress "
5055
+ "account."
5056
  msgstr ""
5057
 
5058
+ #: src/processors/loginprotect_googleauthenticator.php:288
5059
+ msgid "Please click the link below to confirm."
 
5060
  msgstr ""
5061
 
5062
+ #: src/processors/loginprotect_googleauthenticator.php:293
5063
+ msgid "Google Authenticator Removal Confirmation"
 
5064
  msgstr ""
5065
 
5066
+ #: src/processors/loginprotect_googleauthenticator.php:317
5067
+ msgid "Google Authenticator was successfully removed from this account."
 
5068
  msgstr ""
5069
 
5070
+ #: src/processors/loginprotect_googleauthenticator.php:351
5071
  #, php-format
5072
+ msgid ""
5073
+ "User \"%s\" verified their identity using Google Authenticator Two-Factor "
5074
+ "Authentication."
5075
  msgstr ""
5076
 
5077
+ #: src/processors/loginprotect_googleauthenticator.php:361
5078
  #, php-format
5079
+ msgid ""
5080
+ "User \"%s\" failed to verify their identity using Google Authenticator Two-"
5081
+ "Factor Authentication."
 
 
5082
  msgstr ""
5083
 
5084
+ #: src/processors/loginprotect_intent.php:111
5085
+ msgid "Success"
 
 
 
5086
  msgstr ""
5087
 
5088
+ #: src/processors/loginprotect_intent.php:111
5089
+ msgid "Thank you for authenticating your login."
 
5090
  msgstr ""
5091
 
5092
+ #: src/processors/loginprotect_intent.php:115
5093
+ msgid "One or more of your authentication codes failed or was missing"
 
5094
  msgstr ""
5095
 
5096
+ #: src/processors/loginprotect_intent.php:244
5097
+ msgid "Please supply all authentication codes"
5098
  msgstr ""
5099
 
5100
+ #: src/processors/loginprotect_intent.php:247
5101
+ msgid "Please supply at least 1 authentication code"
5102
  msgstr ""
5103
 
5104
+ #: src/processors/loginprotect_intent.php:259
5105
+ msgid "Cancel Login"
5106
  msgstr ""
5107
 
5108
+ #: src/processors/loginprotect_intent.php:260
5109
+ msgid "Time Remaining"
5110
  msgstr ""
5111
 
5112
+ #: src/processors/loginprotect_intent.php:261
5113
+ msgid "Calculating"
 
5114
  msgstr ""
5115
 
5116
+ #: src/processors/loginprotect_intent.php:262
5117
+ msgid "Seconds"
 
5118
  msgstr ""
5119
 
5120
+ #: src/processors/loginprotect_intent.php:263
5121
+ msgid "Login Expired"
 
 
5122
  msgstr ""
5123
 
5124
+ #: src/processors/loginprotect_intent.php:264
5125
+ msgid "Verify My Login"
 
5126
  msgstr ""
5127
 
5128
+ #: src/processors/loginprotect_intent.php:266
5129
+ msgid "What is this?"
5130
  msgstr ""
5131
 
5132
+ #: src/processors/loginprotect_intent.php:268
5133
+ #, php-format
5134
+ msgid "%s Login Verification"
 
5135
  msgstr ""
5136
 
5137
+ #: src/processors/loginprotect_intent.php:269
5138
+ #, php-format
5139
+ msgid "Don't ask again on this browser for %s day(s)"
5140
  msgstr ""
5141
 
5142
+ #: src/processors/loginprotect_twofactorauth.php:45
5143
+ #, php-format
5144
  msgid ""
5145
+ "User \"%s\" verified their identity using Email Two-Factor Authentication."
 
5146
  msgstr ""
5147
 
5148
+ #: src/processors/loginprotect_twofactorauth.php:55
5149
+ #, php-format
5150
  msgid ""
5151
+ "User \"%s\" failed to verify their identity using Email Two-Factor "
5152
+ "Authentication."
5153
  msgstr ""
5154
 
5155
+ #: src/processors/loginprotect_twofactorauth.php:87
5156
+ msgid "This code was just sent to your registered Email address."
 
 
5157
  msgstr ""
5158
 
5159
+ #: src/processors/loginprotect_twofactorauth.php:88
5160
+ msgid "Email OTP"
 
 
5161
  msgstr ""
5162
 
5163
+ #: src/processors/loginprotect_twofactorauth.php:181
5164
+ msgid "Someone attempted to login into this WordPress site using your account."
5165
  msgstr ""
5166
 
5167
+ #: src/processors/loginprotect_twofactorauth.php:182
5168
+ msgid "Login requires verification with the following code."
 
5169
  msgstr ""
5170
 
5171
+ #: src/processors/loginprotect_twofactorauth.php:184
5172
  #, php-format
5173
+ msgid "Verification Code: %s"
 
 
 
 
5174
  msgstr ""
5175
 
5176
+ #: src/processors/loginprotect_twofactorauth.php:186
5177
+ msgid "Login Details"
5178
  msgstr ""
5179
 
5180
+ #: src/processors/loginprotect_twofactorauth.php:187
5181
  #, php-format
5182
+ msgid "URL: %s"
5183
  msgstr ""
5184
 
5185
+ #: src/processors/loginprotect_twofactorauth.php:188
5186
+ #: src/processors/user_management.php:178
5187
  #, php-format
5188
+ msgid "Username: %s"
5189
  msgstr ""
5190
 
5191
+ #: src/processors/loginprotect_twofactorauth.php:191
5192
+ msgid "Why no login link?"
 
5193
  msgstr ""
5194
 
5195
+ #: src/processors/loginprotect_twofactorauth.php:194
5196
+ msgid "Two-Factor Login Verification"
 
5197
  msgstr ""
5198
 
5199
+ #: src/processors/loginprotect_twofactorauth.php:199
5200
  #, php-format
5201
  msgid ""
5202
+ "User \"%s\" was sent an email to verify their Identity using Two-Factor "
5203
+ "Login Auth for IP address \"%s\"."
5204
  msgstr ""
5205
 
5206
+ #: src/processors/loginprotect_twofactorauth.php:203
5207
+ #, php-format
5208
+ msgid ""
5209
+ "Tried to send email to User \"%s\" to verify their identity using Two-Factor "
5210
+ "Login Auth for IP address \"%s\", but email sending failed."
5211
  msgstr ""
5212
 
5213
+ #: src/processors/loginprotect_twofactorauth.php:226
5214
+ msgid "Check the box to enable email-based login authentication."
5215
  msgstr ""
5216
 
5217
+ #: src/processors/loginprotect_wplogin.php:52
5218
+ msgid ""
5219
+ "Your login URL is unchanged because the Rename WP Login feature is not "
5220
+ "currently supported on WPMS."
5221
  msgstr ""
5222
 
5223
+ #: src/processors/loginprotect_wplogin.php:56
5224
+ #: src/processors/loginprotect_wplogin.php:60
5225
  #, php-format
5226
+ msgid ""
5227
+ "Can not use the Rename WP Login feature because you have the \"%s\" plugin "
5228
+ "installed and it is active."
5229
  msgstr ""
5230
 
5231
+ #: src/processors/loginprotect_wplogin.php:64
5232
  #, php-format
5233
+ msgid ""
5234
+ "Can not use the Rename WP Login feature because you have not enabled %s."
5235
  msgstr ""
5236
 
5237
+ #: src/processors/loginprotect_wplogin.php:68
5238
  #, php-format
5239
  msgid ""
5240
+ "Can not use the Rename WP Login feature because you have chosen a path (\"%s"
5241
+ "\") that is reserved on your WordPress site."
 
 
 
 
 
 
 
 
5242
  msgstr ""
5243
 
5244
+ #: src/processors/loginprotect_wplogin.php:94
5245
  msgid ""
5246
+ "Your login URL is unchanged because your current hosting/PHP configuration "
5247
+ "cannot parse the necessary information."
5248
  msgstr ""
5249
 
5250
+ #: src/processors/loginprotect_yubikey.php:38
5251
+ msgid "This is your unique Yubikey Device ID."
 
 
5252
  msgstr ""
5253
 
5254
+ #: src/processors/loginprotect_yubikey.php:39
5255
+ msgid "Provide a One Time Password from your Yubikey."
5256
  msgstr ""
5257
 
5258
+ #: src/processors/loginprotect_yubikey.php:40
5259
+ msgid "This will remove Yubikey Authentication from your account."
 
 
 
5260
  msgstr ""
5261
 
5262
+ #: src/processors/loginprotect_yubikey.php:40
5263
+ msgid "This will add Yubikey Authentication to your account."
5264
  msgstr ""
5265
 
5266
+ #: src/processors/loginprotect_yubikey.php:41
5267
+ msgid "Yubikey ID"
 
 
 
5268
  msgstr ""
5269
 
5270
+ #: src/processors/loginprotect_yubikey.php:42
5271
+ #: src/processors/loginprotect_yubikey.php:240
5272
+ msgid "Yubikey OTP"
5273
  msgstr ""
5274
 
5275
+ #: src/processors/loginprotect_yubikey.php:43
5276
+ msgid "Yubikey Authentication"
 
 
 
5277
  msgstr ""
5278
 
5279
+ #: src/processors/loginprotect_yubikey.php:45
5280
+ #: src/processors/loginprotect_yubikey.php:93
5281
+ #: src/processors/loginprotect_yubikey.php:102
5282
+ msgid "Yubikey"
5283
+ msgstr ""
5284
+
5285
+ #: src/processors/loginprotect_yubikey.php:101
5286
+ #, php-format
5287
+ msgid "%s was successfully removed from your account."
5288
  msgstr ""
5289
 
5290
+ #: src/processors/loginprotect_yubikey.php:148
5291
  #, php-format
5292
  msgid ""
5293
+ "User \"%s\" logged in without a Yubikey One Time Password because no "
5294
+ "username-yubikey pair was found for this user."
5295
  msgstr ""
5296
 
5297
+ #: src/processors/loginprotect_yubikey.php:155
5298
+ #, php-format
5299
  msgid ""
5300
+ "User \"%s\" attempted to login but Yubikey ID \"%s\" used was not in list of "
5301
+ "authorised keys."
5302
  msgstr ""
5303
 
5304
+ #: src/processors/loginprotect_yubikey.php:161
5305
+ #: src/processors/loginprotect_yubikey.php:179
5306
+ #, php-format
5307
+ msgid "ERROR: %s"
5308
  msgstr ""
5309
 
5310
+ #: src/processors/loginprotect_yubikey.php:161
 
5311
  msgid ""
5312
+ "The Yubikey provided is not on the list of permitted keys for this user."
 
5313
  msgstr ""
5314
 
5315
+ #: src/processors/loginprotect_yubikey.php:168
5316
+ #: src/processors/loginprotect_yubikey.php:215
5317
  #, php-format
5318
  msgid ""
5319
+ "User \"%s\" successfully logged in using a validated Yubikey One Time "
5320
+ "Password."
 
 
 
 
5321
  msgstr ""
5322
 
5323
+ #: src/processors/loginprotect_yubikey.php:174
5324
  #, php-format
5325
  msgid ""
5326
+ "User \"%s\" attempted to login but Yubikey One Time Password failed to "
5327
+ "validate due to invalid Yubi API response.\"."
5328
  msgstr ""
5329
 
5330
+ #: src/processors/loginprotect_yubikey.php:179
5331
+ msgid "The Yubikey authentication was not validated successfully."
5332
  msgstr ""
5333
 
5334
+ #: src/processors/loginprotect_yubikey.php:222
5335
+ #, php-format
5336
  msgid ""
5337
+ "User \"%s\" failed to verify their identity using Yubikey One Time Password."
 
5338
  msgstr ""
5339
 
5340
+ #: src/processors/loginprotect_yubikey.php:238
5341
+ msgid "Use your Yubikey to generate a new code."
5342
  msgstr ""
5343
 
5344
+ #: src/processors/plugin.php:159
5345
  #, php-format
5346
+ msgid "%s plugin is not currently processing requests"
 
 
 
 
5347
  msgstr ""
5348
 
5349
+ #: src/processors/plugin.php:161
5350
+ #, php-format
5351
+ msgid "Please delete the \"%s\" file to reactivate the %s protection"
5352
  msgstr ""
5353
 
5354
+ #: src/processors/plugin.php:188
5355
+ msgid "Your Name"
 
 
5356
  msgstr ""
5357
 
5358
+ #: src/processors/plugin.php:189
5359
+ msgid "Your Email"
 
5360
  msgstr ""
5361
 
5362
+ #: src/processors/plugin_badge.php:30
5363
+ #, php-format
5364
+ msgid "%s is provided by %s"
5365
  msgstr ""
5366
 
5367
+ #: src/processors/plugin_badge.php:35
5368
  #, php-format
5369
+ msgid "Days Installed: %s"
5370
  msgstr ""
5371
 
5372
+ #: src/processors/plugin_badgewidget.php:20
5373
+ #, php-format
5374
+ msgid "%s Plugin Badge"
5375
  msgstr ""
5376
 
5377
+ #: src/processors/plugin_badgewidget.php:22
5378
+ #, php-format
5379
+ msgid ""
5380
+ "You can now help spread the word about the %s plugin anywhere on your site"
5381
  msgstr ""
5382
 
5383
+ #: src/processors/plugin_badgewidget.php:55
5384
+ msgid "Site Secured"
 
 
5385
  msgstr ""
5386
 
5387
+ #: src/processors/plugin_importexport.php:92
5388
+ #, php-format
5389
+ msgid "Not currently running %s Pro."
5390
  msgstr ""
5391
 
5392
+ #: src/processors/plugin_importexport.php:96
5393
+ msgid "Export of options is currently disabled."
5394
  msgstr ""
5395
 
5396
+ #: src/processors/plugin_importexport.php:100
5397
+ msgid "Handshake verification failed."
5398
  msgstr ""
5399
 
5400
+ #: src/processors/plugin_importexport.php:109
5401
+ #, php-format
5402
+ msgid "Options exported to site %s."
5403
  msgstr ""
5404
 
5405
+ #: src/processors/plugin_importexport.php:115
5406
  #, php-format
5407
+ msgid "Site added to export white list: %s."
5408
  msgstr ""
5409
 
5410
+ #: src/processors/plugin_importexport.php:254
5411
+ #, php-format
5412
+ msgid "Options imported from %s."
5413
  msgstr ""
5414
 
5415
+ #: src/processors/plugin_importexport.php:264
5416
+ #, php-format
5417
+ msgid "Master Site URL set to %s."
5418
  msgstr ""
5419
 
5420
+ #: src/processors/plugin_tracking.php:32
5421
  #, php-format
5422
+ msgid "Make %s even better by sharing usage info?"
5423
  msgstr ""
5424
 
5425
+ #: src/processors/plugin_tracking.php:33
5426
  #, php-format
5427
+ msgid "We're hoping to understand how %s is configured and used."
5428
  msgstr ""
5429
 
5430
+ #: src/processors/plugin_tracking.php:34
5431
+ msgid "We'd like to understand how effective it is on a global scale."
5432
  msgstr ""
5433
 
5434
+ #: src/processors/plugin_tracking.php:35
5435
  msgid ""
5436
+ "The data sent is always completely anonymous and we can never track you or "
5437
+ "your site."
5438
  msgstr ""
5439
 
5440
+ #: src/processors/plugin_tracking.php:36
5441
+ msgid "It can be turned-off at any time within the plugin options."
 
 
5442
  msgstr ""
5443
 
5444
+ #: src/processors/plugin_tracking.php:37
5445
+ msgid "Click to see the RAW data that would be sent"
5446
  msgstr ""
5447
 
5448
+ #: src/processors/plugin_tracking.php:40
5449
+ msgid "Absolutely"
5450
  msgstr ""
5451
 
5452
+ #: src/processors/sessions.php:94
5453
+ msgid "You're already logged-in."
 
5454
  msgstr ""
5455
 
5456
+ #: src/processors/sessions.php:99
5457
+ msgid "Go To Admin"
5458
  msgstr ""
5459
 
5460
+ #: src/processors/statistics.php:131
5461
+ msgid "Comment Blocks"
5462
  msgstr ""
5463
 
5464
+ #: src/processors/statistics.php:132
5465
+ msgid "Firewall Blocks"
5466
  msgstr ""
5467
 
5468
+ #: src/processors/statistics.php:133
5469
+ msgid "Login Blocks"
 
 
5470
  msgstr ""
5471
 
5472
+ #: src/processors/statistics.php:134
5473
+ msgid "Login Verified"
 
 
5474
  msgstr ""
5475
 
5476
+ #: src/processors/statistics.php:137
5477
+ msgid "IP Auto Black-Listed"
 
 
5478
  msgstr ""
5479
 
5480
+ #: src/processors/statistics.php:138
5481
+ msgid "Total Transgressions"
5482
  msgstr ""
5483
 
5484
+ #: src/processors/statistics.php:142
5485
+ msgid "Shield Statistics"
5486
  msgstr ""
5487
 
5488
+ #: src/processors/user_management.php:99
5489
+ msgid "Last Login"
5490
  msgstr ""
5491
 
5492
+ #: src/processors/user_management.php:121
5493
+ msgid "Not Recorded"
5494
  msgstr ""
5495
 
5496
+ #: src/processors/user_management.php:169
5497
  #, php-format
5498
+ msgid ""
5499
+ "As requested, %s is notifying you of a successful %s login to a WordPress "
5500
+ "site that you manage."
5501
  msgstr ""
5502
 
5503
+ #: src/processors/user_management.php:174
5504
+ #, php-format
5505
+ msgid "Important: %s"
5506
  msgstr ""
5507
 
5508
+ #: src/processors/user_management.php:174
5509
  msgid ""
5510
+ "This user may now be subject to additional Two-Factor Authentication before "
5511
+ "completing their login."
5512
  msgstr ""
5513
 
5514
+ #: src/processors/user_management.php:176
5515
+ msgid "Details for this user are below:"
 
 
5516
  msgstr ""
5517
 
5518
+ #: src/processors/user_management.php:177
5519
+ #, php-format
5520
+ msgid "Site URL: %s"
 
5521
  msgstr ""
5522
 
5523
+ #: src/processors/user_management.php:179
5524
+ #, php-format
5525
+ msgid "User Email: %s"
5526
  msgstr ""
5527
 
5528
+ #: src/processors/user_management.php:182
5529
+ msgid "Thanks."
5530
  msgstr ""
5531
 
5532
+ #: src/processors/user_management.php:190
 
5533
  #, php-format
5534
+ msgid "Notice - %s"
5535
  msgstr ""
5536
 
5537
+ #: src/processors/user_management.php:190
5538
  #, php-format
5539
+ msgid "%s Just Logged Into %s"
5540
  msgstr ""
5541
 
5542
+ #: src/processors/usermanagement_passwords.php:111
5543
+ msgid ""
5544
+ "Your password doesn't currently meet requirements set by your security "
5545
+ "administrator."
5546
  msgstr ""
5547
 
5548
+ #: src/processors/usermanagement_passwords.php:141
 
5549
  msgid ""
5550
+ "Your security administrator has imposed requirements for password quality."
 
5551
  msgstr ""
5552
 
5553
+ #: src/processors/usermanagement_passwords.php:193
5554
  #, php-format
5555
+ msgid "Password length (%s) too short (min: %s characters)"
 
 
5556
  msgstr ""
5557
 
5558
+ #: src/processors/usermanagement_passwords.php:255
5559
+ #: src/processors/usermanagement_passwords.php:318
5560
+ msgid "Please use a different password."
5561
  msgstr ""
5562
 
5563
+ #: src/processors/usermanagement_passwords.php:256
5564
+ #: src/processors/usermanagement_passwords.php:319
5565
+ msgid "This password has already been pwned."
 
5566
  msgstr ""
5567
 
5568
+ #: src/processors/usermanagement_passwords.php:260
5569
+ #: src/processors/usermanagement_passwords.php:323
5570
  #, php-format
5571
+ msgid "%s times"
 
 
5572
  msgstr ""
5573
 
5574
+ #: src/processors/usermanagement_sessions.php:200
5575
+ msgid "Your session has expired."
 
 
5576
  msgstr ""
5577
 
5578
+ #: src/processors/usermanagement_sessions.php:204
5579
+ msgid "Your session was idle for too long."
 
 
 
5580
  msgstr ""
5581
 
5582
+ #: src/processors/usermanagement_sessions.php:208
5583
+ msgid "Your session was locked to another IP Address."
 
5584
  msgstr ""
5585
 
5586
+ #: src/processors/usermanagement_sessions.php:212
5587
+ #, php-format
5588
+ msgid "You do not currently have a %s user session."
 
5589
  msgstr ""
5590
 
5591
+ #: src/processors/usermanagement_sessions.php:217
5592
+ msgid "An administrator has terminated this session."
 
 
 
5593
  msgstr ""
5594
 
5595
+ #: src/processors/usermanagement_sessions.php:221
5596
+ msgid "Not a user."
 
 
 
5597
  msgstr ""
5598
 
5599
+ #: src/processors/usermanagement_sessions.php:225
5600
+ msgid "Your session was terminated."
 
5601
  msgstr ""
5602
 
5603
+ #: src/processors/usermanagement_sessions.php:229
5604
+ msgid "Please login again."
5605
+ msgstr ""
5606
+
5607
+ #: src/wizards/base.php:358
5608
  #, php-format
5609
+ msgid "%s Wizard"
 
 
5610
  msgstr ""
5611
 
5612
+ #: src/wizards/base.php:497
5613
+ msgid "No Access"
 
5614
  msgstr ""
5615
 
5616
+ #: src/wizards/base_wpsf.php:113
5617
+ msgid "Security Admin Key was not correct."
 
 
 
5618
  msgstr ""
5619
 
5620
+ #: src/wizards/hack_protect.php:18
5621
  #, php-format
5622
+ msgid "%s Hack Protect Wizard"
 
 
5623
  msgstr ""
5624
 
5625
+ #: src/wizards/hack_protect.php:302
5626
+ msgid "All changes detected have been ignored."
 
 
 
5627
  msgstr ""
5628
 
5629
+ #: src/wizards/hack_protect.php:310
5630
+ msgid "The plugin has been deactivated."
5631
  msgstr ""
5632
 
5633
+ #: src/wizards/login_protect.php:18
5634
  #, php-format
5635
+ msgid "%s Multi-Factor Authentication Wizard"
5636
  msgstr ""
5637
 
5638
+ #: src/wizards/login_protect.php:62
5639
+ msgid "Invalid email address"
 
5640
  msgstr ""
5641
 
5642
+ #: src/wizards/login_protect.php:117
5643
+ msgid "Code was empty."
 
5644
  msgstr ""
5645
 
5646
+ #: src/wizards/login_protect.php:144
5647
+ msgid "Google Authenticator was enabled for the site."
 
5648
  msgstr ""
5649
 
5650
+ #: src/wizards/login_protect.php:159
5651
  #, php-format
5652
+ msgid "Multi-Factor Authentication was %s for the site."
5653
  msgstr ""
5654
 
5655
+ #: src/wizards/login_protect.php:160
5656
+ msgid "enabled"
5657
  msgstr ""
5658
 
5659
+ #: src/wizards/login_protect.php:160
5660
+ msgid "disabled"
5661
  msgstr ""
5662
 
5663
+ #: src/wizards/plugin.php:25
5664
  #, php-format
5665
+ msgid "%s Welcome Wizard"
5666
  msgstr ""
5667
 
5668
+ #: src/wizards/plugin.php:227
5669
+ msgid "Where to find Shield"
 
 
5670
  msgstr ""
5671
 
5672
+ #: src/wizards/plugin.php:228
5673
+ msgid "Accessing Each Module"
5674
  msgstr ""
5675
 
5676
+ #: src/wizards/plugin.php:229
5677
+ msgid "Accessing Options"
 
5678
  msgstr ""
5679
 
5680
+ #: src/wizards/plugin.php:230
5681
+ msgid "Launching Wizards"
 
 
5682
  msgstr ""
5683
 
5684
+ #: src/wizards/plugin.php:231
5685
+ msgid "Finding Help"
 
 
5686
  msgstr ""
5687
 
5688
+ #: src/wizards/plugin.php:232
5689
+ msgid "Actions (not Options)"
 
 
5690
  msgstr ""
5691
 
5692
+ #: src/wizards/plugin.php:233
5693
+ msgid "Help For Each Option"
 
 
5694
  msgstr ""
5695
 
5696
+ #: src/wizards/plugin.php:234
5697
+ msgid "Module On/Off Switch"
5698
  msgstr ""
5699
 
5700
+ #: src/wizards/plugin.php:237
5701
+ #, php-format
5702
+ msgid "You'll find the main %s settings in the left-hand WordPress menu."
5703
  msgstr ""
5704
 
5705
+ #: src/wizards/plugin.php:238
5706
+ msgid ""
5707
+ "Shield is split up into independent modules for accessing the options of "
5708
+ "each feature."
5709
  msgstr ""
5710
 
5711
+ #: src/wizards/plugin.php:239
5712
+ msgid ""
5713
+ "When you load a module, you can access the options by clicking on the "
5714
+ "Options Panel link."
5715
  msgstr ""
5716
 
5717
+ #: src/wizards/plugin.php:240
5718
+ msgid "Launch helpful walk-through wizards for modules that have them."
5719
  msgstr ""
5720
 
5721
+ #: src/wizards/plugin.php:241
5722
+ msgid ""
5723
+ "Each module also has a brief overview help section - there is more in-depth "
5724
+ "help available."
5725
  msgstr ""
5726
 
5727
+ #: src/wizards/plugin.php:242
5728
+ msgid ""
5729
+ "Certain modules have extra actions and features, e.g. Audit Trail Viewer."
5730
  msgstr ""
5731
 
5732
+ #: src/wizards/plugin.php:243
5733
+ msgid "Note: Not all modules have the actions section"
5734
  msgstr ""
5735
 
5736
+ #: src/wizards/plugin.php:244
5737
+ msgid ""
5738
+ "Each module has an Enable/Disable checkbox to turn on/off all processing for "
5739
+ "that module"
5740
  msgstr ""
5741
 
5742
+ #: src/wizards/plugin.php:245
5743
+ msgid ""
5744
+ "To help you understand each option, most of them have a more info link, and/"
5745
+ "or a blog link, to read more"
5746
  msgstr ""
5747
 
5748
+ #: src/wizards/plugin.php:306
5749
+ msgid "Success!"
5750
  msgstr ""
5751
 
5752
+ #: src/wizards/plugin.php:331
5753
+ msgid "License key was accepted and installed successfully."
5754
  msgstr ""
5755
 
5756
+ #: src/wizards/plugin.php:334
5757
+ msgid "License key was not accepted."
5758
  msgstr ""
5759
 
5760
+ #: src/wizards/plugin.php:365
5761
+ msgid "Options imported successfully to your site."
5762
  msgstr ""
5763
 
5764
+ #: src/wizards/plugin.php:366
5765
+ msgid "Secret key was empty."
5766
+ msgstr ""
5767
+
5768
+ #: src/wizards/plugin.php:367
5769
+ msgid "Secret key was not 40 characters long."
5770
+ msgstr ""
5771
+
5772
+ #: src/wizards/plugin.php:368
5773
  msgid ""
5774
+ "Secret key contains invalid characters - it should be letters and numbers "
5775
+ "only."
5776
  msgstr ""
5777
 
5778
+ #: src/wizards/plugin.php:369
5779
+ msgid "Source site URL could not be parsed correctly."
5780
  msgstr ""
5781
 
5782
+ #: src/wizards/plugin.php:370
5783
+ msgid "Could not parse the response from the site."
 
5784
  msgstr ""
5785
 
5786
+ #: src/wizards/plugin.php:371
5787
+ msgid "Check the secret key is correct for the remote site."
 
5788
  msgstr ""
5789
 
5790
+ #: src/wizards/plugin.php:372
5791
+ msgid "Failure response returned from the site."
5792
  msgstr ""
5793
 
5794
+ #: src/wizards/plugin.php:373
5795
  #, php-format
5796
+ msgid "Remote site responded with - %s"
5797
  msgstr ""
5798
 
5799
+ #: src/wizards/plugin.php:374
5800
+ msgid "Data returned from the site was empty."
5801
  msgstr ""
5802
 
5803
+ #: src/wizards/plugin.php:408
5804
+ msgid "Security Admin setup was successful."
5805
  msgstr ""
5806
 
5807
+ #: src/wizards/plugin.php:426 src/wizards/plugin.php:459
5808
+ #: src/wizards/plugin.php:492 src/wizards/plugin.php:530
5809
+ #: src/wizards/plugin.php:566
5810
+ msgid "No changes were made as no option was selected"
5811
  msgstr ""
5812
 
5813
+ #: src/wizards/plugin.php:439 src/wizards/plugin.php:472
5814
+ #: src/wizards/plugin.php:508 src/wizards/plugin.php:582
5815
+ msgid "Enabled"
5816
  msgstr ""
5817
 
5818
+ #: src/wizards/plugin.php:439 src/wizards/plugin.php:472
5819
+ #: src/wizards/plugin.php:508 src/wizards/plugin.php:582
5820
+ msgid "Disabled"
5821
  msgstr ""
5822
 
5823
+ #: src/wizards/plugin.php:443 src/wizards/plugin.php:476
5824
+ #: src/wizards/plugin.php:512 src/wizards/plugin.php:586
5825
+ #, php-format
5826
+ msgid "%s setting could not be changed at this time."
5827
  msgstr ""
5828
 
5829
+ #: src/wizards/plugin.php:540 src/wizards/plugin.php:550
5830
+ msgid "Preferences have been saved."
5831
  msgstr ""
5832
 
5833
+ #: templates/php/snippets/options_form.php:17
5834
+ msgid "Save Options"
 
5835
  msgstr ""
languages/wp-simple-firewall-fi.mo CHANGED
Binary file
languages/wp-simple-firewall-sr_RS.mo ADDED
Binary file
plugin-spec.php CHANGED
@@ -1,7 +1,7 @@
1
  {
2
  "properties": {
3
- "version": "6.5.0",
4
- "release_timestamp": 1520251200,
5
  "slug_parent": "icwp",
6
  "slug_plugin": "wpsf",
7
  "human_name": "Shield",
1
  {
2
  "properties": {
3
+ "version": "6.6.0",
4
+ "release_timestamp": 1521445600,
5
  "slug_parent": "icwp",
6
  "slug_plugin": "wpsf",
7
  "human_name": "Shield",
readme.txt CHANGED
@@ -1,30 +1,46 @@
1
  === Shield Security for WordPress ===
2
  Contributors: onedollarplugin, paultgoodchild
3
- Donate link: http://icwp.io/q
4
  License: GPLv3
5
  License URI: http://www.gnu.org/licenses/gpl.html
6
  Tags: security, all in one, scan, spam, recaptcha, two-factor authentication, ithemes, wordfence, better wp security, cerber, hack
7
  Requires at least: 3.5.0
 
 
8
  Tested up to: 4.9
9
- Stable tag: 6.5.0
10
 
11
  Free All-In-One Protection for your WordPress sites, data, reputation, and users. Shield: the Highest-Rated Security Plugin for WordPress
12
 
13
  == Description ==
14
 
15
- Shield handles it all for you:
16
 
17
- * Easy-To-Use Guided Setup Wizards
18
- * Login Guard against bots (including Limit Login Attempts)
19
- * Hack Guard scans files for unintended changes, e.g. code injection into core files
20
- * Automatic IP Black List
21
- * 2-Factor Authentication
22
- * Comments SPAM - block 100% of bot spam.
23
- * Audit Trail & Logging
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  * reCAPTCHA
25
  * Firewall
26
  * Security Admin Users
27
- * Core file scanners
28
  * Block REST API / XML-RPC
29
  * HTTP Headers
30
  * Automatic Updates Control
@@ -36,30 +52,31 @@ Shield handles it all for you:
36
  > Why take the risk?
37
  >
38
  > Download and install Shield now for FREE so that you have the most powerful WordPress security system working for you and protecting your site.
39
- >
40
- > <strong>Shield + iControlWP</strong><br />
41
- > If you have multiple sites, then Shield [combined with iControlWP](http://icwp.io/shld8), takes the pain out of managing your websites, and covers your security, daily backup (and restore), and updating plugins/themes
42
 
43
  = The New Shield Pro =
44
 
45
- From November 2017, Shield Security now has a Pro version.
46
-
47
- For just $1/month:
48
 
49
- 1. Exclusive Pro customer email support.
50
- 1. Plugin Vulnerability Scanner.
51
- 1. Import/Export of options across sites.
52
- 1. Protect WooCommerce login and user registration, along with other 3rd party plugins e.g. Easy Digital Downloads, BuddyPress.
53
- 1. Improved Audit Trail logging
54
- 1. Exclusive early access to new security features
55
- 1. Text customisations for visitors.
56
- 1. No manual Pro plugin downloads - we handle this all for you automatically.
57
- 1. (coming soon) White Labelling
58
- 1. (coming soon) Improved performance
59
- 1. (coming soon) Statistics and Reporting
60
- 1. (coming soon) Select individual automatic plugin updates
61
-
62
- Learn more and go Pro at [our One Dollar Plugin store](http://icwp.io/ab).
 
 
 
 
 
 
63
 
64
  = Our Mission =
65
 
@@ -356,15 +373,25 @@ If you don't want to support the work, no problem! You can still continue to use
356
 
357
  You can [go Pro for just $1/month](http://icwp.io/aa).
358
 
359
- = 6.5.0 - Current Release =
360
- *Released: 5th March, 2018* - [Release Notes](http://icwp.io/bu)
361
-
362
- * **(v.0)** IMPROVED: [Plugin Guard](http://icwp.io/bq) better handles the case where a plugin/theme has been entirely renamed/removed.
363
- * **(v.0)** IMPROVED: Attempts to access the XML-RPC system when it's disabled will now trigger the blacklist transgressions counter.
364
- * **(v.0)** IMPROVED: Try to prevent black listing the server's own public IP address where visitor IP address detection is not correctly configured.
365
- * **(v.0)** ADDED: [**PRO**] Provisional support for not processing 2FA logins for Woocommerce Social Login plugin.
366
- * **(v.0)** FIXED: Plugin Guard better handles ignoring non-WordPress.org Plugins/Themes
367
- * **(v.0)** FIXED: A few small bugs
 
 
 
 
 
 
 
 
 
 
368
 
369
  = 6.5 Series =
370
  *Released: 5th March, 2018* - [Release Notes](http://icwp.io/bu)
1
  === Shield Security for WordPress ===
2
  Contributors: onedollarplugin, paultgoodchild
3
+ Donate link: http://icwp.io/bw
4
  License: GPLv3
5
  License URI: http://www.gnu.org/licenses/gpl.html
6
  Tags: security, all in one, scan, spam, recaptcha, two-factor authentication, ithemes, wordfence, better wp security, cerber, hack
7
  Requires at least: 3.5.0
8
+ Requires PHP: 5.2.4
9
+ Recommended PHP: 5.4
10
  Tested up to: 4.9
11
+ Stable tag: 6.6.0
12
 
13
  Free All-In-One Protection for your WordPress sites, data, reputation, and users. Shield: the Highest-Rated Security Plugin for WordPress
14
 
15
  == Description ==
16
 
17
+ = You Can Trust Shield To Do Exactly What It Says It Will Do =
18
 
19
+ We know you may have been let down in the past, but Shield is the WordPress Security solution that does what it says it'll do - Protect Your Site.
20
+
21
+ = All-In-One Shield Is Easy To Use =
22
+
23
+ Your WP Security plugin must be easy to understand and easy to install/setup - Shield built for both beginners and advanced.
24
+
25
+ And importantly, it [comes highly recommended](https://wordpress.org/support/plugin/wp-simple-firewall/reviews/)
26
+ - Shield has the highest average rating for any WP Security plugin.
27
+
28
+ Its simple but powerful protection blocks attacks and suspicious activity, but won't lock you out.
29
+
30
+ Shield is the must-have, free Security Solution for all your WordPress sites.
31
+
32
+ = Shield Features You'll Absolutely Love =
33
+
34
+ * Beautiful, Easy-To-Use Guided Wizards - help you configure Shield and run scans like a Pro
35
+ * Limit Login Attempts / Block Automatic Brute-Force Bots - all automatically
36
+ * Powerful Core File Scanners - automatically detects malicious file changes and hacks you'd never see
37
+ * Automatic IP Black List - no need for you to manage IPs!
38
+ * 2-Factor Authentication - including Google Authenticator and Email
39
+ * Block 100% Automated Comments SPAM
40
+ * Audit Trail & User Activity Logging
41
  * reCAPTCHA
42
  * Firewall
43
  * Security Admin Users
 
44
  * Block REST API / XML-RPC
45
  * HTTP Headers
46
  * Automatic Updates Control
52
  > Why take the risk?
53
  >
54
  > Download and install Shield now for FREE so that you have the most powerful WordPress security system working for you and protecting your site.
 
 
 
55
 
56
  = The New Shield Pro =
57
 
58
+ From November 2017, Shield Security now has a Pro version for those that need to take their Security to the next level.
 
 
59
 
60
+ > <strong>The Pro Extras</strong>:
61
+ >
62
+ > 1. Exclusive customer email support.
63
+ > 1. Plugin Vulnerability Scanner.
64
+ > 1. Plugin / Themes Hack Detection Scanner.
65
+ > 1. More Frequent Scans - as often as every hour.
66
+ > 1. Protection for your WooCommerce customers (incl. Easy Digital Downloads & BuddyPress)
67
+ > 1. Remember-Me 2-Factor Authentication.
68
+ > 1. Powerful Password Policies.
69
+ > 1. Import/Export of options across sites.
70
+ > 1. Improved Audit Trail logging
71
+ > 1. Exclusive early access to new security features
72
+ > 1. Text customisations for your visitors.
73
+ > 1. No manual Pro plugin downloads - we handle this all for you automatically.
74
+ > 1. No license keys to manage - it's all automatic!
75
+ > 1. (coming soon) White Labelling
76
+ > 1. (coming soon) Statistics and Reporting
77
+ > 1. (coming soon) Select individual automatic plugin updates
78
+
79
+ Learn more on going Pro at [our One Dollar Plugin store](http://icwp.io/ab).
80
 
81
  = Our Mission =
82
 
373
 
374
  You can [go Pro for just $1/month](http://icwp.io/aa).
375
 
376
+ = 6.6.0 - Current Release =
377
+ *Released: 19th March, 2018* - [Release Notes](http://icwp.io/c3)
378
+
379
+ * **(v.0)** NEW: [**PRO**] [Keyless Activation of Pro licenses](http://icwp.io/c1).
380
+ * **(v.0)** ADDED: [WordPress Password Policies](http://icwp.io/c2).
381
+ * **(v.0)** ADDED: Pwned Passwords Detection.
382
+ * **(v.0)** IMPROVED: Major rewrite of plugin AJAX handling.
383
+ * **(v.0)** IMPROVED: Notices to indicate the time of the last scans.
384
+ * **(v.0)** FIXED: A few bugs
385
+
386
+ = 6.6 Series =
387
+ *Released: 19th March, 2018* - [Release Notes](http://icwp.io/c3)
388
+
389
+ * **(v.0)** NEW: [**PRO**] [Keyless Activation of Pro licenses](http://icwp.io/c1).
390
+ * **(v.0)** ADDED: [WordPress Password Policies](http://icwp.io/c2).
391
+ * **(v.0)** ADDED: Pwned Passwords Detection.
392
+ * **(v.0)** IMPROVED: Major rewrite of plugin AJAX handling.
393
+ * **(v.0)** IMPROVED: Notices to indicate the time of the last scans.
394
+ * **(v.0)** FIXED: A few bugs
395
 
396
  = 6.5 Series =
397
  *Released: 5th March, 2018* - [Release Notes](http://icwp.io/bu)
resources/js/global-plugin.js CHANGED
@@ -137,6 +137,7 @@ var iCWP_WPSF_HackGuard_Reinstall = new function () {
137
  };
138
  }();
139
 
 
140
  var iCWP_WPSF_Autoupdates = new function () {
141
 
142
  var bRequestCurrentlyRunning = false;
@@ -156,13 +157,12 @@ var iCWP_WPSF_Autoupdates = new function () {
156
  return sendTogglePluginAutoupdate( $oInput.data( 'pluginfile' ), $oInput.data( 'nonce' ) );
157
  };
158
 
159
- var sendTogglePluginAutoupdate = function ( sPluginFile, sAjaxNonce ) {
160
  bRequestCurrentlyRunning = true;
161
 
162
  var requestData = {
163
  'action': 'icwp_wpsf_TogglePluginAutoupdate',
164
- 'pluginfile': sPluginFile,
165
- '_ajax_nonce': sAjaxNonce
166
  };
167
 
168
  jQuery.post( ajaxurl, requestData,
137
  };
138
  }();
139
 
140
+ /** TODO: THIS AJAX IS NOT COMPLETE **/
141
  var iCWP_WPSF_Autoupdates = new function () {
142
 
143
  var bRequestCurrentlyRunning = false;
157
  return sendTogglePluginAutoupdate( $oInput.data( 'pluginfile' ), $oInput.data( 'nonce' ) );
158
  };
159
 
160
+ var sendTogglePluginAutoupdate = function ( sPluginFile ) {
161
  bRequestCurrentlyRunning = true;
162
 
163
  var requestData = {
164
  'action': 'icwp_wpsf_TogglePluginAutoupdate',
165
+ 'pluginfile': sPluginFile
 
166
  };
167
 
168
  jQuery.post( ajaxurl, requestData,
resources/js/plugin.js CHANGED
@@ -57,17 +57,10 @@ var iCWP_WPSF_OptionsFormSubmit = new function () {
57
  if ( bRequestCurrentlyRunning ) {
58
  return false;
59
  }
60
-
61
  bRequestCurrentlyRunning = true;
62
-
63
  event.preventDefault();
64
 
65
  var $oForm = jQuery( this );
66
- jQuery( '<input />' ).attr( 'type', 'hidden' )
67
- .attr( 'name', 'action' )
68
- .attr( 'value', 'icwp_OptionsFormSave' )
69
- .appendTo( $oForm );
70
-
71
  jQuery.post( ajaxurl, $oForm.serialize(),
72
  function ( oResponse ) {
73
  var sMessage;
@@ -77,6 +70,7 @@ var iCWP_WPSF_OptionsFormSubmit = new function () {
77
  else {
78
  sMessage = oResponse.data.message;
79
  }
 
80
  jQuery( 'div#icwpOptionsFormContainer' ).html( oResponse.data.options_form )
81
  iCWP_WPSF_Growl.showMessage( sMessage, oResponse.success );
82
  }
57
  if ( bRequestCurrentlyRunning ) {
58
  return false;
59
  }
 
60
  bRequestCurrentlyRunning = true;
 
61
  event.preventDefault();
62
 
63
  var $oForm = jQuery( this );
 
 
 
 
 
64
  jQuery.post( ajaxurl, $oForm.serialize(),
65
  function ( oResponse ) {
66
  var sMessage;
70
  else {
71
  sMessage = oResponse.data.message;
72
  }
73
+ /** TODO: div#icwpOptionsFormContainer no longer exists */
74
  jQuery( 'div#icwpOptionsFormContainer' ).html( oResponse.data.options_form )
75
  iCWP_WPSF_Growl.showMessage( sMessage, oResponse.success );
76
  }
resources/js/whitelabel.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ var iCWP_WPSF_WhiteLabel = new function () {
2
+ this.initialise = function () {
3
+ jQuery( document ).ready( function () {
4
+ jQuery( 'select#plugin option[value="%s"]' ).remove();
5
+ } );
6
+ };
7
+ }();
8
+ iCWP_WPSF_WhiteLabel.initialise();
src/common/easydigitaldownloads/ICWP_EDD_LicenseVO.php CHANGED
@@ -82,6 +82,14 @@ class ICWP_EDD_LicenseVO {
82
  return $this->getRaw()->site_count;
83
  }
84
 
 
 
 
 
 
 
 
 
85
  /**
86
  * @return bool
87
  */
82
  return $this->getRaw()->site_count;
83
  }
84
 
85
+ /**
86
+ * @return bool
87
+ */
88
+ public function isShieldCentral() {
89
+ $oRaw = $this->getRaw();
90
+ return isset( $oRaw->is_central ) && $oRaw->is_central;
91
+ }
92
+
93
  /**
94
  * @return bool
95
  */
src/common/icwp-data.php CHANGED
@@ -25,7 +25,8 @@ class ICWP_WPSF_DataProcessor extends ICWP_WPSF_Foundation {
25
  */
26
  protected $aRequestUriParts;
27
 
28
- protected function __construct() {}
 
29
 
30
  /**
31
  * @return ICWP_WPSF_DataProcessor
@@ -97,6 +98,24 @@ class ICWP_WPSF_DataProcessor extends ICWP_WPSF_Foundation {
97
  return ( $bTrim && is_scalar( $mVal ) ) ? trim( $mVal ) : $mVal;
98
  }
99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  /**
101
  * @return string URI Path in lowercase
102
  */
@@ -261,6 +280,13 @@ class ICWP_WPSF_DataProcessor extends ICWP_WPSF_Foundation {
261
  return $aNewList;
262
  }
263
 
 
 
 
 
 
 
 
264
  /**
265
  * Taken from http://www.phacks.net/detecting-search-engine-bot-and-web-spiders/
266
  */
@@ -320,13 +346,6 @@ class ICWP_WPSF_DataProcessor extends ICWP_WPSF_Foundation {
320
  return $sAtoZ[ $nRandomInt ];
321
  }
322
 
323
- /**
324
- * @return bool
325
- */
326
- static public function GetIsRequestPost() {
327
- return ( self::GetRequestMethod() == 'post' );
328
- }
329
-
330
  /**
331
  * Returns the current request method as an all-lower-case string
332
  * @return bool|string
25
  */
26
  protected $aRequestUriParts;
27
 
28
+ protected function __construct() {
29
+ }
30
 
31
  /**
32
  * @return ICWP_WPSF_DataProcessor
98
  return ( $bTrim && is_scalar( $mVal ) ) ? trim( $mVal ) : $mVal;
99
  }
100
 
101
+ /**
102
+ * @param string $sKey
103
+ * @param null $mDefault
104
+ * @param bool $bIncludeCookie
105
+ * @param bool $bTrim -automatically trim whitespace
106
+ * @return mixed|null
107
+ */
108
+ public function request( $sKey, $bIncludeCookie = false, $mDefault = null, $bTrim = true ) {
109
+ $mVal = $this->post( $sKey, null, $bTrim );
110
+ if ( is_null( $mVal ) ) {
111
+ $mVal = $this->query( $sKey, null, $bTrim );
112
+ if ( is_null( $mVal && $bIncludeCookie ) ) {
113
+ $mVal = self::FetchCookie( $sKey );
114
+ }
115
+ }
116
+ return is_null( $mVal ) ? $mDefault : ( $bTrim && is_scalar( $mVal ) ) ? trim( $mVal ) : $mVal;
117
+ }
118
+
119
  /**
120
  * @return string URI Path in lowercase
121
  */
280
  return $aNewList;
281
  }
282
 
283
+ /**
284
+ * @return bool
285
+ */
286
+ public function isMethodPost() {
287
+ return ( self::GetRequestMethod() == 'post' );
288
+ }
289
+
290
  /**
291
  * Taken from http://www.phacks.net/detecting-search-engine-bot-and-web-spiders/
292
  */
346
  return $sAtoZ[ $nRandomInt ];
347
  }
348
 
 
 
 
 
 
 
 
349
  /**
350
  * Returns the current request method as an all-lower-case string
351
  * @return bool|string
src/common/icwp-edd.php CHANGED
@@ -10,6 +10,11 @@ class ICWP_WPSF_Edd extends ICWP_WPSF_Foundation {
10
  */
11
  protected static $oInstance = null;
12
 
 
 
 
 
 
13
  /**
14
  * @return ICWP_WPSF_Edd
15
  */
@@ -67,6 +72,25 @@ class ICWP_WPSF_Edd extends ICWP_WPSF_Foundation {
67
  return $this->commonLicenseAction( 'activate_license', $sStoreUrl, $sKey, $sItemId );
68
  }
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  /**
71
  * @param string $sStoreUrl
72
  * @param string $sKey
@@ -88,21 +112,40 @@ class ICWP_WPSF_Edd extends ICWP_WPSF_Foundation {
88
  $oLicense = null;
89
 
90
  $aLicenseLookupParams = array(
91
- 'body' => array(
92
- 'edd_action' => $sAction,
93
- 'license' => $sKey,
94
- 'item_id' => $sItemId,
95
- 'url' => $this->loadWp()->getWpUrl(),
96
- 'home_url' => $this->loadWp()->getHomeUrl()
 
 
 
97
  )
98
  );
99
 
100
  $aContent = $this->loadFS()
101
- ->postUrl( $sStoreUrl, $aLicenseLookupParams );
102
  if ( !empty( $aContent ) ) {
103
  require_once( dirname( __FILE__ ).'/easydigitaldownloads/ICWP_EDD_LicenseVO.php' );
104
  $oLicense = new ICWP_EDD_LicenseVO( json_decode( $aContent[ 'body' ] ) );
105
  }
106
  return $oLicense;
107
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  }
10
  */
11
  protected static $oInstance = null;
12
 
13
+ /**
14
+ * @var array
15
+ */
16
+ private $aAdditionalRequestParams;
17
+
18
  /**
19
  * @return ICWP_WPSF_Edd
20
  */
72
  return $this->commonLicenseAction( 'activate_license', $sStoreUrl, $sKey, $sItemId );
73
  }
74
 
75
+ /**
76
+ * @param string $sStoreUrl
77
+ * @param string $sItemId
78
+ * @return ICWP_EDD_LicenseVO|null
79
+ */
80
+ public function activateLicenseKeyless( $sStoreUrl, $sItemId ) {
81
+ return $this->activateLicense( $sStoreUrl, '', $sItemId );
82
+ }
83
+
84
+ /**
85
+ * @param string $sStoreUrl
86
+ * @param string $sKey
87
+ * @param string $sItemId
88
+ * @return ICWP_EDD_LicenseVO|null
89
+ */
90
+ public function checkLicense( $sStoreUrl, $sKey, $sItemId ) {
91
+ return $this->commonLicenseAction( 'check_license', $sStoreUrl, $sKey, $sItemId );
92
+ }
93
+
94
  /**
95
  * @param string $sStoreUrl
96
  * @param string $sKey
112
  $oLicense = null;
113
 
114
  $aLicenseLookupParams = array(
115
+ 'body' => array_merge(
116
+ array(
117
+ 'edd_action' => $sAction,
118
+ 'license' => $sKey,
119
+ 'item_id' => $sItemId,
120
+ 'url' => $this->loadWp()->getHomeUrl(),
121
+ 'alt_url' => $this->loadWp()->getWpUrl()
122
+ ),
123
+ $this->getRequestParams()
124
  )
125
  );
126
 
127
  $aContent = $this->loadFS()
128
+ ->getUrl( $sStoreUrl, $aLicenseLookupParams );
129
  if ( !empty( $aContent ) ) {
130
  require_once( dirname( __FILE__ ).'/easydigitaldownloads/ICWP_EDD_LicenseVO.php' );
131
  $oLicense = new ICWP_EDD_LicenseVO( json_decode( $aContent[ 'body' ] ) );
132
  }
133
  return $oLicense;
134
  }
135
+
136
+ /**
137
+ * @return array
138
+ */
139
+ public function getRequestParams() {
140
+ return is_array( $this->aAdditionalRequestParams ) ? $this->aAdditionalRequestParams : array();
141
+ }
142
+
143
+ /**
144
+ * @param array $aParams
145
+ * @return $this
146
+ */
147
+ public function setRequestParams( $aParams = array() ) {
148
+ $this->aAdditionalRequestParams = is_array( $aParams ) ? $aParams : array();
149
+ return $this;
150
+ }
151
  }
src/common/icwp-optionsvo.php CHANGED
@@ -242,12 +242,13 @@ class ICWP_WPSF_OptionsVO extends ICWP_WPSF_Foundation {
242
  }
243
 
244
  /**
 
245
  * @return array[]
246
  */
247
- public function getSections() {
248
  $aSections = array();
249
  foreach ( $this->getRawData_OptionsSections() as $aRawSection ) {
250
- if ( !isset( $aRawSection[ 'hidden' ] ) || !$aRawSection[ 'hidden' ] ) {
251
  $aSections[ $aRawSection[ 'slug' ] ] = $aRawSection;
252
  }
253
  }
@@ -262,9 +263,7 @@ class ICWP_WPSF_OptionsVO extends ICWP_WPSF_Foundation {
262
  $aSection = $this->getSection( $sSlug );
263
  $aReqs = ( is_array( $aSection ) && isset( $aSection[ 'reqs' ] ) ) ? $aSection[ 'reqs' ] : array();
264
  return array_merge(
265
- array(
266
- 'php_min' => '5.2.4'
267
- ),
268
  $aReqs
269
  );
270
  }
242
  }
243
 
244
  /**
245
+ * @param bool $bIncludeHidden
246
  * @return array[]
247
  */
248
+ public function getSections( $bIncludeHidden = false ) {
249
  $aSections = array();
250
  foreach ( $this->getRawData_OptionsSections() as $aRawSection ) {
251
+ if ( $bIncludeHidden || !isset( $aRawSection[ 'hidden' ] ) || !$aRawSection[ 'hidden' ] ) {
252
  $aSections[ $aRawSection[ 'slug' ] ] = $aRawSection;
253
  }
254
  }
263
  $aSection = $this->getSection( $sSlug );
264
  $aReqs = ( is_array( $aSection ) && isset( $aSection[ 'reqs' ] ) ) ? $aSection[ 'reqs' ] : array();
265
  return array_merge(
266
+ array( 'php_min' => '5.2.4' ),
 
 
267
  $aReqs
268
  );
269
  }
src/common/icwp-usermeta.php CHANGED
@@ -9,6 +9,9 @@ if ( class_exists( 'ICWP_UserMeta', false ) ) {
9
  * @property string $ga_secret
10
  * @property bool $ga_validated
11
  * @property array $hash_loginmfa
 
 
 
12
  * @property string $yubi_secret
13
  * @property bool $yubi_validated
14
  * @property string $code_tfaemail
9
  * @property string $ga_secret
10
  * @property bool $ga_validated
11
  * @property array $hash_loginmfa
12
+ * @property string $pass_hash
13
+ * @property int $pass_started_at
14
+ * @property int $pass_check_failed_at
15
  * @property string $yubi_secret
16
  * @property bool $yubi_validated
17
  * @property string $code_tfaemail
src/common/icwp-wpfunctions.php CHANGED
@@ -9,6 +9,7 @@ class ICWP_WPSF_WpFunctions extends ICWP_WPSF_Foundation {
9
  * @var WP_Automatic_Updater
10
  */
11
  protected $oWpAutomaticUpdater;
 
12
  /**
13
  * @var ICWP_WPSF_WpFunctions
14
  */
@@ -475,7 +476,7 @@ class ICWP_WPSF_WpFunctions extends ICWP_WPSF_Foundation {
475
  }
476
 
477
  /**
478
- * @param bool $bWpmsOnly
479
  * @return string
480
  */
481
  public function getAdminUrl_Plugins( $bWpmsOnly = false ) {
@@ -492,7 +493,7 @@ class ICWP_WPSF_WpFunctions extends ICWP_WPSF_Foundation {
492
 
493
  //special case for plugin admin pages.
494
  if ( $sPage == 'admin.php' ) {
495
- $sSubPage = $this->loadDataProcessor()->FetchGet( 'page' );
496
  if ( !empty( $sSubPage ) ) {
497
  $aQueryArgs = array(
498
  'page' => $sSubPage,
@@ -532,7 +533,7 @@ class ICWP_WPSF_WpFunctions extends ICWP_WPSF_Foundation {
532
  * @return bool
533
  */
534
  public function isRequestLoginUrl() {
535
- return $this->isLoginUrl( $this->loadDataProcessor()->getRequestPath() );
536
  }
537
 
538
  /**
@@ -540,29 +541,25 @@ class ICWP_WPSF_WpFunctions extends ICWP_WPSF_Foundation {
540
  */
541
  public function isRequestUserLogin() {
542
  $oDp = $this->loadDP();
543
- return $this->isRequestLoginUrl() && $oDp->GetIsRequestPost()
544
- && !is_null( $oDp->FetchPost( 'log' ) ) && !is_null( $oDp->FetchPost( 'pwd' ) );
545
  }
546
 
547
  /**
548
  * @return bool
549
  */
550
  public function isRequestUserRegister() {
551
- $oDp = $this->loadDataProcessor();
552
- return
553
- $oDp->GetIsRequestPost()
554
- && !is_null( $oDp->FetchPost( 'user_login' ) )
555
- && !is_null( $oDp->FetchPost( 'user_email' ) )
556
- && $this->isRequestLoginUrl();
557
  }
558
 
559
  /**
560
  * @return bool
561
  */
562
  public function isRequestUserResetPasswordStart() {
563
- $oDp = $this->loadDataProcessor();
564
- return $this->isRequestLoginUrl() &&
565
- $oDp->GetIsRequestPost() && !is_null( $oDp->FetchPost( 'user_login' ) );
566
  }
567
 
568
  /**
9
  * @var WP_Automatic_Updater
10
  */
11
  protected $oWpAutomaticUpdater;
12
+
13
  /**
14
  * @var ICWP_WPSF_WpFunctions
15
  */
476
  }
477
 
478
  /**
479
+ * @param bool $bWpmsOnly
480
  * @return string
481
  */
482
  public function getAdminUrl_Plugins( $bWpmsOnly = false ) {
493
 
494
  //special case for plugin admin pages.
495
  if ( $sPage == 'admin.php' ) {
496
+ $sSubPage = $this->loadDP()->query( 'page' );
497
  if ( !empty( $sSubPage ) ) {
498
  $aQueryArgs = array(
499
  'page' => $sSubPage,
533
  * @return bool
534
  */
535
  public function isRequestLoginUrl() {
536
+ return $this->isLoginUrl( $this->loadDP()->getRequestPath() );
537
  }
538
 
539
  /**
541
  */
542
  public function isRequestUserLogin() {
543
  $oDp = $this->loadDP();
544
+ return $this->isRequestLoginUrl() && $oDp->isMethodPost()
545
+ && !is_null( $oDp->post( 'log' ) ) && !is_null( $oDp->post( 'pwd' ) );
546
  }
547
 
548
  /**
549
  * @return bool
550
  */
551
  public function isRequestUserRegister() {
552
+ $oDp = $this->loadDP();
553
+ return $oDp->isMethodPost() && !is_null( $oDp->post( 'user_login' ) )
554
+ && !is_null( $oDp->post( 'user_email' ) ) && $this->isRequestLoginUrl();
 
 
 
555
  }
556
 
557
  /**
558
  * @return bool
559
  */
560
  public function isRequestUserResetPasswordStart() {
561
+ $oDp = $this->loadDP();
562
+ return $this->isRequestLoginUrl() && $oDp->isMethodPost() && !is_null( $oDp->post( 'user_login' ) );
 
563
  }
564
 
565
  /**
src/common/lib/composer.json CHANGED
@@ -2,27 +2,32 @@
2
  "name": "shield requirement",
3
  "description": "shield requirement",
4
  "authors": [
5
- {
6
- "name": "Paul Goodchild",
7
- "email": "paul@paulgoodchild.me",
8
- "homepage": "https://paulgoodchild.me"
9
- }
10
  ],
11
  "license": "MIT",
12
  "keywords": [
13
  ],
14
  "repositories": [
15
  ],
 
 
 
 
 
16
  "require": {
17
- "php": ">=5.3.3",
18
- "fernleafsystems/utilities": "^1.0",
19
- "nesbot/carbon": "^1.22.0",
20
- "twig/twig": "^1.0"
21
  },
22
  "require-dev": {
23
  },
24
  "autoload": {
25
- "psr-4": {
26
- }
27
  }
28
  }
2
  "name": "shield requirement",
3
  "description": "shield requirement",
4
  "authors": [
5
+ {
6
+ "name": "Paul Goodchild",
7
+ "email": "paul@paulgoodchild.me",
8
+ "homepage": "https://paulgoodchild.me"
9
+ }
10
  ],
11
  "license": "MIT",
12
  "keywords": [
13
  ],
14
  "repositories": [
15
  ],
16
+ "config": {
17
+ "platform": {
18
+ "php": "5.4"
19
+ }
20
+ },
21
  "require": {
22
+ "fernleafsystems/utilities": "^1.0",
23
+ "nesbot/carbon": "^1.22.0",
24
+ "twig/twig": "^1.0",
25
+ "bjeavons/zxcvbn-php": "^0.3"
26
  },
27
  "require-dev": {
28
  },
29
  "autoload": {
30
+ "psr-4": {
31
+ }
32
  }
33
  }
src/common/lib/composer.lock CHANGED
@@ -4,8 +4,53 @@
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
  "This file is @generated automatically"
6
  ],
7
- "content-hash": "2689fdaca716a455a807827f8266ed2e",
8
  "packages": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  {
10
  "name": "fernleafsystems/utilities",
11
  "version": "1.1.0",
@@ -42,25 +87,25 @@
42
  },
43
  {
44
  "name": "nesbot/carbon",
45
- "version": "1.22.1",
46
  "source": {
47
  "type": "git",
48
  "url": "https://github.com/briannesbitt/Carbon.git",
49
- "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
50
  },
51
  "dist": {
52
  "type": "zip",
53
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
54
- "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
55
  "shasum": ""
56
  },
57
  "require": {
58
- "php": ">=5.3.0",
59
- "symfony/translation": "~2.6 || ~3.0"
60
  },
61
  "require-dev": {
62
  "friendsofphp/php-cs-fixer": "~2",
63
- "phpunit/phpunit": "~4.0 || ~5.0"
64
  },
65
  "type": "library",
66
  "extra": {
@@ -91,7 +136,7 @@
91
  "datetime",
92
  "time"
93
  ],
94
- "time": "2017-01-16T07:55:07+00:00"
95
  },
96
  {
97
  "name": "symfony/polyfill-mbstring",
@@ -154,34 +199,30 @@
154
  },
155
  {
156
  "name": "symfony/translation",
157
- "version": "v3.4.4",
158
  "source": {
159
  "type": "git",
160
  "url": "https://github.com/symfony/translation.git",
161
- "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84"
162
  },
163
  "dist": {
164
  "type": "zip",
165
- "url": "https://api.github.com/repos/symfony/translation/zipball/10b32cf0eae28b9b39fe26c456c42b19854c4b84",
166
- "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84",
167
  "shasum": ""
168
  },
169
  "require": {
170
- "php": "^5.5.9|>=7.0.8",
171
  "symfony/polyfill-mbstring": "~1.0"
172
  },
173
  "conflict": {
174
- "symfony/config": "<2.8",
175
- "symfony/dependency-injection": "<3.4",
176
- "symfony/yaml": "<3.4"
177
  },
178
  "require-dev": {
179
  "psr/log": "~1.0",
180
- "symfony/config": "~2.8|~3.0|~4.0",
181
- "symfony/dependency-injection": "~3.4|~4.0",
182
- "symfony/finder": "~2.8|~3.0|~4.0",
183
- "symfony/intl": "^2.8.18|^3.2.5|~4.0",
184
- "symfony/yaml": "~3.4|~4.0"
185
  },
186
  "suggest": {
187
  "psr/log": "To use logging capability in translator",
@@ -191,7 +232,7 @@
191
  "type": "library",
192
  "extra": {
193
  "branch-alias": {
194
- "dev-master": "3.4-dev"
195
  }
196
  },
197
  "autoload": {
@@ -218,20 +259,20 @@
218
  ],
219
  "description": "Symfony Translation Component",
220
  "homepage": "https://symfony.com",
221
- "time": "2018-01-18T22:16:57+00:00"
222
  },
223
  {
224
  "name": "twig/twig",
225
- "version": "v1.35.0",
226
  "source": {
227
  "type": "git",
228
  "url": "https://github.com/twigphp/Twig.git",
229
- "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f"
230
  },
231
  "dist": {
232
  "type": "zip",
233
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/daa657073e55b0a78cce8fdd22682fddecc6385f",
234
- "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f",
235
  "shasum": ""
236
  },
237
  "require": {
@@ -283,7 +324,7 @@
283
  "keywords": [
284
  "templating"
285
  ],
286
- "time": "2017-09-27T18:06:46+00:00"
287
  }
288
  ],
289
  "packages-dev": [],
@@ -292,8 +333,9 @@
292
  "stability-flags": [],
293
  "prefer-stable": false,
294
  "prefer-lowest": false,
295
- "platform": {
296
- "php": ">=5.3.3"
297
- },
298
- "platform-dev": []
 
299
  }
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
  "This file is @generated automatically"
6
  ],
7
+ "content-hash": "eb4c37064b99387951a2c9ac771571af",
8
  "packages": [
9
+ {
10
+ "name": "bjeavons/zxcvbn-php",
11
+ "version": "0.3.0",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/bjeavons/zxcvbn-php.git",
15
+ "reference": "331a88932d1a399c989967d3399a4a40eb182fd5"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/bjeavons/zxcvbn-php/zipball/331a88932d1a399c989967d3399a4a40eb182fd5",
20
+ "reference": "331a88932d1a399c989967d3399a4a40eb182fd5",
21
+ "shasum": ""
22
+ },
23
+ "require": {
24
+ "php": "^5.3 || ^7.0"
25
+ },
26
+ "require-dev": {
27
+ "phpunit/phpunit": "*",
28
+ "satooshi/php-coveralls": "*"
29
+ },
30
+ "type": "library",
31
+ "autoload": {
32
+ "psr-4": {
33
+ "ZxcvbnPhp\\": "src/"
34
+ }
35
+ },
36
+ "notification-url": "https://packagist.org/downloads/",
37
+ "license": [
38
+ "MIT"
39
+ ],
40
+ "authors": [
41
+ {
42
+ "name": "See contributors",
43
+ "homepage": "https://github.com/bjeavons/zxcvbn-php"
44
+ }
45
+ ],
46
+ "description": "Realistic password strength estimation PHP library based on Zxcvbn JS",
47
+ "homepage": "https://github.com/bjeavons/zxcvbn-php",
48
+ "keywords": [
49
+ "password",
50
+ "zxcvbn"
51
+ ],
52
+ "time": "2017-01-06T15:43:33+00:00"
53
+ },
54
  {
55
  "name": "fernleafsystems/utilities",
56
  "version": "1.1.0",
87
  },
88
  {
89
  "name": "nesbot/carbon",
90
+ "version": "1.24.2",
91
  "source": {
92
  "type": "git",
93
  "url": "https://github.com/briannesbitt/Carbon.git",
94
+ "reference": "bba6c6e410c6b4317e37a9474aeaa753808c3875"
95
  },
96
  "dist": {
97
  "type": "zip",
98
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bba6c6e410c6b4317e37a9474aeaa753808c3875",
99
+ "reference": "bba6c6e410c6b4317e37a9474aeaa753808c3875",
100
  "shasum": ""
101
  },
102
  "require": {
103
+ "php": ">=5.3.9",
104
+ "symfony/translation": "~2.6 || ~3.0 || ~4.0"
105
  },
106
  "require-dev": {
107
  "friendsofphp/php-cs-fixer": "~2",
108
+ "phpunit/phpunit": "^4.8.35 || ^5.7"
109
  },
110
  "type": "library",
111
  "extra": {
136
  "datetime",
137
  "time"
138
  ],
139
+ "time": "2018-03-10T10:10:14+00:00"
140
  },
141
  {
142
  "name": "symfony/polyfill-mbstring",
199
  },
200
  {
201
  "name": "symfony/translation",
202
+ "version": "v2.8.36",
203
  "source": {
204
  "type": "git",
205
  "url": "https://github.com/symfony/translation.git",
206
+ "reference": "72235c1121ae282254e897e342c001f3d4bb7e8d"
207
  },
208
  "dist": {
209
  "type": "zip",
210
+ "url": "https://api.github.com/repos/symfony/translation/zipball/72235c1121ae282254e897e342c001f3d4bb7e8d",
211
+ "reference": "72235c1121ae282254e897e342c001f3d4bb7e8d",
212
  "shasum": ""
213
  },
214
  "require": {
215
+ "php": ">=5.3.9",
216
  "symfony/polyfill-mbstring": "~1.0"
217
  },
218
  "conflict": {
219
+ "symfony/config": "<2.7"
 
 
220
  },
221
  "require-dev": {
222
  "psr/log": "~1.0",
223
+ "symfony/config": "~2.8",
224
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
225
+ "symfony/yaml": "~2.2|~3.0.0"
 
 
226
  },
227
  "suggest": {
228
  "psr/log": "To use logging capability in translator",
232
  "type": "library",
233
  "extra": {
234
  "branch-alias": {
235
+ "dev-master": "2.8-dev"
236
  }
237
  },
238
  "autoload": {
259
  ],
260
  "description": "Symfony Translation Component",
261
  "homepage": "https://symfony.com",
262
+ "time": "2018-01-18T13:56:23+00:00"
263
  },
264
  {
265
  "name": "twig/twig",
266
+ "version": "v1.35.2",
267
  "source": {
268
  "type": "git",
269
  "url": "https://github.com/twigphp/Twig.git",
270
+ "reference": "9c24f2cd39dc1906b76879e099970b7e53724601"
271
  },
272
  "dist": {
273
  "type": "zip",
274
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601",
275
+ "reference": "9c24f2cd39dc1906b76879e099970b7e53724601",
276
  "shasum": ""
277
  },
278
  "require": {
324
  "keywords": [
325
  "templating"
326
  ],
327
+ "time": "2018-03-03T16:21:29+00:00"
328
  }
329
  ],
330
  "packages-dev": [],
333
  "stability-flags": [],
334
  "prefer-stable": false,
335
  "prefer-lowest": false,
336
+ "platform": [],
337
+ "platform-dev": [],
338
+ "platform-overrides": {
339
+ "php": "5.4"
340
+ }
341
  }
src/common/lib/vendor/autoload.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  // autoload.php @generated by Composer
 
4
  require_once __DIR__ . '/composer/autoload_real.php';
5
 
6
  return ComposerAutoloaderInit18a31866e67f0a0bfffdc031786ecae1::getLoader();
1
  <?php
2
 
3
  // autoload.php @generated by Composer
4
+
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
  return ComposerAutoloaderInit18a31866e67f0a0bfffdc031786ecae1::getLoader();
src/common/lib/vendor/composer/autoload_classmap.php CHANGED
@@ -6,461 +6,4 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php',
10
- 'Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php',
11
- 'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
12
- 'FernleafSystems\\Utilities\\Data\\Adapter\\StdClassAdapter' => $vendorDir . '/fernleafsystems/utilities/src/Data/Adapter/StdClassAdapter.php',
13
- 'FernleafSystems\\Utilities\\Response' => $vendorDir . '/fernleafsystems/utilities/src/Response.php',
14
- 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
15
- 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
16
- 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php',
17
- 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php',
18
- 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => $vendorDir . '/symfony/translation/Command/XliffLintCommand.php',
19
- 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php',
20
- 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php',
21
- 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationDumperPass.php',
22
- 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php',
23
- 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPass.php',
24
- 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php',
25
- 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php',
26
- 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php',
27
- 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php',
28
- 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php',
29
- 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php',
30
- 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php',
31
- 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php',
32
- 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php',
33
- 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php',
34
- 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php',
35
- 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php',
36
- 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php',
37
- 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/translation/Exception/InvalidArgumentException.php',
38
- 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php',
39
- 'Symfony\\Component\\Translation\\Exception\\LogicException' => $vendorDir . '/symfony/translation/Exception/LogicException.php',
40
- 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php',
41
- 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => $vendorDir . '/symfony/translation/Exception/RuntimeException.php',
42
- 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php',
43
- 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php',
44
- 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php',
45
- 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpExtractor.php',
46
- 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => $vendorDir . '/symfony/translation/Extractor/PhpStringTokenParser.php',
47
- 'Symfony\\Component\\Translation\\Formatter\\ChoiceMessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php',
48
- 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php',
49
- 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php',
50
- 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php',
51
- 'Symfony\\Component\\Translation\\Interval' => $vendorDir . '/symfony/translation/Interval.php',
52
- 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php',
53
- 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php',
54
- 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php',
55
- 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php',
56
- 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php',
57
- 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php',
58
- 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php',
59
- 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php',
60
- 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php',
61
- 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php',
62
- 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php',
63
- 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php',
64
- 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php',
65
- 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php',
66
- 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php',
67
- 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php',
68
- 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php',
69
- 'Symfony\\Component\\Translation\\MessageSelector' => $vendorDir . '/symfony/translation/MessageSelector.php',
70
- 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php',
71
- 'Symfony\\Component\\Translation\\PluralizationRules' => $vendorDir . '/symfony/translation/PluralizationRules.php',
72
- 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => $vendorDir . '/symfony/translation/Reader/TranslationReader.php',
73
- 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => $vendorDir . '/symfony/translation/Reader/TranslationReaderInterface.php',
74
- 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php',
75
- 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php',
76
- 'Symfony\\Component\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation/TranslatorInterface.php',
77
- 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php',
78
- 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php',
79
- 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php',
80
- 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
81
- 'Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php',
82
- 'Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php',
83
- 'Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php',
84
- 'Twig\\Compiler' => $vendorDir . '/twig/twig/src/Compiler.php',
85
- 'Twig\\Environment' => $vendorDir . '/twig/twig/src/Environment.php',
86
- 'Twig\\Error\\Error' => $vendorDir . '/twig/twig/src/Error/Error.php',
87
- 'Twig\\Error\\LoaderError' => $vendorDir . '/twig/twig/src/Error/LoaderError.php',
88
- 'Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php',
89
- 'Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php',
90
- 'Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php',
91
- 'Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php',
92
- 'Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php',
93
- 'Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php',
94
- 'Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php',
95
- 'Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php',
96
- 'Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php',
97
- 'Twig\\Extension\\InitRuntimeInterface' => $vendorDir . '/twig/twig/src/Extension/InitRuntimeInterface.php',
98
- 'Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php',
99
- 'Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php',
100
- 'Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
101
- 'Twig\\Extension\\SandboxExtension' => $vendorDir . '/twig/twig/src/Extension/SandboxExtension.php',
102
- 'Twig\\Extension\\StagingExtension' => $vendorDir . '/twig/twig/src/Extension/StagingExtension.php',
103
- 'Twig\\Extension\\StringLoaderExtension' => $vendorDir . '/twig/twig/src/Extension/StringLoaderExtension.php',
104
- 'Twig\\FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/src/FileExtensionEscapingStrategy.php',
105
- 'Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php',
106
- 'Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php',
107
- 'Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php',
108
- 'Twig\\Loader\\ExistsLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/ExistsLoaderInterface.php',
109
- 'Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php',
110
- 'Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php',
111
- 'Twig\\Loader\\SourceContextLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/SourceContextLoaderInterface.php',
112
- 'Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php',
113
- 'Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php',
114
- 'Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
115
- 'Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
116
- 'Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
117
- 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
118
- 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
119
- 'Twig\\NodeVisitor\\SandboxNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php',
120
- 'Twig\\Node\\AutoEscapeNode' => $vendorDir . '/twig/twig/src/Node/AutoEscapeNode.php',
121
- 'Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php',
122
- 'Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php',
123
- 'Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php',
124
- 'Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php',
125
- 'Twig\\Node\\DoNode' => $vendorDir . '/twig/twig/src/Node/DoNode.php',
126
- 'Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php',
127
- 'Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php',
128
- 'Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php',
129
- 'Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
130
- 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
131
- 'Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
132
- 'Twig\\Node\\Expression\\Binary\\AndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AndBinary.php',
133
- 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php',
134
- 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php',
135
- 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php',
136
- 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php',
137
- 'Twig\\Node\\Expression\\Binary\\DivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/DivBinary.php',
138
- 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php',
139
- 'Twig\\Node\\Expression\\Binary\\EqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php',
140
- 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php',
141
- 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php',
142
- 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php',
143
- 'Twig\\Node\\Expression\\Binary\\InBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/InBinary.php',
144
- 'Twig\\Node\\Expression\\Binary\\LessBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessBinary.php',
145
- 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php',
146
- 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php',
147
- 'Twig\\Node\\Expression\\Binary\\ModBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ModBinary.php',
148
- 'Twig\\Node\\Expression\\Binary\\MulBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MulBinary.php',
149
- 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php',
150
- 'Twig\\Node\\Expression\\Binary\\NotInBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php',
151
- 'Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
152
- 'Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
153
- 'Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
154
- 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
155
- 'Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
156
- 'Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
157
- 'Twig\\Node\\Expression\\CallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/CallExpression.php',
158
- 'Twig\\Node\\Expression\\ConditionalExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConditionalExpression.php',
159
- 'Twig\\Node\\Expression\\ConstantExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConstantExpression.php',
160
- 'Twig\\Node\\Expression\\FilterExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FilterExpression.php',
161
- 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php',
162
- 'Twig\\Node\\Expression\\FunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionExpression.php',
163
- 'Twig\\Node\\Expression\\GetAttrExpression' => $vendorDir . '/twig/twig/src/Node/Expression/GetAttrExpression.php',
164
- 'Twig\\Node\\Expression\\MethodCallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MethodCallExpression.php',
165
- 'Twig\\Node\\Expression\\NameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NameExpression.php',
166
- 'Twig\\Node\\Expression\\NullCoalesceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php',
167
- 'Twig\\Node\\Expression\\ParentExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ParentExpression.php',
168
- 'Twig\\Node\\Expression\\TempNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TempNameExpression.php',
169
- 'Twig\\Node\\Expression\\TestExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TestExpression.php',
170
- 'Twig\\Node\\Expression\\Test\\ConstantTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/ConstantTest.php',
171
- 'Twig\\Node\\Expression\\Test\\DefinedTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DefinedTest.php',
172
- 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php',
173
- 'Twig\\Node\\Expression\\Test\\EvenTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/EvenTest.php',
174
- 'Twig\\Node\\Expression\\Test\\NullTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/NullTest.php',
175
- 'Twig\\Node\\Expression\\Test\\OddTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/OddTest.php',
176
- 'Twig\\Node\\Expression\\Test\\SameasTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/SameasTest.php',
177
- 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php',
178
- 'Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
179
- 'Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
180
- 'Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
181
- 'Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php',
182
- 'Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php',
183
- 'Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php',
184
- 'Twig\\Node\\IfNode' => $vendorDir . '/twig/twig/src/Node/IfNode.php',
185
- 'Twig\\Node\\ImportNode' => $vendorDir . '/twig/twig/src/Node/ImportNode.php',
186
- 'Twig\\Node\\IncludeNode' => $vendorDir . '/twig/twig/src/Node/IncludeNode.php',
187
- 'Twig\\Node\\MacroNode' => $vendorDir . '/twig/twig/src/Node/MacroNode.php',
188
- 'Twig\\Node\\ModuleNode' => $vendorDir . '/twig/twig/src/Node/ModuleNode.php',
189
- 'Twig\\Node\\Node' => $vendorDir . '/twig/twig/src/Node/Node.php',
190
- 'Twig\\Node\\NodeCaptureInterface' => $vendorDir . '/twig/twig/src/Node/NodeCaptureInterface.php',
191
- 'Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php',
192
- 'Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php',
193
- 'Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php',
194
- 'Twig\\Node\\SandboxedPrintNode' => $vendorDir . '/twig/twig/src/Node/SandboxedPrintNode.php',
195
- 'Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php',
196
- 'Twig\\Node\\SetTempNode' => $vendorDir . '/twig/twig/src/Node/SetTempNode.php',
197
- 'Twig\\Node\\SpacelessNode' => $vendorDir . '/twig/twig/src/Node/SpacelessNode.php',
198
- 'Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php',
199
- 'Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php',
200
- 'Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php',
201
- 'Twig\\Profiler\\Dumper\\BaseDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BaseDumper.php',
202
- 'Twig\\Profiler\\Dumper\\BlackfireDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php',
203
- 'Twig\\Profiler\\Dumper\\HtmlDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php',
204
- 'Twig\\Profiler\\Dumper\\TextDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/TextDumper.php',
205
- 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $vendorDir . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php',
206
- 'Twig\\Profiler\\Node\\EnterProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/EnterProfileNode.php',
207
- 'Twig\\Profiler\\Node\\LeaveProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php',
208
- 'Twig\\Profiler\\Profile' => $vendorDir . '/twig/twig/src/Profiler/Profile.php',
209
- 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php',
210
- 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php',
211
- 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $vendorDir . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php',
212
- 'Twig\\Sandbox\\SecurityError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityError.php',
213
- 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php',
214
- 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php',
215
- 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php',
216
- 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php',
217
- 'Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
218
- 'Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php',
219
- 'Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
220
- 'Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php',
221
- 'Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php',
222
- 'Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php',
223
- 'Twig\\Test\\IntegrationTestCase' => $vendorDir . '/twig/twig/src/Test/IntegrationTestCase.php',
224
- 'Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php',
225
- 'Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php',
226
- 'Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
227
- 'Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
228
- 'Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php',
229
- 'Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php',
230
- 'Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
231
- 'Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
232
- 'Twig\\TokenParser\\FilterTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FilterTokenParser.php',
233
- 'Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php',
234
- 'Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php',
235
- 'Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php',
236
- 'Twig\\TokenParser\\IfTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IfTokenParser.php',
237
- 'Twig\\TokenParser\\ImportTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ImportTokenParser.php',
238
- 'Twig\\TokenParser\\IncludeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IncludeTokenParser.php',
239
- 'Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php',
240
- 'Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
241
- 'Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php',
242
- 'Twig\\TokenParser\\SpacelessTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SpacelessTokenParser.php',
243
- 'Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php',
244
- 'Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php',
245
- 'Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php',
246
- 'Twig\\TokenStream' => $vendorDir . '/twig/twig/src/TokenStream.php',
247
- 'Twig\\TwigFilter' => $vendorDir . '/twig/twig/src/TwigFilter.php',
248
- 'Twig\\TwigFunction' => $vendorDir . '/twig/twig/src/TwigFunction.php',
249
- 'Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php',
250
- 'Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php',
251
- 'Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php',
252
- 'Twig_Autoloader' => $vendorDir . '/twig/twig/lib/Twig/Autoloader.php',
253
- 'Twig_BaseNodeVisitor' => $vendorDir . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
254
- 'Twig_CacheInterface' => $vendorDir . '/twig/twig/lib/Twig/CacheInterface.php',
255
- 'Twig_Cache_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Cache/Filesystem.php',
256
- 'Twig_Cache_Null' => $vendorDir . '/twig/twig/lib/Twig/Cache/Null.php',
257
- 'Twig_Compiler' => $vendorDir . '/twig/twig/lib/Twig/Compiler.php',
258
- 'Twig_CompilerInterface' => $vendorDir . '/twig/twig/lib/Twig/CompilerInterface.php',
259
- 'Twig_ContainerRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php',
260
- 'Twig_Environment' => $vendorDir . '/twig/twig/lib/Twig/Environment.php',
261
- 'Twig_Error' => $vendorDir . '/twig/twig/lib/Twig/Error.php',
262
- 'Twig_Error_Loader' => $vendorDir . '/twig/twig/lib/Twig/Error/Loader.php',
263
- 'Twig_Error_Runtime' => $vendorDir . '/twig/twig/lib/Twig/Error/Runtime.php',
264
- 'Twig_Error_Syntax' => $vendorDir . '/twig/twig/lib/Twig/Error/Syntax.php',
265
- 'Twig_ExistsLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/ExistsLoaderInterface.php',
266
- 'Twig_ExpressionParser' => $vendorDir . '/twig/twig/lib/Twig/ExpressionParser.php',
267
- 'Twig_Extension' => $vendorDir . '/twig/twig/lib/Twig/Extension.php',
268
- 'Twig_ExtensionInterface' => $vendorDir . '/twig/twig/lib/Twig/ExtensionInterface.php',
269
- 'Twig_Extension_Core' => $vendorDir . '/twig/twig/lib/Twig/Extension/Core.php',
270
- 'Twig_Extension_Debug' => $vendorDir . '/twig/twig/lib/Twig/Extension/Debug.php',
271
- 'Twig_Extension_Escaper' => $vendorDir . '/twig/twig/lib/Twig/Extension/Escaper.php',
272
- 'Twig_Extension_GlobalsInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php',
273
- 'Twig_Extension_InitRuntimeInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php',
274
- 'Twig_Extension_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/Extension/Optimizer.php',
275
- 'Twig_Extension_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Extension/Profiler.php',
276
- 'Twig_Extension_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Extension/Sandbox.php',
277
- 'Twig_Extension_Staging' => $vendorDir . '/twig/twig/lib/Twig/Extension/Staging.php',
278
- 'Twig_Extension_StringLoader' => $vendorDir . '/twig/twig/lib/Twig/Extension/StringLoader.php',
279
- 'Twig_FactoryRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php',
280
- 'Twig_FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php',
281
- 'Twig_Filter' => $vendorDir . '/twig/twig/lib/Twig/Filter.php',
282
- 'Twig_FilterCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterCallableInterface.php',
283
- 'Twig_FilterInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterInterface.php',
284
- 'Twig_Filter_Function' => $vendorDir . '/twig/twig/lib/Twig/Filter/Function.php',
285
- 'Twig_Filter_Method' => $vendorDir . '/twig/twig/lib/Twig/Filter/Method.php',
286
- 'Twig_Filter_Node' => $vendorDir . '/twig/twig/lib/Twig/Filter/Node.php',
287
- 'Twig_Function' => $vendorDir . '/twig/twig/lib/Twig/Function.php',
288
- 'Twig_FunctionCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionCallableInterface.php',
289
- 'Twig_FunctionInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionInterface.php',
290
- 'Twig_Function_Function' => $vendorDir . '/twig/twig/lib/Twig/Function/Function.php',
291
- 'Twig_Function_Method' => $vendorDir . '/twig/twig/lib/Twig/Function/Method.php',
292
- 'Twig_Function_Node' => $vendorDir . '/twig/twig/lib/Twig/Function/Node.php',
293
- 'Twig_Lexer' => $vendorDir . '/twig/twig/lib/Twig/Lexer.php',
294
- 'Twig_LexerInterface' => $vendorDir . '/twig/twig/lib/Twig/LexerInterface.php',
295
- 'Twig_LoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/LoaderInterface.php',
296
- 'Twig_Loader_Array' => $vendorDir . '/twig/twig/lib/Twig/Loader/Array.php',
297
- 'Twig_Loader_Chain' => $vendorDir . '/twig/twig/lib/Twig/Loader/Chain.php',
298
- 'Twig_Loader_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Loader/Filesystem.php',
299
- 'Twig_Loader_String' => $vendorDir . '/twig/twig/lib/Twig/Loader/String.php',
300
- 'Twig_Markup' => $vendorDir . '/twig/twig/lib/Twig/Markup.php',
301
- 'Twig_Node' => $vendorDir . '/twig/twig/lib/Twig/Node.php',
302
- 'Twig_NodeCaptureInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeCaptureInterface.php',
303
- 'Twig_NodeInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeInterface.php',
304
- 'Twig_NodeOutputInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeOutputInterface.php',
305
- 'Twig_NodeTraverser' => $vendorDir . '/twig/twig/lib/Twig/NodeTraverser.php',
306
- 'Twig_NodeVisitorInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitorInterface.php',
307
- 'Twig_NodeVisitor_Escaper' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php',
308
- 'Twig_NodeVisitor_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php',
309
- 'Twig_NodeVisitor_SafeAnalysis' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php',
310
- 'Twig_NodeVisitor_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php',
311
- 'Twig_Node_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/Node/AutoEscape.php',
312
- 'Twig_Node_Block' => $vendorDir . '/twig/twig/lib/Twig/Node/Block.php',
313
- 'Twig_Node_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/BlockReference.php',
314
- 'Twig_Node_Body' => $vendorDir . '/twig/twig/lib/Twig/Node/Body.php',
315
- 'Twig_Node_CheckSecurity' => $vendorDir . '/twig/twig/lib/Twig/Node/CheckSecurity.php',
316
- 'Twig_Node_Do' => $vendorDir . '/twig/twig/lib/Twig/Node/Do.php',
317
- 'Twig_Node_Embed' => $vendorDir . '/twig/twig/lib/Twig/Node/Embed.php',
318
- 'Twig_Node_Expression' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression.php',
319
- 'Twig_Node_Expression_Array' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Array.php',
320
- 'Twig_Node_Expression_AssignName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/AssignName.php',
321
- 'Twig_Node_Expression_Binary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary.php',
322
- 'Twig_Node_Expression_Binary_Add' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php',
323
- 'Twig_Node_Expression_Binary_And' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php',
324
- 'Twig_Node_Expression_Binary_BitwiseAnd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php',
325
- 'Twig_Node_Expression_Binary_BitwiseOr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php',
326
- 'Twig_Node_Expression_Binary_BitwiseXor' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php',
327
- 'Twig_Node_Expression_Binary_Concat' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php',
328
- 'Twig_Node_Expression_Binary_Div' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php',
329
- 'Twig_Node_Expression_Binary_EndsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php',
330
- 'Twig_Node_Expression_Binary_Equal' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php',
331
- 'Twig_Node_Expression_Binary_FloorDiv' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php',
332
- 'Twig_Node_Expression_Binary_Greater' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php',
333
- 'Twig_Node_Expression_Binary_GreaterEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php',
334
- 'Twig_Node_Expression_Binary_In' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php',
335
- 'Twig_Node_Expression_Binary_Less' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php',
336
- 'Twig_Node_Expression_Binary_LessEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php',
337
- 'Twig_Node_Expression_Binary_Matches' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php',
338
- 'Twig_Node_Expression_Binary_Mod' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php',
339
- 'Twig_Node_Expression_Binary_Mul' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php',
340
- 'Twig_Node_Expression_Binary_NotEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php',
341
- 'Twig_Node_Expression_Binary_NotIn' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php',
342
- 'Twig_Node_Expression_Binary_Or' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php',
343
- 'Twig_Node_Expression_Binary_Power' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php',
344
- 'Twig_Node_Expression_Binary_Range' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php',
345
- 'Twig_Node_Expression_Binary_StartsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php',
346
- 'Twig_Node_Expression_Binary_Sub' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php',
347
- 'Twig_Node_Expression_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php',
348
- 'Twig_Node_Expression_Call' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Call.php',
349
- 'Twig_Node_Expression_Conditional' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Conditional.php',
350
- 'Twig_Node_Expression_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Constant.php',
351
- 'Twig_Node_Expression_ExtensionReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php',
352
- 'Twig_Node_Expression_Filter' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter.php',
353
- 'Twig_Node_Expression_Filter_Default' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php',
354
- 'Twig_Node_Expression_Function' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Function.php',
355
- 'Twig_Node_Expression_GetAttr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php',
356
- 'Twig_Node_Expression_MethodCall' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php',
357
- 'Twig_Node_Expression_Name' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Name.php',
358
- 'Twig_Node_Expression_NullCoalesce' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php',
359
- 'Twig_Node_Expression_Parent' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Parent.php',
360
- 'Twig_Node_Expression_TempName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/TempName.php',
361
- 'Twig_Node_Expression_Test' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test.php',
362
- 'Twig_Node_Expression_Test_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php',
363
- 'Twig_Node_Expression_Test_Defined' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php',
364
- 'Twig_Node_Expression_Test_Divisibleby' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php',
365
- 'Twig_Node_Expression_Test_Even' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php',
366
- 'Twig_Node_Expression_Test_Null' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php',
367
- 'Twig_Node_Expression_Test_Odd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php',
368
- 'Twig_Node_Expression_Test_Sameas' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php',
369
- 'Twig_Node_Expression_Unary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary.php',
370
- 'Twig_Node_Expression_Unary_Neg' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php',
371
- 'Twig_Node_Expression_Unary_Not' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php',
372
- 'Twig_Node_Expression_Unary_Pos' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php',
373
- 'Twig_Node_Flush' => $vendorDir . '/twig/twig/lib/Twig/Node/Flush.php',
374
- 'Twig_Node_For' => $vendorDir . '/twig/twig/lib/Twig/Node/For.php',
375
- 'Twig_Node_ForLoop' => $vendorDir . '/twig/twig/lib/Twig/Node/ForLoop.php',
376
- 'Twig_Node_If' => $vendorDir . '/twig/twig/lib/Twig/Node/If.php',
377
- 'Twig_Node_Import' => $vendorDir . '/twig/twig/lib/Twig/Node/Import.php',
378
- 'Twig_Node_Include' => $vendorDir . '/twig/twig/lib/Twig/Node/Include.php',
379
- 'Twig_Node_Macro' => $vendorDir . '/twig/twig/lib/Twig/Node/Macro.php',
380
- 'Twig_Node_Module' => $vendorDir . '/twig/twig/lib/Twig/Node/Module.php',
381
- 'Twig_Node_Print' => $vendorDir . '/twig/twig/lib/Twig/Node/Print.php',
382
- 'Twig_Node_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Node/Sandbox.php',
383
- 'Twig_Node_SandboxedPrint' => $vendorDir . '/twig/twig/lib/Twig/Node/SandboxedPrint.php',
384
- 'Twig_Node_Set' => $vendorDir . '/twig/twig/lib/Twig/Node/Set.php',
385
- 'Twig_Node_SetTemp' => $vendorDir . '/twig/twig/lib/Twig/Node/SetTemp.php',
386
- 'Twig_Node_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/Node/Spaceless.php',
387
- 'Twig_Node_Text' => $vendorDir . '/twig/twig/lib/Twig/Node/Text.php',
388
- 'Twig_Node_With' => $vendorDir . '/twig/twig/lib/Twig/Node/With.php',
389
- 'Twig_Parser' => $vendorDir . '/twig/twig/lib/Twig/Parser.php',
390
- 'Twig_ParserInterface' => $vendorDir . '/twig/twig/lib/Twig/ParserInterface.php',
391
- 'Twig_Profiler_Dumper_Base' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php',
392
- 'Twig_Profiler_Dumper_Blackfire' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php',
393
- 'Twig_Profiler_Dumper_Html' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php',
394
- 'Twig_Profiler_Dumper_Text' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php',
395
- 'Twig_Profiler_NodeVisitor_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php',
396
- 'Twig_Profiler_Node_EnterProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php',
397
- 'Twig_Profiler_Node_LeaveProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php',
398
- 'Twig_Profiler_Profile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Profile.php',
399
- 'Twig_RuntimeLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php',
400
- 'Twig_Sandbox_SecurityError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityError.php',
401
- 'Twig_Sandbox_SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php',
402
- 'Twig_Sandbox_SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php',
403
- 'Twig_Sandbox_SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php',
404
- 'Twig_Sandbox_SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php',
405
- 'Twig_Sandbox_SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php',
406
- 'Twig_Sandbox_SecurityPolicy' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php',
407
- 'Twig_Sandbox_SecurityPolicyInterface' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php',
408
- 'Twig_SimpleFilter' => $vendorDir . '/twig/twig/lib/Twig/SimpleFilter.php',
409
- 'Twig_SimpleFunction' => $vendorDir . '/twig/twig/lib/Twig/SimpleFunction.php',
410
- 'Twig_SimpleTest' => $vendorDir . '/twig/twig/lib/Twig/SimpleTest.php',
411
- 'Twig_Source' => $vendorDir . '/twig/twig/lib/Twig/Source.php',
412
- 'Twig_SourceContextLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php',
413
- 'Twig_Template' => $vendorDir . '/twig/twig/lib/Twig/Template.php',
414
- 'Twig_TemplateInterface' => $vendorDir . '/twig/twig/lib/Twig/TemplateInterface.php',
415
- 'Twig_TemplateWrapper' => $vendorDir . '/twig/twig/lib/Twig/TemplateWrapper.php',
416
- 'Twig_Test' => $vendorDir . '/twig/twig/lib/Twig/Test.php',
417
- 'Twig_TestCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/TestCallableInterface.php',
418
- 'Twig_TestInterface' => $vendorDir . '/twig/twig/lib/Twig/TestInterface.php',
419
- 'Twig_Test_Function' => $vendorDir . '/twig/twig/lib/Twig/Test/Function.php',
420
- 'Twig_Test_IntegrationTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php',
421
- 'Twig_Test_Method' => $vendorDir . '/twig/twig/lib/Twig/Test/Method.php',
422
- 'Twig_Test_Node' => $vendorDir . '/twig/twig/lib/Twig/Test/Node.php',
423
- 'Twig_Test_NodeTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/NodeTestCase.php',
424
- 'Twig_Token' => $vendorDir . '/twig/twig/lib/Twig/Token.php',
425
- 'Twig_TokenParser' => $vendorDir . '/twig/twig/lib/Twig/TokenParser.php',
426
- 'Twig_TokenParserBroker' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBroker.php',
427
- 'Twig_TokenParserBrokerInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php',
428
- 'Twig_TokenParserInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserInterface.php',
429
- 'Twig_TokenParser_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php',
430
- 'Twig_TokenParser_Block' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Block.php',
431
- 'Twig_TokenParser_Do' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Do.php',
432
- 'Twig_TokenParser_Embed' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Embed.php',
433
- 'Twig_TokenParser_Extends' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Extends.php',
434
- 'Twig_TokenParser_Filter' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Filter.php',
435
- 'Twig_TokenParser_Flush' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Flush.php',
436
- 'Twig_TokenParser_For' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/For.php',
437
- 'Twig_TokenParser_From' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/From.php',
438
- 'Twig_TokenParser_If' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/If.php',
439
- 'Twig_TokenParser_Import' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Import.php',
440
- 'Twig_TokenParser_Include' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Include.php',
441
- 'Twig_TokenParser_Macro' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Macro.php',
442
- 'Twig_TokenParser_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Sandbox.php',
443
- 'Twig_TokenParser_Set' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Set.php',
444
- 'Twig_TokenParser_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Spaceless.php',
445
- 'Twig_TokenParser_Use' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Use.php',
446
- 'Twig_TokenParser_With' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/With.php',
447
- 'Twig_TokenStream' => $vendorDir . '/twig/twig/lib/Twig/TokenStream.php',
448
- 'Twig_Util_DeprecationCollector' => $vendorDir . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
449
- 'Twig_Util_TemplateDirIterator' => $vendorDir . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
450
- 'ZxcvbnPhp\\Matcher' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matcher.php',
451
- 'ZxcvbnPhp\\Matchers\\Bruteforce' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/Bruteforce.php',
452
- 'ZxcvbnPhp\\Matchers\\DateMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/DateMatch.php',
453
- 'ZxcvbnPhp\\Matchers\\DictionaryMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/DictionaryMatch.php',
454
- 'ZxcvbnPhp\\Matchers\\DigitMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/DigitMatch.php',
455
- 'ZxcvbnPhp\\Matchers\\L33tMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/L33tMatch.php',
456
- 'ZxcvbnPhp\\Matchers\\Match' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/Match.php',
457
- 'ZxcvbnPhp\\Matchers\\MatchInterface' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/MatchInterface.php',
458
- 'ZxcvbnPhp\\Matchers\\RepeatMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/RepeatMatch.php',
459
- 'ZxcvbnPhp\\Matchers\\SequenceMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/SequenceMatch.php',
460
- 'ZxcvbnPhp\\Matchers\\SpatialMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/SpatialMatch.php',
461
- 'ZxcvbnPhp\\Matchers\\YearMatch' => $vendorDir . '/bjeavons/zxcvbn-php/src/Matchers/YearMatch.php',
462
- 'ZxcvbnPhp\\Scorer' => $vendorDir . '/bjeavons/zxcvbn-php/src/Scorer.php',
463
- 'ZxcvbnPhp\\ScorerInterface' => $vendorDir . '/bjeavons/zxcvbn-php/src/ScorerInterface.php',
464
- 'ZxcvbnPhp\\Searcher' => $vendorDir . '/bjeavons/zxcvbn-php/src/Searcher.php',
465
- 'ZxcvbnPhp\\Zxcvbn' => $vendorDir . '/bjeavons/zxcvbn-php/src/Zxcvbn.php',
466
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  );
src/common/lib/vendor/composer/autoload_static.php CHANGED
@@ -71,473 +71,12 @@ class ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1
71
  ),
72
  );
73
 
74
- public static $classMap = array (
75
- 'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php',
76
- 'Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php',
77
- 'Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
78
- 'FernleafSystems\\Utilities\\Data\\Adapter\\StdClassAdapter' => __DIR__ . '/..' . '/fernleafsystems/utilities/src/Data/Adapter/StdClassAdapter.php',
79
- 'FernleafSystems\\Utilities\\Response' => __DIR__ . '/..' . '/fernleafsystems/utilities/src/Response.php',
80
- 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php',
81
- 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php',
82
- 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php',
83
- 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php',
84
- 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/XliffLintCommand.php',
85
- 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php',
86
- 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php',
87
- 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationDumperPass.php',
88
- 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php',
89
- 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPass.php',
90
- 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php',
91
- 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php',
92
- 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php',
93
- 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php',
94
- 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php',
95
- 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php',
96
- 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php',
97
- 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php',
98
- 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php',
99
- 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php',
100
- 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php',
101
- 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php',
102
- 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php',
103
- 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidArgumentException.php',
104
- 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php',
105
- 'Symfony\\Component\\Translation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/translation/Exception/LogicException.php',
106
- 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php',
107
- 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/translation/Exception/RuntimeException.php',
108
- 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php',
109
- 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php',
110
- 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php',
111
- 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpExtractor.php',
112
- 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpStringTokenParser.php',
113
- 'Symfony\\Component\\Translation\\Formatter\\ChoiceMessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php',
114
- 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php',
115
- 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php',
116
- 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php',
117
- 'Symfony\\Component\\Translation\\Interval' => __DIR__ . '/..' . '/symfony/translation/Interval.php',
118
- 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php',
119
- 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php',
120
- 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php',
121
- 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php',
122
- 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php',
123
- 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php',
124
- 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php',
125
- 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php',
126
- 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php',
127
- 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php',
128
- 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php',
129
- 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php',
130
- 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php',
131
- 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php',
132
- 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php',
133
- 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php',
134
- 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php',
135
- 'Symfony\\Component\\Translation\\MessageSelector' => __DIR__ . '/..' . '/symfony/translation/MessageSelector.php',
136
- 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php',
137
- 'Symfony\\Component\\Translation\\PluralizationRules' => __DIR__ . '/..' . '/symfony/translation/PluralizationRules.php',
138
- 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReader.php',
139
- 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReaderInterface.php',
140
- 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php',
141
- 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php',
142
- 'Symfony\\Component\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorInterface.php',
143
- 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php',
144
- 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php',
145
- 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php',
146
- 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
147
- 'Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php',
148
- 'Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php',
149
- 'Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php',
150
- 'Twig\\Compiler' => __DIR__ . '/..' . '/twig/twig/src/Compiler.php',
151
- 'Twig\\Environment' => __DIR__ . '/..' . '/twig/twig/src/Environment.php',
152
- 'Twig\\Error\\Error' => __DIR__ . '/..' . '/twig/twig/src/Error/Error.php',
153
- 'Twig\\Error\\LoaderError' => __DIR__ . '/..' . '/twig/twig/src/Error/LoaderError.php',
154
- 'Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php',
155
- 'Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php',
156
- 'Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php',
157
- 'Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php',
158
- 'Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php',
159
- 'Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php',
160
- 'Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php',
161
- 'Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php',
162
- 'Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php',
163
- 'Twig\\Extension\\InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/InitRuntimeInterface.php',
164
- 'Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php',
165
- 'Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php',
166
- 'Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
167
- 'Twig\\Extension\\SandboxExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/SandboxExtension.php',
168
- 'Twig\\Extension\\StagingExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StagingExtension.php',
169
- 'Twig\\Extension\\StringLoaderExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StringLoaderExtension.php',
170
- 'Twig\\FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/src/FileExtensionEscapingStrategy.php',
171
- 'Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php',
172
- 'Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php',
173
- 'Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php',
174
- 'Twig\\Loader\\ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/ExistsLoaderInterface.php',
175
- 'Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php',
176
- 'Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php',
177
- 'Twig\\Loader\\SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/SourceContextLoaderInterface.php',
178
- 'Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php',
179
- 'Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php',
180
- 'Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
181
- 'Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
182
- 'Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
183
- 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
184
- 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
185
- 'Twig\\NodeVisitor\\SandboxNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php',
186
- 'Twig\\Node\\AutoEscapeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/AutoEscapeNode.php',
187
- 'Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php',
188
- 'Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php',
189
- 'Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php',
190
- 'Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php',
191
- 'Twig\\Node\\DoNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DoNode.php',
192
- 'Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php',
193
- 'Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php',
194
- 'Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php',
195
- 'Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
196
- 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
197
- 'Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
198
- 'Twig\\Node\\Expression\\Binary\\AndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AndBinary.php',
199
- 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php',
200
- 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php',
201
- 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php',
202
- 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php',
203
- 'Twig\\Node\\Expression\\Binary\\DivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/DivBinary.php',
204
- 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php',
205
- 'Twig\\Node\\Expression\\Binary\\EqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php',
206
- 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php',
207
- 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php',
208
- 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php',
209
- 'Twig\\Node\\Expression\\Binary\\InBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/InBinary.php',
210
- 'Twig\\Node\\Expression\\Binary\\LessBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessBinary.php',
211
- 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php',
212
- 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php',
213
- 'Twig\\Node\\Expression\\Binary\\ModBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ModBinary.php',
214
- 'Twig\\Node\\Expression\\Binary\\MulBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MulBinary.php',
215
- 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php',
216
- 'Twig\\Node\\Expression\\Binary\\NotInBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php',
217
- 'Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
218
- 'Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
219
- 'Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
220
- 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
221
- 'Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
222
- 'Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
223
- 'Twig\\Node\\Expression\\CallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/CallExpression.php',
224
- 'Twig\\Node\\Expression\\ConditionalExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConditionalExpression.php',
225
- 'Twig\\Node\\Expression\\ConstantExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConstantExpression.php',
226
- 'Twig\\Node\\Expression\\FilterExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FilterExpression.php',
227
- 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php',
228
- 'Twig\\Node\\Expression\\FunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionExpression.php',
229
- 'Twig\\Node\\Expression\\GetAttrExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/GetAttrExpression.php',
230
- 'Twig\\Node\\Expression\\MethodCallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MethodCallExpression.php',
231
- 'Twig\\Node\\Expression\\NameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NameExpression.php',
232
- 'Twig\\Node\\Expression\\NullCoalesceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php',
233
- 'Twig\\Node\\Expression\\ParentExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ParentExpression.php',
234
- 'Twig\\Node\\Expression\\TempNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TempNameExpression.php',
235
- 'Twig\\Node\\Expression\\TestExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TestExpression.php',
236
- 'Twig\\Node\\Expression\\Test\\ConstantTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/ConstantTest.php',
237
- 'Twig\\Node\\Expression\\Test\\DefinedTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DefinedTest.php',
238
- 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php',
239
- 'Twig\\Node\\Expression\\Test\\EvenTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/EvenTest.php',
240
- 'Twig\\Node\\Expression\\Test\\NullTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/NullTest.php',
241
- 'Twig\\Node\\Expression\\Test\\OddTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/OddTest.php',
242
- 'Twig\\Node\\Expression\\Test\\SameasTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/SameasTest.php',
243
- 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php',
244
- 'Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
245
- 'Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
246
- 'Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
247
- 'Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php',
248
- 'Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php',
249
- 'Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php',
250
- 'Twig\\Node\\IfNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IfNode.php',
251
- 'Twig\\Node\\ImportNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ImportNode.php',
252
- 'Twig\\Node\\IncludeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IncludeNode.php',
253
- 'Twig\\Node\\MacroNode' => __DIR__ . '/..' . '/twig/twig/src/Node/MacroNode.php',
254
- 'Twig\\Node\\ModuleNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ModuleNode.php',
255
- 'Twig\\Node\\Node' => __DIR__ . '/..' . '/twig/twig/src/Node/Node.php',
256
- 'Twig\\Node\\NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeCaptureInterface.php',
257
- 'Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php',
258
- 'Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php',
259
- 'Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php',
260
- 'Twig\\Node\\SandboxedPrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxedPrintNode.php',
261
- 'Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php',
262
- 'Twig\\Node\\SetTempNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetTempNode.php',
263
- 'Twig\\Node\\SpacelessNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SpacelessNode.php',
264
- 'Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php',
265
- 'Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php',
266
- 'Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php',
267
- 'Twig\\Profiler\\Dumper\\BaseDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BaseDumper.php',
268
- 'Twig\\Profiler\\Dumper\\BlackfireDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php',
269
- 'Twig\\Profiler\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php',
270
- 'Twig\\Profiler\\Dumper\\TextDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/TextDumper.php',
271
- 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php',
272
- 'Twig\\Profiler\\Node\\EnterProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/EnterProfileNode.php',
273
- 'Twig\\Profiler\\Node\\LeaveProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php',
274
- 'Twig\\Profiler\\Profile' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Profile.php',
275
- 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php',
276
- 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php',
277
- 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php',
278
- 'Twig\\Sandbox\\SecurityError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityError.php',
279
- 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php',
280
- 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php',
281
- 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php',
282
- 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php',
283
- 'Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
284
- 'Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php',
285
- 'Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
286
- 'Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php',
287
- 'Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php',
288
- 'Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php',
289
- 'Twig\\Test\\IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/IntegrationTestCase.php',
290
- 'Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php',
291
- 'Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php',
292
- 'Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
293
- 'Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
294
- 'Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php',
295
- 'Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php',
296
- 'Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
297
- 'Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
298
- 'Twig\\TokenParser\\FilterTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FilterTokenParser.php',
299
- 'Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php',
300
- 'Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php',
301
- 'Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php',
302
- 'Twig\\TokenParser\\IfTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IfTokenParser.php',
303
- 'Twig\\TokenParser\\ImportTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ImportTokenParser.php',
304
- 'Twig\\TokenParser\\IncludeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IncludeTokenParser.php',
305
- 'Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php',
306
- 'Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
307
- 'Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php',
308
- 'Twig\\TokenParser\\SpacelessTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SpacelessTokenParser.php',
309
- 'Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php',
310
- 'Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php',
311
- 'Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php',
312
- 'Twig\\TokenStream' => __DIR__ . '/..' . '/twig/twig/src/TokenStream.php',
313
- 'Twig\\TwigFilter' => __DIR__ . '/..' . '/twig/twig/src/TwigFilter.php',
314
- 'Twig\\TwigFunction' => __DIR__ . '/..' . '/twig/twig/src/TwigFunction.php',
315
- 'Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php',
316
- 'Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php',
317
- 'Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php',
318
- 'Twig_Autoloader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Autoloader.php',
319
- 'Twig_BaseNodeVisitor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
320
- 'Twig_CacheInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CacheInterface.php',
321
- 'Twig_Cache_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Filesystem.php',
322
- 'Twig_Cache_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Null.php',
323
- 'Twig_Compiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Compiler.php',
324
- 'Twig_CompilerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CompilerInterface.php',
325
- 'Twig_ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php',
326
- 'Twig_Environment' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Environment.php',
327
- 'Twig_Error' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error.php',
328
- 'Twig_Error_Loader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Loader.php',
329
- 'Twig_Error_Runtime' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Runtime.php',
330
- 'Twig_Error_Syntax' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Syntax.php',
331
- 'Twig_ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExistsLoaderInterface.php',
332
- 'Twig_ExpressionParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExpressionParser.php',
333
- 'Twig_Extension' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension.php',
334
- 'Twig_ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExtensionInterface.php',
335
- 'Twig_Extension_Core' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Core.php',
336
- 'Twig_Extension_Debug' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Debug.php',
337
- 'Twig_Extension_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Escaper.php',
338
- 'Twig_Extension_GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php',
339
- 'Twig_Extension_InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php',
340
- 'Twig_Extension_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Optimizer.php',
341
- 'Twig_Extension_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Profiler.php',
342
- 'Twig_Extension_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Sandbox.php',
343
- 'Twig_Extension_Staging' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Staging.php',
344
- 'Twig_Extension_StringLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/StringLoader.php',
345
- 'Twig_FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php',
346
- 'Twig_FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php',
347
- 'Twig_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter.php',
348
- 'Twig_FilterCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FilterCallableInterface.php',
349
- 'Twig_FilterInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FilterInterface.php',
350
- 'Twig_Filter_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Function.php',
351
- 'Twig_Filter_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Method.php',
352
- 'Twig_Filter_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Node.php',
353
- 'Twig_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function.php',
354
- 'Twig_FunctionCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FunctionCallableInterface.php',
355
- 'Twig_FunctionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FunctionInterface.php',
356
- 'Twig_Function_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Function.php',
357
- 'Twig_Function_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Method.php',
358
- 'Twig_Function_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Node.php',
359
- 'Twig_Lexer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Lexer.php',
360
- 'Twig_LexerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LexerInterface.php',
361
- 'Twig_LoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LoaderInterface.php',
362
- 'Twig_Loader_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Array.php',
363
- 'Twig_Loader_Chain' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Chain.php',
364
- 'Twig_Loader_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Filesystem.php',
365
- 'Twig_Loader_String' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/String.php',
366
- 'Twig_Markup' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Markup.php',
367
- 'Twig_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node.php',
368
- 'Twig_NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeCaptureInterface.php',
369
- 'Twig_NodeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeInterface.php',
370
- 'Twig_NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeOutputInterface.php',
371
- 'Twig_NodeTraverser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeTraverser.php',
372
- 'Twig_NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitorInterface.php',
373
- 'Twig_NodeVisitor_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php',
374
- 'Twig_NodeVisitor_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php',
375
- 'Twig_NodeVisitor_SafeAnalysis' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php',
376
- 'Twig_NodeVisitor_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php',
377
- 'Twig_Node_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/AutoEscape.php',
378
- 'Twig_Node_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Block.php',
379
- 'Twig_Node_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/BlockReference.php',
380
- 'Twig_Node_Body' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Body.php',
381
- 'Twig_Node_CheckSecurity' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/CheckSecurity.php',
382
- 'Twig_Node_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Do.php',
383
- 'Twig_Node_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Embed.php',
384
- 'Twig_Node_Expression' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression.php',
385
- 'Twig_Node_Expression_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Array.php',
386
- 'Twig_Node_Expression_AssignName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/AssignName.php',
387
- 'Twig_Node_Expression_Binary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary.php',
388
- 'Twig_Node_Expression_Binary_Add' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php',
389
- 'Twig_Node_Expression_Binary_And' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php',
390
- 'Twig_Node_Expression_Binary_BitwiseAnd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php',
391
- 'Twig_Node_Expression_Binary_BitwiseOr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php',
392
- 'Twig_Node_Expression_Binary_BitwiseXor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php',
393
- 'Twig_Node_Expression_Binary_Concat' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php',
394
- 'Twig_Node_Expression_Binary_Div' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php',
395
- 'Twig_Node_Expression_Binary_EndsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php',
396
- 'Twig_Node_Expression_Binary_Equal' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php',
397
- 'Twig_Node_Expression_Binary_FloorDiv' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php',
398
- 'Twig_Node_Expression_Binary_Greater' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php',
399
- 'Twig_Node_Expression_Binary_GreaterEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php',
400
- 'Twig_Node_Expression_Binary_In' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php',
401
- 'Twig_Node_Expression_Binary_Less' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php',
402
- 'Twig_Node_Expression_Binary_LessEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php',
403
- 'Twig_Node_Expression_Binary_Matches' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php',
404
- 'Twig_Node_Expression_Binary_Mod' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php',
405
- 'Twig_Node_Expression_Binary_Mul' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php',
406
- 'Twig_Node_Expression_Binary_NotEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php',
407
- 'Twig_Node_Expression_Binary_NotIn' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php',
408
- 'Twig_Node_Expression_Binary_Or' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php',
409
- 'Twig_Node_Expression_Binary_Power' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php',
410
- 'Twig_Node_Expression_Binary_Range' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php',
411
- 'Twig_Node_Expression_Binary_StartsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php',
412
- 'Twig_Node_Expression_Binary_Sub' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php',
413
- 'Twig_Node_Expression_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php',
414
- 'Twig_Node_Expression_Call' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Call.php',
415
- 'Twig_Node_Expression_Conditional' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Conditional.php',
416
- 'Twig_Node_Expression_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Constant.php',
417
- 'Twig_Node_Expression_ExtensionReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php',
418
- 'Twig_Node_Expression_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter.php',
419
- 'Twig_Node_Expression_Filter_Default' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php',
420
- 'Twig_Node_Expression_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Function.php',
421
- 'Twig_Node_Expression_GetAttr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php',
422
- 'Twig_Node_Expression_MethodCall' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php',
423
- 'Twig_Node_Expression_Name' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Name.php',
424
- 'Twig_Node_Expression_NullCoalesce' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php',
425
- 'Twig_Node_Expression_Parent' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Parent.php',
426
- 'Twig_Node_Expression_TempName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/TempName.php',
427
- 'Twig_Node_Expression_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test.php',
428
- 'Twig_Node_Expression_Test_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php',
429
- 'Twig_Node_Expression_Test_Defined' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php',
430
- 'Twig_Node_Expression_Test_Divisibleby' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php',
431
- 'Twig_Node_Expression_Test_Even' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php',
432
- 'Twig_Node_Expression_Test_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php',
433
- 'Twig_Node_Expression_Test_Odd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php',
434
- 'Twig_Node_Expression_Test_Sameas' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php',
435
- 'Twig_Node_Expression_Unary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary.php',
436
- 'Twig_Node_Expression_Unary_Neg' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php',
437
- 'Twig_Node_Expression_Unary_Not' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php',
438
- 'Twig_Node_Expression_Unary_Pos' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php',
439
- 'Twig_Node_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Flush.php',
440
- 'Twig_Node_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/For.php',
441
- 'Twig_Node_ForLoop' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/ForLoop.php',
442
- 'Twig_Node_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/If.php',
443
- 'Twig_Node_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Import.php',
444
- 'Twig_Node_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Include.php',
445
- 'Twig_Node_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Macro.php',
446
- 'Twig_Node_Module' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Module.php',
447
- 'Twig_Node_Print' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Print.php',
448
- 'Twig_Node_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Sandbox.php',
449
- 'Twig_Node_SandboxedPrint' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SandboxedPrint.php',
450
- 'Twig_Node_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Set.php',
451
- 'Twig_Node_SetTemp' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SetTemp.php',
452
- 'Twig_Node_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Spaceless.php',
453
- 'Twig_Node_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Text.php',
454
- 'Twig_Node_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/With.php',
455
- 'Twig_Parser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Parser.php',
456
- 'Twig_ParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ParserInterface.php',
457
- 'Twig_Profiler_Dumper_Base' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php',
458
- 'Twig_Profiler_Dumper_Blackfire' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php',
459
- 'Twig_Profiler_Dumper_Html' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php',
460
- 'Twig_Profiler_Dumper_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php',
461
- 'Twig_Profiler_NodeVisitor_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php',
462
- 'Twig_Profiler_Node_EnterProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php',
463
- 'Twig_Profiler_Node_LeaveProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php',
464
- 'Twig_Profiler_Profile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Profile.php',
465
- 'Twig_RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php',
466
- 'Twig_Sandbox_SecurityError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityError.php',
467
- 'Twig_Sandbox_SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php',
468
- 'Twig_Sandbox_SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php',
469
- 'Twig_Sandbox_SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php',
470
- 'Twig_Sandbox_SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php',
471
- 'Twig_Sandbox_SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php',
472
- 'Twig_Sandbox_SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php',
473
- 'Twig_Sandbox_SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php',
474
- 'Twig_SimpleFilter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFilter.php',
475
- 'Twig_SimpleFunction' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFunction.php',
476
- 'Twig_SimpleTest' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleTest.php',
477
- 'Twig_Source' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Source.php',
478
- 'Twig_SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php',
479
- 'Twig_Template' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Template.php',
480
- 'Twig_TemplateInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateInterface.php',
481
- 'Twig_TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateWrapper.php',
482
- 'Twig_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test.php',
483
- 'Twig_TestCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TestCallableInterface.php',
484
- 'Twig_TestInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TestInterface.php',
485
- 'Twig_Test_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/Function.php',
486
- 'Twig_Test_IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php',
487
- 'Twig_Test_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/Method.php',
488
- 'Twig_Test_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/Node.php',
489
- 'Twig_Test_NodeTestCase' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/NodeTestCase.php',
490
- 'Twig_Token' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Token.php',
491
- 'Twig_TokenParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser.php',
492
- 'Twig_TokenParserBroker' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserBroker.php',
493
- 'Twig_TokenParserBrokerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php',
494
- 'Twig_TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserInterface.php',
495
- 'Twig_TokenParser_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php',
496
- 'Twig_TokenParser_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Block.php',
497
- 'Twig_TokenParser_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Do.php',
498
- 'Twig_TokenParser_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Embed.php',
499
- 'Twig_TokenParser_Extends' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Extends.php',
500
- 'Twig_TokenParser_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Filter.php',
501
- 'Twig_TokenParser_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Flush.php',
502
- 'Twig_TokenParser_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/For.php',
503
- 'Twig_TokenParser_From' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/From.php',
504
- 'Twig_TokenParser_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/If.php',
505
- 'Twig_TokenParser_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Import.php',
506
- 'Twig_TokenParser_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Include.php',
507
- 'Twig_TokenParser_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Macro.php',
508
- 'Twig_TokenParser_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Sandbox.php',
509
- 'Twig_TokenParser_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Set.php',
510
- 'Twig_TokenParser_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Spaceless.php',
511
- 'Twig_TokenParser_Use' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Use.php',
512
- 'Twig_TokenParser_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/With.php',
513
- 'Twig_TokenStream' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenStream.php',
514
- 'Twig_Util_DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
515
- 'Twig_Util_TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
516
- 'ZxcvbnPhp\\Matcher' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matcher.php',
517
- 'ZxcvbnPhp\\Matchers\\Bruteforce' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/Bruteforce.php',
518
- 'ZxcvbnPhp\\Matchers\\DateMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/DateMatch.php',
519
- 'ZxcvbnPhp\\Matchers\\DictionaryMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/DictionaryMatch.php',
520
- 'ZxcvbnPhp\\Matchers\\DigitMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/DigitMatch.php',
521
- 'ZxcvbnPhp\\Matchers\\L33tMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/L33tMatch.php',
522
- 'ZxcvbnPhp\\Matchers\\Match' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/Match.php',
523
- 'ZxcvbnPhp\\Matchers\\MatchInterface' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/MatchInterface.php',
524
- 'ZxcvbnPhp\\Matchers\\RepeatMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/RepeatMatch.php',
525
- 'ZxcvbnPhp\\Matchers\\SequenceMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/SequenceMatch.php',
526
- 'ZxcvbnPhp\\Matchers\\SpatialMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/SpatialMatch.php',
527
- 'ZxcvbnPhp\\Matchers\\YearMatch' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Matchers/YearMatch.php',
528
- 'ZxcvbnPhp\\Scorer' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Scorer.php',
529
- 'ZxcvbnPhp\\ScorerInterface' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/ScorerInterface.php',
530
- 'ZxcvbnPhp\\Searcher' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Searcher.php',
531
- 'ZxcvbnPhp\\Zxcvbn' => __DIR__ . '/..' . '/bjeavons/zxcvbn-php/src/Zxcvbn.php',
532
- );
533
-
534
  public static function getInitializer(ClassLoader $loader)
535
  {
536
  return \Closure::bind(function () use ($loader) {
537
  $loader->prefixLengthsPsr4 = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$prefixLengthsPsr4;
538
  $loader->prefixDirsPsr4 = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$prefixDirsPsr4;
539
  $loader->prefixesPsr0 = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$prefixesPsr0;
540
- $loader->classMap = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$classMap;
541
 
542
  }, null, ClassLoader::class);
543
  }
71
  ),
72
  );
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  public static function getInitializer(ClassLoader $loader)
75
  {
76
  return \Closure::bind(function () use ($loader) {
77
  $loader->prefixLengthsPsr4 = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$prefixLengthsPsr4;
78
  $loader->prefixDirsPsr4 = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$prefixDirsPsr4;
79
  $loader->prefixesPsr0 = ComposerStaticInit18a31866e67f0a0bfffdc031786ecae1::$prefixesPsr0;
 
80
 
81
  }, null, ClassLoader::class);
82
  }
src/common/lib/vendor/composer/installed.json CHANGED
@@ -143,100 +143,30 @@
143
  "shim"
144
  ]
145
  },
146
- {
147
- "name": "symfony/translation",
148
- "version": "v3.4.4",
149
- "version_normalized": "3.4.4.0",
150
- "source": {
151
- "type": "git",
152
- "url": "https://github.com/symfony/translation.git",
153
- "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84"
154
- },
155
- "dist": {
156
- "type": "zip",
157
- "url": "https://api.github.com/repos/symfony/translation/zipball/10b32cf0eae28b9b39fe26c456c42b19854c4b84",
158
- "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84",
159
- "shasum": ""
160
- },
161
- "require": {
162
- "php": "^5.5.9|>=7.0.8",
163
- "symfony/polyfill-mbstring": "~1.0"
164
- },
165
- "conflict": {
166
- "symfony/config": "<2.8",
167
- "symfony/dependency-injection": "<3.4",
168
- "symfony/yaml": "<3.4"
169
- },
170
- "require-dev": {
171
- "psr/log": "~1.0",
172
- "symfony/config": "~2.8|~3.0|~4.0",
173
- "symfony/dependency-injection": "~3.4|~4.0",
174
- "symfony/finder": "~2.8|~3.0|~4.0",
175
- "symfony/intl": "^2.8.18|^3.2.5|~4.0",
176
- "symfony/yaml": "~3.4|~4.0"
177
- },
178
- "suggest": {
179
- "psr/log": "To use logging capability in translator",
180
- "symfony/config": "",
181
- "symfony/yaml": ""
182
- },
183
- "time": "2018-01-18T22:16:57+00:00",
184
- "type": "library",
185
- "extra": {
186
- "branch-alias": {
187
- "dev-master": "3.4-dev"
188
- }
189
- },
190
- "installation-source": "dist",
191
- "autoload": {
192
- "psr-4": {
193
- "Symfony\\Component\\Translation\\": ""
194
- },
195
- "exclude-from-classmap": [
196
- "/Tests/"
197
- ]
198
- },
199
- "notification-url": "https://packagist.org/downloads/",
200
- "license": [
201
- "MIT"
202
- ],
203
- "authors": [
204
- {
205
- "name": "Fabien Potencier",
206
- "email": "fabien@symfony.com"
207
- },
208
- {
209
- "name": "Symfony Community",
210
- "homepage": "https://symfony.com/contributors"
211
- }
212
- ],
213
- "description": "Symfony Translation Component",
214
- "homepage": "https://symfony.com"
215
- },
216
  {
217
  "name": "nesbot/carbon",
218
- "version": "1.22.1",
219
- "version_normalized": "1.22.1.0",
220
  "source": {
221
  "type": "git",
222
  "url": "https://github.com/briannesbitt/Carbon.git",
223
- "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
224
  },
225
  "dist": {
226
  "type": "zip",
227
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
228
- "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
229
  "shasum": ""
230
  },
231
  "require": {
232
- "php": ">=5.3.0",
233
- "symfony/translation": "~2.6 || ~3.0"
234
  },
235
  "require-dev": {
236
  "friendsofphp/php-cs-fixer": "~2",
237
- "phpunit/phpunit": "~4.0 || ~5.0"
238
  },
239
- "time": "2017-01-16T07:55:07+00:00",
240
  "type": "library",
241
  "extra": {
242
  "branch-alias": {
@@ -270,17 +200,17 @@
270
  },
271
  {
272
  "name": "twig/twig",
273
- "version": "v1.35.0",
274
- "version_normalized": "1.35.0.0",
275
  "source": {
276
  "type": "git",
277
  "url": "https://github.com/twigphp/Twig.git",
278
- "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f"
279
  },
280
  "dist": {
281
  "type": "zip",
282
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/daa657073e55b0a78cce8fdd22682fddecc6385f",
283
- "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f",
284
  "shasum": ""
285
  },
286
  "require": {
@@ -291,7 +221,7 @@
291
  "symfony/debug": "~2.7",
292
  "symfony/phpunit-bridge": "~3.3@dev"
293
  },
294
- "time": "2017-09-27T18:06:46+00:00",
295
  "type": "library",
296
  "extra": {
297
  "branch-alias": {
@@ -334,5 +264,71 @@
334
  "keywords": [
335
  "templating"
336
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
337
  }
338
  ]
143
  "shim"
144
  ]
145
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  {
147
  "name": "nesbot/carbon",
148
+ "version": "1.24.2",
149
+ "version_normalized": "1.24.2.0",
150
  "source": {
151
  "type": "git",
152
  "url": "https://github.com/briannesbitt/Carbon.git",
153
+ "reference": "bba6c6e410c6b4317e37a9474aeaa753808c3875"
154
  },
155
  "dist": {
156
  "type": "zip",
157
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bba6c6e410c6b4317e37a9474aeaa753808c3875",
158
+ "reference": "bba6c6e410c6b4317e37a9474aeaa753808c3875",
159
  "shasum": ""
160
  },
161
  "require": {
162
+ "php": ">=5.3.9",
163
+ "symfony/translation": "~2.6 || ~3.0 || ~4.0"
164
  },
165
  "require-dev": {
166
  "friendsofphp/php-cs-fixer": "~2",
167
+ "phpunit/phpunit": "^4.8.35 || ^5.7"
168
  },
169
+ "time": "2018-03-10T10:10:14+00:00",
170
  "type": "library",
171
  "extra": {
172
  "branch-alias": {
200
  },
201
  {
202
  "name": "twig/twig",
203
+ "version": "v1.35.2",
204
+ "version_normalized": "1.35.2.0",
205
  "source": {
206
  "type": "git",
207
  "url": "https://github.com/twigphp/Twig.git",
208
+ "reference": "9c24f2cd39dc1906b76879e099970b7e53724601"
209
  },
210
  "dist": {
211
  "type": "zip",
212
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601",
213
+ "reference": "9c24f2cd39dc1906b76879e099970b7e53724601",
214
  "shasum": ""
215
  },
216
  "require": {
221
  "symfony/debug": "~2.7",
222
  "symfony/phpunit-bridge": "~3.3@dev"
223
  },
224
+ "time": "2018-03-03T16:21:29+00:00",
225
  "type": "library",
226
  "extra": {
227
  "branch-alias": {
264
  "keywords": [
265
  "templating"
266
  ]
267
+ },
268
+ {
269
+ "name": "symfony/translation",
270
+ "version": "v2.8.36",
271
+ "version_normalized": "2.8.36.0",
272
+ "source": {
273
+ "type": "git",
274
+ "url": "https://github.com/symfony/translation.git",
275
+ "reference": "72235c1121ae282254e897e342c001f3d4bb7e8d"
276
+ },
277
+ "dist": {
278
+ "type": "zip",
279
+ "url": "https://api.github.com/repos/symfony/translation/zipball/72235c1121ae282254e897e342c001f3d4bb7e8d",
280
+ "reference": "72235c1121ae282254e897e342c001f3d4bb7e8d",
281
+ "shasum": ""
282
+ },
283
+ "require": {
284
+ "php": ">=5.3.9",
285
+ "symfony/polyfill-mbstring": "~1.0"
286
+ },
287
+ "conflict": {
288
+ "symfony/config": "<2.7"
289
+ },
290
+ "require-dev": {
291
+ "psr/log": "~1.0",
292
+ "symfony/config": "~2.8",
293
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
294
+ "symfony/yaml": "~2.2|~3.0.0"
295
+ },
296
+ "suggest": {
297
+ "psr/log": "To use logging capability in translator",
298
+ "symfony/config": "",
299
+ "symfony/yaml": ""
300
+ },
301
+ "time": "2018-01-18T13:56:23+00:00",
302
+ "type": "library",
303
+ "extra": {
304
+ "branch-alias": {
305
+ "dev-master": "2.8-dev"
306
+ }
307
+ },
308
+ "installation-source": "dist",
309
+ "autoload": {
310
+ "psr-4": {
311
+ "Symfony\\Component\\Translation\\": ""
312
+ },
313
+ "exclude-from-classmap": [
314
+ "/Tests/"
315
+ ]
316
+ },
317
+ "notification-url": "https://packagist.org/downloads/",
318
+ "license": [
319
+ "MIT"
320
+ ],
321
+ "authors": [
322
+ {
323
+ "name": "Fabien Potencier",
324
+ "email": "fabien@symfony.com"
325
+ },
326
+ {
327
+ "name": "Symfony Community",
328
+ "homepage": "https://symfony.com/contributors"
329
+ }
330
+ ],
331
+ "description": "Symfony Translation Component",
332
+ "homepage": "https://symfony.com"
333
  }
334
  ]
src/common/lib/vendor/nesbot/carbon/src/Carbon/Carbon.php CHANGED
@@ -15,6 +15,7 @@ use Carbon\Exceptions\InvalidDateException;
15
  use Closure;
16
  use DatePeriod;
17
  use DateTime;
 
18
  use DateTimeZone;
19
  use InvalidArgumentException;
20
  use Symfony\Component\Translation\Loader\ArrayLoader;
@@ -38,6 +39,7 @@ use Symfony\Component\Translation\TranslatorInterface;
38
  * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday)
39
  * @property-read int $dayOfYear 0 through 365
40
  * @property-read int $weekOfMonth 1 through 5
 
41
  * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
42
  * @property-read int $daysInMonth number of days in the given month
43
  * @property-read int $age does a diffInYears() with default parameters
@@ -78,26 +80,6 @@ class Carbon extends DateTime
78
  self::SATURDAY => 'Saturday',
79
  );
80
 
81
- /**
82
- * Terms used to detect if a time passed is a relative date.
83
- *
84
- * This is here for testing purposes.
85
- *
86
- * @var array
87
- */
88
- protected static $relativeKeywords = array(
89
- '+',
90
- '-',
91
- 'ago',
92
- 'first',
93
- 'last',
94
- 'next',
95
- 'this',
96
- 'today',
97
- 'tomorrow',
98
- 'yesterday',
99
- );
100
-
101
  /**
102
  * Number of X in Y.
103
  */
@@ -111,6 +93,13 @@ class Carbon extends DateTime
111
  const MINUTES_PER_HOUR = 60;
112
  const SECONDS_PER_MINUTE = 60;
113
 
 
 
 
 
 
 
 
114
  /**
115
  * Default format to use for __toString method when type juggling occurs.
116
  *
@@ -118,6 +107,20 @@ class Carbon extends DateTime
118
  */
119
  const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s';
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  /**
122
  * Format to use for __toString method when type juggling occurs.
123
  *
@@ -149,6 +152,61 @@ class Carbon extends DateTime
149
  self::SUNDAY,
150
  );
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  /**
153
  * A test Carbon instance to be returned when now instances are created.
154
  *
@@ -177,13 +235,20 @@ class Carbon extends DateTime
177
  */
178
  protected static $utf8 = false;
179
 
180
- /*
181
  * Indicates if months should be calculated with overflow.
182
  *
183
  * @var bool
184
  */
185
  protected static $monthsOverflow = true;
186
 
 
 
 
 
 
 
 
187
  /**
188
  * Indicates if months should be calculated with overflow.
189
  *
@@ -216,6 +281,38 @@ class Carbon extends DateTime
216
  return static::$monthsOverflow;
217
  }
218
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  /**
220
  * Creates a DateTimeZone from a string, DateTimeZone or integer offset.
221
  *
@@ -272,7 +369,8 @@ class Carbon extends DateTime
272
  {
273
  // If the class has a test now set and we are trying to create a now()
274
  // instance then override as required
275
- if (static::hasTestNow() && (empty($time) || $time === 'now' || static::hasRelativeKeywords($time))) {
 
276
  $testInstance = clone static::getTestNow();
277
  if (static::hasRelativeKeywords($time)) {
278
  $testInstance->modify($time);
@@ -285,26 +383,53 @@ class Carbon extends DateTime
285
  $tz = $testInstance->getTimezone();
286
  }
287
 
288
- $time = $testInstance->toDateTimeString();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  }
 
290
 
291
- parent::__construct($time, static::safeCreateDateTimeZone($tz));
 
 
 
 
 
 
 
 
 
292
  }
293
 
294
  /**
295
  * Create a Carbon instance from a DateTime one.
296
  *
297
- * @param \DateTime $dt
298
  *
299
  * @return static
300
  */
301
- public static function instance(DateTime $dt)
302
  {
303
- if ($dt instanceof static) {
304
- return clone $dt;
305
  }
306
 
307
- return new static($dt->format('Y-m-d H:i:s.u'), $dt->getTimezone());
308
  }
309
 
310
  /**
@@ -379,9 +504,9 @@ class Carbon extends DateTime
379
  */
380
  public static function maxValue()
381
  {
382
- if (PHP_INT_SIZE === 4) {
383
- // 32 bit (and additionally Windows 64 bit)
384
- return static::createFromTimestamp(PHP_INT_MAX);
385
  }
386
 
387
  // 64 bit
@@ -395,9 +520,9 @@ class Carbon extends DateTime
395
  */
396
  public static function minValue()
397
  {
398
- if (PHP_INT_SIZE === 4) {
399
- // 32 bit (and additionally Windows 64 bit)
400
- return static::createFromTimestamp(~PHP_INT_MAX);
401
  }
402
 
403
  // 64 bit
@@ -424,11 +549,13 @@ class Carbon extends DateTime
424
  * @param int|null $second
425
  * @param \DateTimeZone|string|null $tz
426
  *
 
 
427
  * @return static
428
  */
429
  public static function create($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null)
430
  {
431
- $now = static::hasTestNow() ? static::getTestNow()->getTimestamp() : time();
432
 
433
  $defaults = array_combine(array(
434
  'year',
@@ -437,7 +564,7 @@ class Carbon extends DateTime
437
  'hour',
438
  'minute',
439
  'second',
440
- ), explode('-', date('Y-n-j-G-i-s', $now)));
441
 
442
  $year = $year === null ? $defaults['year'] : $year;
443
  $month = $month === null ? $defaults['month'] : $month;
@@ -494,7 +621,7 @@ class Carbon extends DateTime
494
  * @param int|null $second
495
  * @param \DateTimeZone|string|null $tz
496
  *
497
- * @throws \Carbon\Exceptions\InvalidDateException
498
  *
499
  * @return static
500
  */
@@ -515,13 +642,15 @@ class Carbon extends DateTime
515
  }
516
  }
517
 
518
- $instance = static::create($year, $month, 1, $hour, $minute, $second, $tz);
519
 
520
- if ($day !== null && $day > $instance->daysInMonth) {
521
- throw new InvalidDateException('day', $day);
 
 
522
  }
523
 
524
- return $instance->day($day);
525
  }
526
 
527
  /**
@@ -532,6 +661,8 @@ class Carbon extends DateTime
532
  * @param int|null $day
533
  * @param \DateTimeZone|string|null $tz
534
  *
 
 
535
  * @return static
536
  */
537
  public static function createFromDate($year = null, $month = null, $day = null, $tz = null)
@@ -539,6 +670,21 @@ class Carbon extends DateTime
539
  return static::create($year, $month, $day, null, null, null, $tz);
540
  }
541
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
542
  /**
543
  * Create a Carbon instance from just a time. The date portion is set to today.
544
  *
@@ -547,6 +693,8 @@ class Carbon extends DateTime
547
  * @param int|null $second
548
  * @param \DateTimeZone|string|null $tz
549
  *
 
 
550
  * @return static
551
  */
552
  public static function createFromTime($hour = null, $minute = null, $second = null, $tz = null)
@@ -557,26 +705,29 @@ class Carbon extends DateTime
557
  /**
558
  * Create a Carbon instance from a specific format.
559
  *
560
- * @param string $format
561
  * @param string $time
562
  * @param \DateTimeZone|string|null $tz
563
  *
564
- * @throws \InvalidArgumentException
565
  *
566
  * @return static
567
  */
568
  public static function createFromFormat($format, $time, $tz = null)
569
  {
570
  if ($tz !== null) {
571
- $dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
572
  } else {
573
- $dt = parent::createFromFormat($format, $time);
574
  }
575
 
576
- static::setLastErrors($lastErrors = parent::getLastErrors());
 
 
 
 
577
 
578
- if ($dt instanceof DateTime) {
579
- return static::instance($dt);
580
  }
581
 
582
  throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
@@ -615,6 +766,20 @@ class Carbon extends DateTime
615
  return static::now($tz)->setTimestamp($timestamp);
616
  }
617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618
  /**
619
  * Create a Carbon instance from an UTC timestamp.
620
  *
@@ -637,6 +802,28 @@ class Carbon extends DateTime
637
  return clone $this;
638
  }
639
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
  ///////////////////////////////////////////////////////////////////
641
  ///////////////////////// GETTERS AND SETTERS /////////////////////
642
  ///////////////////////////////////////////////////////////////////
@@ -652,27 +839,32 @@ class Carbon extends DateTime
652
  */
653
  public function __get($name)
654
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
655
  switch (true) {
656
- case array_key_exists($name, $formats = array(
657
- 'year' => 'Y',
658
- 'yearIso' => 'o',
659
- 'month' => 'n',
660
- 'day' => 'j',
661
- 'hour' => 'G',
662
- 'minute' => 'i',
663
- 'second' => 's',
664
- 'micro' => 'u',
665
- 'dayOfWeek' => 'w',
666
- 'dayOfYear' => 'z',
667
- 'weekOfYear' => 'W',
668
- 'daysInMonth' => 't',
669
- 'timestamp' => 'U',
670
- )):
671
  return (int) $this->format($formats[$name]);
672
 
673
  case $name === 'weekOfMonth':
674
  return (int) ceil($this->day / static::DAYS_PER_WEEK);
675
 
 
 
 
676
  case $name === 'age':
677
  return $this->diffInYears();
678
 
@@ -730,6 +922,8 @@ class Carbon extends DateTime
730
  * @param string|int|\DateTimeZone $value
731
  *
732
  * @throws \InvalidArgumentException
 
 
733
  */
734
  public function __set($name, $value)
735
  {
@@ -943,7 +1137,22 @@ class Carbon extends DateTime
943
  */
944
  public function setTimezone($value)
945
  {
946
- return parent::setTimezone(static::safeCreateDateTimeZone($value));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
947
  }
948
 
949
  ///////////////////////////////////////////////////////////////////
@@ -963,7 +1172,9 @@ class Carbon extends DateTime
963
  /**
964
  * Set the first day of week
965
  *
966
- * @param int
 
 
967
  */
968
  public static function setWeekStartsAt($day)
969
  {
@@ -983,7 +1194,9 @@ class Carbon extends DateTime
983
  /**
984
  * Set the last day of week
985
  *
986
- * @param int
 
 
987
  */
988
  public static function setWeekEndsAt($day)
989
  {
@@ -1003,13 +1216,37 @@ class Carbon extends DateTime
1003
  /**
1004
  * Set weekend days
1005
  *
1006
- * @param array
 
 
1007
  */
1008
  public static function setWeekendDays($days)
1009
  {
1010
  static::$weekendDays = $days;
1011
  }
1012
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1013
  ///////////////////////////////////////////////////////////////////
1014
  ///////////////////////// TESTING AIDS ////////////////////////////
1015
  ///////////////////////////////////////////////////////////////////
@@ -1029,6 +1266,7 @@ class Carbon extends DateTime
1029
  * To clear the test instance call this method using the default
1030
  * parameter of null.
1031
  *
 
1032
  * @param \Carbon\Carbon|string|null $testNow
1033
  */
1034
  public static function setTestNow($testNow = null)
@@ -1059,25 +1297,24 @@ class Carbon extends DateTime
1059
  }
1060
 
1061
  /**
1062
- * Determine if there is a relative keyword in the time string, this is to
1063
- * create dates relative to now for test instances. e.g.: next tuesday
1064
  *
1065
  * @param string $time
1066
  *
1067
- * @return bool true if there is a keyword, otherwise false
1068
  */
1069
  public static function hasRelativeKeywords($time)
1070
  {
1071
- // skip common format with a '-' in it
1072
- if (preg_match('/\d{4}-\d{1,2}-\d{1,2}/', $time) !== 1) {
1073
- foreach (static::$relativeKeywords as $keyword) {
1074
- if (stripos($time, $keyword) !== false) {
1075
- return true;
1076
- }
1077
- }
1078
  }
1079
 
1080
- return false;
 
 
 
 
 
1081
  }
1082
 
1083
  ///////////////////////////////////////////////////////////////////
@@ -1092,8 +1329,9 @@ class Carbon extends DateTime
1092
  protected static function translator()
1093
  {
1094
  if (static::$translator === null) {
1095
- static::$translator = new Translator('en');
1096
- static::$translator->addLoader('array', new ArrayLoader());
 
1097
  static::setLocale('en');
1098
  }
1099
 
@@ -1114,6 +1352,8 @@ class Carbon extends DateTime
1114
  * Set the translator instance to use
1115
  *
1116
  * @param \Symfony\Component\Translation\TranslatorInterface $translator
 
 
1117
  */
1118
  public static function setTranslator(TranslatorInterface $translator)
1119
  {
@@ -1133,20 +1373,25 @@ class Carbon extends DateTime
1133
  /**
1134
  * Set the current translator locale and indicate if the source locale file exists
1135
  *
1136
- * @param string $locale
1137
  *
1138
  * @return bool
1139
  */
1140
  public static function setLocale($locale)
1141
  {
1142
- $locale = preg_replace_callback('/\b([a-z]{2})[-_](?:([a-z]{4})[-_])?([a-z]{2})\b/', function ($matches) {
1143
- return $matches[1].'_'.(!empty($matches[2]) ? ucfirst($matches[2]).'_' : '').strtoupper($matches[3]);
 
1144
  }, strtolower($locale));
1145
 
1146
  if (file_exists($filename = __DIR__.'/Lang/'.$locale.'.php')) {
1147
- static::translator()->setLocale($locale);
1148
- // Ensure the locale has been loaded.
1149
- static::translator()->addResource('array', require $filename, $locale);
 
 
 
 
1150
 
1151
  return true;
1152
  }
@@ -1178,19 +1423,20 @@ class Carbon extends DateTime
1178
  */
1179
  public function formatLocalized($format)
1180
  {
1181
- // Check for Windows to find and replace the %e
1182
- // modifier correctly
1183
  if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
1184
- $format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
1185
  }
1186
 
1187
- $formatted = strftime($format, strtotime($this));
1188
 
1189
  return static::$utf8 ? utf8_encode($formatted) : $formatted;
1190
  }
1191
 
1192
  /**
1193
  * Reset the format used to the default when type juggling a Carbon instance to a string
 
 
1194
  */
1195
  public static function resetToStringFormat()
1196
  {
@@ -1201,6 +1447,8 @@ class Carbon extends DateTime
1201
  * Set the default format used when type juggling a Carbon instance to a string
1202
  *
1203
  * @param string $format
 
 
1204
  */
1205
  public static function setToStringFormat($format)
1206
  {
@@ -1307,6 +1555,16 @@ class Carbon extends DateTime
1307
  return $this->format(static::RFC822);
1308
  }
1309
 
 
 
 
 
 
 
 
 
 
 
1310
  /**
1311
  * Format the instance as RFC850
1312
  *
@@ -1377,6 +1635,41 @@ class Carbon extends DateTime
1377
  return $this->format(static::W3C);
1378
  }
1379
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1380
  ///////////////////////////////////////////////////////////////////
1381
  ////////////////////////// COMPARISONS ////////////////////////////
1382
  ///////////////////////////////////////////////////////////////////
@@ -1384,263 +1677,263 @@ class Carbon extends DateTime
1384
  /**
1385
  * Determines if the instance is equal to another
1386
  *
1387
- * @param Carbon $dt
1388
  *
1389
  * @return bool
1390
  */
1391
- public function eq(Carbon $dt)
1392
  {
1393
- return $this == $dt;
1394
  }
1395
 
1396
  /**
1397
  * Determines if the instance is equal to another
1398
  *
1399
- * @param Carbon $dt
1400
  *
1401
  * @see eq()
1402
  *
1403
  * @return bool
1404
  */
1405
- public function equalTo(Carbon $dt)
1406
  {
1407
- return $this->eq($dt);
1408
  }
1409
 
1410
  /**
1411
  * Determines if the instance is not equal to another
1412
  *
1413
- * @param Carbon $dt
1414
  *
1415
  * @return bool
1416
  */
1417
- public function ne(Carbon $dt)
1418
  {
1419
- return !$this->eq($dt);
1420
  }
1421
 
1422
  /**
1423
  * Determines if the instance is not equal to another
1424
  *
1425
- * @param Carbon $dt
1426
  *
1427
  * @see ne()
1428
  *
1429
  * @return bool
1430
  */
1431
- public function notEqualTo(Carbon $dt)
1432
  {
1433
- return $this->ne($dt);
1434
  }
1435
 
1436
  /**
1437
  * Determines if the instance is greater (after) than another
1438
  *
1439
- * @param Carbon $dt
1440
  *
1441
  * @return bool
1442
  */
1443
- public function gt(Carbon $dt)
1444
  {
1445
- return $this > $dt;
1446
  }
1447
 
1448
  /**
1449
  * Determines if the instance is greater (after) than another
1450
  *
1451
- * @param Carbon $dt
1452
  *
1453
  * @see gt()
1454
  *
1455
  * @return bool
1456
  */
1457
- public function greaterThan(Carbon $dt)
1458
  {
1459
- return $this->gt($dt);
1460
  }
1461
 
1462
  /**
1463
  * Determines if the instance is greater (after) than or equal to another
1464
  *
1465
- * @param Carbon $dt
1466
  *
1467
  * @return bool
1468
  */
1469
- public function gte(Carbon $dt)
1470
  {
1471
- return $this >= $dt;
1472
  }
1473
 
1474
  /**
1475
  * Determines if the instance is greater (after) than or equal to another
1476
  *
1477
- * @param Carbon $dt
1478
  *
1479
  * @see gte()
1480
  *
1481
  * @return bool
1482
  */
1483
- public function greaterThanOrEqualTo(Carbon $dt)
1484
  {
1485
- return $this->gte($dt);
1486
  }
1487
 
1488
  /**
1489
  * Determines if the instance is less (before) than another
1490
  *
1491
- * @param Carbon $dt
1492
  *
1493
  * @return bool
1494
  */
1495
- public function lt(Carbon $dt)
1496
  {
1497
- return $this < $dt;
1498
  }
1499
 
1500
  /**
1501
  * Determines if the instance is less (before) than another
1502
  *
1503
- * @param Carbon $dt
1504
  *
1505
  * @see lt()
1506
  *
1507
  * @return bool
1508
  */
1509
- public function lessThan(Carbon $dt)
1510
  {
1511
- return $this->lt($dt);
1512
  }
1513
 
1514
  /**
1515
  * Determines if the instance is less (before) or equal to another
1516
  *
1517
- * @param Carbon $dt
1518
  *
1519
  * @return bool
1520
  */
1521
- public function lte(Carbon $dt)
1522
  {
1523
- return $this <= $dt;
1524
  }
1525
 
1526
  /**
1527
  * Determines if the instance is less (before) or equal to another
1528
  *
1529
- * @param Carbon $dt
1530
  *
1531
  * @see lte()
1532
  *
1533
  * @return bool
1534
  */
1535
- public function lessThanOrEqualTo(Carbon $dt)
1536
  {
1537
- return $this->lte($dt);
1538
  }
1539
 
1540
  /**
1541
  * Determines if the instance is between two others
1542
  *
1543
- * @param Carbon $dt1
1544
- * @param Carbon $dt2
1545
- * @param bool $equal Indicates if a > and < comparison should be used or <= or >=
1546
  *
1547
  * @return bool
1548
  */
1549
- public function between(Carbon $dt1, Carbon $dt2, $equal = true)
1550
  {
1551
- if ($dt1->gt($dt2)) {
1552
- $temp = $dt1;
1553
- $dt1 = $dt2;
1554
- $dt2 = $temp;
1555
  }
1556
 
1557
  if ($equal) {
1558
- return $this->gte($dt1) && $this->lte($dt2);
1559
  }
1560
 
1561
- return $this->gt($dt1) && $this->lt($dt2);
1562
  }
1563
 
1564
  /**
1565
  * Get the closest date from the instance.
1566
  *
1567
- * @param Carbon $dt1
1568
- * @param Carbon $dt2
1569
  *
1570
  * @return static
1571
  */
1572
- public function closest(Carbon $dt1, Carbon $dt2)
1573
  {
1574
- return $this->diffInSeconds($dt1) < $this->diffInSeconds($dt2) ? $dt1 : $dt2;
1575
  }
1576
 
1577
  /**
1578
  * Get the farthest date from the instance.
1579
  *
1580
- * @param Carbon $dt1
1581
- * @param Carbon $dt2
1582
  *
1583
  * @return static
1584
  */
1585
- public function farthest(Carbon $dt1, Carbon $dt2)
1586
  {
1587
- return $this->diffInSeconds($dt1) > $this->diffInSeconds($dt2) ? $dt1 : $dt2;
1588
  }
1589
 
1590
  /**
1591
  * Get the minimum instance between a given instance (default now) and the current instance.
1592
  *
1593
- * @param \Carbon\Carbon|null $dt
1594
  *
1595
  * @return static
1596
  */
1597
- public function min(Carbon $dt = null)
1598
  {
1599
- $dt = $dt ?: static::now($this->getTimezone());
1600
 
1601
- return $this->lt($dt) ? $this : $dt;
1602
  }
1603
 
1604
  /**
1605
  * Get the minimum instance between a given instance (default now) and the current instance.
1606
  *
1607
- * @param \Carbon\Carbon|null $dt
1608
  *
1609
  * @see min()
1610
  *
1611
  * @return static
1612
  */
1613
- public function minimum(Carbon $dt = null)
1614
  {
1615
- return $this->min($dt);
1616
  }
1617
 
1618
  /**
1619
  * Get the maximum instance between a given instance (default now) and the current instance.
1620
  *
1621
- * @param \Carbon\Carbon|null $dt
1622
  *
1623
  * @return static
1624
  */
1625
- public function max(Carbon $dt = null)
1626
  {
1627
- $dt = $dt ?: static::now($this->getTimezone());
1628
 
1629
- return $this->gt($dt) ? $this : $dt;
1630
  }
1631
 
1632
  /**
1633
  * Get the maximum instance between a given instance (default now) and the current instance.
1634
  *
1635
- * @param \Carbon\Carbon|null $dt
1636
  *
1637
  * @see max()
1638
  *
1639
  * @return static
1640
  */
1641
- public function maximum(Carbon $dt = null)
1642
  {
1643
- return $this->max($dt);
1644
  }
1645
 
1646
  /**
@@ -1680,7 +1973,7 @@ class Carbon extends DateTime
1680
  */
1681
  public function isToday()
1682
  {
1683
- return $this->toDateString() === static::now($this->getTimezone())->toDateString();
1684
  }
1685
 
1686
  /**
@@ -1700,7 +1993,7 @@ class Carbon extends DateTime
1700
  */
1701
  public function isNextWeek()
1702
  {
1703
- return $this->weekOfYear === static::now($this->getTimezone())->addWeek()->weekOfYear;
1704
  }
1705
 
1706
  /**
@@ -1710,7 +2003,7 @@ class Carbon extends DateTime
1710
  */
1711
  public function isLastWeek()
1712
  {
1713
- return $this->weekOfYear === static::now($this->getTimezone())->subWeek()->weekOfYear;
1714
  }
1715
 
1716
  /**
@@ -1720,7 +2013,7 @@ class Carbon extends DateTime
1720
  */
1721
  public function isNextMonth()
1722
  {
1723
- return $this->month === static::now($this->getTimezone())->addMonthNoOverflow()->month;
1724
  }
1725
 
1726
  /**
@@ -1730,7 +2023,7 @@ class Carbon extends DateTime
1730
  */
1731
  public function isLastMonth()
1732
  {
1733
- return $this->month === static::now($this->getTimezone())->subMonthNoOverflow()->month;
1734
  }
1735
 
1736
  /**
@@ -1740,7 +2033,7 @@ class Carbon extends DateTime
1740
  */
1741
  public function isNextYear()
1742
  {
1743
- return $this->year === static::now($this->getTimezone())->addYear()->year;
1744
  }
1745
 
1746
  /**
@@ -1750,7 +2043,7 @@ class Carbon extends DateTime
1750
  */
1751
  public function isLastYear()
1752
  {
1753
- return $this->year === static::now($this->getTimezone())->subYear()->year;
1754
  }
1755
 
1756
  /**
@@ -1760,7 +2053,7 @@ class Carbon extends DateTime
1760
  */
1761
  public function isFuture()
1762
  {
1763
- return $this->gt(static::now($this->getTimezone()));
1764
  }
1765
 
1766
  /**
@@ -1770,7 +2063,7 @@ class Carbon extends DateTime
1770
  */
1771
  public function isPast()
1772
  {
1773
- return $this->lt(static::now($this->getTimezone()));
1774
  }
1775
 
1776
  /**
@@ -1795,19 +2088,25 @@ class Carbon extends DateTime
1795
  return static::create($this->year, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === 53;
1796
  }
1797
 
1798
- /*
1799
  * Compares the formatted values of the two dates.
1800
  *
1801
- * @param string $format The date formats to compare.
1802
- * @param \Carbon\Carbon|null $dt The instance to compare with or null to use current day.
 
 
1803
  *
1804
  * @return bool
1805
  */
1806
- public function isSameAs($format, Carbon $dt = null)
1807
  {
1808
- $dt = $dt ?: static::now($this->tz);
 
 
 
 
1809
 
1810
- return $this->format($format) === $dt->format($format);
1811
  }
1812
 
1813
  /**
@@ -1823,13 +2122,13 @@ class Carbon extends DateTime
1823
  /**
1824
  * Checks if the passed in date is in the same year as the instance year.
1825
  *
1826
- * @param \Carbon\Carbon|null $dt The instance to compare with or null to use current day.
1827
  *
1828
  * @return bool
1829
  */
1830
- public function isSameYear(Carbon $dt = null)
1831
  {
1832
- return $this->isSameAs('Y', $dt);
1833
  }
1834
 
1835
  /**
@@ -1845,28 +2144,38 @@ class Carbon extends DateTime
1845
  /**
1846
  * Checks if the passed in date is in the same month as the instance month (and year if needed).
1847
  *
1848
- * @param \Carbon\Carbon|null $dt The instance to compare with or null to use current day.
1849
- * @param bool $ofSameYear Check if it is the same month in the same year.
1850
  *
1851
  * @return bool
1852
  */
1853
- public function isSameMonth(Carbon $dt = null, $ofSameYear = false)
1854
  {
1855
- $format = $ofSameYear ? 'Y-m' : 'm';
1856
-
1857
- return $this->isSameAs($format, $dt);
1858
  }
1859
 
1860
  /**
1861
  * Checks if the passed in date is the same day as the instance current day.
1862
  *
1863
- * @param \Carbon\Carbon $dt
 
 
 
 
 
 
 
 
 
 
 
 
1864
  *
1865
  * @return bool
1866
  */
1867
- public function isSameDay(Carbon $dt)
1868
  {
1869
- return $this->toDateString() === $dt->toDateString();
1870
  }
1871
 
1872
  /**
@@ -1939,6 +2248,36 @@ class Carbon extends DateTime
1939
  return $this->dayOfWeek === static::SATURDAY;
1940
  }
1941
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1942
  ///////////////////////////////////////////////////////////////////
1943
  /////////////////// ADDITIONS AND SUBTRACTIONS ////////////////////
1944
  ///////////////////////////////////////////////////////////////////
@@ -1953,7 +2292,11 @@ class Carbon extends DateTime
1953
  */
1954
  public function addYears($value)
1955
  {
1956
- return $this->modify((int) $value.' year');
 
 
 
 
1957
  }
1958
 
1959
  /**
@@ -1968,6 +2311,58 @@ class Carbon extends DateTime
1968
  return $this->addYears($value);
1969
  }
1970
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1971
  /**
1972
  * Remove a year from the instance
1973
  *
@@ -1992,6 +2387,54 @@ class Carbon extends DateTime
1992
  return $this->addYears(-1 * $value);
1993
  }
1994
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1995
  /**
1996
  * Add quarters to the instance. Positive $value travels forward while
1997
  * negative $value travels into the past.
@@ -2308,7 +2751,7 @@ class Carbon extends DateTime
2308
  */
2309
  public function addWeekdays($value)
2310
  {
2311
- // fix for https://bugs.php.net/bug.php?id=54909
2312
  $t = $this->toTimeString();
2313
  $this->modify((int) $value.' weekday');
2314
 
@@ -2524,27 +2967,27 @@ class Carbon extends DateTime
2524
  }
2525
 
2526
  /**
2527
- * Remove a second from the instance
2528
  *
2529
  * @param int $value
2530
  *
2531
  * @return static
2532
  */
2533
- public function subSecond($value = 1)
2534
  {
2535
- return $this->subSeconds($value);
2536
  }
2537
 
2538
  /**
2539
- * Remove seconds from the instance
2540
  *
2541
  * @param int $value
2542
  *
2543
  * @return static
2544
  */
2545
- public function subSeconds($value)
2546
  {
2547
- return $this->addSeconds(-1 * $value);
2548
  }
2549
 
2550
  ///////////////////////////////////////////////////////////////////
@@ -2554,87 +2997,83 @@ class Carbon extends DateTime
2554
  /**
2555
  * Get the difference in years
2556
  *
2557
- * @param \Carbon\Carbon|null $dt
2558
- * @param bool $abs Get the absolute of the difference
2559
  *
2560
  * @return int
2561
  */
2562
- public function diffInYears(Carbon $dt = null, $abs = true)
2563
  {
2564
- $dt = $dt ?: static::now($this->getTimezone());
2565
-
2566
- return (int) $this->diff($dt, $abs)->format('%r%y');
2567
  }
2568
 
2569
  /**
2570
  * Get the difference in months
2571
  *
2572
- * @param \Carbon\Carbon|null $dt
2573
- * @param bool $abs Get the absolute of the difference
2574
  *
2575
  * @return int
2576
  */
2577
- public function diffInMonths(Carbon $dt = null, $abs = true)
2578
  {
2579
- $dt = $dt ?: static::now($this->getTimezone());
2580
 
2581
- return $this->diffInYears($dt, $abs) * static::MONTHS_PER_YEAR + (int) $this->diff($dt, $abs)->format('%r%m');
2582
  }
2583
 
2584
  /**
2585
  * Get the difference in weeks
2586
  *
2587
- * @param \Carbon\Carbon|null $dt
2588
- * @param bool $abs Get the absolute of the difference
2589
  *
2590
  * @return int
2591
  */
2592
- public function diffInWeeks(Carbon $dt = null, $abs = true)
2593
  {
2594
- return (int) ($this->diffInDays($dt, $abs) / static::DAYS_PER_WEEK);
2595
  }
2596
 
2597
  /**
2598
  * Get the difference in days
2599
  *
2600
- * @param \Carbon\Carbon|null $dt
2601
- * @param bool $abs Get the absolute of the difference
2602
  *
2603
  * @return int
2604
  */
2605
- public function diffInDays(Carbon $dt = null, $abs = true)
2606
  {
2607
- $dt = $dt ?: static::now($this->getTimezone());
2608
-
2609
- return (int) $this->diff($dt, $abs)->format('%r%a');
2610
  }
2611
 
2612
  /**
2613
  * Get the difference in days using a filter closure
2614
  *
2615
  * @param Closure $callback
2616
- * @param \Carbon\Carbon|null $dt
2617
- * @param bool $abs Get the absolute of the difference
2618
  *
2619
  * @return int
2620
  */
2621
- public function diffInDaysFiltered(Closure $callback, Carbon $dt = null, $abs = true)
2622
  {
2623
- return $this->diffFiltered(CarbonInterval::day(), $callback, $dt, $abs);
2624
  }
2625
 
2626
  /**
2627
  * Get the difference in hours using a filter closure
2628
  *
2629
  * @param Closure $callback
2630
- * @param \Carbon\Carbon|null $dt
2631
- * @param bool $abs Get the absolute of the difference
2632
  *
2633
  * @return int
2634
  */
2635
- public function diffInHoursFiltered(Closure $callback, Carbon $dt = null, $abs = true)
2636
  {
2637
- return $this->diffFiltered(CarbonInterval::hour(), $callback, $dt, $abs);
2638
  }
2639
 
2640
  /**
@@ -2642,15 +3081,15 @@ class Carbon extends DateTime
2642
  *
2643
  * @param CarbonInterval $ci An interval to traverse by
2644
  * @param Closure $callback
2645
- * @param Carbon|null $dt
2646
- * @param bool $abs Get the absolute of the difference
2647
  *
2648
  * @return int
2649
  */
2650
- public function diffFiltered(CarbonInterval $ci, Closure $callback, Carbon $dt = null, $abs = true)
2651
  {
2652
  $start = $this;
2653
- $end = $dt ?: static::now($this->getTimezone());
2654
  $inverse = false;
2655
 
2656
  if ($end < $start) {
@@ -2660,85 +3099,88 @@ class Carbon extends DateTime
2660
  }
2661
 
2662
  $period = new DatePeriod($start, $ci, $end);
2663
- $vals = array_filter(iterator_to_array($period), function (DateTime $date) use ($callback) {
2664
  return call_user_func($callback, Carbon::instance($date));
2665
  });
2666
 
2667
- $diff = count($vals);
2668
 
2669
- return $inverse && !$abs ? -$diff : $diff;
2670
  }
2671
 
2672
  /**
2673
  * Get the difference in weekdays
2674
  *
2675
- * @param \Carbon\Carbon|null $dt
2676
- * @param bool $abs Get the absolute of the difference
2677
  *
2678
  * @return int
2679
  */
2680
- public function diffInWeekdays(Carbon $dt = null, $abs = true)
2681
  {
2682
  return $this->diffInDaysFiltered(function (Carbon $date) {
2683
  return $date->isWeekday();
2684
- }, $dt, $abs);
2685
  }
2686
 
2687
  /**
2688
  * Get the difference in weekend days using a filter
2689
  *
2690
- * @param \Carbon\Carbon|null $dt
2691
- * @param bool $abs Get the absolute of the difference
2692
  *
2693
  * @return int
2694
  */
2695
- public function diffInWeekendDays(Carbon $dt = null, $abs = true)
2696
  {
2697
  return $this->diffInDaysFiltered(function (Carbon $date) {
2698
  return $date->isWeekend();
2699
- }, $dt, $abs);
2700
  }
2701
 
2702
  /**
2703
  * Get the difference in hours
2704
  *
2705
- * @param \Carbon\Carbon|null $dt
2706
- * @param bool $abs Get the absolute of the difference
2707
  *
2708
  * @return int
2709
  */
2710
- public function diffInHours(Carbon $dt = null, $abs = true)
2711
  {
2712
- return (int) ($this->diffInSeconds($dt, $abs) / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR);
2713
  }
2714
 
2715
  /**
2716
  * Get the difference in minutes
2717
  *
2718
- * @param \Carbon\Carbon|null $dt
2719
- * @param bool $abs Get the absolute of the difference
2720
  *
2721
  * @return int
2722
  */
2723
- public function diffInMinutes(Carbon $dt = null, $abs = true)
2724
  {
2725
- return (int) ($this->diffInSeconds($dt, $abs) / static::SECONDS_PER_MINUTE);
2726
  }
2727
 
2728
  /**
2729
  * Get the difference in seconds
2730
  *
2731
- * @param \Carbon\Carbon|null $dt
2732
- * @param bool $abs Get the absolute of the difference
2733
  *
2734
  * @return int
2735
  */
2736
- public function diffInSeconds(Carbon $dt = null, $abs = true)
2737
  {
2738
- $dt = $dt ?: static::now($this->getTimezone());
2739
- $value = $dt->getTimestamp() - $this->getTimestamp();
 
 
 
2740
 
2741
- return $abs ? abs($value) : $value;
2742
  }
2743
 
2744
  /**
@@ -2752,7 +3194,7 @@ class Carbon extends DateTime
2752
  }
2753
 
2754
  /**
2755
- * The number of seconds until 23:23:59.
2756
  *
2757
  * @return int
2758
  */
@@ -2783,61 +3225,74 @@ class Carbon extends DateTime
2783
  * @param Carbon|null $other
2784
  * @param bool $absolute removes time difference modifiers ago, after, etc
2785
  * @param bool $short displays short format of time units
 
2786
  *
2787
  * @return string
2788
  */
2789
- public function diffForHumans(Carbon $other = null, $absolute = false, $short = false)
2790
  {
2791
  $isNow = $other === null;
 
 
 
 
 
2792
 
2793
  if ($isNow) {
2794
- $other = static::now($this->getTimezone());
2795
  }
2796
 
2797
  $diffInterval = $this->diff($other);
2798
 
2799
- switch (true) {
2800
- case $diffInterval->y > 0:
2801
- $unit = $short ? 'y' : 'year';
2802
- $count = $diffInterval->y;
2803
- break;
2804
-
2805
- case $diffInterval->m > 0:
2806
- $unit = $short ? 'm' : 'month';
2807
- $count = $diffInterval->m;
2808
- break;
2809
 
2810
- case $diffInterval->d > 0:
2811
- $unit = $short ? 'd' : 'day';
2812
- $count = $diffInterval->d;
 
2813
 
2814
- if ($count >= static::DAYS_PER_WEEK) {
2815
  $unit = $short ? 'w' : 'week';
2816
  $count = (int) ($count / static::DAYS_PER_WEEK);
2817
- }
2818
- break;
2819
 
2820
- case $diffInterval->h > 0:
2821
- $unit = $short ? 'h' : 'hour';
2822
- $count = $diffInterval->h;
2823
- break;
2824
 
2825
- case $diffInterval->i > 0:
2826
- $unit = $short ? 'min' : 'minute';
2827
- $count = $diffInterval->i;
2828
- break;
2829
 
2830
- default:
2831
- $count = $diffInterval->s;
2832
- $unit = $short ? 's' : 'second';
 
 
 
 
 
 
 
 
 
2833
  break;
 
2834
  }
2835
 
2836
- if ($count === 0) {
2837
  $count = 1;
 
 
2838
  }
2839
 
2840
- $time = static::translator()->transChoice($unit, $count, array(':count' => $count));
 
 
 
2841
 
2842
  if ($absolute) {
2843
  return $time;
@@ -2847,10 +3302,13 @@ class Carbon extends DateTime
2847
 
2848
  $transId = $isNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before');
2849
 
2850
- // Some langs have special pluralization for past and future tense.
2851
- $tryKeyExists = $unit.'_'.$transId;
2852
- if ($tryKeyExists !== static::translator()->transChoice($tryKeyExists, $count)) {
2853
- $time = static::translator()->transChoice($tryKeyExists, $count, array(':count' => $count));
 
 
 
2854
  }
2855
 
2856
  return static::translator()->trans($transId, array(':time' => $time));
@@ -2861,7 +3319,7 @@ class Carbon extends DateTime
2861
  ///////////////////////////////////////////////////////////////////
2862
 
2863
  /**
2864
- * Resets the time to 00:00:00
2865
  *
2866
  * @return static
2867
  */
@@ -2871,7 +3329,7 @@ class Carbon extends DateTime
2871
  }
2872
 
2873
  /**
2874
- * Resets the time to 23:59:59
2875
  *
2876
  * @return static
2877
  */
@@ -3018,6 +3476,56 @@ class Carbon extends DateTime
3018
  return $this->endOfDay();
3019
  }
3020
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3021
  /**
3022
  * Modify to the next occurrence of a given day of the week.
3023
  * If no dayOfWeek is provided, modify to the next occurrence
@@ -3043,7 +3551,7 @@ class Carbon extends DateTime
3043
  * @param bool $weekday
3044
  * @param bool $forward
3045
  *
3046
- * @return static
3047
  */
3048
  private function nextOrPreviousDay($weekday = true, $forward = true)
3049
  {
@@ -3069,7 +3577,7 @@ class Carbon extends DateTime
3069
  /**
3070
  * Go backward to the previous weekday.
3071
  *
3072
- * @return static
3073
  */
3074
  public function previousWeekday()
3075
  {
@@ -3079,7 +3587,7 @@ class Carbon extends DateTime
3079
  /**
3080
  * Go forward to the next weekend day.
3081
  *
3082
- * @return static
3083
  */
3084
  public function nextWeekendDay()
3085
  {
@@ -3089,7 +3597,7 @@ class Carbon extends DateTime
3089
  /**
3090
  * Go backward to the previous weekend day.
3091
  *
3092
- * @return static
3093
  */
3094
  public function previousWeekendDay()
3095
  {
@@ -3170,11 +3678,11 @@ class Carbon extends DateTime
3170
  */
3171
  public function nthOfMonth($nth, $dayOfWeek)
3172
  {
3173
- $dt = $this->copy()->firstOfMonth();
3174
- $check = $dt->format('Y-m');
3175
- $dt->modify('+'.$nth.' '.static::$days[$dayOfWeek]);
3176
 
3177
- return $dt->format('Y-m') === $check ? $this->modify($dt) : false;
3178
  }
3179
 
3180
  /**
@@ -3183,7 +3691,7 @@ class Carbon extends DateTime
3183
  * first day of the current quarter. Use the supplied constants
3184
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3185
  *
3186
- * @param int|null $dayOfWeek
3187
  *
3188
  * @return static
3189
  */
@@ -3198,7 +3706,7 @@ class Carbon extends DateTime
3198
  * last day of the current quarter. Use the supplied constants
3199
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3200
  *
3201
- * @param int|null $dayOfWeek
3202
  *
3203
  * @return static
3204
  */
@@ -3220,12 +3728,12 @@ class Carbon extends DateTime
3220
  */
3221
  public function nthOfQuarter($nth, $dayOfWeek)
3222
  {
3223
- $dt = $this->copy()->day(1)->month($this->quarter * static::MONTHS_PER_QUARTER);
3224
- $lastMonth = $dt->month;
3225
- $year = $dt->year;
3226
- $dt->firstOfQuarter()->modify('+'.$nth.' '.static::$days[$dayOfWeek]);
3227
 
3228
- return ($lastMonth < $dt->month || $year !== $dt->year) ? false : $this->modify($dt);
3229
  }
3230
 
3231
  /**
@@ -3234,7 +3742,7 @@ class Carbon extends DateTime
3234
  * first day of the current year. Use the supplied constants
3235
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3236
  *
3237
- * @param int|null $dayOfWeek
3238
  *
3239
  * @return static
3240
  */
@@ -3249,7 +3757,7 @@ class Carbon extends DateTime
3249
  * last day of the current year. Use the supplied constants
3250
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3251
  *
3252
- * @param int|null $dayOfWeek
3253
  *
3254
  * @return static
3255
  */
@@ -3271,56 +3779,43 @@ class Carbon extends DateTime
3271
  */
3272
  public function nthOfYear($nth, $dayOfWeek)
3273
  {
3274
- $dt = $this->copy()->firstOfYear()->modify('+'.$nth.' '.static::$days[$dayOfWeek]);
3275
 
3276
- return $this->year === $dt->year ? $this->modify($dt) : false;
3277
  }
3278
 
3279
  /**
3280
  * Modify the current instance to the average of a given instance (default now) and the current instance.
3281
  *
3282
- * @param \Carbon\Carbon|null $dt
3283
  *
3284
  * @return static
3285
  */
3286
- public function average(Carbon $dt = null)
3287
  {
3288
- $dt = $dt ?: static::now($this->getTimezone());
3289
-
3290
- return $this->addSeconds((int) ($this->diffInSeconds($dt, false) / 2));
3291
  }
3292
 
3293
  /**
3294
  * Check if its the birthday. Compares the date/month values of the two dates.
3295
  *
3296
- * @param \Carbon\Carbon|null $dt The instance to compare with or null to use current day.
3297
  *
3298
  * @return bool
3299
  */
3300
- public function isBirthday(Carbon $dt = null)
3301
  {
3302
- return $this->isSameAs('md', $dt);
3303
  }
3304
 
3305
  /**
3306
- * Consider the timezone when modifying the instance.
3307
  *
3308
- * @param string $modify
3309
- *
3310
- * @return static
3311
  */
3312
- public function modify($modify)
3313
  {
3314
- if ($this->local) {
3315
- return parent::modify($modify);
3316
- }
3317
-
3318
- $timezone = $this->getTimezone();
3319
- $this->setTimezone('UTC');
3320
- $instance = parent::modify($modify);
3321
- $this->setTimezone($timezone);
3322
-
3323
- return $instance;
3324
  }
3325
 
3326
  /**
@@ -3334,7 +3829,7 @@ class Carbon extends DateTime
3334
  }
3335
 
3336
  /**
3337
- * Create an instance form a serialized string.
3338
  *
3339
  * @param string $value
3340
  *
@@ -3352,4 +3847,16 @@ class Carbon extends DateTime
3352
 
3353
  return $instance;
3354
  }
 
 
 
 
 
 
 
 
 
 
 
 
3355
  }
15
  use Closure;
16
  use DatePeriod;
17
  use DateTime;
18
+ use DateTimeInterface;
19
  use DateTimeZone;
20
  use InvalidArgumentException;
21
  use Symfony\Component\Translation\Loader\ArrayLoader;
39
  * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday)
40
  * @property-read int $dayOfYear 0 through 365
41
  * @property-read int $weekOfMonth 1 through 5
42
+ * @property-read int $weekNumberInMonth 1 through 5
43
  * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
44
  * @property-read int $daysInMonth number of days in the given month
45
  * @property-read int $age does a diffInYears() with default parameters
80
  self::SATURDAY => 'Saturday',
81
  );
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  /**
84
  * Number of X in Y.
85
  */
93
  const MINUTES_PER_HOUR = 60;
94
  const SECONDS_PER_MINUTE = 60;
95
 
96
+ /**
97
+ * RFC7231 DateTime format.
98
+ *
99
+ * @var string
100
+ */
101
+ const RFC7231_FORMAT = 'D, d M Y H:i:s \G\M\T';
102
+
103
  /**
104
  * Default format to use for __toString method when type juggling occurs.
105
  *
107
  */
108
  const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s';
109
 
110
+ /**
111
+ * Format for converting mocked time, includes microseconds.
112
+ *
113
+ * @var string
114
+ */
115
+ const MOCK_DATETIME_FORMAT = 'Y-m-d H:i:s.u';
116
+
117
+ /**
118
+ * Customizable PHP_INT_SIZE override.
119
+ *
120
+ * @var int
121
+ */
122
+ public static $PHPIntSize = PHP_INT_SIZE;
123
+
124
  /**
125
  * Format to use for __toString method when type juggling occurs.
126
  *
152
  self::SUNDAY,
153
  );
154
 
155
+ /**
156
+ * Midday/noon hour.
157
+ *
158
+ * @var int
159
+ */
160
+ protected static $midDayAt = 12;
161
+
162
+ /**
163
+ * Format regex patterns.
164
+ *
165
+ * @var array
166
+ */
167
+ protected static $regexFormats = array(
168
+ 'd' => '(3[01]|[12][0-9]|0[1-9])',
169
+ 'D' => '([a-zA-Z]{3})',
170
+ 'j' => '([123][0-9]|[1-9])',
171
+ 'l' => '([a-zA-Z]{2,})',
172
+ 'N' => '([1-7])',
173
+ 'S' => '([a-zA-Z]{2})',
174
+ 'w' => '([0-6])',
175
+ 'z' => '(36[0-5]|3[0-5][0-9]|[12][0-9]{2}|[1-9]?[0-9])',
176
+ 'W' => '(5[012]|[1-4][0-9]|[1-9])',
177
+ 'F' => '([a-zA-Z]{2,})',
178
+ 'm' => '(1[012]|0[1-9])',
179
+ 'M' => '([a-zA-Z]{3})',
180
+ 'n' => '(1[012]|[1-9])',
181
+ 't' => '(2[89]|3[01])',
182
+ 'L' => '(0|1)',
183
+ 'o' => '([1-9][0-9]{0,4})',
184
+ 'Y' => '([1-9][0-9]{0,4})',
185
+ 'y' => '([0-9]{2})',
186
+ 'a' => '(am|pm)',
187
+ 'A' => '(AM|PM)',
188
+ 'B' => '([0-9]{3})',
189
+ 'g' => '(1[012]|[1-9])',
190
+ 'G' => '(2[0-3]|1?[0-9])',
191
+ 'h' => '(1[012]|0[1-9])',
192
+ 'H' => '(2[0-3]|[01][0-9])',
193
+ 'i' => '([0-5][0-9])',
194
+ 's' => '([0-5][0-9])',
195
+ 'u' => '([0-9]{1,6})',
196
+ 'v' => '([0-9]{1,3})',
197
+ 'e' => '([a-zA-Z]{1,5})|([a-zA-Z]*\/[a-zA-Z]*)',
198
+ 'I' => '(0|1)',
199
+ 'O' => '([\+\-](1[012]|0[0-9])[0134][05])',
200
+ 'P' => '([\+\-](1[012]|0[0-9]):[0134][05])',
201
+ 'T' => '([a-zA-Z]{1,5})',
202
+ 'Z' => '(-?[1-5]?[0-9]{1,4})',
203
+ 'U' => '([0-9]*)',
204
+
205
+ // The formats below are combinations of the above formats.
206
+ 'c' => '(([1-9][0-9]{0,4})\-(1[012]|0[1-9])\-(3[01]|[12][0-9]|0[1-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])[\+\-](1[012]|0[0-9]):([0134][05]))', // Y-m-dTH:i:sP
207
+ 'r' => '(([a-zA-Z]{3}), ([123][0-9]|[1-9]) ([a-zA-Z]{3}) ([1-9][0-9]{0,4}) (2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9]) [\+\-](1[012]|0[0-9])([0134][05]))', // D, j M Y H:i:s O
208
+ );
209
+
210
  /**
211
  * A test Carbon instance to be returned when now instances are created.
212
  *
235
  */
236
  protected static $utf8 = false;
237
 
238
+ /**
239
  * Indicates if months should be calculated with overflow.
240
  *
241
  * @var bool
242
  */
243
  protected static $monthsOverflow = true;
244
 
245
+ /**
246
+ * Indicates if years should be calculated with overflow.
247
+ *
248
+ * @var bool
249
+ */
250
+ protected static $yearsOverflow = true;
251
+
252
  /**
253
  * Indicates if months should be calculated with overflow.
254
  *
281
  return static::$monthsOverflow;
282
  }
283
 
284
+ /**
285
+ * Indicates if years should be calculated with overflow.
286
+ *
287
+ * @param bool $yearsOverflow
288
+ *
289
+ * @return void
290
+ */
291
+ public static function useYearsOverflow($yearsOverflow = true)
292
+ {
293
+ static::$yearsOverflow = $yearsOverflow;
294
+ }
295
+
296
+ /**
297
+ * Reset the month overflow behavior.
298
+ *
299
+ * @return void
300
+ */
301
+ public static function resetYearsOverflow()
302
+ {
303
+ static::$yearsOverflow = true;
304
+ }
305
+
306
+ /**
307
+ * Get the month overflow behavior.
308
+ *
309
+ * @return bool
310
+ */
311
+ public static function shouldOverflowYears()
312
+ {
313
+ return static::$yearsOverflow;
314
+ }
315
+
316
  /**
317
  * Creates a DateTimeZone from a string, DateTimeZone or integer offset.
318
  *
369
  {
370
  // If the class has a test now set and we are trying to create a now()
371
  // instance then override as required
372
+ $isNow = empty($time) || $time === 'now';
373
+ if (static::hasTestNow() && ($isNow || static::hasRelativeKeywords($time))) {
374
  $testInstance = clone static::getTestNow();
375
  if (static::hasRelativeKeywords($time)) {
376
  $testInstance->modify($time);
383
  $tz = $testInstance->getTimezone();
384
  }
385
 
386
+ $time = $testInstance->format(static::MOCK_DATETIME_FORMAT);
387
+ }
388
+
389
+ // Get microseconds from microtime() if "now" asked and PHP < 7.1
390
+ $timezone = static::safeCreateDateTimeZone($tz);
391
+ // @codeCoverageIgnoreStart
392
+ if ($isNow && !isset($testInstance) && (
393
+ version_compare(PHP_VERSION, '7.1.0-dev', '<')
394
+ ||
395
+ version_compare(PHP_VERSION, '7.1.3-dev', '>=') && version_compare(PHP_VERSION, '7.1.4-dev', '<')
396
+ )
397
+ ) {
398
+ $dateTime = new DateTime('now', $timezone);
399
+ $microTime = microtime(true) * 1000000 % 1000000;
400
+ if ($microTime > 0) {
401
+ $microTime = str_pad(strval($microTime), 6, '0', STR_PAD_LEFT);
402
+ $time = $dateTime->format(static::DEFAULT_TO_STRING_FORMAT).'.'.$microTime;
403
+ }
404
  }
405
+ // @codeCoverageIgnoreEnd
406
 
407
+ // Work-around for PHP bug https://bugs.php.net/bug.php?id=67127
408
+ if (strpos((string) .1, '.') === false) {
409
+ $locale = setlocale(LC_NUMERIC, '0');
410
+ setlocale(LC_NUMERIC, 'C');
411
+ }
412
+ parent::__construct($time, $timezone);
413
+ if (isset($locale)) {
414
+ setlocale(LC_NUMERIC, $locale);
415
+ }
416
+ static::setLastErrors(parent::getLastErrors());
417
  }
418
 
419
  /**
420
  * Create a Carbon instance from a DateTime one.
421
  *
422
+ * @param \DateTime $date
423
  *
424
  * @return static
425
  */
426
+ public static function instance(DateTime $date)
427
  {
428
+ if ($date instanceof static) {
429
+ return clone $date;
430
  }
431
 
432
+ return new static($date->format('Y-m-d H:i:s.u'), $date->getTimezone());
433
  }
434
 
435
  /**
504
  */
505
  public static function maxValue()
506
  {
507
+ if (self::$PHPIntSize === 4) {
508
+ // 32 bit
509
+ return static::createFromTimestamp(PHP_INT_MAX); // @codeCoverageIgnore
510
  }
511
 
512
  // 64 bit
520
  */
521
  public static function minValue()
522
  {
523
+ if (self::$PHPIntSize === 4) {
524
+ // 32 bit
525
+ return static::createFromTimestamp(~PHP_INT_MAX); // @codeCoverageIgnore
526
  }
527
 
528
  // 64 bit
549
  * @param int|null $second
550
  * @param \DateTimeZone|string|null $tz
551
  *
552
+ * @throws \InvalidArgumentException
553
+ *
554
  * @return static
555
  */
556
  public static function create($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null)
557
  {
558
+ $now = static::hasTestNow() ? static::getTestNow() : static::now($tz);
559
 
560
  $defaults = array_combine(array(
561
  'year',
564
  'hour',
565
  'minute',
566
  'second',
567
+ ), explode('-', $now->format('Y-n-j-G-i-s')));
568
 
569
  $year = $year === null ? $defaults['year'] : $year;
570
  $month = $month === null ? $defaults['month'] : $month;
621
  * @param int|null $second
622
  * @param \DateTimeZone|string|null $tz
623
  *
624
+ * @throws \Carbon\Exceptions\InvalidDateException|\InvalidArgumentException
625
  *
626
  * @return static
627
  */
642
  }
643
  }
644
 
645
+ $instance = static::create($year, $month, $day, $hour, $minute, $second, $tz);
646
 
647
+ foreach (array_reverse($fields) as $field => $range) {
648
+ if ($$field !== null && (!is_int($$field) || $$field !== $instance->$field)) {
649
+ throw new InvalidDateException($field, $$field);
650
+ }
651
  }
652
 
653
+ return $instance;
654
  }
655
 
656
  /**
661
  * @param int|null $day
662
  * @param \DateTimeZone|string|null $tz
663
  *
664
+ * @throws \InvalidArgumentException
665
+ *
666
  * @return static
667
  */
668
  public static function createFromDate($year = null, $month = null, $day = null, $tz = null)
670
  return static::create($year, $month, $day, null, null, null, $tz);
671
  }
672
 
673
+ /**
674
+ * Create a Carbon instance from just a date. The time portion is set to midnight.
675
+ *
676
+ * @param int|null $year
677
+ * @param int|null $month
678
+ * @param int|null $day
679
+ * @param \DateTimeZone|string|null $tz
680
+ *
681
+ * @return static
682
+ */
683
+ public static function createMidnightDate($year = null, $month = null, $day = null, $tz = null)
684
+ {
685
+ return static::create($year, $month, $day, 0, 0, 0, $tz);
686
+ }
687
+
688
  /**
689
  * Create a Carbon instance from just a time. The date portion is set to today.
690
  *
693
  * @param int|null $second
694
  * @param \DateTimeZone|string|null $tz
695
  *
696
+ * @throws \InvalidArgumentException
697
+ *
698
  * @return static
699
  */
700
  public static function createFromTime($hour = null, $minute = null, $second = null, $tz = null)
705
  /**
706
  * Create a Carbon instance from a specific format.
707
  *
708
+ * @param string $format Datetime format
709
  * @param string $time
710
  * @param \DateTimeZone|string|null $tz
711
  *
712
+ * @throws InvalidArgumentException
713
  *
714
  * @return static
715
  */
716
  public static function createFromFormat($format, $time, $tz = null)
717
  {
718
  if ($tz !== null) {
719
+ $date = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
720
  } else {
721
+ $date = parent::createFromFormat($format, $time);
722
  }
723
 
724
+ $lastErrors = parent::getLastErrors();
725
+
726
+ if ($date instanceof DateTime) {
727
+ $instance = static::instance($date);
728
+ $instance::setLastErrors($lastErrors);
729
 
730
+ return $instance;
 
731
  }
732
 
733
  throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
766
  return static::now($tz)->setTimestamp($timestamp);
767
  }
768
 
769
+ /**
770
+ * Create a Carbon instance from a timestamp in milliseconds.
771
+ *
772
+ * @param int $timestamp
773
+ * @param \DateTimeZone|string|null $tz
774
+ *
775
+ * @return static
776
+ */
777
+ public static function createFromTimestampMs($timestamp, $tz = null)
778
+ {
779
+ return static::createFromFormat('U.u', sprintf('%F', $timestamp / 1000))
780
+ ->setTimezone($tz);
781
+ }
782
+
783
  /**
784
  * Create a Carbon instance from an UTC timestamp.
785
  *
802
  return clone $this;
803
  }
804
 
805
+ /**
806
+ * Returns a present instance in the same timezone.
807
+ *
808
+ * @return static
809
+ */
810
+ public function nowWithSameTz()
811
+ {
812
+ return static::now($this->getTimezone());
813
+ }
814
+
815
+ /**
816
+ * Return the Carbon instance passed through or a copy in the same timezone.
817
+ *
818
+ * @param \Carbon\Carbon|null $date
819
+ *
820
+ * @return static
821
+ */
822
+ protected function resolveCarbon(self $date = null)
823
+ {
824
+ return $date ?: $this->nowWithSameTz();
825
+ }
826
+
827
  ///////////////////////////////////////////////////////////////////
828
  ///////////////////////// GETTERS AND SETTERS /////////////////////
829
  ///////////////////////////////////////////////////////////////////
839
  */
840
  public function __get($name)
841
  {
842
+ static $formats = array(
843
+ 'year' => 'Y',
844
+ 'yearIso' => 'o',
845
+ 'month' => 'n',
846
+ 'day' => 'j',
847
+ 'hour' => 'G',
848
+ 'minute' => 'i',
849
+ 'second' => 's',
850
+ 'micro' => 'u',
851
+ 'dayOfWeek' => 'w',
852
+ 'dayOfYear' => 'z',
853
+ 'weekOfYear' => 'W',
854
+ 'daysInMonth' => 't',
855
+ 'timestamp' => 'U',
856
+ );
857
+
858
  switch (true) {
859
+ case isset($formats[$name]):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
860
  return (int) $this->format($formats[$name]);
861
 
862
  case $name === 'weekOfMonth':
863
  return (int) ceil($this->day / static::DAYS_PER_WEEK);
864
 
865
+ case $name === 'weekNumberInMonth':
866
+ return (int) ceil(($this->day + $this->copy()->startOfMonth()->dayOfWeek - 1) / static::DAYS_PER_WEEK);
867
+
868
  case $name === 'age':
869
  return $this->diffInYears();
870
 
922
  * @param string|int|\DateTimeZone $value
923
  *
924
  * @throws \InvalidArgumentException
925
+ *
926
+ * @return void
927
  */
928
  public function __set($name, $value)
929
  {
1137
  */
1138
  public function setTimezone($value)
1139
  {
1140
+ parent::setTimezone(static::safeCreateDateTimeZone($value));
1141
+ // https://bugs.php.net/bug.php?id=72338
1142
+ // just workaround on this bug
1143
+ $this->getTimestamp();
1144
+
1145
+ return $this;
1146
+ }
1147
+
1148
+ /**
1149
+ * Get the days of the week
1150
+ *
1151
+ * @return array
1152
+ */
1153
+ public static function getDays()
1154
+ {
1155
+ return static::$days;
1156
  }
1157
 
1158
  ///////////////////////////////////////////////////////////////////
1172
  /**
1173
  * Set the first day of week
1174
  *
1175
+ * @param int $day week start day
1176
+ *
1177
+ * @return void
1178
  */
1179
  public static function setWeekStartsAt($day)
1180
  {
1194
  /**
1195
  * Set the last day of week
1196
  *
1197
+ * @param int $day
1198
+ *
1199
+ * @return void
1200
  */
1201
  public static function setWeekEndsAt($day)
1202
  {
1216
  /**
1217
  * Set weekend days
1218
  *
1219
+ * @param array $days
1220
+ *
1221
+ * @return void
1222
  */
1223
  public static function setWeekendDays($days)
1224
  {
1225
  static::$weekendDays = $days;
1226
  }
1227
 
1228
+ /**
1229
+ * get midday/noon hour
1230
+ *
1231
+ * @return int
1232
+ */
1233
+ public static function getMidDayAt()
1234
+ {
1235
+ return static::$midDayAt;
1236
+ }
1237
+
1238
+ /**
1239
+ * Set midday/noon hour
1240
+ *
1241
+ * @param int $hour midday hour
1242
+ *
1243
+ * @return void
1244
+ */
1245
+ public static function setMidDayAt($hour)
1246
+ {
1247
+ static::$midDayAt = $hour;
1248
+ }
1249
+
1250
  ///////////////////////////////////////////////////////////////////
1251
  ///////////////////////// TESTING AIDS ////////////////////////////
1252
  ///////////////////////////////////////////////////////////////////
1266
  * To clear the test instance call this method using the default
1267
  * parameter of null.
1268
  *
1269
+ * @param \Carbon\Carbon|null $testNow real or mock Carbon instance
1270
  * @param \Carbon\Carbon|string|null $testNow
1271
  */
1272
  public static function setTestNow($testNow = null)
1297
  }
1298
 
1299
  /**
1300
+ * Determine if a time string will produce a relative date.
 
1301
  *
1302
  * @param string $time
1303
  *
1304
+ * @return bool true if time match a relative date, false if absolute or invalid time string
1305
  */
1306
  public static function hasRelativeKeywords($time)
1307
  {
1308
+ if (strtotime($time) === false) {
1309
+ return false;
 
 
 
 
 
1310
  }
1311
 
1312
+ $date1 = new DateTime('2000-01-01T00:00:00Z');
1313
+ $date1->modify($time);
1314
+ $date2 = new DateTime('2001-12-25T00:00:00Z');
1315
+ $date2->modify($time);
1316
+
1317
+ return $date1 != $date2;
1318
  }
1319
 
1320
  ///////////////////////////////////////////////////////////////////
1329
  protected static function translator()
1330
  {
1331
  if (static::$translator === null) {
1332
+ $translator = new Translator('en');
1333
+ $translator->addLoader('array', new ArrayLoader());
1334
+ static::$translator = $translator;
1335
  static::setLocale('en');
1336
  }
1337
 
1352
  * Set the translator instance to use
1353
  *
1354
  * @param \Symfony\Component\Translation\TranslatorInterface $translator
1355
+ *
1356
+ * @return void
1357
  */
1358
  public static function setTranslator(TranslatorInterface $translator)
1359
  {
1373
  /**
1374
  * Set the current translator locale and indicate if the source locale file exists
1375
  *
1376
+ * @param string $locale locale ex. en
1377
  *
1378
  * @return bool
1379
  */
1380
  public static function setLocale($locale)
1381
  {
1382
+ $locale = preg_replace_callback('/[-_]([a-z]{2,})/', function ($matches) {
1383
+ // _2-letters is a region, _3+-letters is a variant
1384
+ return '_'.call_user_func(strlen($matches[1]) > 2 ? 'ucfirst' : 'strtoupper', $matches[1]);
1385
  }, strtolower($locale));
1386
 
1387
  if (file_exists($filename = __DIR__.'/Lang/'.$locale.'.php')) {
1388
+ $translator = static::translator();
1389
+ $translator->setLocale($locale);
1390
+
1391
+ if ($translator instanceof Translator) {
1392
+ // Ensure the locale has been loaded.
1393
+ $translator->addResource('array', require $filename, $locale);
1394
+ }
1395
 
1396
  return true;
1397
  }
1423
  */
1424
  public function formatLocalized($format)
1425
  {
1426
+ // Check for Windows to find and replace the %e modifier correctly.
 
1427
  if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
1428
+ $format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format); // @codeCoverageIgnore
1429
  }
1430
 
1431
+ $formatted = strftime($format, strtotime($this->toDateTimeString()));
1432
 
1433
  return static::$utf8 ? utf8_encode($formatted) : $formatted;
1434
  }
1435
 
1436
  /**
1437
  * Reset the format used to the default when type juggling a Carbon instance to a string
1438
+ *
1439
+ * @return void
1440
  */
1441
  public static function resetToStringFormat()
1442
  {
1447
  * Set the default format used when type juggling a Carbon instance to a string
1448
  *
1449
  * @param string $format
1450
+ *
1451
+ * @return void
1452
  */
1453
  public static function setToStringFormat($format)
1454
  {
1555
  return $this->format(static::RFC822);
1556
  }
1557
 
1558
+ /**
1559
+ * Convert the instance to UTC and return as Zulu ISO8601
1560
+ *
1561
+ * @return string
1562
+ */
1563
+ public function toIso8601ZuluString()
1564
+ {
1565
+ return $this->copy()->setTimezone('UTC')->format('Y-m-d\TH:i:s\Z');
1566
+ }
1567
+
1568
  /**
1569
  * Format the instance as RFC850
1570
  *
1635
  return $this->format(static::W3C);
1636
  }
1637
 
1638
+ /**
1639
+ * Format the instance as RFC7231
1640
+ *
1641
+ * @return string
1642
+ */
1643
+ public function toRfc7231String()
1644
+ {
1645
+ return $this->copy()
1646
+ ->setTimezone('GMT')
1647
+ ->format(static::RFC7231_FORMAT);
1648
+ }
1649
+
1650
+ /**
1651
+ * Get default array representation
1652
+ *
1653
+ * @return array
1654
+ */
1655
+ public function toArray()
1656
+ {
1657
+ return array(
1658
+ 'year' => $this->year,
1659
+ 'month' => $this->month,
1660
+ 'day' => $this->day,
1661
+ 'dayOfWeek' => $this->dayOfWeek,
1662
+ 'dayOfYear' => $this->dayOfYear,
1663
+ 'hour' => $this->hour,
1664
+ 'minute' => $this->minute,
1665
+ 'second' => $this->second,
1666
+ 'micro' => $this->micro,
1667
+ 'timestamp' => $this->timestamp,
1668
+ 'formatted' => $this->format(self::DEFAULT_TO_STRING_FORMAT),
1669
+ 'timezone' => $this->timezone,
1670
+ );
1671
+ }
1672
+
1673
  ///////////////////////////////////////////////////////////////////
1674
  ////////////////////////// COMPARISONS ////////////////////////////
1675
  ///////////////////////////////////////////////////////////////////
1677
  /**
1678
  * Determines if the instance is equal to another
1679
  *
1680
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1681
  *
1682
  * @return bool
1683
  */
1684
+ public function eq($date)
1685
  {
1686
+ return $this == $date;
1687
  }
1688
 
1689
  /**
1690
  * Determines if the instance is equal to another
1691
  *
1692
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1693
  *
1694
  * @see eq()
1695
  *
1696
  * @return bool
1697
  */
1698
+ public function equalTo($date)
1699
  {
1700
+ return $this->eq($date);
1701
  }
1702
 
1703
  /**
1704
  * Determines if the instance is not equal to another
1705
  *
1706
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1707
  *
1708
  * @return bool
1709
  */
1710
+ public function ne($date)
1711
  {
1712
+ return !$this->eq($date);
1713
  }
1714
 
1715
  /**
1716
  * Determines if the instance is not equal to another
1717
  *
1718
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1719
  *
1720
  * @see ne()
1721
  *
1722
  * @return bool
1723
  */
1724
+ public function notEqualTo($date)
1725
  {
1726
+ return $this->ne($date);
1727
  }
1728
 
1729
  /**
1730
  * Determines if the instance is greater (after) than another
1731
  *
1732
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1733
  *
1734
  * @return bool
1735
  */
1736
+ public function gt($date)
1737
  {
1738
+ return $this > $date;
1739
  }
1740
 
1741
  /**
1742
  * Determines if the instance is greater (after) than another
1743
  *
1744
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1745
  *
1746
  * @see gt()
1747
  *
1748
  * @return bool
1749
  */
1750
+ public function greaterThan($date)
1751
  {
1752
+ return $this->gt($date);
1753
  }
1754
 
1755
  /**
1756
  * Determines if the instance is greater (after) than or equal to another
1757
  *
1758
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1759
  *
1760
  * @return bool
1761
  */
1762
+ public function gte($date)
1763
  {
1764
+ return $this >= $date;
1765
  }
1766
 
1767
  /**
1768
  * Determines if the instance is greater (after) than or equal to another
1769
  *
1770
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1771
  *
1772
  * @see gte()
1773
  *
1774
  * @return bool
1775
  */
1776
+ public function greaterThanOrEqualTo($date)
1777
  {
1778
+ return $this->gte($date);
1779
  }
1780
 
1781
  /**
1782
  * Determines if the instance is less (before) than another
1783
  *
1784
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1785
  *
1786
  * @return bool
1787
  */
1788
+ public function lt($date)
1789
  {
1790
+ return $this < $date;
1791
  }
1792
 
1793
  /**
1794
  * Determines if the instance is less (before) than another
1795
  *
1796
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1797
  *
1798
  * @see lt()
1799
  *
1800
  * @return bool
1801
  */
1802
+ public function lessThan($date)
1803
  {
1804
+ return $this->lt($date);
1805
  }
1806
 
1807
  /**
1808
  * Determines if the instance is less (before) or equal to another
1809
  *
1810
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1811
  *
1812
  * @return bool
1813
  */
1814
+ public function lte($date)
1815
  {
1816
+ return $this <= $date;
1817
  }
1818
 
1819
  /**
1820
  * Determines if the instance is less (before) or equal to another
1821
  *
1822
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1823
  *
1824
  * @see lte()
1825
  *
1826
  * @return bool
1827
  */
1828
+ public function lessThanOrEqualTo($date)
1829
  {
1830
+ return $this->lte($date);
1831
  }
1832
 
1833
  /**
1834
  * Determines if the instance is between two others
1835
  *
1836
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1
1837
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2
1838
+ * @param bool $equal Indicates if a > and < comparison should be used or <= or >=
1839
  *
1840
  * @return bool
1841
  */
1842
+ public function between($date1, $date2, $equal = true)
1843
  {
1844
+ if ($date1->gt($date2)) {
1845
+ $temp = $date1;
1846
+ $date1 = $date2;
1847
+ $date2 = $temp;
1848
  }
1849
 
1850
  if ($equal) {
1851
+ return $this->gte($date1) && $this->lte($date2);
1852
  }
1853
 
1854
+ return $this->gt($date1) && $this->lt($date2);
1855
  }
1856
 
1857
  /**
1858
  * Get the closest date from the instance.
1859
  *
1860
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1
1861
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2
1862
  *
1863
  * @return static
1864
  */
1865
+ public function closest($date1, $date2)
1866
  {
1867
+ return $this->diffInSeconds($date1) < $this->diffInSeconds($date2) ? $date1 : $date2;
1868
  }
1869
 
1870
  /**
1871
  * Get the farthest date from the instance.
1872
  *
1873
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1
1874
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2
1875
  *
1876
  * @return static
1877
  */
1878
+ public function farthest($date1, $date2)
1879
  {
1880
+ return $this->diffInSeconds($date1) > $this->diffInSeconds($date2) ? $date1 : $date2;
1881
  }
1882
 
1883
  /**
1884
  * Get the minimum instance between a given instance (default now) and the current instance.
1885
  *
1886
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1887
  *
1888
  * @return static
1889
  */
1890
+ public function min($date = null)
1891
  {
1892
+ $date = $this->resolveCarbon($date);
1893
 
1894
+ return $this->lt($date) ? $this : $date;
1895
  }
1896
 
1897
  /**
1898
  * Get the minimum instance between a given instance (default now) and the current instance.
1899
  *
1900
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1901
  *
1902
  * @see min()
1903
  *
1904
  * @return static
1905
  */
1906
+ public function minimum($date = null)
1907
  {
1908
+ return $this->min($date);
1909
  }
1910
 
1911
  /**
1912
  * Get the maximum instance between a given instance (default now) and the current instance.
1913
  *
1914
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1915
  *
1916
  * @return static
1917
  */
1918
+ public function max($date = null)
1919
  {
1920
+ $date = $this->resolveCarbon($date);
1921
 
1922
+ return $this->gt($date) ? $this : $date;
1923
  }
1924
 
1925
  /**
1926
  * Get the maximum instance between a given instance (default now) and the current instance.
1927
  *
1928
+ * @param \Carbon\Carbon|\DateTimeInterface|mixed $date
1929
  *
1930
  * @see max()
1931
  *
1932
  * @return static
1933
  */
1934
+ public function maximum($date = null)
1935
  {
1936
+ return $this->max($date);
1937
  }
1938
 
1939
  /**
1973
  */
1974
  public function isToday()
1975
  {
1976
+ return $this->toDateString() === $this->nowWithSameTz()->toDateString();
1977
  }
1978
 
1979
  /**
1993
  */
1994
  public function isNextWeek()
1995
  {
1996
+ return $this->weekOfYear === $this->nowWithSameTz()->addWeek()->weekOfYear;
1997
  }
1998
 
1999
  /**
2003
  */
2004
  public function isLastWeek()
2005
  {
2006
+ return $this->weekOfYear === $this->nowWithSameTz()->subWeek()->weekOfYear;
2007
  }
2008
 
2009
  /**
2013
  */
2014
  public function isNextMonth()
2015
  {
2016
+ return $this->month === $this->nowWithSameTz()->addMonthNoOverflow()->month;
2017
  }
2018
 
2019
  /**
2023
  */
2024
  public function isLastMonth()
2025
  {
2026
+ return $this->month === $this->nowWithSameTz()->subMonthNoOverflow()->month;
2027
  }
2028
 
2029
  /**
2033
  */
2034
  public function isNextYear()
2035
  {
2036
+ return $this->year === $this->nowWithSameTz()->addYear()->year;
2037
  }
2038
 
2039
  /**
2043
  */
2044
  public function isLastYear()
2045
  {
2046
+ return $this->year === $this->nowWithSameTz()->subYear()->year;
2047
  }
2048
 
2049
  /**
2053
  */
2054
  public function isFuture()
2055
  {
2056
+ return $this->gt($this->nowWithSameTz());
2057
  }
2058
 
2059
  /**
2063
  */
2064
  public function isPast()
2065
  {
2066
+ return $this->lt($this->nowWithSameTz());
2067
  }
2068
 
2069
  /**
2088
  return static::create($this->year, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === 53;
2089
  }
2090
 
2091
+ /**
2092
  * Compares the formatted values of the two dates.
2093
  *
2094
+ * @param string $format The date formats to compare.
2095
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day.
2096
+ *
2097
+ * @throws \InvalidArgumentException
2098
  *
2099
  * @return bool
2100
  */
2101
+ public function isSameAs($format, $date = null)
2102
  {
2103
+ $date = $date ?: static::now($this->tz);
2104
+
2105
+ if (!($date instanceof DateTime) && !($date instanceof DateTimeInterface)) {
2106
+ throw new InvalidArgumentException('Expected DateTime (or instanceof) object as argument.');
2107
+ }
2108
 
2109
+ return $this->format($format) === $date->format($format);
2110
  }
2111
 
2112
  /**
2122
  /**
2123
  * Checks if the passed in date is in the same year as the instance year.
2124
  *
2125
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day.
2126
  *
2127
  * @return bool
2128
  */
2129
+ public function isSameYear($date = null)
2130
  {
2131
+ return $this->isSameAs('Y', $date);
2132
  }
2133
 
2134
  /**
2144
  /**
2145
  * Checks if the passed in date is in the same month as the instance month (and year if needed).
2146
  *
2147
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day.
2148
+ * @param bool $ofSameYear Check if it is the same month in the same year.
2149
  *
2150
  * @return bool
2151
  */
2152
+ public function isSameMonth($date = null, $ofSameYear = false)
2153
  {
2154
+ return $this->isSameAs($ofSameYear ? 'Y-m' : 'm', $date);
 
 
2155
  }
2156
 
2157
  /**
2158
  * Checks if the passed in date is the same day as the instance current day.
2159
  *
2160
+ * @param \Carbon\Carbon|\DateTimeInterface $date
2161
+ *
2162
+ * @return bool
2163
+ */
2164
+ public function isSameDay($date)
2165
+ {
2166
+ return $this->isSameAs('Y-m-d', $date);
2167
+ }
2168
+
2169
+ /**
2170
+ * Checks if this day is a specific day of the week.
2171
+ *
2172
+ * @param int $dayOfWeek
2173
  *
2174
  * @return bool
2175
  */
2176
+ public function isDayOfWeek($dayOfWeek)
2177
  {
2178
+ return $this->dayOfWeek === $dayOfWeek;
2179
  }
2180
 
2181
  /**
2248
  return $this->dayOfWeek === static::SATURDAY;
2249
  }
2250
 
2251
+ /**
2252
+ * Checks if the (date)time string is in a given format.
2253
+ *
2254
+ * @param string $date
2255
+ * @param string $format
2256
+ *
2257
+ * @return bool
2258
+ */
2259
+ public static function hasFormat($date, $format)
2260
+ {
2261
+ try {
2262
+ // Try to create a DateTime object. Throws an InvalidArgumentException if the provided time string
2263
+ // doesn't match the format in any way.
2264
+ static::createFromFormat($format, $date);
2265
+
2266
+ // createFromFormat() is known to handle edge cases silently.
2267
+ // E.g. "1975-5-1" (Y-n-j) will still be parsed correctly when "Y-m-d" is supplied as the format.
2268
+ // To ensure we're really testing against our desired format, perform an additional regex validation.
2269
+ $regex = strtr(
2270
+ preg_quote($format, '/'),
2271
+ static::$regexFormats
2272
+ );
2273
+
2274
+ return (bool) preg_match('/^'.$regex.'$/', $date);
2275
+ } catch (InvalidArgumentException $e) {
2276
+ }
2277
+
2278
+ return false;
2279
+ }
2280
+
2281
  ///////////////////////////////////////////////////////////////////
2282
  /////////////////// ADDITIONS AND SUBTRACTIONS ////////////////////
2283
  ///////////////////////////////////////////////////////////////////
2292
  */
2293
  public function addYears($value)
2294
  {
2295
+ if ($this->shouldOverflowYears()) {
2296
+ return $this->addYearsWithOverflow($value);
2297
+ }
2298
+
2299
+ return $this->addYearsNoOverflow($value);
2300
  }
2301
 
2302
  /**
2311
  return $this->addYears($value);
2312
  }
2313
 
2314
+ /**
2315
+ * Add years to the instance with no overflow of months
2316
+ * Positive $value travel forward while
2317
+ * negative $value travel into the past.
2318
+ *
2319
+ * @param int $value
2320
+ *
2321
+ * @return static
2322
+ */
2323
+ public function addYearsNoOverflow($value)
2324
+ {
2325
+ return $this->addMonthsNoOverflow($value * static::MONTHS_PER_YEAR);
2326
+ }
2327
+
2328
+ /**
2329
+ * Add year with overflow months set to false
2330
+ *
2331
+ * @param int $value
2332
+ *
2333
+ * @return static
2334
+ */
2335
+ public function addYearNoOverflow($value = 1)
2336
+ {
2337
+ return $this->addYearsNoOverflow($value);
2338
+ }
2339
+
2340
+ /**
2341
+ * Add years to the instance.
2342
+ * Positive $value travel forward while
2343
+ * negative $value travel into the past.
2344
+ *
2345
+ * @param int $value
2346
+ *
2347
+ * @return static
2348
+ */
2349
+ public function addYearsWithOverflow($value)
2350
+ {
2351
+ return $this->modify((int) $value.' year');
2352
+ }
2353
+
2354
+ /**
2355
+ * Add year with overflow.
2356
+ *
2357
+ * @param int $value
2358
+ *
2359
+ * @return static
2360
+ */
2361
+ public function addYearWithOverflow($value = 1)
2362
+ {
2363
+ return $this->addYearsWithOverflow($value);
2364
+ }
2365
+
2366
  /**
2367
  * Remove a year from the instance
2368
  *
2387
  return $this->addYears(-1 * $value);
2388
  }
2389
 
2390
+ /**
2391
+ * Remove year from the instance with no month overflow
2392
+ *
2393
+ * @param int $value
2394
+ *
2395
+ * @return static
2396
+ */
2397
+ public function subYearNoOverflow($value = 1)
2398
+ {
2399
+ return $this->subYearsNoOverflow($value);
2400
+ }
2401
+
2402
+ /**
2403
+ * Remove years from the instance with no month overflow.
2404
+ *
2405
+ * @param int $value
2406
+ *
2407
+ * @return static
2408
+ */
2409
+ public function subYearsNoOverflow($value)
2410
+ {
2411
+ return $this->subMonthsNoOverflow($value * static::MONTHS_PER_YEAR);
2412
+ }
2413
+
2414
+ /**
2415
+ * Remove year from the instance.
2416
+ *
2417
+ * @param int $value
2418
+ *
2419
+ * @return static
2420
+ */
2421
+ public function subYearWithOverflow($value = 1)
2422
+ {
2423
+ return $this->subYearsWithOverflow($value);
2424
+ }
2425
+
2426
+ /**
2427
+ * Remove years from the instance.
2428
+ *
2429
+ * @param int $value
2430
+ *
2431
+ * @return static
2432
+ */
2433
+ public function subYearsWithOverflow($value)
2434
+ {
2435
+ return $this->subMonthsWithOverflow($value * static::MONTHS_PER_YEAR);
2436
+ }
2437
+
2438
  /**
2439
  * Add quarters to the instance. Positive $value travels forward while
2440
  * negative $value travels into the past.
2751
  */
2752
  public function addWeekdays($value)
2753
  {
2754
+ // Fix for weekday bug https://bugs.php.net/bug.php?id=54909
2755
  $t = $this->toTimeString();
2756
  $this->modify((int) $value.' weekday');
2757
 
2967
  }
2968
 
2969
  /**
2970
+ * Remove seconds from the instance
2971
  *
2972
  * @param int $value
2973
  *
2974
  * @return static
2975
  */
2976
+ public function subSeconds($value)
2977
  {
2978
+ return $this->addSeconds(-1 * $value);
2979
  }
2980
 
2981
  /**
2982
+ * Remove a second from the instance
2983
  *
2984
  * @param int $value
2985
  *
2986
  * @return static
2987
  */
2988
+ public function subSecond($value = 1)
2989
  {
2990
+ return $this->subSeconds($value);
2991
  }
2992
 
2993
  ///////////////////////////////////////////////////////////////////
2997
  /**
2998
  * Get the difference in years
2999
  *
3000
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date
3001
+ * @param bool $absolute Get the absolute of the difference
3002
  *
3003
  * @return int
3004
  */
3005
+ public function diffInYears($date = null, $absolute = true)
3006
  {
3007
+ return (int) $this->diff($this->resolveCarbon($date), $absolute)->format('%r%y');
 
 
3008
  }
3009
 
3010
  /**
3011
  * Get the difference in months
3012
  *
3013
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date
3014
+ * @param bool $absolute Get the absolute of the difference
3015
  *
3016
  * @return int
3017
  */
3018
+ public function diffInMonths($date = null, $absolute = true)
3019
  {
3020
+ $date = $this->resolveCarbon($date);
3021
 
3022
+ return $this->diffInYears($date, $absolute) * static::MONTHS_PER_YEAR + (int) $this->diff($date, $absolute)->format('%r%m');
3023
  }
3024
 
3025
  /**
3026
  * Get the difference in weeks
3027
  *
3028
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date
3029
+ * @param bool $absolute Get the absolute of the difference
3030
  *
3031
  * @return int
3032
  */
3033
+ public function diffInWeeks($date = null, $absolute = true)
3034
  {
3035
+ return (int) ($this->diffInDays($date, $absolute) / static::DAYS_PER_WEEK);
3036
  }
3037
 
3038
  /**
3039
  * Get the difference in days
3040
  *
3041
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date
3042
+ * @param bool $absolute Get the absolute of the difference
3043
  *
3044
  * @return int
3045
  */
3046
+ public function diffInDays($date = null, $absolute = true)
3047
  {
3048
+ return (int) $this->diff($this->resolveCarbon($date), $absolute)->format('%r%a');
 
 
3049
  }
3050
 
3051
  /**
3052
  * Get the difference in days using a filter closure
3053
  *
3054
  * @param Closure $callback
3055
+ * @param \Carbon\Carbon|null $date
3056
+ * @param bool $absolute Get the absolute of the difference
3057
  *
3058
  * @return int
3059
  */
3060
+ public function diffInDaysFiltered(Closure $callback, $date = null, $absolute = true)
3061
  {
3062
+ return $this->diffFiltered(CarbonInterval::day(), $callback, $date, $absolute);
3063
  }
3064
 
3065
  /**
3066
  * Get the difference in hours using a filter closure
3067
  *
3068
  * @param Closure $callback
3069
+ * @param \Carbon\Carbon|null $date
3070
+ * @param bool $absolute Get the absolute of the difference
3071
  *
3072
  * @return int
3073
  */
3074
+ public function diffInHoursFiltered(Closure $callback, $date = null, $absolute = true)
3075
  {
3076
+ return $this->diffFiltered(CarbonInterval::hour(), $callback, $date, $absolute);
3077
  }
3078
 
3079
  /**
3081
  *
3082
  * @param CarbonInterval $ci An interval to traverse by
3083
  * @param Closure $callback
3084
+ * @param Carbon|null $date
3085
+ * @param bool $absolute Get the absolute of the difference
3086
  *
3087
  * @return int
3088
  */
3089
+ public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, $absolute = true)
3090
  {
3091
  $start = $this;
3092
+ $end = $this->resolveCarbon($date);
3093
  $inverse = false;
3094
 
3095
  if ($end < $start) {
3099
  }
3100
 
3101
  $period = new DatePeriod($start, $ci, $end);
3102
+ $values = array_filter(iterator_to_array($period), function (DateTime $date) use ($callback) {
3103
  return call_user_func($callback, Carbon::instance($date));
3104
  });
3105
 
3106
+ $diff = count($values);
3107
 
3108
+ return $inverse && !$absolute ? -$diff : $diff;
3109
  }
3110
 
3111
  /**
3112
  * Get the difference in weekdays
3113
  *
3114
+ * @param \Carbon\Carbon|null $date
3115
+ * @param bool $absolute Get the absolute of the difference
3116
  *
3117
  * @return int
3118
  */
3119
+ public function diffInWeekdays($date = null, $absolute = true)
3120
  {
3121
  return $this->diffInDaysFiltered(function (Carbon $date) {
3122
  return $date->isWeekday();
3123
+ }, $date, $absolute);
3124
  }
3125
 
3126
  /**
3127
  * Get the difference in weekend days using a filter
3128
  *
3129
+ * @param \Carbon\Carbon|null $date
3130
+ * @param bool $absolute Get the absolute of the difference
3131
  *
3132
  * @return int
3133
  */
3134
+ public function diffInWeekendDays($date = null, $absolute = true)
3135
  {
3136
  return $this->diffInDaysFiltered(function (Carbon $date) {
3137
  return $date->isWeekend();
3138
+ }, $date, $absolute);
3139
  }
3140
 
3141
  /**
3142
  * Get the difference in hours
3143
  *
3144
+ * @param \Carbon\Carbon|null $date
3145
+ * @param bool $absolute Get the absolute of the difference
3146
  *
3147
  * @return int
3148
  */
3149
+ public function diffInHours($date = null, $absolute = true)
3150
  {
3151
+ return (int) ($this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR);
3152
  }
3153
 
3154
  /**
3155
  * Get the difference in minutes
3156
  *
3157
+ * @param \Carbon\Carbon|null $date
3158
+ * @param bool $absolute Get the absolute of the difference
3159
  *
3160
  * @return int
3161
  */
3162
+ public function diffInMinutes($date = null, $absolute = true)
3163
  {
3164
+ return (int) ($this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE);
3165
  }
3166
 
3167
  /**
3168
  * Get the difference in seconds
3169
  *
3170
+ * @param \Carbon\Carbon|null $date
3171
+ * @param bool $absolute Get the absolute of the difference
3172
  *
3173
  * @return int
3174
  */
3175
+ public function diffInSeconds($date = null, $absolute = true)
3176
  {
3177
+ $diff = $this->diff($this->resolveCarbon($date));
3178
+ $value = $diff->days * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE +
3179
+ $diff->h * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE +
3180
+ $diff->i * static::SECONDS_PER_MINUTE +
3181
+ $diff->s;
3182
 
3183
+ return $absolute || !$diff->invert ? $value : -$value;
3184
  }
3185
 
3186
  /**
3194
  }
3195
 
3196
  /**
3197
+ * The number of seconds until 23:59:59.
3198
  *
3199
  * @return int
3200
  */
3225
  * @param Carbon|null $other
3226
  * @param bool $absolute removes time difference modifiers ago, after, etc
3227
  * @param bool $short displays short format of time units
3228
+ * @param int $parts displays number of parts in the interval
3229
  *
3230
  * @return string
3231
  */
3232
+ public function diffForHumans(self $other = null, $absolute = false, $short = false, $parts = 1)
3233
  {
3234
  $isNow = $other === null;
3235
+ $interval = array();
3236
+
3237
+ $parts = min(6, max(1, (int) $parts));
3238
+ $count = 1;
3239
+ $unit = $short ? 's' : 'second';
3240
 
3241
  if ($isNow) {
3242
+ $other = $this->nowWithSameTz();
3243
  }
3244
 
3245
  $diffInterval = $this->diff($other);
3246
 
3247
+ $diffIntervalArray = array(
3248
+ array('value' => $diffInterval->y, 'unit' => 'year', 'unitShort' => 'y'),
3249
+ array('value' => $diffInterval->m, 'unit' => 'month', 'unitShort' => 'm'),
3250
+ array('value' => $diffInterval->d, 'unit' => 'day', 'unitShort' => 'd'),
3251
+ array('value' => $diffInterval->h, 'unit' => 'hour', 'unitShort' => 'h'),
3252
+ array('value' => $diffInterval->i, 'unit' => 'minute', 'unitShort' => 'min'),
3253
+ array('value' => $diffInterval->s, 'unit' => 'second', 'unitShort' => 's'),
3254
+ );
 
 
3255
 
3256
+ foreach ($diffIntervalArray as $diffIntervalData) {
3257
+ if ($diffIntervalData['value'] > 0) {
3258
+ $unit = $short ? $diffIntervalData['unitShort'] : $diffIntervalData['unit'];
3259
+ $count = $diffIntervalData['value'];
3260
 
3261
+ if ($diffIntervalData['unit'] === 'day' && $count >= static::DAYS_PER_WEEK) {
3262
  $unit = $short ? 'w' : 'week';
3263
  $count = (int) ($count / static::DAYS_PER_WEEK);
 
 
3264
 
3265
+ $interval[] = static::translator()->transChoice($unit, $count, array(':count' => $count));
 
 
 
3266
 
3267
+ // get the count days excluding weeks (might be zero)
3268
+ $numOfDaysCount = (int) ($diffIntervalData['value'] - ($count * static::DAYS_PER_WEEK));
 
 
3269
 
3270
+ if ($numOfDaysCount > 0 && count($interval) < $parts) {
3271
+ $unit = $short ? 'd' : 'day';
3272
+ $count = $numOfDaysCount;
3273
+ $interval[] = static::translator()->transChoice($unit, $count, array(':count' => $count));
3274
+ }
3275
+ } else {
3276
+ $interval[] = static::translator()->transChoice($unit, $count, array(':count' => $count));
3277
+ }
3278
+ }
3279
+
3280
+ // break the loop after we get the required number of parts in array
3281
+ if (count($interval) >= $parts) {
3282
  break;
3283
+ }
3284
  }
3285
 
3286
+ if (count($interval) === 0) {
3287
  $count = 1;
3288
+ $unit = $short ? 's' : 'second';
3289
+ $interval[] = static::translator()->transChoice($unit, $count, array(':count' => $count));
3290
  }
3291
 
3292
+ // join the interval parts by a space
3293
+ $time = implode(' ', $interval);
3294
+
3295
+ unset($diffIntervalArray, $interval);
3296
 
3297
  if ($absolute) {
3298
  return $time;
3302
 
3303
  $transId = $isNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before');
3304
 
3305
+ if ($parts === 1) {
3306
+ // Some langs have special pluralization for past and future tense.
3307
+ $key = $unit.'_'.$transId;
3308
+ $count = isset($count) ? $count : 1;
3309
+ if ($key !== static::translator()->transChoice($key, $count)) {
3310
+ $time = static::translator()->transChoice($key, $count, array(':count' => $count));
3311
+ }
3312
  }
3313
 
3314
  return static::translator()->trans($transId, array(':time' => $time));
3319
  ///////////////////////////////////////////////////////////////////
3320
 
3321
  /**
3322
+ * Resets the time to 00:00:00 start of day
3323
  *
3324
  * @return static
3325
  */
3329
  }
3330
 
3331
  /**
3332
+ * Resets the time to 23:59:59 end of day
3333
  *
3334
  * @return static
3335
  */
3476
  return $this->endOfDay();
3477
  }
3478
 
3479
+ /**
3480
+ * Modify to start of current hour, minutes and seconds become 0
3481
+ *
3482
+ * @return static
3483
+ */
3484
+ public function startOfHour()
3485
+ {
3486
+ return $this->setTime($this->hour, 0, 0);
3487
+ }
3488
+
3489
+ /**
3490
+ * Modify to end of current hour, minutes and seconds become 59
3491
+ *
3492
+ * @return static
3493
+ */
3494
+ public function endOfHour()
3495
+ {
3496
+ return $this->setTime($this->hour, 59, 59);
3497
+ }
3498
+
3499
+ /**
3500
+ * Modify to start of current minute, seconds become 0
3501
+ *
3502
+ * @return static
3503
+ */
3504
+ public function startOfMinute()
3505
+ {
3506
+ return $this->setTime($this->hour, $this->minute, 0);
3507
+ }
3508
+
3509
+ /**
3510
+ * Modify to end of current minute, seconds become 59
3511
+ *
3512
+ * @return static
3513
+ */
3514
+ public function endOfMinute()
3515
+ {
3516
+ return $this->setTime($this->hour, $this->minute, 59);
3517
+ }
3518
+
3519
+ /**
3520
+ * Modify to midday, default to self::$midDayAt
3521
+ *
3522
+ * @return static
3523
+ */
3524
+ public function midDay()
3525
+ {
3526
+ return $this->setTime(self::$midDayAt, 0, 0);
3527
+ }
3528
+
3529
  /**
3530
  * Modify to the next occurrence of a given day of the week.
3531
  * If no dayOfWeek is provided, modify to the next occurrence
3551
  * @param bool $weekday
3552
  * @param bool $forward
3553
  *
3554
+ * @return $this
3555
  */
3556
  private function nextOrPreviousDay($weekday = true, $forward = true)
3557
  {
3577
  /**
3578
  * Go backward to the previous weekday.
3579
  *
3580
+ * @return $this
3581
  */
3582
  public function previousWeekday()
3583
  {
3587
  /**
3588
  * Go forward to the next weekend day.
3589
  *
3590
+ * @return $this
3591
  */
3592
  public function nextWeekendDay()
3593
  {
3597
  /**
3598
  * Go backward to the previous weekend day.
3599
  *
3600
+ * @return $this
3601
  */
3602
  public function previousWeekendDay()
3603
  {
3678
  */
3679
  public function nthOfMonth($nth, $dayOfWeek)
3680
  {
3681
+ $date = $this->copy()->firstOfMonth();
3682
+ $check = $date->format('Y-m');
3683
+ $date->modify('+'.$nth.' '.static::$days[$dayOfWeek]);
3684
 
3685
+ return $date->format('Y-m') === $check ? $this->modify($date) : false;
3686
  }
3687
 
3688
  /**
3691
  * first day of the current quarter. Use the supplied constants
3692
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3693
  *
3694
+ * @param int|null $dayOfWeek day of the week default null
3695
  *
3696
  * @return static
3697
  */
3706
  * last day of the current quarter. Use the supplied constants
3707
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3708
  *
3709
+ * @param int|null $dayOfWeek day of the week default null
3710
  *
3711
  * @return static
3712
  */
3728
  */
3729
  public function nthOfQuarter($nth, $dayOfWeek)
3730
  {
3731
+ $date = $this->copy()->day(1)->month($this->quarter * static::MONTHS_PER_QUARTER);
3732
+ $lastMonth = $date->month;
3733
+ $year = $date->year;
3734
+ $date->firstOfQuarter()->modify('+'.$nth.' '.static::$days[$dayOfWeek]);
3735
 
3736
+ return ($lastMonth < $date->month || $year !== $date->year) ? false : $this->modify($date);
3737
  }
3738
 
3739
  /**
3742
  * first day of the current year. Use the supplied constants
3743
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3744
  *
3745
+ * @param int|null $dayOfWeek day of the week default null
3746
  *
3747
  * @return static
3748
  */
3757
  * last day of the current year. Use the supplied constants
3758
  * to indicate the desired dayOfWeek, ex. static::MONDAY.
3759
  *
3760
+ * @param int|null $dayOfWeek day of the week default null
3761
  *
3762
  * @return static
3763
  */
3779
  */
3780
  public function nthOfYear($nth, $dayOfWeek)
3781
  {
3782
+ $date = $this->copy()->firstOfYear()->modify('+'.$nth.' '.static::$days[$dayOfWeek]);
3783
 
3784
+ return $this->year === $date->year ? $this->modify($date) : false;
3785
  }
3786
 
3787
  /**
3788
  * Modify the current instance to the average of a given instance (default now) and the current instance.
3789
  *
3790
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date
3791
  *
3792
  * @return static
3793
  */
3794
+ public function average($date = null)
3795
  {
3796
+ return $this->addSeconds((int) ($this->diffInSeconds($this->resolveCarbon($date), false) / 2));
 
 
3797
  }
3798
 
3799
  /**
3800
  * Check if its the birthday. Compares the date/month values of the two dates.
3801
  *
3802
+ * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day.
3803
  *
3804
  * @return bool
3805
  */
3806
+ public function isBirthday($date = null)
3807
  {
3808
+ return $this->isSameAs('md', $date);
3809
  }
3810
 
3811
  /**
3812
+ * Check if today is the last day of the Month
3813
  *
3814
+ * @return bool
 
 
3815
  */
3816
+ public function isLastOfMonth()
3817
  {
3818
+ return $this->day === $this->daysInMonth;
 
 
 
 
 
 
 
 
 
3819
  }
3820
 
3821
  /**
3829
  }
3830
 
3831
  /**
3832
+ * Create an instance from a serialized string.
3833
  *
3834
  * @param string $value
3835
  *
3847
 
3848
  return $instance;
3849
  }
3850
+
3851
+ /**
3852
+ * The __set_state handler.
3853
+ *
3854
+ * @param array $array
3855
+ *
3856
+ * @return static
3857
+ */
3858
+ public static function __set_state($array)
3859
+ {
3860
+ return static::instance(parent::__set_state($array));
3861
+ }
3862
  }
src/common/lib/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php CHANGED
@@ -47,21 +47,21 @@ use Symfony\Component\Translation\TranslatorInterface;
47
  * @method static CarbonInterval minute($minutes = 1) Alias for minutes()
48
  * @method static CarbonInterval seconds($seconds = 1) Create instance specifying a number of seconds.
49
  * @method static CarbonInterval second($seconds = 1) Alias for seconds()
50
- * @method CarbonInterval years() years($years = 1) Set the years portion of the current interval.
51
- * @method CarbonInterval year() year($years = 1) Alias for years().
52
- * @method CarbonInterval months() months($months = 1) Set the months portion of the current interval.
53
- * @method CarbonInterval month() month($months = 1) Alias for months().
54
- * @method CarbonInterval weeks() weeks($weeks = 1) Set the weeks portion of the current interval. Will overwrite dayz value.
55
- * @method CarbonInterval week() week($weeks = 1) Alias for weeks().
56
- * @method CarbonInterval days() days($days = 1) Set the days portion of the current interval.
57
- * @method CarbonInterval dayz() dayz($days = 1) Alias for days().
58
- * @method CarbonInterval day() day($days = 1) Alias for days().
59
- * @method CarbonInterval hours() hours($hours = 1) Set the hours portion of the current interval.
60
- * @method CarbonInterval hour() hour($hours = 1) Alias for hours().
61
- * @method CarbonInterval minutes() minutes($minutes = 1) Set the minutes portion of the current interval.
62
- * @method CarbonInterval minute() minute($minutes = 1) Alias for minutes().
63
- * @method CarbonInterval seconds() seconds($seconds = 1) Set the seconds portion of the current interval.
64
- * @method CarbonInterval second() second($seconds = 1) Alias for seconds().
65
  */
66
  class CarbonInterval extends DateInterval
67
  {
@@ -249,8 +249,9 @@ class CarbonInterval extends DateInterval
249
  protected static function translator()
250
  {
251
  if (static::$translator === null) {
252
- static::$translator = new Translator('en');
253
- static::$translator->addLoader('array', new ArrayLoader());
 
254
  static::setLocale('en');
255
  }
256
 
@@ -294,10 +295,13 @@ class CarbonInterval extends DateInterval
294
  */
295
  public static function setLocale($locale)
296
  {
297
- static::translator()->setLocale($locale);
 
298
 
299
- // Ensure the locale has been loaded.
300
- static::translator()->addResource('array', require __DIR__.'/Lang/'.$locale.'.php', $locale);
 
 
301
  }
302
 
303
  ///////////////////////////////////////////////////////////////////
@@ -478,7 +482,7 @@ class CarbonInterval extends DateInterval
478
  $parts = array();
479
  foreach ($periods as $unit => $count) {
480
  if ($count > 0) {
481
- array_push($parts, static::translator()->transChoice($unit, $count, array(':count' => $count)));
482
  }
483
  }
484
 
@@ -554,4 +558,26 @@ class CarbonInterval extends DateInterval
554
 
555
  return $specString === static::PERIOD_PREFIX ? 'PT0S' : $specString;
556
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
557
  }
47
  * @method static CarbonInterval minute($minutes = 1) Alias for minutes()
48
  * @method static CarbonInterval seconds($seconds = 1) Create instance specifying a number of seconds.
49
  * @method static CarbonInterval second($seconds = 1) Alias for seconds()
50
+ * @method CarbonInterval years($years = 1) Set the years portion of the current interval.
51
+ * @method CarbonInterval year($years = 1) Alias for years().
52
+ * @method CarbonInterval months($months = 1) Set the months portion of the current interval.
53
+ * @method CarbonInterval month($months = 1) Alias for months().
54
+ * @method CarbonInterval weeks($weeks = 1) Set the weeks portion of the current interval. Will overwrite dayz value.
55
+ * @method CarbonInterval week($weeks = 1) Alias for weeks().
56
+ * @method CarbonInterval days($days = 1) Set the days portion of the current interval.
57
+ * @method CarbonInterval dayz($days = 1) Alias for days().
58
+ * @method CarbonInterval day($days = 1) Alias for days().
59
+ * @method CarbonInterval hours($hours = 1) Set the hours portion of the current interval.
60
+ * @method CarbonInterval hour($hours = 1) Alias for hours().
61
+ * @method CarbonInterval minutes($minutes = 1) Set the minutes portion of the current interval.
62
+ * @method CarbonInterval minute($minutes = 1) Alias for minutes().
63
+ * @method CarbonInterval seconds($seconds = 1) Set the seconds portion of the current interval.
64
+ * @method CarbonInterval second($seconds = 1) Alias for seconds().
65
  */
66
  class CarbonInterval extends DateInterval
67
  {
249
  protected static function translator()
250
  {
251
  if (static::$translator === null) {
252
+ $translator = new Translator('en');
253
+ $translator->addLoader('array', new ArrayLoader());
254
+ static::$translator = $translator;
255
  static::setLocale('en');
256
  }
257
 
295
  */
296
  public static function setLocale($locale)
297
  {
298
+ $translator = static::translator();
299
+ $translator->setLocale($locale);
300
 
301
+ if ($translator instanceof Translator) {
302
+ // Ensure the locale has been loaded.
303
+ $translator->addResource('array', require __DIR__.'/Lang/'.$locale.'.php', $locale);
304
+ }
305
  }
306
 
307
  ///////////////////////////////////////////////////////////////////
482
  $parts = array();
483
  foreach ($periods as $unit => $count) {
484
  if ($count > 0) {
485
+ $parts[] = static::translator()->transChoice($unit, $count, array(':count' => $count));
486
  }
487
  }
488
 
558
 
559
  return $specString === static::PERIOD_PREFIX ? 'PT0S' : $specString;
560
  }
561
+
562
+ /**
563
+ * Comparing with passed interval
564
+ *
565
+ * @param DateInterval $interval
566
+ *
567
+ * @return int
568
+ */
569
+ public function compare(DateInterval $interval)
570
+ {
571
+ $current = Carbon::now();
572
+ $passed = $current->copy()->add($interval);
573
+ $current->add($this);
574
+
575
+ if ($current < $passed) {
576
+ return -1;
577
+ } elseif ($current > $passed) {
578
+ return 1;
579
+ }
580
+
581
+ return 0;
582
+ }
583
  }
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ar.php CHANGED
@@ -14,8 +14,8 @@ return array(
14
  'y' => '{0}سنة|{1}سنة|{2}سنتين|[3,10]:count سنوات|[11,Inf]:count سنة',
15
  'month' => '{0}شهر|{1} شهر|{2}شهرين|[3,10]:count أشهر|[11,Inf]:count شهر',
16
  'm' => '{0}شهر|{1} شهر|{2}شهرين|[3,10]:count أشهر|[11,Inf]:count شهر',
17
- 'week' => '{0}إسبوع|{1}إسبوع|{2}إسبوعين|[3,10]:count أسابيع|[11,Inf]:count إسبوع',
18
- 'w' => '{0}إسبوع|{1}إسبوع|{2}إسبوعين|[3,10]:count أسابيع|[11,Inf]:count إسبوع',
19
  'day' => '{0}يوم|{1}يوم|{2}يومين|[3,10]:count أيام|[11,Inf] يوم',
20
  'd' => '{0}يوم|{1}يوم|{2}يومين|[3,10]:count أيام|[11,Inf] يوم',
21
  'hour' => '{0}ساعة|{1}ساعة|{2}ساعتين|[3,10]:count ساعات|[11,Inf]:count ساعة',
@@ -25,7 +25,7 @@ return array(
25
  'second' => '{0}ثانية|{1}ثانية|{2}ثانيتين|[3,10]:count ثوان|[11,Inf]:count ثانية',
26
  's' => '{0}ثانية|{1}ثانية|{2}ثانيتين|[3,10]:count ثوان|[11,Inf]:count ثانية',
27
  'ago' => 'منذ :time',
28
- 'from_now' => 'من الآن :time',
29
  'after' => 'بعد :time',
30
  'before' => 'قبل :time',
31
  );
14
  'y' => '{0}سنة|{1}سنة|{2}سنتين|[3,10]:count سنوات|[11,Inf]:count سنة',
15
  'month' => '{0}شهر|{1} شهر|{2}شهرين|[3,10]:count أشهر|[11,Inf]:count شهر',
16
  'm' => '{0}شهر|{1} شهر|{2}شهرين|[3,10]:count أشهر|[11,Inf]:count شهر',
17
+ 'week' => '{0}أسبوع|{1}أسبوع|{2}أسبوعين|[3,10]:count أسابيع|[11,Inf]:count أسبوع',
18
+ 'w' => '{0}أسبوع|{1}أسبوع|{2}أسبوعين|[3,10]:count أسابيع|[11,Inf]:count أسبوع',
19
  'day' => '{0}يوم|{1}يوم|{2}يومين|[3,10]:count أيام|[11,Inf] يوم',
20
  'd' => '{0}يوم|{1}يوم|{2}يومين|[3,10]:count أيام|[11,Inf] يوم',
21
  'hour' => '{0}ساعة|{1}ساعة|{2}ساعتين|[3,10]:count ساعات|[11,Inf]:count ساعة',
25
  'second' => '{0}ثانية|{1}ثانية|{2}ثانيتين|[3,10]:count ثوان|[11,Inf]:count ثانية',
26
  's' => '{0}ثانية|{1}ثانية|{2}ثانيتين|[3,10]:count ثوان|[11,Inf]:count ثانية',
27
  'ago' => 'منذ :time',
28
+ 'from_now' => ':time من الآن',
29
  'after' => 'بعد :time',
30
  'before' => 'قبل :time',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Carbon package.
5
+ *
6
+ * (c) Brian Nesbitt <brian@nesbot.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ return array(
13
+ 'year' => '[0,1] سَنَة|{2} سَنَتَيْن|[3,10]:count سَنَوَات|[11,Inf]:count سَنَة',
14
+ 'y' => '[0,1] سَنَة|{2} سَنَتَيْن|[3,10]:count سَنَوَات|[11,Inf]:count سَنَة',
15
+ 'month' => '[0,1] شَهْرَ|{2} شَهْرَيْن|[3,10]:count أَشْهُر|[11,Inf]:count شَهْرَ',
16
+ 'm' => '[0,1] شَهْرَ|{2} شَهْرَيْن|[3,10]:count أَشْهُر|[11,Inf]:count شَهْرَ',
17
+ 'week' => '[0,1] أُسْبُوع|{2} أُسْبُوعَيْن|[3,10]:count أَسَابِيع|[11,Inf]:count أُسْبُوع',
18
+ 'w' => '[0,1] أُسْبُوع|{2} أُسْبُوعَيْن|[3,10]:count أَسَابِيع|[11,Inf]:count أُسْبُوع',
19
+ 'day' => '[0,1] يَوْم|{2} يَوْمَيْن|[3,10]:count أَيَّام|[11,Inf] يَوْم',
20
+ 'd' => '[0,1] يَوْم|{2} يَوْمَيْن|[3,10]:count أَيَّام|[11,Inf] يَوْم',
21
+ 'hour' => '[0,1] سَاعَة|{2} سَاعَتَيْن|[3,10]:count سَاعَات|[11,Inf]:count سَاعَة',
22
+ 'h' => '[0,1] سَاعَة|{2} سَاعَتَيْن|[3,10]:count سَاعَات|[11,Inf]:count سَاعَة',
23
+ 'minute' => '[0,1] دَقِيقَة|{2} دَقِيقَتَيْن|[3,10]:count دَقَائِق|[11,Inf]:count دَقِيقَة',
24
+ 'min' => '[0,1] دَقِيقَة|{2} دَقِيقَتَيْن|[3,10]:count دَقَائِق|[11,Inf]:count دَقِيقَة',
25
+ 'second' => '[0,1] ثَانِيَة|{2} ثَانِيَتَيْن|[3,10]:count ثَوَان|[11,Inf]:count ثَانِيَة',
26
+ 's' => '[0,1] ثَانِيَة|{2} ثَانِيَتَيْن|[3,10]:count ثَوَان|[11,Inf]:count ثَانِيَة',
27
+ 'ago' => 'مُنْذُ :time',
28
+ 'from_now' => 'مِنَ الْآن :time',
29
+ 'after' => 'بَعْدَ :time',
30
+ 'before' => 'قَبْلَ :time',
31
+ );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/az.php CHANGED
@@ -24,8 +24,8 @@ return array(
24
  'min' => ':count dəqiqə',
25
  'second' => ':count saniyə',
26
  's' => ':count saniyə',
27
- 'ago' => ':time öncə',
28
  'from_now' => ':time sonra',
29
  'after' => ':time sonra',
30
- 'before' => ':time öncə',
31
  );
24
  'min' => ':count dəqiqə',
25
  'second' => ':count saniyə',
26
  's' => ':count saniyə',
27
+ 'ago' => ':time əvvəl',
28
  'from_now' => ':time sonra',
29
  'after' => ':time sonra',
30
+ 'before' => ':time əvvəl',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/bg.php CHANGED
@@ -21,7 +21,7 @@ return array(
21
  'hour' => '1 час|:count часа',
22
  'h' => '1 час|:count часа',
23
  'minute' => '1 минута|:count минути',
24
- 'm' => '1 минута|:count минути',
25
  'second' => '1 секунда|:count секунди',
26
  's' => '1 секунда|:count секунди',
27
  'ago' => 'преди :time',
21
  'hour' => '1 час|:count часа',
22
  'h' => '1 час|:count часа',
23
  'minute' => '1 минута|:count минути',
24
+ 'min' => '1 минута|:count минути',
25
  'second' => '1 секунда|:count секунди',
26
  's' => '1 секунда|:count секунди',
27
  'ago' => 'преди :time',
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Carbon package.
5
+ *
6
+ * (c) Ahmed Ali <ajaaibu@gmail.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ return array(
13
+ 'year' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު',
14
+ 'y' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު',
15
+ 'month' => '{0}މައްސަރެއް|[1,Inf]:count މަސް',
16
+ 'm' => '{0}މައްސަރެއް|[1,Inf]:count މަސް',
17
+ 'week' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ',
18
+ 'w' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ',
19
+ 'day' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް',
20
+ 'd' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް',
21
+ 'hour' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި',
22
+ 'h' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި',
23
+ 'minute' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް',
24
+ 'min' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް',
25
+ 'second' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު',
26
+ 's' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު',
27
+ 'ago' => ':time ކުރިން',
28
+ 'from_now' => ':time ފަހުން',
29
+ 'after' => ':time ފަހުން',
30
+ 'before' => ':time ކުރި',
31
+ );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/el.php CHANGED
@@ -24,8 +24,8 @@ return array(
24
  'min' => '1 λεπτό|:count λεπτά',
25
  'second' => '1 δευτερόλεπτο|:count δευτερόλεπτα',
26
  's' => '1 δευτερόλεπτο|:count δευτερόλεπτα',
27
- 'ago' => 'πρίν απο :time',
28
- 'from_now' => 'σε :time απο τώρα',
29
  'after' => ':time μετά',
30
- 'before' => ':time πρίν',
31
  );
24
  'min' => '1 λεπτό|:count λεπτά',
25
  'second' => '1 δευτερόλεπτο|:count δευτερόλεπτα',
26
  's' => '1 δευτερόλεπτο|:count δευτερόλεπτα',
27
+ 'ago' => 'πριν από :time',
28
+ 'from_now' => 'σε :time από τώρα',
29
  'after' => ':time μετά',
30
+ 'before' => ':time πριν',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/fr.php CHANGED
@@ -15,15 +15,15 @@ return array(
15
  'month' => ':count mois',
16
  'm' => ':count mois',
17
  'week' => '1 semaine|:count semaines',
18
- 'w' => '1 semaine|:count semaines',
19
  'day' => '1 jour|:count jours',
20
- 'd' => '1 jour|:count jours',
21
  'hour' => '1 heure|:count heures',
22
- 'h' => '1 heure|:count heures',
23
  'minute' => '1 minute|:count minutes',
24
- 'min' => '1 minute|:count minutes',
25
  'second' => '1 seconde|:count secondes',
26
- 's' => '1 seconde|:count secondes',
27
  'ago' => 'il y a :time',
28
  'from_now' => 'dans :time',
29
  'after' => ':time après',
15
  'month' => ':count mois',
16
  'm' => ':count mois',
17
  'week' => '1 semaine|:count semaines',
18
+ 'w' => '1 sem.|:count sem.',
19
  'day' => '1 jour|:count jours',
20
+ 'd' => '1 j.|:count j.',
21
  'hour' => '1 heure|:count heures',
22
+ 'h' => '1 h|:count h.',
23
  'minute' => '1 minute|:count minutes',
24
+ 'min' => '1 min.|:count min.',
25
  'second' => '1 seconde|:count secondes',
26
+ 's' => '1 sec.|:count sec.',
27
  'ago' => 'il y a :time',
28
  'from_now' => 'dans :time',
29
  'after' => ':time après',
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/hy.php CHANGED
@@ -11,21 +11,21 @@
11
 
12
  return array(
13
  'year' => ':count տարի',
14
- 'y' => ':count տարի',
15
  'month' => ':count ամիս',
16
- 'm' => ':count ամիս',
17
  'week' => ':count շաբաթ',
18
- 'w' => ':count շաբաթ',
19
  'day' => ':count օր',
20
- 'd' => ':count օր',
21
  'hour' => ':count ժամ',
22
- 'h' => ':count ժամ',
23
  'minute' => ':count րոպե',
24
- 'min' => ':count րոպե',
25
- 'second' => ':count վայրկյան',
26
- 's' => ':count վայրկյան',
27
  'ago' => ':time առաջ',
28
- 'from_now' => ':time հետո',
29
  'after' => ':time հետո',
30
  'before' => ':time առաջ',
31
  );
11
 
12
  return array(
13
  'year' => ':count տարի',
14
+ 'y' => ':countտ',
15
  'month' => ':count ամիս',
16
+ 'm' => ':countամ',
17
  'week' => ':count շաբաթ',
18
+ 'w' => ':countշ',
19
  'day' => ':count օր',
20
+ 'd' => ':countօր',
21
  'hour' => ':count ժամ',
22
+ 'h' => ':countժ',
23
  'minute' => ':count րոպե',
24
+ 'min' => ':countր',
25
+ 'second' => ':count վարկյան',
26
+ 's' => ':countվրկ',
27
  'ago' => ':time առաջ',
28
+ 'from_now' => ':time ներկա պահից',
29
  'after' => ':time հետո',
30
  'before' => ':time առաջ',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ja.php CHANGED
@@ -10,22 +10,22 @@
10
  */
11
 
12
  return array(
13
- 'year' => ':count 年',
14
- 'y' => ':count 年',
15
- 'month' => ':count ヶ月',
16
- 'm' => ':count ヶ月',
17
- 'week' => ':count 週間',
18
- 'w' => ':count 週間',
19
- 'day' => ':count 日',
20
- 'd' => ':count 日',
21
- 'hour' => ':count 時間',
22
- 'h' => ':count 時間',
23
- 'minute' => ':count 分',
24
- 'min' => ':count 分',
25
- 'second' => ':count 秒',
26
- 's' => ':count 秒',
27
- 'ago' => ':time 前',
28
- 'from_now' => '今から :time',
29
- 'after' => ':time 後',
30
- 'before' => ':time 前',
31
  );
10
  */
11
 
12
  return array(
13
+ 'year' => ':count年',
14
+ 'y' => ':count年',
15
+ 'month' => ':countヶ月',
16
+ 'm' => ':countヶ月',
17
+ 'week' => ':count週間',
18
+ 'w' => ':count週間',
19
+ 'day' => ':count日',
20
+ 'd' => ':count日',
21
+ 'hour' => ':count時間',
22
+ 'h' => ':count時間',
23
+ 'minute' => ':count分',
24
+ 'min' => ':count分',
25
+ 'second' => ':count秒',
26
+ 's' => ':count秒',
27
+ 'ago' => ':time前',
28
+ 'from_now' => '今から:time',
29
+ 'after' => ':time後',
30
+ 'before' => ':time前',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/kk.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the Carbon package.
4
+ *
5
+ * (c) Brian Nesbitt <brian@nesbot.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+ return array(
11
+ 'year' => ':count жыл',
12
+ 'y' => ':count жыл',
13
+ 'month' => ':count ай',
14
+ 'm' => ':count ай',
15
+ 'week' => ':count апта',
16
+ 'w' => ':count апта',
17
+ 'day' => ':count күн',
18
+ 'd' => ':count күн',
19
+ 'hour' => ':count сағат',
20
+ 'h' => ':count сағат',
21
+ 'minute' => ':count минут',
22
+ 'min' => ':count минут',
23
+ 'second' => ':count секунд',
24
+ 's' => ':count секунд',
25
+ 'ago' => ':time бұрын',
26
+ 'from_now' => ':time кейін',
27
+ 'after' => ':time кейін',
28
+ 'before' => ':time бұрын',
29
+ );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/mn.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Carbon package.
5
+ *
6
+ * (c) Brian Nesbitt <brian@nesbot.com>
7
+ *
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ *
12
+ * @translator Batmandakh Erdenebileg <batmandakh.e@icloud.com>
13
+ */
14
+
15
+ return array(
16
+ 'year' => ':count жил',
17
+ 'y' => ':count жил',
18
+ 'month' => ':count сар',
19
+ 'm' => ':count сар',
20
+ 'week' => ':count долоо хоног',
21
+ 'w' => ':count долоо хоног',
22
+ 'day' => ':count өдөр',
23
+ 'd' => ':count өдөр',
24
+ 'hour' => ':count цаг',
25
+ 'h' => ':countц',
26
+ 'minute' => ':count минут',
27
+ 'min' => ':countм',
28
+ 'second' => ':count секунд',
29
+ 's' => ':countс',
30
+
31
+ 'ago' => ':timeн өмнө',
32
+ 'year_ago' => ':count жилий',
33
+ 'month_ago' => ':count сары',
34
+ 'day_ago' => ':count хоногий',
35
+ 'hour_ago' => ':count цагий',
36
+ 'minute_ago' => ':count минуты',
37
+ 'second_ago' => ':count секунды',
38
+
39
+ 'from_now' => 'одоогоос :time',
40
+ 'year_from_now' => ':count жилийн дараа',
41
+ 'month_from_now' => ':count сарын дараа',
42
+ 'day_from_now' => ':count хоногийн дараа',
43
+ 'hour_from_now' => ':count цагийн дараа',
44
+ 'minute_from_now' => ':count минутын дараа',
45
+ 'second_from_now' => ':count секундын дараа',
46
+
47
+ // Does it required to make translation for before, after as follows? hmm, I think we've made it with ago and from now keywords already. Anyway, I've included it just in case of undesired action...
48
+ 'after' => ':timeн дараа',
49
+ 'year_after' => ':count жилий',
50
+ 'month_after' => ':count сары',
51
+ 'day_after' => ':count хоногий',
52
+ 'hour_after' => ':count цагий',
53
+ 'minute_after' => ':count минуты',
54
+ 'second_after' => ':count секунды',
55
+ 'before' => ':timeн өмнө',
56
+ 'year_before' => ':count жилий',
57
+ 'month_before' => ':count сары',
58
+ 'day_before' => ':count хоногий',
59
+ 'hour_before' => ':count цагий',
60
+ 'minute_before' => ':count минуты',
61
+ 'second_before' => ':count секунды',
62
+ );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/pl.php CHANGED
@@ -26,6 +26,6 @@ return array(
26
  's' => '1 sekunda|:count sekundy|:count sekund',
27
  'ago' => ':time temu',
28
  'from_now' => ':time od teraz',
29
- 'after' => ':time przed',
30
- 'before' => ':time po',
31
  );
26
  's' => '1 sekunda|:count sekundy|:count sekund',
27
  'ago' => ':time temu',
28
  'from_now' => ':time od teraz',
29
+ 'after' => ':time po',
30
+ 'before' => ':time przed',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/ps.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Carbon package.
5
+ *
6
+ * (c) Brian Nesbitt <brian@nesbot.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ return array(
13
+ 'year' => '1 کال|:count کاله',
14
+ 'y' => '1کال|:countکاله',
15
+ 'month' => '1 مياشت|:count مياشتي',
16
+ 'm' => '1مياشت|:countمياشتي',
17
+ 'week' => '1 اونۍ|:count اونۍ',
18
+ 'w' => '1اونۍ|:countاونۍ',
19
+ 'day' => '1 ورځ|:count ورځي',
20
+ 'd' => '1ورځ|:countورځي',
21
+ 'hour' => '1 ساعت|:count ساعته',
22
+ 'h' => '1ساعت|:countساعته',
23
+ 'minute' => '1 دقيقه|:count دقيقې',
24
+ 'min' => '1دقيقه|:countدقيقې',
25
+ 'second' => '1 ثانيه|:count ثانيې',
26
+ 's' => '1ثانيه|:countثانيې',
27
+ 'ago' => ':time دمخه',
28
+ 'from_now' => ':time له اوس څخه',
29
+ 'after' => ':time وروسته',
30
+ 'before' => ':time دمخه',
31
+ );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sk.php CHANGED
@@ -26,6 +26,13 @@ return array(
26
  's' => 'sekundu|:count sekundy|:count sekúnd',
27
  'ago' => 'pred :time',
28
  'from_now' => 'za :time',
29
- 'after' => ':time neskôr',
30
  'before' => ':time predtým',
 
 
 
 
 
 
 
31
  );
26
  's' => 'sekundu|:count sekundy|:count sekúnd',
27
  'ago' => 'pred :time',
28
  'from_now' => 'za :time',
29
+ 'after' => 'o :time neskôr',
30
  'before' => ':time predtým',
31
+ 'year_ago' => 'rokom|:count rokmi|:count rokmi',
32
+ 'month_ago' => 'mesiacom|:count mesiacmi|:count mesiacmi',
33
+ 'week_ago' => 'týždňom|:count týždňami|:count týždňami',
34
+ 'day_ago' => 'dňom|:count dňami|:count dňami',
35
+ 'hour_ago' => 'hodinou|:count hodinami|:count hodinami',
36
+ 'minute_ago' => 'minútou|:count minútami|:count minútami',
37
+ 'second_ago' => 'sekundou|:count sekundami|:count sekundami',
38
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sr.php CHANGED
@@ -28,4 +28,10 @@ return array(
28
  'from_now' => ':time od sada',
29
  'after' => 'nakon :time',
30
  'before' => 'pre :time',
 
 
 
 
 
 
31
  );
28
  'from_now' => ':time od sada',
29
  'after' => 'nakon :time',
30
  'before' => 'pre :time',
31
+
32
+ 'year_from_now' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
33
+ 'year_ago' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
34
+
35
+ 'week_from_now' => '{1} :count nedelju|{2,3,4} :count nedelje|[5,Inf[ :count nedelja',
36
+ 'week_ago' => '{1} :count nedelju|{2,3,4} :count nedelje|[5,Inf[ :count nedelja',
37
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Carbon package.
5
+ *
6
+ * (c) Nikola Zeravcic <office@bytenet.rs>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ return array(
13
+ 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[ :count година',
14
+ 'y' => ':count г.',
15
+ 'month' => '{1} :count месец|{2,3,4}:count месеца|[5,Inf[ :count месеци',
16
+ 'm' => ':count м.',
17
+ 'week' => '{1} :count недеља|{2,3,4}:count недеље|[5,Inf[ :count недеља',
18
+ 'w' => ':count нед.',
19
+ 'day' => '{1,21,31} :count дан|[2,Inf[ :count дана',
20
+ 'd' => ':count д.',
21
+ 'hour' => '{1,21} :count сат|{2,3,4,22,23,24}:count сата|[5,Inf[ :count сати',
22
+ 'h' => ':count ч.',
23
+ 'minute' => '{1,21,31,41,51} :count минут|[2,Inf[ :count минута',
24
+ 'min' => ':count мин.',
25
+ 'second' => '{1,21,31,41,51} :count секунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count секунде|[5,Inf[:count секунди',
26
+ 's' => ':count сек.',
27
+ 'ago' => 'пре :time',
28
+ 'from_now' => 'за :time',
29
+ 'after' => ':time након',
30
+ 'before' => ':time пре',
31
+
32
+ 'year_from_now' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година',
33
+ 'year_ago' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година',
34
+
35
+ 'week_from_now' => '{1} :count недељу|{2,3,4} :count недеље|[5,Inf[ :count недеља',
36
+ 'week_ago' => '{1} :count недељу|{2,3,4} :count недеље|[5,Inf[ :count недеља',
37
+
38
+ );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php CHANGED
@@ -9,30 +9,4 @@
9
  * file that was distributed with this source code.
10
  */
11
 
12
- return array(
13
- 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count godine|[0,Inf[ :count godina',
14
- 'y' => ':count g.',
15
- 'month' => '{1} :count mjesec|{2,3,4}:count mjeseca|[5,Inf[ :count mjeseci',
16
- 'm' => ':count mj.',
17
- 'week' => '{1} :count nedjelja|{2,3,4}:count nedjelje|[5,Inf[ :count nedjelja',
18
- 'w' => ':count ned.',
19
- 'day' => '{1,21,31} :count dan|[2,Inf[ :count dana',
20
- 'd' => ':count d.',
21
- 'hour' => '{1,21} :count sat|{2,3,4,22,23,24}:count sata|[5,Inf[ :count sati',
22
- 'h' => ':count č.',
23
- 'minute' => '{1,21,31,41,51} :count minut|[2,Inf[ :count minuta',
24
- 'min' => ':count min.',
25
- 'second' => '{1,21,31,41,51} :count sekund|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count sekunde|[5,Inf[:count sekundi',
26
- 's' => ':count sek.',
27
- 'ago' => 'prije :time',
28
- 'from_now' => 'za :time',
29
- 'after' => ':time nakon',
30
- 'before' => ':time prije',
31
-
32
- 'year_from_now' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
33
- 'year_ago' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
34
-
35
- 'week_from_now' => '{1} :count nedjelju|{2,3,4} :count nedjelje|[5,Inf[ :count nedjelja',
36
- 'week_ago' => '{1} :count nedjelju|{2,3,4} :count nedjelje|[5,Inf[ :count nedjelja',
37
-
38
- );
9
  * file that was distributed with this source code.
10
  */
11
 
12
+ return require __DIR__.'/sr_Latn_ME.php';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/th.php CHANGED
@@ -10,22 +10,22 @@
10
  */
11
 
12
  return array(
13
- 'year' => '1 ปี|:count ปี',
14
- 'y' => '1 ปี|:count ปี',
15
- 'month' => '1 เดือน|:count เดือน',
16
- 'm' => '1 เดือน|:count เดือน',
17
- 'week' => '1 สัปดาห์|:count สัปดาห์',
18
- 'w' => '1 สัปดาห์|:count สัปดาห์',
19
- 'day' => '1 วัน|:count วัน',
20
- 'd' => '1 วัน|:count วัน',
21
- 'hour' => '1 ชั่วโมง|:count ชั่วโมง',
22
- 'h' => '1 ชั่วโมง|:count ชั่วโมง',
23
- 'minute' => '1 นาที|:count นาที',
24
- 'min' => '1 นาที|:count นาที',
25
- 'second' => '1 วินาที|:count วินาที',
26
- 's' => '1 วินาที|:count วินาที',
27
- 'ago' => ':time ที่แล้ว',
28
- 'from_now' => ':time จากนี้',
29
- 'after' => 'หลัง:time',
30
- 'before' => 'ก่อน:time',
31
  );
10
  */
11
 
12
  return array(
13
+ 'year' => ':count ปี',
14
+ 'y' => ':count ปี',
15
+ 'month' => ':count เดือน',
16
+ 'm' => ':count เดือน',
17
+ 'week' => ':count สัปดาห์',
18
+ 'w' => ':count สัปดาห์',
19
+ 'day' => ':count วัน',
20
+ 'd' => ':count วัน',
21
+ 'hour' => ':count ชั่วโมง',
22
+ 'h' => ':count ชั่วโมง',
23
+ 'minute' => ':count นาที',
24
+ 'min' => ':count นาที',
25
+ 'second' => ':count วินาที',
26
+ 's' => ':count วินาที',
27
+ 'ago' => ':timeที่แล้ว',
28
+ 'from_now' => ':timeต่อจากนี้',
29
+ 'after' => ':timeหลังจากนี้',
30
+ 'before' => ':timeก่อน',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/uk.php CHANGED
@@ -24,7 +24,7 @@ return array(
24
  'min' => ':count хвилину|:count хвилини|:count хвилин',
25
  'second' => ':count секунду|:count секунди|:count секунд',
26
  's' => ':count секунду|:count секунди|:count секунд',
27
- 'ago' => ':time назад',
28
  'from_now' => 'через :time',
29
  'after' => ':time після',
30
  'before' => ':time до',
24
  'min' => ':count хвилину|:count хвилини|:count хвилин',
25
  'second' => ':count секунду|:count секунди|:count секунд',
26
  's' => ':count секунду|:count секунди|:count секунд',
27
+ 'ago' => ':time тому',
28
  'from_now' => 'через :time',
29
  'after' => ':time після',
30
  'before' => ':time до',
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/uz.php CHANGED
@@ -10,22 +10,22 @@
10
  */
11
 
12
  return array(
13
- 'year' => ':count yil|:count yil|:count yil',
14
- 'y' => ':count yil|:count yil|:count yil',
15
- 'month' => ':count oy|:count oy|:count oylar',
16
- 'm' => ':count oy|:count oy|:count oylar',
17
- 'week' => ':count hafta|:count hafta|:count hafta',
18
- 'w' => ':count hafta|:count hafta|:count hafta',
19
- 'day' => ':count kun|:count kun|:count kun',
20
- 'd' => ':count kun|:count kun|:count kun',
21
- 'hour' => ':count soat|:count soat|:count soat',
22
- 'h' => ':count soat|:count soat|:count soat',
23
- 'minute' => ':count minut|:count minut|:count minut',
24
- 'min' => ':count minut|:count minut|:count minut',
25
- 'second' => ':count sekund|:count sekund|:count sekund',
26
- 's' => ':count sekund|:count sekund|:count sekund',
27
  'ago' => ':time avval',
28
- 'from_now' => ':time keyin',
29
  'after' => ':time keyin',
30
  'before' => ':time oldin',
31
  );
10
  */
11
 
12
  return array(
13
+ 'year' => ':count yil',
14
+ 'y' => ':count yil',
15
+ 'month' => ':count oy',
16
+ 'm' => ':count oy',
17
+ 'week' => ':count hafta',
18
+ 'w' => ':count hafta',
19
+ 'day' => ':count kun',
20
+ 'd' => ':count kun',
21
+ 'hour' => ':count soat',
22
+ 'h' => ':count soat',
23
+ 'minute' => ':count daqiqa',
24
+ 'min' => ':count daq',
25
+ 'second' => ':count soniya',
26
+ 's' => ':count s',
27
  'ago' => ':time avval',
28
+ 'from_now' => ':time dan keyin',
29
  'after' => ':time keyin',
30
  'before' => ':time oldin',
31
  );
src/common/lib/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php CHANGED
@@ -10,22 +10,22 @@
10
  */
11
 
12
  return array(
13
- 'year' => ':count 年',
14
- 'y' => ':count 年',
15
- 'month' => ':count 月',
16
- 'm' => ':count 月',
17
- 'week' => ':count',
18
- 'w' => ':count',
19
- 'day' => ':count 天',
20
- 'd' => ':count 天',
21
- 'hour' => ':count 小時',
22
- 'h' => ':count 小時',
23
- 'minute' => ':count 分鐘',
24
- 'min' => ':count 分鐘',
25
- 'second' => ':count 秒',
26
- 's' => ':count 秒',
27
  'ago' => ':time前',
28
- 'from_now' => '距現在 :time',
29
  'after' => ':time後',
30
  'before' => ':time前',
31
  );
10
  */
11
 
12
  return array(
13
+ 'year' => ':count年',
14
+ 'y' => ':count年',
15
+ 'month' => ':count月',
16
+ 'm' => ':count月',
17
+ 'week' => ':count',
18
+ 'w' => ':count',
19
+ 'day' => ':count天',
20
+ 'd' => ':count天',
21
+ 'hour' => ':count小時',
22
+ 'h' => ':count小時',
23
+ 'minute' => ':count分鐘',
24
+ 'min' => ':count分鐘',
25
+ 'second' => ':count秒',
26
+ 's' => ':count秒',
27
  'ago' => ':time前',
28
+ 'from_now' => '距現在:time',
29
  'after' => ':time後',
30
  'before' => ':time前',
31
  );
src/common/lib/vendor/symfony/translation/CHANGELOG.md CHANGED
@@ -1,37 +1,6 @@
1
  CHANGELOG
2
  =========
3
 
4
- 3.4.0
5
- -----
6
-
7
- * Added `TranslationDumperPass`
8
- * Added `TranslationExtractorPass`
9
- * Added `TranslatorPass`
10
- * Added `TranslationReader` and `TranslationReaderInterface`
11
- * Added `<notes>` section to the Xliff 2.0 dumper.
12
- * Improved Xliff 2.0 loader to load `<notes>` section.
13
- * Added `TranslationWriterInterface`
14
- * Deprecated `TranslationWriter::writeTranslations` in favor of `TranslationWriter::write`
15
- * added support for adding custom message formatter and decoupling the default one.
16
- * Added `PhpExtractor`
17
- * Added `PhpStringTokenParser`
18
-
19
- 3.2.0
20
- -----
21
-
22
- * Added support for escaping `|` in plural translations with double pipe.
23
-
24
- 3.1.0
25
- -----
26
-
27
- * Deprecated the backup feature of the file dumper classes.
28
-
29
- 3.0.0
30
- -----
31
-
32
- * removed `FileDumper::format()` method.
33
- * Changed the visibility of the locale property in `Translator` from protected to private.
34
-
35
  2.8.0
36
  -----
37
 
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  2.8.0
5
  -----
6
 
src/common/lib/vendor/symfony/translation/Catalogue/AbstractOperation.php CHANGED
@@ -13,8 +13,6 @@ namespace Symfony\Component\Translation\Catalogue;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
  use Symfony\Component\Translation\MessageCatalogueInterface;
16
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
17
- use Symfony\Component\Translation\Exception\LogicException;
18
 
19
  /**
20
  * Base catalogues binary operation class.
@@ -60,12 +58,12 @@ abstract class AbstractOperation implements OperationInterface
60
  protected $messages;
61
 
62
  /**
63
- * @throws LogicException
64
  */
65
  public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
66
  {
67
  if ($source->getLocale() !== $target->getLocale()) {
68
- throw new LogicException('Operated catalogues must belong to the same locale.');
69
  }
70
 
71
  $this->source = $source;
@@ -92,7 +90,7 @@ abstract class AbstractOperation implements OperationInterface
92
  public function getMessages($domain)
93
  {
94
  if (!in_array($domain, $this->getDomains())) {
95
- throw new InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
96
  }
97
 
98
  if (!isset($this->messages[$domain]['all'])) {
@@ -108,7 +106,7 @@ abstract class AbstractOperation implements OperationInterface
108
  public function getNewMessages($domain)
109
  {
110
  if (!in_array($domain, $this->getDomains())) {
111
- throw new InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
112
  }
113
 
114
  if (!isset($this->messages[$domain]['new'])) {
@@ -124,7 +122,7 @@ abstract class AbstractOperation implements OperationInterface
124
  public function getObsoleteMessages($domain)
125
  {
126
  if (!in_array($domain, $this->getDomains())) {
127
- throw new InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
128
  }
129
 
130
  if (!isset($this->messages[$domain]['obsolete'])) {
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
  use Symfony\Component\Translation\MessageCatalogueInterface;
 
 
16
 
17
  /**
18
  * Base catalogues binary operation class.
58
  protected $messages;
59
 
60
  /**
61
+ * @throws \LogicException
62
  */
63
  public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
64
  {
65
  if ($source->getLocale() !== $target->getLocale()) {
66
+ throw new \LogicException('Operated catalogues must belong to the same locale.');
67
  }
68
 
69
  $this->source = $source;
90
  public function getMessages($domain)
91
  {
92
  if (!in_array($domain, $this->getDomains())) {
93
+ throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
94
  }
95
 
96
  if (!isset($this->messages[$domain]['all'])) {
106
  public function getNewMessages($domain)
107
  {
108
  if (!in_array($domain, $this->getDomains())) {
109
+ throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
110
  }
111
 
112
  if (!isset($this->messages[$domain]['new'])) {
122
  public function getObsoleteMessages($domain)
123
  {
124
  if (!in_array($domain, $this->getDomains())) {
125
+ throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
126
  }
127
 
128
  if (!isset($this->messages[$domain]['obsolete'])) {
src/common/lib/vendor/symfony/translation/Catalogue/DiffOperation.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Translation\Catalogue;
13
+
14
+ @trigger_error('The '.__NAMESPACE__.'\DiffOperation class is deprecated since Symfony 2.8 and will be removed in 3.0. Use the TargetOperation class in the same namespace instead.', E_USER_DEPRECATED);
15
+
16
+ /**
17
+ * Diff operation between two catalogues.
18
+ *
19
+ * The name of 'Diff' is misleading because the operation
20
+ * has nothing to do with diff:
21
+ *
22
+ * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target}
23
+ * all = intersection ∪ (target ∖ intersection) = target
24
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
25
+ * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target}
26
+ *
27
+ * @author Jean-François Simon <contact@jfsimon.fr>
28
+ *
29
+ * @deprecated since version 2.8, to be removed in 3.0. Use TargetOperation instead.
30
+ */
31
+ class DiffOperation extends TargetOperation
32
+ {
33
+ }
src/common/lib/vendor/symfony/translation/Command/XliffLintCommand.php DELETED
@@ -1,245 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Command;
13
-
14
- use Symfony\Component\Console\Command\Command;
15
- use Symfony\Component\Console\Input\InputInterface;
16
- use Symfony\Component\Console\Input\InputOption;
17
- use Symfony\Component\Console\Output\OutputInterface;
18
- use Symfony\Component\Console\Style\SymfonyStyle;
19
-
20
- /**
21
- * Validates XLIFF files syntax and outputs encountered errors.
22
- *
23
- * @author Grégoire Pineau <lyrixx@lyrixx.info>
24
- * @author Robin Chalas <robin.chalas@gmail.com>
25
- * @author Javier Eguiluz <javier.eguiluz@gmail.com>
26
- */
27
- class XliffLintCommand extends Command
28
- {
29
- protected static $defaultName = 'lint:xliff';
30
-
31
- private $format;
32
- private $displayCorrectFiles;
33
- private $directoryIteratorProvider;
34
- private $isReadableProvider;
35
-
36
- public function __construct($name = null, $directoryIteratorProvider = null, $isReadableProvider = null)
37
- {
38
- parent::__construct($name);
39
-
40
- $this->directoryIteratorProvider = $directoryIteratorProvider;
41
- $this->isReadableProvider = $isReadableProvider;
42
- }
43
-
44
- /**
45
- * {@inheritdoc}
46
- */
47
- protected function configure()
48
- {
49
- $this
50
- ->setDescription('Lints a XLIFF file and outputs encountered errors')
51
- ->addArgument('filename', null, 'A file or a directory or STDIN')
52
- ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt')
53
- ->setHelp(<<<EOF
54
- The <info>%command.name%</info> command lints a XLIFF file and outputs to STDOUT
55
- the first encountered syntax error.
56
-
57
- You can validates XLIFF contents passed from STDIN:
58
-
59
- <info>cat filename | php %command.full_name%</info>
60
-
61
- You can also validate the syntax of a file:
62
-
63
- <info>php %command.full_name% filename</info>
64
-
65
- Or of a whole directory:
66
-
67
- <info>php %command.full_name% dirname</info>
68
- <info>php %command.full_name% dirname --format=json</info>
69
-
70
- EOF
71
- )
72
- ;
73
- }
74
-
75
- protected function execute(InputInterface $input, OutputInterface $output)
76
- {
77
- $io = new SymfonyStyle($input, $output);
78
- $filename = $input->getArgument('filename');
79
- $this->format = $input->getOption('format');
80
- $this->displayCorrectFiles = $output->isVerbose();
81
-
82
- if (!$filename) {
83
- if (!$stdin = $this->getStdin()) {
84
- throw new \RuntimeException('Please provide a filename or pipe file content to STDIN.');
85
- }
86
-
87
- return $this->display($io, array($this->validate($stdin)));
88
- }
89
-
90
- if (!$this->isReadable($filename)) {
91
- throw new \RuntimeException(sprintf('File or directory "%s" is not readable.', $filename));
92
- }
93
-
94
- $filesInfo = array();
95
- foreach ($this->getFiles($filename) as $file) {
96
- $filesInfo[] = $this->validate(file_get_contents($file), $file);
97
- }
98
-
99
- return $this->display($io, $filesInfo);
100
- }
101
-
102
- private function validate($content, $file = null)
103
- {
104
- // Avoid: Warning DOMDocument::loadXML(): Empty string supplied as input
105
- if ('' === trim($content)) {
106
- return array('file' => $file, 'valid' => true);
107
- }
108
-
109
- libxml_use_internal_errors(true);
110
-
111
- $document = new \DOMDocument();
112
- $document->loadXML($content);
113
- if ($document->schemaValidate(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd')) {
114
- return array('file' => $file, 'valid' => true);
115
- }
116
-
117
- $errorMessages = array_map(function ($error) {
118
- return array(
119
- 'line' => $error->line,
120
- 'column' => $error->column,
121
- 'message' => trim($error->message),
122
- );
123
- }, libxml_get_errors());
124
-
125
- libxml_clear_errors();
126
- libxml_use_internal_errors(false);
127
-
128
- return array('file' => $file, 'valid' => false, 'messages' => $errorMessages);
129
- }
130
-
131
- private function display(SymfonyStyle $io, array $files)
132
- {
133
- switch ($this->format) {
134
- case 'txt':
135
- return $this->displayTxt($io, $files);
136
- case 'json':
137
- return $this->displayJson($io, $files);
138
- default:
139
- throw new \InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format));
140
- }
141
- }
142
-
143
- private function displayTxt(SymfonyStyle $io, array $filesInfo)
144
- {
145
- $countFiles = count($filesInfo);
146
- $erroredFiles = 0;
147
-
148
- foreach ($filesInfo as $info) {
149
- if ($info['valid'] && $this->displayCorrectFiles) {
150
- $io->comment('<info>OK</info>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
151
- } elseif (!$info['valid']) {
152
- ++$erroredFiles;
153
- $io->text('<error> ERROR </error>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
154
- $io->listing(array_map(function ($error) {
155
- // general document errors have a '-1' line number
156
- return -1 === $error['line'] ? $error['message'] : sprintf('Line %d, Column %d: %s', $error['line'], $error['column'], $error['message']);
157
- }, $info['messages']));
158
- }
159
- }
160
-
161
- if (0 === $erroredFiles) {
162
- $io->success(sprintf('All %d XLIFF files contain valid syntax.', $countFiles));
163
- } else {
164
- $io->warning(sprintf('%d XLIFF files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles));
165
- }
166
-
167
- return min($erroredFiles, 1);
168
- }
169
-
170
- private function displayJson(SymfonyStyle $io, array $filesInfo)
171
- {
172
- $errors = 0;
173
-
174
- array_walk($filesInfo, function (&$v) use (&$errors) {
175
- $v['file'] = (string) $v['file'];
176
- if (!$v['valid']) {
177
- ++$errors;
178
- }
179
- });
180
-
181
- $io->writeln(json_encode($filesInfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
182
-
183
- return min($errors, 1);
184
- }
185
-
186
- private function getFiles($fileOrDirectory)
187
- {
188
- if (is_file($fileOrDirectory)) {
189
- yield new \SplFileInfo($fileOrDirectory);
190
-
191
- return;
192
- }
193
-
194
- foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {
195
- if (!in_array($file->getExtension(), array('xlf', 'xliff'))) {
196
- continue;
197
- }
198
-
199
- yield $file;
200
- }
201
- }
202
-
203
- private function getStdin()
204
- {
205
- if (0 !== ftell(STDIN)) {
206
- return;
207
- }
208
-
209
- $inputs = '';
210
- while (!feof(STDIN)) {
211
- $inputs .= fread(STDIN, 1024);
212
- }
213
-
214
- return $inputs;
215
- }
216
-
217
- private function getDirectoryIterator($directory)
218
- {
219
- $default = function ($directory) {
220
- return new \RecursiveIteratorIterator(
221
- new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS),
222
- \RecursiveIteratorIterator::LEAVES_ONLY
223
- );
224
- };
225
-
226
- if (null !== $this->directoryIteratorProvider) {
227
- return call_user_func($this->directoryIteratorProvider, $directory, $default);
228
- }
229
-
230
- return $default($directory);
231
- }
232
-
233
- private function isReadable($fileOrDirectory)
234
- {
235
- $default = function ($fileOrDirectory) {
236
- return is_readable($fileOrDirectory);
237
- };
238
-
239
- if (null !== $this->isReadableProvider) {
240
- return call_user_func($this->isReadableProvider, $fileOrDirectory, $default);
241
- }
242
-
243
- return $default($fileOrDirectory);
244
- }
245
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/DataCollector/TranslationDataCollector.php CHANGED
@@ -38,11 +38,6 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto
38
 
39
  $this->data = $this->computeCount($messages);
40
  $this->data['messages'] = $messages;
41
-
42
- $this->data['locale'] = $this->translator->getLocale();
43
- $this->data['fallback_locales'] = $this->translator->getFallbackLocales();
44
-
45
- $this->data = $this->cloneVar($this->data);
46
  }
47
 
48
  /**
@@ -52,14 +47,6 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto
52
  {
53
  }
54
 
55
- /**
56
- * {@inheritdoc}
57
- */
58
- public function reset()
59
- {
60
- $this->data = array();
61
- }
62
-
63
  /**
64
  * @return array
65
  */
@@ -92,16 +79,6 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto
92
  return isset($this->data[DataCollectorTranslator::MESSAGE_DEFINED]) ? $this->data[DataCollectorTranslator::MESSAGE_DEFINED] : 0;
93
  }
94
 
95
- public function getLocale()
96
- {
97
- return !empty($this->data['locale']) ? $this->data['locale'] : null;
98
- }
99
-
100
- public function getFallbackLocales()
101
- {
102
- return (isset($this->data['fallback_locales']) && count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : array();
103
- }
104
-
105
  /**
106
  * {@inheritdoc}
107
  */
38
 
39
  $this->data = $this->computeCount($messages);
40
  $this->data['messages'] = $messages;
 
 
 
 
 
41
  }
42
 
43
  /**
47
  {
48
  }
49
 
 
 
 
 
 
 
 
 
50
  /**
51
  * @return array
52
  */
79
  return isset($this->data[DataCollectorTranslator::MESSAGE_DEFINED]) ? $this->data[DataCollectorTranslator::MESSAGE_DEFINED] : 0;
80
  }
81
 
 
 
 
 
 
 
 
 
 
 
82
  /**
83
  * {@inheritdoc}
84
  */
src/common/lib/vendor/symfony/translation/DataCollectorTranslator.php CHANGED
@@ -11,8 +11,6 @@
11
 
12
  namespace Symfony\Component\Translation;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
-
16
  /**
17
  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
  */
@@ -35,7 +33,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter
35
  public function __construct(TranslatorInterface $translator)
36
  {
37
  if (!$translator instanceof TranslatorBagInterface) {
38
- throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator)));
39
  }
40
 
41
  $this->translator = $translator;
11
 
12
  namespace Symfony\Component\Translation;
13
 
 
 
14
  /**
15
  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
16
  */
33
  public function __construct(TranslatorInterface $translator)
34
  {
35
  if (!$translator instanceof TranslatorBagInterface) {
36
+ throw new \InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator)));
37
  }
38
 
39
  $this->translator = $translator;
src/common/lib/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\DependencyInjection;
13
-
14
- use Symfony\Component\DependencyInjection\Reference;
15
- use Symfony\Component\DependencyInjection\ContainerBuilder;
16
- use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
17
-
18
- /**
19
- * Adds tagged translation.formatter services to translation writer.
20
- */
21
- class TranslationDumperPass implements CompilerPassInterface
22
- {
23
- private $writerServiceId;
24
- private $dumperTag;
25
-
26
- public function __construct($writerServiceId = 'translation.writer', $dumperTag = 'translation.dumper')
27
- {
28
- $this->writerServiceId = $writerServiceId;
29
- $this->dumperTag = $dumperTag;
30
- }
31
-
32
- public function process(ContainerBuilder $container)
33
- {
34
- if (!$container->hasDefinition($this->writerServiceId)) {
35
- return;
36
- }
37
-
38
- $definition = $container->getDefinition($this->writerServiceId);
39
-
40
- foreach ($container->findTaggedServiceIds($this->dumperTag, true) as $id => $attributes) {
41
- $definition->addMethodCall('addDumper', array($attributes[0]['alias'], new Reference($id)));
42
- }
43
- }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php DELETED
@@ -1,49 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\DependencyInjection;
13
-
14
- use Symfony\Component\DependencyInjection\Reference;
15
- use Symfony\Component\DependencyInjection\ContainerBuilder;
16
- use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
17
- use Symfony\Component\DependencyInjection\Exception\RuntimeException;
18
-
19
- /**
20
- * Adds tagged translation.extractor services to translation extractor.
21
- */
22
- class TranslationExtractorPass implements CompilerPassInterface
23
- {
24
- private $extractorServiceId;
25
- private $extractorTag;
26
-
27
- public function __construct($extractorServiceId = 'translation.extractor', $extractorTag = 'translation.extractor')
28
- {
29
- $this->extractorServiceId = $extractorServiceId;
30
- $this->extractorTag = $extractorTag;
31
- }
32
-
33
- public function process(ContainerBuilder $container)
34
- {
35
- if (!$container->hasDefinition($this->extractorServiceId)) {
36
- return;
37
- }
38
-
39
- $definition = $container->getDefinition($this->extractorServiceId);
40
-
41
- foreach ($container->findTaggedServiceIds($this->extractorTag, true) as $id => $attributes) {
42
- if (!isset($attributes[0]['alias'])) {
43
- throw new RuntimeException(sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id));
44
- }
45
-
46
- $definition->addMethodCall('addExtractor', array($attributes[0]['alias'], new Reference($id)));
47
- }
48
- }
49
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/DependencyInjection/TranslatorPass.php DELETED
@@ -1,95 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\DependencyInjection;
13
-
14
- use Symfony\Component\DependencyInjection\Reference;
15
- use Symfony\Component\DependencyInjection\ContainerBuilder;
16
- use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
17
- use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
18
-
19
- class TranslatorPass implements CompilerPassInterface
20
- {
21
- private $translatorServiceId;
22
- private $readerServiceId;
23
- private $loaderTag;
24
- private $debugCommandServiceId;
25
- private $updateCommandServiceId;
26
-
27
- public function __construct($translatorServiceId = 'translator.default', $readerServiceId = 'translation.loader', $loaderTag = 'translation.loader', $debugCommandServiceId = 'console.command.translation_debug', $updateCommandServiceId = 'console.command.translation_update')
28
- {
29
- if ('translation.loader' === $readerServiceId && 2 > func_num_args()) {
30
- @trigger_error('The default value for $readerServiceId will change in 4.0 to "translation.reader".', E_USER_DEPRECATED);
31
- }
32
-
33
- $this->translatorServiceId = $translatorServiceId;
34
- $this->readerServiceId = $readerServiceId;
35
- $this->loaderTag = $loaderTag;
36
- $this->debugCommandServiceId = $debugCommandServiceId;
37
- $this->updateCommandServiceId = $updateCommandServiceId;
38
- }
39
-
40
- public function process(ContainerBuilder $container)
41
- {
42
- if (!$container->hasDefinition($this->translatorServiceId)) {
43
- return;
44
- }
45
-
46
- $loaders = array();
47
- $loaderRefs = array();
48
- foreach ($container->findTaggedServiceIds($this->loaderTag, true) as $id => $attributes) {
49
- $loaderRefs[$id] = new Reference($id);
50
- $loaders[$id][] = $attributes[0]['alias'];
51
- if (isset($attributes[0]['legacy-alias'])) {
52
- $loaders[$id][] = $attributes[0]['legacy-alias'];
53
- }
54
- }
55
-
56
- if ($container->hasDefinition($this->readerServiceId)) {
57
- $definition = $container->getDefinition($this->readerServiceId);
58
- foreach ($loaders as $id => $formats) {
59
- foreach ($formats as $format) {
60
- $definition->addMethodCall('addLoader', array($format, $loaderRefs[$id]));
61
- }
62
- }
63
- }
64
-
65
- // Duplicated code to support "translation.reader", to be removed in 4.0
66
- if ('translation.reader' !== $this->readerServiceId) {
67
- if ($container->hasDefinition('translation.reader')) {
68
- $definition = $container->getDefinition('translation.reader');
69
- foreach ($loaders as $id => $formats) {
70
- foreach ($formats as $format) {
71
- $definition->addMethodCall('addLoader', array($format, $loaderRefs[$id]));
72
- }
73
- }
74
- }
75
- }
76
-
77
- $container
78
- ->findDefinition($this->translatorServiceId)
79
- ->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs))
80
- ->replaceArgument(3, $loaders)
81
- ;
82
-
83
- if (!$container->hasParameter('twig.default_path')) {
84
- return;
85
- }
86
-
87
- if ($container->hasDefinition($this->debugCommandServiceId)) {
88
- $container->getDefinition($this->debugCommandServiceId)->replaceArgument(4, $container->getParameter('twig.default_path'));
89
- }
90
-
91
- if ($container->hasDefinition($this->updateCommandServiceId)) {
92
- $container->getDefinition($this->updateCommandServiceId)->replaceArgument(5, $container->getParameter('twig.default_path'));
93
- }
94
- }
95
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Dumper/CsvFileDumper.php CHANGED
@@ -23,6 +23,16 @@ class CsvFileDumper extends FileDumper
23
  private $delimiter = ';';
24
  private $enclosure = '"';
25
 
 
 
 
 
 
 
 
 
 
 
26
  /**
27
  * {@inheritdoc}
28
  */
23
  private $delimiter = ';';
24
  private $enclosure = '"';
25
 
26
+ /**
27
+ * {@inheritdoc}
28
+ */
29
+ public function format(MessageCatalogue $messages, $domain = 'messages')
30
+ {
31
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
32
+
33
+ return $this->formatCatalogue($messages, $domain);
34
+ }
35
+
36
  /**
37
  * {@inheritdoc}
38
  */
src/common/lib/vendor/symfony/translation/Dumper/FileDumper.php CHANGED
@@ -12,8 +12,6 @@
12
  namespace Symfony\Component\Translation\Dumper;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
16
- use Symfony\Component\Translation\Exception\RuntimeException;
17
 
18
  /**
19
  * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s).
@@ -66,7 +64,7 @@ abstract class FileDumper implements DumperInterface
66
  public function dump(MessageCatalogue $messages, $options = array())
67
  {
68
  if (!array_key_exists('path', $options)) {
69
- throw new InvalidArgumentException('The file dumper needs a path option.');
70
  }
71
 
72
  // save a file for each domain
@@ -75,13 +73,12 @@ abstract class FileDumper implements DumperInterface
75
  $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale());
76
  if (file_exists($fullpath)) {
77
  if ($this->backup) {
78
- @trigger_error('Creating a backup while dumping a message catalogue is deprecated since Symfony 3.1 and will be removed in 4.0. Use TranslationWriter::disableBackup() to disable the backup.', E_USER_DEPRECATED);
79
  copy($fullpath, $fullpath.'~');
80
  }
81
  } else {
82
  $directory = dirname($fullpath);
83
  if (!file_exists($directory) && !@mkdir($directory, 0777, true)) {
84
- throw new RuntimeException(sprintf('Unable to create directory "%s".', $directory));
85
  }
86
  }
87
  // save file
@@ -92,13 +89,35 @@ abstract class FileDumper implements DumperInterface
92
  /**
93
  * Transforms a domain of a message catalogue to its string representation.
94
  *
 
 
95
  * @param MessageCatalogue $messages
96
  * @param string $domain
97
  * @param array $options
98
  *
99
  * @return string representation
100
  */
101
- abstract public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
 
103
  /**
104
  * Gets the file extension of the dumper.
12
  namespace Symfony\Component\Translation\Dumper;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
 
 
15
 
16
  /**
17
  * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s).
64
  public function dump(MessageCatalogue $messages, $options = array())
65
  {
66
  if (!array_key_exists('path', $options)) {
67
+ throw new \InvalidArgumentException('The file dumper needs a path option.');
68
  }
69
 
70
  // save a file for each domain
73
  $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale());
74
  if (file_exists($fullpath)) {
75
  if ($this->backup) {
 
76
  copy($fullpath, $fullpath.'~');
77
  }
78
  } else {
79
  $directory = dirname($fullpath);
80
  if (!file_exists($directory) && !@mkdir($directory, 0777, true)) {
81
+ throw new \RuntimeException(sprintf('Unable to create directory "%s".', $directory));
82
  }
83
  }
84
  // save file
89
  /**
90
  * Transforms a domain of a message catalogue to its string representation.
91
  *
92
+ * Override this function in child class if $options is used for message formatting.
93
+ *
94
  * @param MessageCatalogue $messages
95
  * @param string $domain
96
  * @param array $options
97
  *
98
  * @return string representation
99
  */
100
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
101
+ {
102
+ @trigger_error('The '.__METHOD__.' method will replace the format method in 3.0. You should overwrite it instead of overwriting format instead.', E_USER_DEPRECATED);
103
+
104
+ return $this->format($messages, $domain);
105
+ }
106
+
107
+ /**
108
+ * Transforms a domain of a message catalogue to its string representation.
109
+ *
110
+ * @param MessageCatalogue $messages
111
+ * @param string $domain
112
+ *
113
+ * @return string representation
114
+ *
115
+ * @deprecated since version 2.8, to be removed in 3.0. Overwrite formatCatalogue() instead.
116
+ */
117
+ protected function format(MessageCatalogue $messages, $domain)
118
+ {
119
+ throw new \LogicException('The "FileDumper::format" method needs to be overwritten, you should implement either "format" or "formatCatalogue".');
120
+ }
121
 
122
  /**
123
  * Gets the file extension of the dumper.
src/common/lib/vendor/symfony/translation/Dumper/IcuResFileDumper.php CHANGED
@@ -25,6 +25,16 @@ class IcuResFileDumper extends FileDumper
25
  */
26
  protected $relativePathTemplate = '%domain%/%locale%.%extension%';
27
 
 
 
 
 
 
 
 
 
 
 
28
  /**
29
  * {@inheritdoc}
30
  */
25
  */
26
  protected $relativePathTemplate = '%domain%/%locale%.%extension%';
27
 
28
+ /**
29
+ * {@inheritdoc}
30
+ */
31
+ public function format(MessageCatalogue $messages, $domain = 'messages')
32
+ {
33
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
34
+
35
+ return $this->formatCatalogue($messages, $domain);
36
+ }
37
+
38
  /**
39
  * {@inheritdoc}
40
  */
src/common/lib/vendor/symfony/translation/Dumper/IniFileDumper.php CHANGED
@@ -20,6 +20,16 @@ use Symfony\Component\Translation\MessageCatalogue;
20
  */
21
  class IniFileDumper extends FileDumper
22
  {
 
 
 
 
 
 
 
 
 
 
23
  /**
24
  * {@inheritdoc}
25
  */
20
  */
21
  class IniFileDumper extends FileDumper
22
  {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain = 'messages')
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
  /**
34
  * {@inheritdoc}
35
  */
src/common/lib/vendor/symfony/translation/Dumper/JsonFileDumper.php CHANGED
@@ -20,6 +20,16 @@ use Symfony\Component\Translation\MessageCatalogue;
20
  */
21
  class JsonFileDumper extends FileDumper
22
  {
 
 
 
 
 
 
 
 
 
 
23
  /**
24
  * {@inheritdoc}
25
  */
20
  */
21
  class JsonFileDumper extends FileDumper
22
  {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain = 'messages')
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
  /**
34
  * {@inheritdoc}
35
  */
src/common/lib/vendor/symfony/translation/Dumper/MoFileDumper.php CHANGED
@@ -21,6 +21,16 @@ use Symfony\Component\Translation\Loader\MoFileLoader;
21
  */
22
  class MoFileDumper extends FileDumper
23
  {
 
 
 
 
 
 
 
 
 
 
24
  /**
25
  * {@inheritdoc}
26
  */
21
  */
22
  class MoFileDumper extends FileDumper
23
  {
24
+ /**
25
+ * {@inheritdoc}
26
+ */
27
+ public function format(MessageCatalogue $messages, $domain = 'messages')
28
+ {
29
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
30
+
31
+ return $this->formatCatalogue($messages, $domain);
32
+ }
33
+
34
  /**
35
  * {@inheritdoc}
36
  */
src/common/lib/vendor/symfony/translation/Dumper/PhpFileDumper.php CHANGED
@@ -20,6 +20,16 @@ use Symfony\Component\Translation\MessageCatalogue;
20
  */
21
  class PhpFileDumper extends FileDumper
22
  {
 
 
 
 
 
 
 
 
 
 
23
  /**
24
  * {@inheritdoc}
25
  */
20
  */
21
  class PhpFileDumper extends FileDumper
22
  {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ protected function format(MessageCatalogue $messages, $domain)
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
  /**
34
  * {@inheritdoc}
35
  */
src/common/lib/vendor/symfony/translation/Dumper/PoFileDumper.php CHANGED
@@ -20,6 +20,16 @@ use Symfony\Component\Translation\MessageCatalogue;
20
  */
21
  class PoFileDumper extends FileDumper
22
  {
 
 
 
 
 
 
 
 
 
 
23
  /**
24
  * {@inheritdoc}
25
  */
20
  */
21
  class PoFileDumper extends FileDumper
22
  {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain = 'messages')
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
  /**
34
  * {@inheritdoc}
35
  */
src/common/lib/vendor/symfony/translation/Dumper/QtFileDumper.php CHANGED
@@ -20,6 +20,16 @@ use Symfony\Component\Translation\MessageCatalogue;
20
  */
21
  class QtFileDumper extends FileDumper
22
  {
 
 
 
 
 
 
 
 
 
 
23
  /**
24
  * {@inheritdoc}
25
  */
20
  */
21
  class QtFileDumper extends FileDumper
22
  {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain)
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
  /**
34
  * {@inheritdoc}
35
  */
src/common/lib/vendor/symfony/translation/Dumper/XliffFileDumper.php CHANGED
@@ -12,7 +12,6 @@
12
  namespace Symfony\Component\Translation\Dumper;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
16
 
17
  /**
18
  * XliffFileDumper generates xliff files from a message catalogue.
@@ -44,7 +43,17 @@ class XliffFileDumper extends FileDumper
44
  return $this->dumpXliff2($defaultLocale, $messages, $domain, $options);
45
  }
46
 
47
- throw new InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion));
 
 
 
 
 
 
 
 
 
 
48
  }
49
 
50
  /**
@@ -85,7 +94,7 @@ class XliffFileDumper extends FileDumper
85
  foreach ($messages->all($domain) as $source => $target) {
86
  $translation = $dom->createElement('trans-unit');
87
 
88
- $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._'));
89
  $translation->setAttribute('resname', $source);
90
 
91
  $s = $translation->appendChild($dom->createElement('source'));
@@ -145,24 +154,7 @@ class XliffFileDumper extends FileDumper
145
 
146
  foreach ($messages->all($domain) as $source => $target) {
147
  $translation = $dom->createElement('unit');
148
- $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._'));
149
- $metadata = $messages->getMetadata($source, $domain);
150
-
151
- // Add notes section
152
- if ($this->hasMetadataArrayInfo('notes', $metadata)) {
153
- $notesElement = $dom->createElement('notes');
154
- foreach ($metadata['notes'] as $note) {
155
- $n = $dom->createElement('note');
156
- $n->appendChild($dom->createTextNode(isset($note['content']) ? $note['content'] : ''));
157
- unset($note['content']);
158
-
159
- foreach ($note as $name => $value) {
160
- $n->setAttribute($name, $value);
161
- }
162
- $notesElement->appendChild($n);
163
- }
164
- $translation->appendChild($notesElement);
165
- }
166
 
167
  $segment = $translation->appendChild($dom->createElement('segment'));
168
 
@@ -173,6 +165,7 @@ class XliffFileDumper extends FileDumper
173
  $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
174
 
175
  $targetElement = $dom->createElement('target');
 
176
  if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
177
  foreach ($metadata['target-attributes'] as $name => $value) {
178
  $targetElement->setAttribute($name, $value);
12
  namespace Symfony\Component\Translation\Dumper;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
 
15
 
16
  /**
17
  * XliffFileDumper generates xliff files from a message catalogue.
43
  return $this->dumpXliff2($defaultLocale, $messages, $domain, $options);
44
  }
45
 
46
+ throw new \InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion));
47
+ }
48
+
49
+ /**
50
+ * {@inheritdoc}
51
+ */
52
+ protected function format(MessageCatalogue $messages, $domain)
53
+ {
54
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
55
+
56
+ return $this->formatCatalogue($messages, $domain);
57
  }
58
 
59
  /**
94
  foreach ($messages->all($domain) as $source => $target) {
95
  $translation = $dom->createElement('trans-unit');
96
 
97
+ $translation->setAttribute('id', md5($source));
98
  $translation->setAttribute('resname', $source);
99
 
100
  $s = $translation->appendChild($dom->createElement('source'));
154
 
155
  foreach ($messages->all($domain) as $source => $target) {
156
  $translation = $dom->createElement('unit');
157
+ $translation->setAttribute('id', md5($source));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
  $segment = $translation->appendChild($dom->createElement('segment'));
160
 
165
  $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
166
 
167
  $targetElement = $dom->createElement('target');
168
+ $metadata = $messages->getMetadata($source, $domain);
169
  if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
170
  foreach ($metadata['target-attributes'] as $name => $value) {
171
  $targetElement->setAttribute($name, $value);
src/common/lib/vendor/symfony/translation/Dumper/YamlFileDumper.php CHANGED
@@ -14,7 +14,6 @@ namespace Symfony\Component\Translation\Dumper;
14
  use Symfony\Component\Translation\MessageCatalogue;
15
  use Symfony\Component\Translation\Util\ArrayConverter;
16
  use Symfony\Component\Yaml\Yaml;
17
- use Symfony\Component\Translation\Exception\LogicException;
18
 
19
  /**
20
  * YamlFileDumper generates yaml files from a message catalogue.
@@ -23,20 +22,13 @@ use Symfony\Component\Translation\Exception\LogicException;
23
  */
24
  class YamlFileDumper extends FileDumper
25
  {
26
- private $extension;
27
-
28
- public function __construct(/**string */$extension = 'yml')
29
- {
30
- $this->extension = $extension;
31
- }
32
-
33
  /**
34
  * {@inheritdoc}
35
  */
36
  public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
37
  {
38
  if (!class_exists('Symfony\Component\Yaml\Yaml')) {
39
- throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.');
40
  }
41
 
42
  $data = $messages->all($domain);
@@ -52,11 +44,21 @@ class YamlFileDumper extends FileDumper
52
  return Yaml::dump($data);
53
  }
54
 
 
 
 
 
 
 
 
 
 
 
55
  /**
56
  * {@inheritdoc}
57
  */
58
  protected function getExtension()
59
  {
60
- return $this->extension;
61
  }
62
  }
14
  use Symfony\Component\Translation\MessageCatalogue;
15
  use Symfony\Component\Translation\Util\ArrayConverter;
16
  use Symfony\Component\Yaml\Yaml;
 
17
 
18
  /**
19
  * YamlFileDumper generates yaml files from a message catalogue.
22
  */
23
  class YamlFileDumper extends FileDumper
24
  {
 
 
 
 
 
 
 
25
  /**
26
  * {@inheritdoc}
27
  */
28
  public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
29
  {
30
  if (!class_exists('Symfony\Component\Yaml\Yaml')) {
31
+ throw new \LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.');
32
  }
33
 
34
  $data = $messages->all($domain);
44
  return Yaml::dump($data);
45
  }
46
 
47
+ /**
48
+ * {@inheritdoc}
49
+ */
50
+ protected function format(MessageCatalogue $messages, $domain)
51
+ {
52
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
53
+
54
+ return $this->formatCatalogue($messages, $domain);
55
+ }
56
+
57
  /**
58
  * {@inheritdoc}
59
  */
60
  protected function getExtension()
61
  {
62
+ return 'yml';
63
  }
64
  }
src/common/lib/vendor/symfony/translation/Exception/InvalidArgumentException.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Exception;
13
-
14
- /**
15
- * Base InvalidArgumentException for the Translation component.
16
- *
17
- * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
- */
19
- class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
20
- {
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Exception/LogicException.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Exception;
13
-
14
- /**
15
- * Base LogicException for Translation component.
16
- *
17
- * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
- */
19
- class LogicException extends \LogicException implements ExceptionInterface
20
- {
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Exception/RuntimeException.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Exception;
13
-
14
- /**
15
- * Base RuntimeException for the Translation component.
16
- *
17
- * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
- */
19
- class RuntimeException extends \RuntimeException implements ExceptionInterface
20
- {
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Extractor/AbstractFileExtractor.php CHANGED
@@ -11,8 +11,6 @@
11
 
12
  namespace Symfony\Component\Translation\Extractor;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
-
16
  /**
17
  * Base class used by classes that extract translation messages from files.
18
  *
@@ -58,12 +56,12 @@ abstract class AbstractFileExtractor
58
  *
59
  * @return bool
60
  *
61
- * @throws InvalidArgumentException
62
  */
63
  protected function isFile($file)
64
  {
65
  if (!is_file($file)) {
66
- throw new InvalidArgumentException(sprintf('The "%s" file does not exist.', $file));
67
  }
68
 
69
  return true;
11
 
12
  namespace Symfony\Component\Translation\Extractor;
13
 
 
 
14
  /**
15
  * Base class used by classes that extract translation messages from files.
16
  *
56
  *
57
  * @return bool
58
  *
59
+ * @throws \InvalidArgumentException
60
  */
61
  protected function isFile($file)
62
  {
63
  if (!is_file($file)) {
64
+ throw new \InvalidArgumentException(sprintf('The "%s" file does not exist.', $file));
65
  }
66
 
67
  return true;
src/common/lib/vendor/symfony/translation/Extractor/PhpExtractor.php DELETED
@@ -1,258 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Extractor;
13
-
14
- use Symfony\Component\Finder\Finder;
15
- use Symfony\Component\Translation\MessageCatalogue;
16
-
17
- /**
18
- * PhpExtractor extracts translation messages from a PHP template.
19
- *
20
- * @author Michel Salib <michelsalib@hotmail.com>
21
- */
22
- class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface
23
- {
24
- const MESSAGE_TOKEN = 300;
25
- const METHOD_ARGUMENTS_TOKEN = 1000;
26
- const DOMAIN_TOKEN = 1001;
27
-
28
- /**
29
- * Prefix for new found message.
30
- *
31
- * @var string
32
- */
33
- private $prefix = '';
34
-
35
- /**
36
- * The sequence that captures translation messages.
37
- *
38
- * @var array
39
- */
40
- protected $sequences = array(
41
- array(
42
- '->',
43
- 'trans',
44
- '(',
45
- self::MESSAGE_TOKEN,
46
- ',',
47
- self::METHOD_ARGUMENTS_TOKEN,
48
- ',',
49
- self::DOMAIN_TOKEN,
50
- ),
51
- array(
52
- '->',
53
- 'transChoice',
54
- '(',
55
- self::MESSAGE_TOKEN,
56
- ',',
57
- self::METHOD_ARGUMENTS_TOKEN,
58
- ',',
59
- self::METHOD_ARGUMENTS_TOKEN,
60
- ',',
61
- self::DOMAIN_TOKEN,
62
- ),
63
- array(
64
- '->',
65
- 'trans',
66
- '(',
67
- self::MESSAGE_TOKEN,
68
- ),
69
- array(
70
- '->',
71
- 'transChoice',
72
- '(',
73
- self::MESSAGE_TOKEN,
74
- ),
75
- );
76
-
77
- /**
78
- * {@inheritdoc}
79
- */
80
- public function extract($resource, MessageCatalogue $catalog)
81
- {
82
- $files = $this->extractFiles($resource);
83
- foreach ($files as $file) {
84
- $this->parseTokens(token_get_all(file_get_contents($file)), $catalog);
85
-
86
- if (\PHP_VERSION_ID >= 70000) {
87
- // PHP 7 memory manager will not release after token_get_all(), see https://bugs.php.net/70098
88
- gc_mem_caches();
89
- }
90
- }
91
- }
92
-
93
- /**
94
- * {@inheritdoc}
95
- */
96
- public function setPrefix($prefix)
97
- {
98
- $this->prefix = $prefix;
99
- }
100
-
101
- /**
102
- * Normalizes a token.
103
- *
104
- * @param mixed $token
105
- *
106
- * @return string
107
- */
108
- protected function normalizeToken($token)
109
- {
110
- if (isset($token[1]) && 'b"' !== $token) {
111
- return $token[1];
112
- }
113
-
114
- return $token;
115
- }
116
-
117
- /**
118
- * Seeks to a non-whitespace token.
119
- */
120
- private function seekToNextRelevantToken(\Iterator $tokenIterator)
121
- {
122
- for (; $tokenIterator->valid(); $tokenIterator->next()) {
123
- $t = $tokenIterator->current();
124
- if (T_WHITESPACE !== $t[0]) {
125
- break;
126
- }
127
- }
128
- }
129
-
130
- private function skipMethodArgument(\Iterator $tokenIterator)
131
- {
132
- $openBraces = 0;
133
-
134
- for (; $tokenIterator->valid(); $tokenIterator->next()) {
135
- $t = $tokenIterator->current();
136
-
137
- if ('[' === $t[0] || '(' === $t[0]) {
138
- ++$openBraces;
139
- }
140
-
141
- if (']' === $t[0] || ')' === $t[0]) {
142
- --$openBraces;
143
- }
144
-
145
- if ((0 === $openBraces && ',' === $t[0]) || (-1 === $openBraces && ')' === $t[0])) {
146
- break;
147
- }
148
- }
149
- }
150
-
151
- /**
152
- * Extracts the message from the iterator while the tokens
153
- * match allowed message tokens.
154
- */
155
- private function getValue(\Iterator $tokenIterator)
156
- {
157
- $message = '';
158
- $docToken = '';
159
-
160
- for (; $tokenIterator->valid(); $tokenIterator->next()) {
161
- $t = $tokenIterator->current();
162
- if (!isset($t[1])) {
163
- break;
164
- }
165
-
166
- switch ($t[0]) {
167
- case T_START_HEREDOC:
168
- $docToken = $t[1];
169
- break;
170
- case T_ENCAPSED_AND_WHITESPACE:
171
- case T_CONSTANT_ENCAPSED_STRING:
172
- $message .= $t[1];
173
- break;
174
- case T_END_HEREDOC:
175
- return PhpStringTokenParser::parseDocString($docToken, $message);
176
- default:
177
- break 2;
178
- }
179
- }
180
-
181
- if ($message) {
182
- $message = PhpStringTokenParser::parse($message);
183
- }
184
-
185
- return $message;
186
- }
187
-
188
- /**
189
- * Extracts trans message from PHP tokens.
190
- *
191
- * @param array $tokens
192
- * @param MessageCatalogue $catalog
193
- */
194
- protected function parseTokens($tokens, MessageCatalogue $catalog)
195
- {
196
- $tokenIterator = new \ArrayIterator($tokens);
197
-
198
- for ($key = 0; $key < $tokenIterator->count(); ++$key) {
199
- foreach ($this->sequences as $sequence) {
200
- $message = '';
201
- $domain = 'messages';
202
- $tokenIterator->seek($key);
203
-
204
- foreach ($sequence as $sequenceKey => $item) {
205
- $this->seekToNextRelevantToken($tokenIterator);
206
-
207
- if ($this->normalizeToken($tokenIterator->current()) === $item) {
208
- $tokenIterator->next();
209
- continue;
210
- } elseif (self::MESSAGE_TOKEN === $item) {
211
- $message = $this->getValue($tokenIterator);
212
-
213
- if (count($sequence) === ($sequenceKey + 1)) {
214
- break;
215
- }
216
- } elseif (self::METHOD_ARGUMENTS_TOKEN === $item) {
217
- $this->skipMethodArgument($tokenIterator);
218
- } elseif (self::DOMAIN_TOKEN === $item) {
219
- $domain = $this->getValue($tokenIterator);
220
-
221
- break;
222
- } else {
223
- break;
224
- }
225
- }
226
-
227
- if ($message) {
228
- $catalog->set($message, $this->prefix.$message, $domain);
229
- break;
230
- }
231
- }
232
- }
233
- }
234
-
235
- /**
236
- * @param string $file
237
- *
238
- * @return bool
239
- *
240
- * @throws \InvalidArgumentException
241
- */
242
- protected function canBeExtracted($file)
243
- {
244
- return $this->isFile($file) && 'php' === pathinfo($file, PATHINFO_EXTENSION);
245
- }
246
-
247
- /**
248
- * @param string|array $directory
249
- *
250
- * @return array
251
- */
252
- protected function extractFromDirectory($directory)
253
- {
254
- $finder = new Finder();
255
-
256
- return $finder->files()->name('*.php')->in($directory);
257
- }
258
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Extractor/PhpStringTokenParser.php DELETED
@@ -1,142 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Extractor;
13
-
14
- /*
15
- * The following is derived from code at http://github.com/nikic/PHP-Parser
16
- *
17
- * Copyright (c) 2011 by Nikita Popov
18
- *
19
- * Some rights reserved.
20
- *
21
- * Redistribution and use in source and binary forms, with or without
22
- * modification, are permitted provided that the following conditions are
23
- * met:
24
- *
25
- * * Redistributions of source code must retain the above copyright
26
- * notice, this list of conditions and the following disclaimer.
27
- *
28
- * * Redistributions in binary form must reproduce the above
29
- * copyright notice, this list of conditions and the following
30
- * disclaimer in the documentation and/or other materials provided
31
- * with the distribution.
32
- *
33
- * * The names of the contributors may not be used to endorse or
34
- * promote products derived from this software without specific
35
- * prior written permission.
36
- *
37
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
38
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
39
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
40
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
41
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
44
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
45
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
46
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
47
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48
- */
49
-
50
- class PhpStringTokenParser
51
- {
52
- protected static $replacements = array(
53
- '\\' => '\\',
54
- '$' => '$',
55
- 'n' => "\n",
56
- 'r' => "\r",
57
- 't' => "\t",
58
- 'f' => "\f",
59
- 'v' => "\v",
60
- 'e' => "\x1B",
61
- );
62
-
63
- /**
64
- * Parses a string token.
65
- *
66
- * @param string $str String token content
67
- *
68
- * @return string The parsed string
69
- */
70
- public static function parse($str)
71
- {
72
- $bLength = 0;
73
- if ('b' === $str[0]) {
74
- $bLength = 1;
75
- }
76
-
77
- if ('\'' === $str[$bLength]) {
78
- return str_replace(
79
- array('\\\\', '\\\''),
80
- array('\\', '\''),
81
- substr($str, $bLength + 1, -1)
82
- );
83
- } else {
84
- return self::parseEscapeSequences(substr($str, $bLength + 1, -1), '"');
85
- }
86
- }
87
-
88
- /**
89
- * Parses escape sequences in strings (all string types apart from single quoted).
90
- *
91
- * @param string $str String without quotes
92
- * @param null|string $quote Quote type
93
- *
94
- * @return string String with escape sequences parsed
95
- */
96
- public static function parseEscapeSequences($str, $quote)
97
- {
98
- if (null !== $quote) {
99
- $str = str_replace('\\'.$quote, $quote, $str);
100
- }
101
-
102
- return preg_replace_callback(
103
- '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~',
104
- array(__CLASS__, 'parseCallback'),
105
- $str
106
- );
107
- }
108
-
109
- private static function parseCallback($matches)
110
- {
111
- $str = $matches[1];
112
-
113
- if (isset(self::$replacements[$str])) {
114
- return self::$replacements[$str];
115
- } elseif ('x' === $str[0] || 'X' === $str[0]) {
116
- return chr(hexdec($str));
117
- } else {
118
- return chr(octdec($str));
119
- }
120
- }
121
-
122
- /**
123
- * Parses a constant doc string.
124
- *
125
- * @param string $startToken Doc string start token content (<<<SMTHG)
126
- * @param string $str String token content
127
- *
128
- * @return string Parsed string
129
- */
130
- public static function parseDocString($startToken, $str)
131
- {
132
- // strip last newline (thanks tokenizer for sticking it into the string!)
133
- $str = preg_replace('~(\r\n|\n|\r)$~', '', $str);
134
-
135
- // nowdoc string
136
- if (false !== strpos($startToken, '\'')) {
137
- return $str;
138
- }
139
-
140
- return self::parseEscapeSequences($str, null);
141
- }
142
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Formatter;
13
-
14
- /**
15
- * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
16
- */
17
- interface ChoiceMessageFormatterInterface
18
- {
19
- /**
20
- * Formats a localized message pattern with given arguments.
21
- *
22
- * @param string $message The message (may also be an object that can be cast to string)
23
- * @param int $number The number to use to find the indice of the message
24
- * @param string $locale The message locale
25
- * @param array $parameters An array of parameters for the message
26
- *
27
- * @return string
28
- */
29
- public function choiceFormat($message, $number, $locale, array $parameters = array());
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Formatter/MessageFormatter.php DELETED
@@ -1,48 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Formatter;
13
-
14
- use Symfony\Component\Translation\MessageSelector;
15
-
16
- /**
17
- * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
- */
19
- class MessageFormatter implements MessageFormatterInterface, ChoiceMessageFormatterInterface
20
- {
21
- private $selector;
22
-
23
- /**
24
- * @param MessageSelector|null $selector The message selector for pluralization
25
- */
26
- public function __construct(MessageSelector $selector = null)
27
- {
28
- $this->selector = $selector ?: new MessageSelector();
29
- }
30
-
31
- /**
32
- * {@inheritdoc}
33
- */
34
- public function format($message, $locale, array $parameters = array())
35
- {
36
- return strtr($message, $parameters);
37
- }
38
-
39
- /**
40
- * {@inheritdoc}
41
- */
42
- public function choiceFormat($message, $number, $locale, array $parameters = array())
43
- {
44
- $parameters = array_merge(array('%count%' => $number), $parameters);
45
-
46
- return $this->format($this->selector->choose($message, (int) $number, $locale), $locale, $parameters);
47
- }
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Formatter/MessageFormatterInterface.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Formatter;
13
-
14
- /**
15
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
16
- * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
17
- */
18
- interface MessageFormatterInterface
19
- {
20
- /**
21
- * Formats a localized message pattern with given arguments.
22
- *
23
- * @param string $message The message (may also be an object that can be cast to string)
24
- * @param string $locale The message locale
25
- * @param array $parameters An array of parameters for the message
26
- *
27
- * @return string
28
- */
29
- public function format($message, $locale, array $parameters = array());
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Interval.php CHANGED
@@ -11,8 +11,6 @@
11
 
12
  namespace Symfony\Component\Translation;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
-
16
  /**
17
  * Tests if a given number belongs to a given math interval.
18
  *
@@ -43,14 +41,14 @@ class Interval
43
  *
44
  * @return bool
45
  *
46
- * @throws InvalidArgumentException
47
  */
48
  public static function test($number, $interval)
49
  {
50
  $interval = trim($interval);
51
 
52
  if (!preg_match('/^'.self::getIntervalRegexp().'$/x', $interval, $matches)) {
53
- throw new InvalidArgumentException(sprintf('"%s" is not a valid interval.', $interval));
54
  }
55
 
56
  if ($matches[1]) {
11
 
12
  namespace Symfony\Component\Translation;
13
 
 
 
14
  /**
15
  * Tests if a given number belongs to a given math interval.
16
  *
41
  *
42
  * @return bool
43
  *
44
+ * @throws \InvalidArgumentException
45
  */
46
  public static function test($number, $interval)
47
  {
48
  $interval = trim($interval);
49
 
50
  if (!preg_match('/^'.self::getIntervalRegexp().'$/x', $interval, $matches)) {
51
+ throw new \InvalidArgumentException(sprintf('"%s" is not a valid interval.', $interval));
52
  }
53
 
54
  if ($matches[1]) {
src/common/lib/vendor/symfony/translation/Loader/XliffFileLoader.php CHANGED
@@ -15,7 +15,6 @@ use Symfony\Component\Config\Util\XmlUtils;
15
  use Symfony\Component\Translation\MessageCatalogue;
16
  use Symfony\Component\Translation\Exception\InvalidResourceException;
17
  use Symfony\Component\Translation\Exception\NotFoundResourceException;
18
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
19
  use Symfony\Component\Config\Resource\FileResource;
20
 
21
  /**
@@ -99,7 +98,6 @@ class XliffFileLoader implements LoaderInterface
99
  if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
100
  $metadata['notes'] = $notes;
101
  }
102
-
103
  if (isset($translation->target) && $translation->target->attributes()) {
104
  $metadata['target-attributes'] = array();
105
  foreach ($translation->target->attributes() as $key => $value) {
@@ -107,10 +105,6 @@ class XliffFileLoader implements LoaderInterface
107
  }
108
  }
109
 
110
- if (isset($attributes['id'])) {
111
- $metadata['id'] = (string) $attributes['id'];
112
- }
113
-
114
  $catalogue->setMetadata((string) $source, $metadata, $domain);
115
  }
116
  }
@@ -127,8 +121,7 @@ class XliffFileLoader implements LoaderInterface
127
 
128
  $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
129
 
130
- foreach ($xml->xpath('//xliff:unit') as $unit) {
131
- $segment = $unit->segment;
132
  $source = $segment->source;
133
 
134
  // If the xlf file has another encoding specified, try to convert it because
@@ -145,18 +138,6 @@ class XliffFileLoader implements LoaderInterface
145
  }
146
  }
147
 
148
- if (isset($unit->notes)) {
149
- $metadata['notes'] = array();
150
- foreach ($unit->notes->note as $noteNode) {
151
- $note = array();
152
- foreach ($noteNode->attributes() as $key => $value) {
153
- $note[$key] = (string) $value;
154
- }
155
- $note['content'] = (string) $noteNode;
156
- $metadata['notes'][] = $note;
157
- }
158
- }
159
-
160
  $catalogue->setMetadata((string) $source, $metadata, $domain);
161
  }
162
  }
@@ -185,6 +166,7 @@ class XliffFileLoader implements LoaderInterface
185
  * @param \DOMDocument $dom
186
  * @param string $schema source of the schema
187
  *
 
188
  * @throws InvalidResourceException
189
  */
190
  private function validateSchema($file, \DOMDocument $dom, $schema)
@@ -216,7 +198,7 @@ class XliffFileLoader implements LoaderInterface
216
  $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-2.0.xsd');
217
  $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
218
  } else {
219
- throw new InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
220
  }
221
 
222
  return $this->fixXmlLocation($schemaSource, $xmlUri);
@@ -236,7 +218,7 @@ class XliffFileLoader implements LoaderInterface
236
  $parts = explode('/', $newPath);
237
  $locationstart = 'file:///';
238
  if (0 === stripos($newPath, 'phar://')) {
239
- $tmpfile = tempnam(sys_get_temp_dir(), 'symfony');
240
  if ($tmpfile) {
241
  copy($newPath, $tmpfile);
242
  $parts = explode('/', str_replace('\\', '/', $tmpfile));
@@ -245,7 +227,6 @@ class XliffFileLoader implements LoaderInterface
245
  $locationstart = 'phar:///';
246
  }
247
  }
248
-
249
  $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
250
  $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts));
251
 
@@ -285,7 +266,7 @@ class XliffFileLoader implements LoaderInterface
285
  *
286
  * @param \DOMDocument $dom
287
  *
288
- * @throws InvalidArgumentException
289
  *
290
  * @return string
291
  */
@@ -301,7 +282,7 @@ class XliffFileLoader implements LoaderInterface
301
  $namespace = $xliff->attributes->getNamedItem('xmlns');
302
  if ($namespace) {
303
  if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) {
304
- throw new InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace));
305
  }
306
 
307
  return substr($namespace, 34);
@@ -312,7 +293,7 @@ class XliffFileLoader implements LoaderInterface
312
  return '1.2';
313
  }
314
 
315
- /**
316
  * @param \SimpleXMLElement|null $noteElement
317
  * @param string|null $encoding
318
  *
@@ -326,7 +307,6 @@ class XliffFileLoader implements LoaderInterface
326
  return $notes;
327
  }
328
 
329
- /** @var \SimpleXMLElement $xmlNote */
330
  foreach ($noteElement as $xmlNote) {
331
  $noteAttributes = $xmlNote->attributes();
332
  $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
15
  use Symfony\Component\Translation\MessageCatalogue;
16
  use Symfony\Component\Translation\Exception\InvalidResourceException;
17
  use Symfony\Component\Translation\Exception\NotFoundResourceException;
 
18
  use Symfony\Component\Config\Resource\FileResource;
19
 
20
  /**
98
  if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
99
  $metadata['notes'] = $notes;
100
  }
 
101
  if (isset($translation->target) && $translation->target->attributes()) {
102
  $metadata['target-attributes'] = array();
103
  foreach ($translation->target->attributes() as $key => $value) {
105
  }
106
  }
107
 
 
 
 
 
108
  $catalogue->setMetadata((string) $source, $metadata, $domain);
109
  }
110
  }
121
 
122
  $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
123
 
124
+ foreach ($xml->xpath('//xliff:unit/xliff:segment') as $segment) {
 
125
  $source = $segment->source;
126
 
127
  // If the xlf file has another encoding specified, try to convert it because
138
  }
139
  }
140
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  $catalogue->setMetadata((string) $source, $metadata, $domain);
142
  }
143
  }
166
  * @param \DOMDocument $dom
167
  * @param string $schema source of the schema
168
  *
169
+ * @throws \RuntimeException
170
  * @throws InvalidResourceException
171
  */
172
  private function validateSchema($file, \DOMDocument $dom, $schema)
198
  $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-2.0.xsd');
199
  $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
200
  } else {
201
+ throw new \InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
202
  }
203
 
204
  return $this->fixXmlLocation($schemaSource, $xmlUri);
218
  $parts = explode('/', $newPath);
219
  $locationstart = 'file:///';
220
  if (0 === stripos($newPath, 'phar://')) {
221
+ $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
222
  if ($tmpfile) {
223
  copy($newPath, $tmpfile);
224
  $parts = explode('/', str_replace('\\', '/', $tmpfile));
227
  $locationstart = 'phar:///';
228
  }
229
  }
 
230
  $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
231
  $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts));
232
 
266
  *
267
  * @param \DOMDocument $dom
268
  *
269
+ * @throws \InvalidArgumentException
270
  *
271
  * @return string
272
  */
282
  $namespace = $xliff->attributes->getNamedItem('xmlns');
283
  if ($namespace) {
284
  if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) {
285
+ throw new \InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace));
286
  }
287
 
288
  return substr($namespace, 34);
293
  return '1.2';
294
  }
295
 
296
+ /*
297
  * @param \SimpleXMLElement|null $noteElement
298
  * @param string|null $encoding
299
  *
307
  return $notes;
308
  }
309
 
 
310
  foreach ($noteElement as $xmlNote) {
311
  $noteAttributes = $xmlNote->attributes();
312
  $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
src/common/lib/vendor/symfony/translation/Loader/YamlFileLoader.php CHANGED
@@ -12,7 +12,6 @@
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\LogicException;
16
  use Symfony\Component\Yaml\Parser as YamlParser;
17
  use Symfony\Component\Yaml\Exception\ParseException;
18
 
@@ -32,24 +31,16 @@ class YamlFileLoader extends FileLoader
32
  {
33
  if (null === $this->yamlParser) {
34
  if (!class_exists('Symfony\Component\Yaml\Parser')) {
35
- throw new LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
36
  }
37
 
38
  $this->yamlParser = new YamlParser();
39
  }
40
 
41
- $prevErrorHandler = set_error_handler(function ($level, $message, $script, $line) use ($resource, &$prevErrorHandler) {
42
- $message = E_USER_DEPRECATED === $level ? preg_replace('/ on line \d+/', ' in "'.$resource.'"$0', $message) : $message;
43
-
44
- return $prevErrorHandler ? $prevErrorHandler($level, $message, $script, $line) : false;
45
- });
46
-
47
  try {
48
- $messages = $this->yamlParser->parseFile($resource);
49
  } catch (ParseException $e) {
50
  throw new InvalidResourceException(sprintf('Error parsing YAML, invalid file "%s"', $resource), 0, $e);
51
- } finally {
52
- restore_error_handler();
53
  }
54
 
55
  return $messages;
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
 
15
  use Symfony\Component\Yaml\Parser as YamlParser;
16
  use Symfony\Component\Yaml\Exception\ParseException;
17
 
31
  {
32
  if (null === $this->yamlParser) {
33
  if (!class_exists('Symfony\Component\Yaml\Parser')) {
34
+ throw new \LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
35
  }
36
 
37
  $this->yamlParser = new YamlParser();
38
  }
39
 
 
 
 
 
 
 
40
  try {
41
+ $messages = $this->yamlParser->parse(file_get_contents($resource));
42
  } catch (ParseException $e) {
43
  throw new InvalidResourceException(sprintf('Error parsing YAML, invalid file "%s"', $resource), 0, $e);
 
 
44
  }
45
 
46
  return $messages;
src/common/lib/vendor/symfony/translation/LoggingTranslator.php CHANGED
@@ -12,7 +12,6 @@
12
  namespace Symfony\Component\Translation;
13
 
14
  use Psr\Log\LoggerInterface;
15
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
16
 
17
  /**
18
  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
@@ -33,7 +32,7 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface
33
  public function __construct(TranslatorInterface $translator, LoggerInterface $logger)
34
  {
35
  if (!$translator instanceof TranslatorBagInterface) {
36
- throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator)));
37
  }
38
 
39
  $this->translator = $translator;
12
  namespace Symfony\Component\Translation;
13
 
14
  use Psr\Log\LoggerInterface;
 
15
 
16
  /**
17
  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
32
  public function __construct(TranslatorInterface $translator, LoggerInterface $logger)
33
  {
34
  if (!$translator instanceof TranslatorBagInterface) {
35
+ throw new \InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator)));
36
  }
37
 
38
  $this->translator = $translator;
src/common/lib/vendor/symfony/translation/MessageCatalogue.php CHANGED
@@ -12,7 +12,6 @@
12
  namespace Symfony\Component\Translation;
13
 
14
  use Symfony\Component\Config\Resource\ResourceInterface;
15
- use Symfony\Component\Translation\Exception\LogicException;
16
 
17
  /**
18
  * @author Fabien Potencier <fabien@symfony.com>
@@ -140,7 +139,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf
140
  public function addCatalogue(MessageCatalogueInterface $catalogue)
141
  {
142
  if ($catalogue->getLocale() !== $this->locale) {
143
- throw new LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
144
  }
145
 
146
  foreach ($catalogue->all() as $domain => $messages) {
@@ -166,14 +165,14 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf
166
  $c = $catalogue;
167
  while ($c = $c->getFallbackCatalogue()) {
168
  if ($c->getLocale() === $this->getLocale()) {
169
- throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
170
  }
171
  }
172
 
173
  $c = $this;
174
  do {
175
  if ($c->getLocale() === $catalogue->getLocale()) {
176
- throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
177
  }
178
 
179
  foreach ($catalogue->getResources() as $resource) {
12
  namespace Symfony\Component\Translation;
13
 
14
  use Symfony\Component\Config\Resource\ResourceInterface;
 
15
 
16
  /**
17
  * @author Fabien Potencier <fabien@symfony.com>
139
  public function addCatalogue(MessageCatalogueInterface $catalogue)
140
  {
141
  if ($catalogue->getLocale() !== $this->locale) {
142
+ throw new \LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
143
  }
144
 
145
  foreach ($catalogue->all() as $domain => $messages) {
165
  $c = $catalogue;
166
  while ($c = $c->getFallbackCatalogue()) {
167
  if ($c->getLocale() === $this->getLocale()) {
168
+ throw new \LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
169
  }
170
  }
171
 
172
  $c = $this;
173
  do {
174
  if ($c->getLocale() === $catalogue->getLocale()) {
175
+ throw new \LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
176
  }
177
 
178
  foreach ($catalogue->getResources() as $resource) {
src/common/lib/vendor/symfony/translation/MessageSelector.php CHANGED
@@ -11,8 +11,6 @@
11
 
12
  namespace Symfony\Component\Translation;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
-
16
  /**
17
  * MessageSelector.
18
  *
@@ -45,21 +43,15 @@ class MessageSelector
45
  *
46
  * @return string
47
  *
48
- * @throws InvalidArgumentException
49
  */
50
  public function choose($message, $number, $locale)
51
  {
52
- $parts = array();
53
- if (preg_match('/^\|++$/', $message)) {
54
- $parts = explode('|', $message);
55
- } elseif (preg_match_all('/(?:\|\||[^\|])++/', $message, $matches)) {
56
- $parts = $matches[0];
57
- }
58
-
59
  $explicitRules = array();
60
  $standardRules = array();
61
  foreach ($parts as $part) {
62
- $part = trim(str_replace('||', '|', $part));
63
 
64
  if (preg_match('/^(?P<interval>'.Interval::getIntervalRegexp().')\s*(?P<message>.*?)$/xs', $part, $matches)) {
65
  $explicitRules[$matches['interval']] = $matches['message'];
@@ -86,7 +78,7 @@ class MessageSelector
86
  return $standardRules[0];
87
  }
88
 
89
- throw new InvalidArgumentException(sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale, $number));
90
  }
91
 
92
  return $standardRules[$position];
11
 
12
  namespace Symfony\Component\Translation;
13
 
 
 
14
  /**
15
  * MessageSelector.
16
  *
43
  *
44
  * @return string
45
  *
46
+ * @throws \InvalidArgumentException
47
  */
48
  public function choose($message, $number, $locale)
49
  {
50
+ $parts = explode('|', $message);
 
 
 
 
 
 
51
  $explicitRules = array();
52
  $standardRules = array();
53
  foreach ($parts as $part) {
54
+ $part = trim($part);
55
 
56
  if (preg_match('/^(?P<interval>'.Interval::getIntervalRegexp().')\s*(?P<message>.*?)$/xs', $part, $matches)) {
57
  $explicitRules[$matches['interval']] = $matches['message'];
78
  return $standardRules[0];
79
  }
80
 
81
+ throw new \InvalidArgumentException(sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale, $number));
82
  }
83
 
84
  return $standardRules[$position];
src/common/lib/vendor/symfony/translation/PluralizationRules.php CHANGED
@@ -191,8 +191,10 @@ class PluralizationRules
191
  *
192
  * @param callable $rule A PHP callable
193
  * @param string $locale The locale
 
 
194
  */
195
- public static function set(callable $rule, $locale)
196
  {
197
  if ('pt_BR' === $locale) {
198
  // temporary set a locale for brazilian
@@ -203,6 +205,10 @@ class PluralizationRules
203
  $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
204
  }
205
 
 
 
 
 
206
  self::$rules[$locale] = $rule;
207
  }
208
  }
191
  *
192
  * @param callable $rule A PHP callable
193
  * @param string $locale The locale
194
+ *
195
+ * @throws \LogicException
196
  */
197
+ public static function set($rule, $locale)
198
  {
199
  if ('pt_BR' === $locale) {
200
  // temporary set a locale for brazilian
205
  $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
206
  }
207
 
208
+ if (!is_callable($rule)) {
209
+ throw new \LogicException('The given rule can not be called');
210
+ }
211
+
212
  self::$rules[$locale] = $rule;
213
  }
214
  }
src/common/lib/vendor/symfony/translation/Reader/TranslationReader.php DELETED
@@ -1,63 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Reader;
13
-
14
- use Symfony\Component\Finder\Finder;
15
- use Symfony\Component\Translation\Loader\LoaderInterface;
16
- use Symfony\Component\Translation\MessageCatalogue;
17
-
18
- /**
19
- * TranslationReader reads translation messages from translation files.
20
- *
21
- * @author Michel Salib <michelsalib@hotmail.com>
22
- */
23
- class TranslationReader implements TranslationReaderInterface
24
- {
25
- /**
26
- * Loaders used for import.
27
- *
28
- * @var array
29
- */
30
- private $loaders = array();
31
-
32
- /**
33
- * Adds a loader to the translation extractor.
34
- *
35
- * @param string $format The format of the loader
36
- * @param LoaderInterface $loader
37
- */
38
- public function addLoader($format, LoaderInterface $loader)
39
- {
40
- $this->loaders[$format] = $loader;
41
- }
42
-
43
- /**
44
- * {@inheritdoc}
45
- */
46
- public function read($directory, MessageCatalogue $catalogue)
47
- {
48
- if (!is_dir($directory)) {
49
- return;
50
- }
51
-
52
- foreach ($this->loaders as $format => $loader) {
53
- // load any existing translation files
54
- $finder = new Finder();
55
- $extension = $catalogue->getLocale().'.'.$format;
56
- $files = $finder->files()->name('*.'.$extension)->in($directory);
57
- foreach ($files as $file) {
58
- $domain = substr($file->getFilename(), 0, -1 * strlen($extension) - 1);
59
- $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain));
60
- }
61
- }
62
- }
63
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Reader/TranslationReaderInterface.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Reader;
13
-
14
- use Symfony\Component\Translation\MessageCatalogue;
15
-
16
- /**
17
- * TranslationReader reads translation messages from translation files.
18
- *
19
- * @author Tobias Nyholm <tobias.nyholm@gmail.com>
20
- */
21
- interface TranslationReaderInterface
22
- {
23
- /**
24
- * Reads translation messages from a directory to the catalogue.
25
- *
26
- * @param string $directory
27
- * @param MessageCatalogue $catalogue
28
- */
29
- public function read($directory, MessageCatalogue $catalogue);
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd DELETED
@@ -1,2223 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
-
3
- <!--
4
-
5
- May-19-2004:
6
- - Changed the <choice> for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements
7
- to <choice> itself.
8
- - Added <choice> for ElemType_trans-unit to allow "any order" for <context-group>, <count-group>, <prop-group>, <note>, and
9
- <alt-trans>.
10
-
11
- Oct-2005
12
- - updated version info to 1.2
13
- - equiv-trans attribute to <trans-unit> element
14
- - merged-trans attribute for <group> element
15
- - Add the <seg-source> element as optional in the <trans-unit> and <alt-trans> content models, at the same level as <source>
16
- - Create a new value "seg" for the mtype attribute of the <mrk> element
17
- - Add mid as an optional attribute for the <alt-trans> element
18
-
19
- Nov-14-2005
20
- - Changed name attribute for <context-group> from required to optional
21
- - Added extension point at <xliff>
22
-
23
- Jan-9-2006
24
- - Added alttranstype type attribute to <alt-trans>, and values
25
-
26
- Jan-10-2006
27
- - Corrected error with overwritten purposeValueList
28
- - Corrected name="AttrType_Version", attribute should have been "name"
29
-
30
- -->
31
- <xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
32
- <!-- Import for xml:lang and xml:space -->
33
- <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
34
- <!-- Attributes Lists -->
35
- <xsd:simpleType name="XTend">
36
- <xsd:restriction base="xsd:string">
37
- <xsd:pattern value="x-[^\s]+"/>
38
- </xsd:restriction>
39
- </xsd:simpleType>
40
- <xsd:simpleType name="context-typeValueList">
41
- <xsd:annotation>
42
- <xsd:documentation>Values for the attribute 'context-type'.</xsd:documentation>
43
- </xsd:annotation>
44
- <xsd:restriction base="xsd:string">
45
- <xsd:enumeration value="database">
46
- <xsd:annotation>
47
- <xsd:documentation>Indicates a database content.</xsd:documentation>
48
- </xsd:annotation>
49
- </xsd:enumeration>
50
- <xsd:enumeration value="element">
51
- <xsd:annotation>
52
- <xsd:documentation>Indicates the content of an element within an XML document.</xsd:documentation>
53
- </xsd:annotation>
54
- </xsd:enumeration>
55
- <xsd:enumeration value="elementtitle">
56
- <xsd:annotation>
57
- <xsd:documentation>Indicates the name of an element within an XML document.</xsd:documentation>
58
- </xsd:annotation>
59
- </xsd:enumeration>
60
- <xsd:enumeration value="linenumber">
61
- <xsd:annotation>
62
- <xsd:documentation>Indicates the line number from the sourcefile (see context-type="sourcefile") where the &lt;source&gt; is found.</xsd:documentation>
63
- </xsd:annotation>
64
- </xsd:enumeration>
65
- <xsd:enumeration value="numparams">
66
- <xsd:annotation>
67
- <xsd:documentation>Indicates a the number of parameters contained within the &lt;source&gt;.</xsd:documentation>
68
- </xsd:annotation>
69
- </xsd:enumeration>
70
- <xsd:enumeration value="paramnotes">
71
- <xsd:annotation>
72
- <xsd:documentation>Indicates notes pertaining to the parameters in the &lt;source&gt;.</xsd:documentation>
73
- </xsd:annotation>
74
- </xsd:enumeration>
75
- <xsd:enumeration value="record">
76
- <xsd:annotation>
77
- <xsd:documentation>Indicates the content of a record within a database.</xsd:documentation>
78
- </xsd:annotation>
79
- </xsd:enumeration>
80
- <xsd:enumeration value="recordtitle">
81
- <xsd:annotation>
82
- <xsd:documentation>Indicates the name of a record within a database.</xsd:documentation>
83
- </xsd:annotation>
84
- </xsd:enumeration>
85
- <xsd:enumeration value="sourcefile">
86
- <xsd:annotation>
87
- <xsd:documentation>Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original &lt;file&gt; attribute in that this sourcefile is one of many that make up that file.</xsd:documentation>
88
- </xsd:annotation>
89
- </xsd:enumeration>
90
- </xsd:restriction>
91
- </xsd:simpleType>
92
- <xsd:simpleType name="count-typeValueList">
93
- <xsd:annotation>
94
- <xsd:documentation>Values for the attribute 'count-type'.</xsd:documentation>
95
- </xsd:annotation>
96
- <xsd:restriction base="xsd:NMTOKEN">
97
- <xsd:enumeration value="num-usages">
98
- <xsd:annotation>
99
- <xsd:documentation>Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.</xsd:documentation>
100
- </xsd:annotation>
101
- </xsd:enumeration>
102
- <xsd:enumeration value="repetition">
103
- <xsd:annotation>
104
- <xsd:documentation>Indicates the count units are translation units existing already in the same document.</xsd:documentation>
105
- </xsd:annotation>
106
- </xsd:enumeration>
107
- <xsd:enumeration value="total">
108
- <xsd:annotation>
109
- <xsd:documentation>Indicates a total count.</xsd:documentation>
110
- </xsd:annotation>
111
- </xsd:enumeration>
112
- </xsd:restriction>
113
- </xsd:simpleType>
114
- <xsd:simpleType name="InlineDelimitersValueList">
115
- <xsd:annotation>
116
- <xsd:documentation>Values for the attribute 'ctype' when used other elements than &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
117
- </xsd:annotation>
118
- <xsd:restriction base="xsd:NMTOKEN">
119
- <xsd:enumeration value="bold">
120
- <xsd:annotation>
121
- <xsd:documentation>Indicates a run of bolded text.</xsd:documentation>
122
- </xsd:annotation>
123
- </xsd:enumeration>
124
- <xsd:enumeration value="italic">
125
- <xsd:annotation>
126
- <xsd:documentation>Indicates a run of text in italics.</xsd:documentation>
127
- </xsd:annotation>
128
- </xsd:enumeration>
129
- <xsd:enumeration value="underlined">
130
- <xsd:annotation>
131
- <xsd:documentation>Indicates a run of underlined text.</xsd:documentation>
132
- </xsd:annotation>
133
- </xsd:enumeration>
134
- <xsd:enumeration value="link">
135
- <xsd:annotation>
136
- <xsd:documentation>Indicates a run of hyper-text.</xsd:documentation>
137
- </xsd:annotation>
138
- </xsd:enumeration>
139
- </xsd:restriction>
140
- </xsd:simpleType>
141
- <xsd:simpleType name="InlinePlaceholdersValueList">
142
- <xsd:annotation>
143
- <xsd:documentation>Values for the attribute 'ctype' when used with &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
144
- </xsd:annotation>
145
- <xsd:restriction base="xsd:NMTOKEN">
146
- <xsd:enumeration value="image">
147
- <xsd:annotation>
148
- <xsd:documentation>Indicates a inline image.</xsd:documentation>
149
- </xsd:annotation>
150
- </xsd:enumeration>
151
- <xsd:enumeration value="pb">
152
- <xsd:annotation>
153
- <xsd:documentation>Indicates a page break.</xsd:documentation>
154
- </xsd:annotation>
155
- </xsd:enumeration>
156
- <xsd:enumeration value="lb">
157
- <xsd:annotation>
158
- <xsd:documentation>Indicates a line break.</xsd:documentation>
159
- </xsd:annotation>
160
- </xsd:enumeration>
161
- </xsd:restriction>
162
- </xsd:simpleType>
163
- <xsd:simpleType name="mime-typeValueList">
164
- <xsd:restriction base="xsd:string">
165
- <xsd:pattern value="(text|multipart|message|application|image|audio|video|model)(/.+)*"/>
166
- </xsd:restriction>
167
- </xsd:simpleType>
168
- <xsd:simpleType name="datatypeValueList">
169
- <xsd:annotation>
170
- <xsd:documentation>Values for the attribute 'datatype'.</xsd:documentation>
171
- </xsd:annotation>
172
- <xsd:restriction base="xsd:NMTOKEN">
173
- <xsd:enumeration value="asp">
174
- <xsd:annotation>
175
- <xsd:documentation>Indicates Active Server Page data.</xsd:documentation>
176
- </xsd:annotation>
177
- </xsd:enumeration>
178
- <xsd:enumeration value="c">
179
- <xsd:annotation>
180
- <xsd:documentation>Indicates C source file data.</xsd:documentation>
181
- </xsd:annotation>
182
- </xsd:enumeration>
183
- <xsd:enumeration value="cdf">
184
- <xsd:annotation>
185
- <xsd:documentation>Indicates Channel Definition Format (CDF) data.</xsd:documentation>
186
- </xsd:annotation>
187
- </xsd:enumeration>
188
- <xsd:enumeration value="cfm">
189
- <xsd:annotation>
190
- <xsd:documentation>Indicates ColdFusion data.</xsd:documentation>
191
- </xsd:annotation>
192
- </xsd:enumeration>
193
- <xsd:enumeration value="cpp">
194
- <xsd:annotation>
195
- <xsd:documentation>Indicates C++ source file data.</xsd:documentation>
196
- </xsd:annotation>
197
- </xsd:enumeration>
198
- <xsd:enumeration value="csharp">
199
- <xsd:annotation>
200
- <xsd:documentation>Indicates C-Sharp data.</xsd:documentation>
201
- </xsd:annotation>
202
- </xsd:enumeration>
203
- <xsd:enumeration value="cstring">
204
- <xsd:annotation>
205
- <xsd:documentation>Indicates strings from C, ASM, and driver files data.</xsd:documentation>
206
- </xsd:annotation>
207
- </xsd:enumeration>
208
- <xsd:enumeration value="csv">
209
- <xsd:annotation>
210
- <xsd:documentation>Indicates comma-separated values data.</xsd:documentation>
211
- </xsd:annotation>
212
- </xsd:enumeration>
213
- <xsd:enumeration value="database">
214
- <xsd:annotation>
215
- <xsd:documentation>Indicates database data.</xsd:documentation>
216
- </xsd:annotation>
217
- </xsd:enumeration>
218
- <xsd:enumeration value="documentfooter">
219
- <xsd:annotation>
220
- <xsd:documentation>Indicates portions of document that follows data and contains metadata.</xsd:documentation>
221
- </xsd:annotation>
222
- </xsd:enumeration>
223
- <xsd:enumeration value="documentheader">
224
- <xsd:annotation>
225
- <xsd:documentation>Indicates portions of document that precedes data and contains metadata.</xsd:documentation>
226
- </xsd:annotation>
227
- </xsd:enumeration>
228
- <xsd:enumeration value="filedialog">
229
- <xsd:annotation>
230
- <xsd:documentation>Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).</xsd:documentation>
231
- </xsd:annotation>
232
- </xsd:enumeration>
233
- <xsd:enumeration value="form">
234
- <xsd:annotation>
235
- <xsd:documentation>Indicates standard user input screen data.</xsd:documentation>
236
- </xsd:annotation>
237
- </xsd:enumeration>
238
- <xsd:enumeration value="html">
239
- <xsd:annotation>
240
- <xsd:documentation>Indicates HyperText Markup Language (HTML) data - document instance.</xsd:documentation>
241
- </xsd:annotation>
242
- </xsd:enumeration>
243
- <xsd:enumeration value="htmlbody">
244
- <xsd:annotation>
245
- <xsd:documentation>Indicates content within an HTML document’s &lt;body&gt; element.</xsd:documentation>
246
- </xsd:annotation>
247
- </xsd:enumeration>
248
- <xsd:enumeration value="ini">
249
- <xsd:annotation>
250
- <xsd:documentation>Indicates Windows INI file data.</xsd:documentation>
251
- </xsd:annotation>
252
- </xsd:enumeration>
253
- <xsd:enumeration value="interleaf">
254
- <xsd:annotation>
255
- <xsd:documentation>Indicates Interleaf data.</xsd:documentation>
256
- </xsd:annotation>
257
- </xsd:enumeration>
258
- <xsd:enumeration value="javaclass">
259
- <xsd:annotation>
260
- <xsd:documentation>Indicates Java source file data (extension '.java').</xsd:documentation>
261
- </xsd:annotation>
262
- </xsd:enumeration>
263
- <xsd:enumeration value="javapropertyresourcebundle">
264
- <xsd:annotation>
265
- <xsd:documentation>Indicates Java property resource bundle data.</xsd:documentation>
266
- </xsd:annotation>
267
- </xsd:enumeration>
268
- <xsd:enumeration value="javalistresourcebundle">
269
- <xsd:annotation>
270
- <xsd:documentation>Indicates Java list resource bundle data.</xsd:documentation>
271
- </xsd:annotation>
272
- </xsd:enumeration>
273
- <xsd:enumeration value="javascript">
274
- <xsd:annotation>
275
- <xsd:documentation>Indicates JavaScript source file data.</xsd:documentation>
276
- </xsd:annotation>
277
- </xsd:enumeration>
278
- <xsd:enumeration value="jscript">
279
- <xsd:annotation>
280
- <xsd:documentation>Indicates JScript source file data.</xsd:documentation>
281
- </xsd:annotation>
282
- </xsd:enumeration>
283
- <xsd:enumeration value="layout">
284
- <xsd:annotation>
285
- <xsd:documentation>Indicates information relating to formatting.</xsd:documentation>
286
- </xsd:annotation>
287
- </xsd:enumeration>
288
- <xsd:enumeration value="lisp">
289
- <xsd:annotation>
290
- <xsd:documentation>Indicates LISP source file data.</xsd:documentation>
291
- </xsd:annotation>
292
- </xsd:enumeration>
293
- <xsd:enumeration value="margin">
294
- <xsd:annotation>
295
- <xsd:documentation>Indicates information relating to margin formats.</xsd:documentation>
296
- </xsd:annotation>
297
- </xsd:enumeration>
298
- <xsd:enumeration value="menufile">
299
- <xsd:annotation>
300
- <xsd:documentation>Indicates a file containing menu.</xsd:documentation>
301
- </xsd:annotation>
302
- </xsd:enumeration>
303
- <xsd:enumeration value="messagefile">
304
- <xsd:annotation>
305
- <xsd:documentation>Indicates numerically identified string table.</xsd:documentation>
306
- </xsd:annotation>
307
- </xsd:enumeration>
308
- <xsd:enumeration value="mif">
309
- <xsd:annotation>
310
- <xsd:documentation>Indicates Maker Interchange Format (MIF) data.</xsd:documentation>
311
- </xsd:annotation>
312
- </xsd:enumeration>
313
- <xsd:enumeration value="mimetype">
314
- <xsd:annotation>
315
- <xsd:documentation>Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.</xsd:documentation>
316
- </xsd:annotation>
317
- </xsd:enumeration>
318
- <xsd:enumeration value="mo">
319
- <xsd:annotation>
320
- <xsd:documentation>Indicates GNU Machine Object data.</xsd:documentation>
321
- </xsd:annotation>
322
- </xsd:enumeration>
323
- <xsd:enumeration value="msglib">
324
- <xsd:annotation>
325
- <xsd:documentation>Indicates Message Librarian strings created by Novell's Message Librarian Tool.</xsd:documentation>
326
- </xsd:annotation>
327
- </xsd:enumeration>
328
- <xsd:enumeration value="pagefooter">
329
- <xsd:annotation>
330
- <xsd:documentation>Indicates information to be displayed at the bottom of each page of a document.</xsd:documentation>
331
- </xsd:annotation>
332
- </xsd:enumeration>
333
- <xsd:enumeration value="pageheader">
334
- <xsd:annotation>
335
- <xsd:documentation>Indicates information to be displayed at the top of each page of a document.</xsd:documentation>
336
- </xsd:annotation>
337
- </xsd:enumeration>
338
- <xsd:enumeration value="parameters">
339
- <xsd:annotation>
340
- <xsd:documentation>Indicates a list of property values (e.g., settings within INI files or preferences dialog).</xsd:documentation>
341
- </xsd:annotation>
342
- </xsd:enumeration>
343
- <xsd:enumeration value="pascal">
344
- <xsd:annotation>
345
- <xsd:documentation>Indicates Pascal source file data.</xsd:documentation>
346
- </xsd:annotation>
347
- </xsd:enumeration>
348
- <xsd:enumeration value="php">
349
- <xsd:annotation>
350
- <xsd:documentation>Indicates Hypertext Preprocessor data.</xsd:documentation>
351
- </xsd:annotation>
352
- </xsd:enumeration>
353
- <xsd:enumeration value="plaintext">
354
- <xsd:annotation>
355
- <xsd:documentation>Indicates plain text file (no formatting other than, possibly, wrapping).</xsd:documentation>
356
- </xsd:annotation>
357
- </xsd:enumeration>
358
- <xsd:enumeration value="po">
359
- <xsd:annotation>
360
- <xsd:documentation>Indicates GNU Portable Object file.</xsd:documentation>
361
- </xsd:annotation>
362
- </xsd:enumeration>
363
- <xsd:enumeration value="report">
364
- <xsd:annotation>
365
- <xsd:documentation>Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.</xsd:documentation>
366
- </xsd:annotation>
367
- </xsd:enumeration>
368
- <xsd:enumeration value="resources">
369
- <xsd:annotation>
370
- <xsd:documentation>Indicates Windows .NET binary resources.</xsd:documentation>
371
- </xsd:annotation>
372
- </xsd:enumeration>
373
- <xsd:enumeration value="resx">
374
- <xsd:annotation>
375
- <xsd:documentation>Indicates Windows .NET Resources.</xsd:documentation>
376
- </xsd:annotation>
377
- </xsd:enumeration>
378
- <xsd:enumeration value="rtf">
379
- <xsd:annotation>
380
- <xsd:documentation>Indicates Rich Text Format (RTF) data.</xsd:documentation>
381
- </xsd:annotation>
382
- </xsd:enumeration>
383
- <xsd:enumeration value="sgml">
384
- <xsd:annotation>
385
- <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - document instance.</xsd:documentation>
386
- </xsd:annotation>
387
- </xsd:enumeration>
388
- <xsd:enumeration value="sgmldtd">
389
- <xsd:annotation>
390
- <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).</xsd:documentation>
391
- </xsd:annotation>
392
- </xsd:enumeration>
393
- <xsd:enumeration value="svg">
394
- <xsd:annotation>
395
- <xsd:documentation>Indicates Scalable Vector Graphic (SVG) data.</xsd:documentation>
396
- </xsd:annotation>
397
- </xsd:enumeration>
398
- <xsd:enumeration value="vbscript">
399
- <xsd:annotation>
400
- <xsd:documentation>Indicates VisualBasic Script source file.</xsd:documentation>
401
- </xsd:annotation>
402
- </xsd:enumeration>
403
- <xsd:enumeration value="warning">
404
- <xsd:annotation>
405
- <xsd:documentation>Indicates warning message.</xsd:documentation>
406
- </xsd:annotation>
407
- </xsd:enumeration>
408
- <xsd:enumeration value="winres">
409
- <xsd:annotation>
410
- <xsd:documentation>Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).</xsd:documentation>
411
- </xsd:annotation>
412
- </xsd:enumeration>
413
- <xsd:enumeration value="xhtml">
414
- <xsd:annotation>
415
- <xsd:documentation>Indicates Extensible HyperText Markup Language (XHTML) data - document instance.</xsd:documentation>
416
- </xsd:annotation>
417
- </xsd:enumeration>
418
- <xsd:enumeration value="xml">
419
- <xsd:annotation>
420
- <xsd:documentation>Indicates Extensible Markup Language (XML) data - document instance.</xsd:documentation>
421
- </xsd:annotation>
422
- </xsd:enumeration>
423
- <xsd:enumeration value="xmldtd">
424
- <xsd:annotation>
425
- <xsd:documentation>Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).</xsd:documentation>
426
- </xsd:annotation>
427
- </xsd:enumeration>
428
- <xsd:enumeration value="xsl">
429
- <xsd:annotation>
430
- <xsd:documentation>Indicates Extensible Stylesheet Language (XSL) data.</xsd:documentation>
431
- </xsd:annotation>
432
- </xsd:enumeration>
433
- <xsd:enumeration value="xul">
434
- <xsd:annotation>
435
- <xsd:documentation>Indicates XUL elements.</xsd:documentation>
436
- </xsd:annotation>
437
- </xsd:enumeration>
438
- </xsd:restriction>
439
- </xsd:simpleType>
440
- <xsd:simpleType name="mtypeValueList">
441
- <xsd:annotation>
442
- <xsd:documentation>Values for the attribute 'mtype'.</xsd:documentation>
443
- </xsd:annotation>
444
- <xsd:restriction base="xsd:NMTOKEN">
445
- <xsd:enumeration value="abbrev">
446
- <xsd:annotation>
447
- <xsd:documentation>Indicates the marked text is an abbreviation.</xsd:documentation>
448
- </xsd:annotation>
449
- </xsd:enumeration>
450
- <xsd:enumeration value="abbreviated-form">
451
- <xsd:annotation>
452
- <xsd:documentation>ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.</xsd:documentation>
453
- </xsd:annotation>
454
- </xsd:enumeration>
455
- <xsd:enumeration value="abbreviation">
456
- <xsd:annotation>
457
- <xsd:documentation>ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').</xsd:documentation>
458
- </xsd:annotation>
459
- </xsd:enumeration>
460
- <xsd:enumeration value="acronym">
461
- <xsd:annotation>
462
- <xsd:documentation>ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').</xsd:documentation>
463
- </xsd:annotation>
464
- </xsd:enumeration>
465
- <xsd:enumeration value="appellation">
466
- <xsd:annotation>
467
- <xsd:documentation>ISO-12620: A proper-name term, such as the name of an agency or other proper entity.</xsd:documentation>
468
- </xsd:annotation>
469
- </xsd:enumeration>
470
- <xsd:enumeration value="collocation">
471
- <xsd:annotation>
472
- <xsd:documentation>ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.</xsd:documentation>
473
- </xsd:annotation>
474
- </xsd:enumeration>
475
- <xsd:enumeration value="common-name">
476
- <xsd:annotation>
477
- <xsd:documentation>ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.</xsd:documentation>
478
- </xsd:annotation>
479
- </xsd:enumeration>
480
- <xsd:enumeration value="datetime">
481
- <xsd:annotation>
482
- <xsd:documentation>Indicates the marked text is a date and/or time.</xsd:documentation>
483
- </xsd:annotation>
484
- </xsd:enumeration>
485
- <xsd:enumeration value="equation">
486
- <xsd:annotation>
487
- <xsd:documentation>ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.</xsd:documentation>
488
- </xsd:annotation>
489
- </xsd:enumeration>
490
- <xsd:enumeration value="expanded-form">
491
- <xsd:annotation>
492
- <xsd:documentation>ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.</xsd:documentation>
493
- </xsd:annotation>
494
- </xsd:enumeration>
495
- <xsd:enumeration value="formula">
496
- <xsd:annotation>
497
- <xsd:documentation>ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.</xsd:documentation>
498
- </xsd:annotation>
499
- </xsd:enumeration>
500
- <xsd:enumeration value="head-term">
501
- <xsd:annotation>
502
- <xsd:documentation>ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.</xsd:documentation>
503
- </xsd:annotation>
504
- </xsd:enumeration>
505
- <xsd:enumeration value="initialism">
506
- <xsd:annotation>
507
- <xsd:documentation>ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').</xsd:documentation>
508
- </xsd:annotation>
509
- </xsd:enumeration>
510
- <xsd:enumeration value="international-scientific-term">
511
- <xsd:annotation>
512
- <xsd:documentation>ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.</xsd:documentation>
513
- </xsd:annotation>
514
- </xsd:enumeration>
515
- <xsd:enumeration value="internationalism">
516
- <xsd:annotation>
517
- <xsd:documentation>ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.</xsd:documentation>
518
- </xsd:annotation>
519
- </xsd:enumeration>
520
- <xsd:enumeration value="logical-expression">
521
- <xsd:annotation>
522
- <xsd:documentation>ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.</xsd:documentation>
523
- </xsd:annotation>
524
- </xsd:enumeration>
525
- <xsd:enumeration value="materials-management-unit">
526
- <xsd:annotation>
527
- <xsd:documentation>ISO-12620 2.1.17: A unit to track object.</xsd:documentation>
528
- </xsd:annotation>
529
- </xsd:enumeration>
530
- <xsd:enumeration value="name">
531
- <xsd:annotation>
532
- <xsd:documentation>Indicates the marked text is a name.</xsd:documentation>
533
- </xsd:annotation>
534
- </xsd:enumeration>
535
- <xsd:enumeration value="near-synonym">
536
- <xsd:annotation>
537
- <xsd:documentation>ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.</xsd:documentation>
538
- </xsd:annotation>
539
- </xsd:enumeration>
540
- <xsd:enumeration value="part-number">
541
- <xsd:annotation>
542
- <xsd:documentation>ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.</xsd:documentation>
543
- </xsd:annotation>
544
- </xsd:enumeration>
545
- <xsd:enumeration value="phrase">
546
- <xsd:annotation>
547
- <xsd:documentation>Indicates the marked text is a phrase.</xsd:documentation>
548
- </xsd:annotation>
549
- </xsd:enumeration>
550
- <xsd:enumeration value="phraseological-unit">
551
- <xsd:annotation>
552
- <xsd:documentation>ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.</xsd:documentation>
553
- </xsd:annotation>
554
- </xsd:enumeration>
555
- <xsd:enumeration value="protected">
556
- <xsd:annotation>
557
- <xsd:documentation>Indicates the marked text should not be translated.</xsd:documentation>
558
- </xsd:annotation>
559
- </xsd:enumeration>
560
- <xsd:enumeration value="romanized-form">
561
- <xsd:annotation>
562
- <xsd:documentation>ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.</xsd:documentation>
563
- </xsd:annotation>
564
- </xsd:enumeration>
565
- <xsd:enumeration value="seg">
566
- <xsd:annotation>
567
- <xsd:documentation>Indicates that the marked text represents a segment.</xsd:documentation>
568
- </xsd:annotation>
569
- </xsd:enumeration>
570
- <xsd:enumeration value="set-phrase">
571
- <xsd:annotation>
572
- <xsd:documentation>ISO-12620 2.1.18.2: A fixed, lexicalized phrase.</xsd:documentation>
573
- </xsd:annotation>
574
- </xsd:enumeration>
575
- <xsd:enumeration value="short-form">
576
- <xsd:annotation>
577
- <xsd:documentation>ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').</xsd:documentation>
578
- </xsd:annotation>
579
- </xsd:enumeration>
580
- <xsd:enumeration value="sku">
581
- <xsd:annotation>
582
- <xsd:documentation>ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.</xsd:documentation>
583
- </xsd:annotation>
584
- </xsd:enumeration>
585
- <xsd:enumeration value="standard-text">
586
- <xsd:annotation>
587
- <xsd:documentation>ISO-12620 2.1.19: A fixed chunk of recurring text.</xsd:documentation>
588
- </xsd:annotation>
589
- </xsd:enumeration>
590
- <xsd:enumeration value="symbol">
591
- <xsd:annotation>
592
- <xsd:documentation>ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.</xsd:documentation>
593
- </xsd:annotation>
594
- </xsd:enumeration>
595
- <xsd:enumeration value="synonym">
596
- <xsd:annotation>
597
- <xsd:documentation>ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.</xsd:documentation>
598
- </xsd:annotation>
599
- </xsd:enumeration>
600
- <xsd:enumeration value="synonymous-phrase">
601
- <xsd:annotation>
602
- <xsd:documentation>ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.</xsd:documentation>
603
- </xsd:annotation>
604
- </xsd:enumeration>
605
- <xsd:enumeration value="term">
606
- <xsd:annotation>
607
- <xsd:documentation>Indicates the marked text is a term.</xsd:documentation>
608
- </xsd:annotation>
609
- </xsd:enumeration>
610
- <xsd:enumeration value="transcribed-form">
611
- <xsd:annotation>
612
- <xsd:documentation>ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.</xsd:documentation>
613
- </xsd:annotation>
614
- </xsd:enumeration>
615
- <xsd:enumeration value="transliterated-form">
616
- <xsd:annotation>
617
- <xsd:documentation>ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.</xsd:documentation>
618
- </xsd:annotation>
619
- </xsd:enumeration>
620
- <xsd:enumeration value="truncated-term">
621
- <xsd:annotation>
622
- <xsd:documentation>ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').</xsd:documentation>
623
- </xsd:annotation>
624
- </xsd:enumeration>
625
- <xsd:enumeration value="variant">
626
- <xsd:annotation>
627
- <xsd:documentation>ISO-12620 2.1.9: One of the alternate forms of a term.</xsd:documentation>
628
- </xsd:annotation>
629
- </xsd:enumeration>
630
- </xsd:restriction>
631
- </xsd:simpleType>
632
- <xsd:simpleType name="restypeValueList">
633
- <xsd:annotation>
634
- <xsd:documentation>Values for the attribute 'restype'.</xsd:documentation>
635
- </xsd:annotation>
636
- <xsd:restriction base="xsd:NMTOKEN">
637
- <xsd:enumeration value="auto3state">
638
- <xsd:annotation>
639
- <xsd:documentation>Indicates a Windows RC AUTO3STATE control.</xsd:documentation>
640
- </xsd:annotation>
641
- </xsd:enumeration>
642
- <xsd:enumeration value="autocheckbox">
643
- <xsd:annotation>
644
- <xsd:documentation>Indicates a Windows RC AUTOCHECKBOX control.</xsd:documentation>
645
- </xsd:annotation>
646
- </xsd:enumeration>
647
- <xsd:enumeration value="autoradiobutton">
648
- <xsd:annotation>
649
- <xsd:documentation>Indicates a Windows RC AUTORADIOBUTTON control.</xsd:documentation>
650
- </xsd:annotation>
651
- </xsd:enumeration>
652
- <xsd:enumeration value="bedit">
653
- <xsd:annotation>
654
- <xsd:documentation>Indicates a Windows RC BEDIT control.</xsd:documentation>
655
- </xsd:annotation>
656
- </xsd:enumeration>
657
- <xsd:enumeration value="bitmap">
658
- <xsd:annotation>
659
- <xsd:documentation>Indicates a bitmap, for example a BITMAP resource in Windows.</xsd:documentation>
660
- </xsd:annotation>
661
- </xsd:enumeration>
662
- <xsd:enumeration value="button">
663
- <xsd:annotation>
664
- <xsd:documentation>Indicates a button object, for example a BUTTON control Windows.</xsd:documentation>
665
- </xsd:annotation>
666
- </xsd:enumeration>
667
- <xsd:enumeration value="caption">
668
- <xsd:annotation>
669
- <xsd:documentation>Indicates a caption, such as the caption of a dialog box.</xsd:documentation>
670
- </xsd:annotation>
671
- </xsd:enumeration>
672
- <xsd:enumeration value="cell">
673
- <xsd:annotation>
674
- <xsd:documentation>Indicates the cell in a table, for example the content of the &lt;td&gt; element in HTML.</xsd:documentation>
675
- </xsd:annotation>
676
- </xsd:enumeration>
677
- <xsd:enumeration value="checkbox">
678
- <xsd:annotation>
679
- <xsd:documentation>Indicates check box object, for example a CHECKBOX control in Windows.</xsd:documentation>
680
- </xsd:annotation>
681
- </xsd:enumeration>
682
- <xsd:enumeration value="checkboxmenuitem">
683
- <xsd:annotation>
684
- <xsd:documentation>Indicates a menu item with an associated checkbox.</xsd:documentation>
685
- </xsd:annotation>
686
- </xsd:enumeration>
687
- <xsd:enumeration value="checkedlistbox">
688
- <xsd:annotation>
689
- <xsd:documentation>Indicates a list box, but with a check-box for each item.</xsd:documentation>
690
- </xsd:annotation>
691
- </xsd:enumeration>
692
- <xsd:enumeration value="colorchooser">
693
- <xsd:annotation>
694
- <xsd:documentation>Indicates a color selection dialog.</xsd:documentation>
695
- </xsd:annotation>
696
- </xsd:enumeration>
697
- <xsd:enumeration value="combobox">
698
- <xsd:annotation>
699
- <xsd:documentation>Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.</xsd:documentation>
700
- </xsd:annotation>
701
- </xsd:enumeration>
702
- <xsd:enumeration value="comboboxexitem">
703
- <xsd:annotation>
704
- <xsd:documentation>Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).</xsd:documentation>
705
- </xsd:annotation>
706
- </xsd:enumeration>
707
- <xsd:enumeration value="comboboxitem">
708
- <xsd:annotation>
709
- <xsd:documentation>Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).</xsd:documentation>
710
- </xsd:annotation>
711
- </xsd:enumeration>
712
- <xsd:enumeration value="component">
713
- <xsd:annotation>
714
- <xsd:documentation>Indicates a UI base class element that cannot be represented by any other element.</xsd:documentation>
715
- </xsd:annotation>
716
- </xsd:enumeration>
717
- <xsd:enumeration value="contextmenu">
718
- <xsd:annotation>
719
- <xsd:documentation>Indicates a context menu.</xsd:documentation>
720
- </xsd:annotation>
721
- </xsd:enumeration>
722
- <xsd:enumeration value="ctext">
723
- <xsd:annotation>
724
- <xsd:documentation>Indicates a Windows RC CTEXT control.</xsd:documentation>
725
- </xsd:annotation>
726
- </xsd:enumeration>
727
- <xsd:enumeration value="cursor">
728
- <xsd:annotation>
729
- <xsd:documentation>Indicates a cursor, for example a CURSOR resource in Windows.</xsd:documentation>
730
- </xsd:annotation>
731
- </xsd:enumeration>
732
- <xsd:enumeration value="datetimepicker">
733
- <xsd:annotation>
734
- <xsd:documentation>Indicates a date/time picker.</xsd:documentation>
735
- </xsd:annotation>
736
- </xsd:enumeration>
737
- <xsd:enumeration value="defpushbutton">
738
- <xsd:annotation>
739
- <xsd:documentation>Indicates a Windows RC DEFPUSHBUTTON control.</xsd:documentation>
740
- </xsd:annotation>
741
- </xsd:enumeration>
742
- <xsd:enumeration value="dialog">
743
- <xsd:annotation>
744
- <xsd:documentation>Indicates a dialog box.</xsd:documentation>
745
- </xsd:annotation>
746
- </xsd:enumeration>
747
- <xsd:enumeration value="dlginit">
748
- <xsd:annotation>
749
- <xsd:documentation>Indicates a Windows RC DLGINIT resource block.</xsd:documentation>
750
- </xsd:annotation>
751
- </xsd:enumeration>
752
- <xsd:enumeration value="edit">
753
- <xsd:annotation>
754
- <xsd:documentation>Indicates an edit box object, for example an EDIT control in Windows.</xsd:documentation>
755
- </xsd:annotation>
756
- </xsd:enumeration>
757
- <xsd:enumeration value="file">
758
- <xsd:annotation>
759
- <xsd:documentation>Indicates a filename.</xsd:documentation>
760
- </xsd:annotation>
761
- </xsd:enumeration>
762
- <xsd:enumeration value="filechooser">
763
- <xsd:annotation>
764
- <xsd:documentation>Indicates a file dialog.</xsd:documentation>
765
- </xsd:annotation>
766
- </xsd:enumeration>
767
- <xsd:enumeration value="fn">
768
- <xsd:annotation>
769
- <xsd:documentation>Indicates a footnote.</xsd:documentation>
770
- </xsd:annotation>
771
- </xsd:enumeration>
772
- <xsd:enumeration value="font">
773
- <xsd:annotation>
774
- <xsd:documentation>Indicates a font name.</xsd:documentation>
775
- </xsd:annotation>
776
- </xsd:enumeration>
777
- <xsd:enumeration value="footer">
778
- <xsd:annotation>
779
- <xsd:documentation>Indicates a footer.</xsd:documentation>
780
- </xsd:annotation>
781
- </xsd:enumeration>
782
- <xsd:enumeration value="frame">
783
- <xsd:annotation>
784
- <xsd:documentation>Indicates a frame object.</xsd:documentation>
785
- </xsd:annotation>
786
- </xsd:enumeration>
787
- <xsd:enumeration value="grid">
788
- <xsd:annotation>
789
- <xsd:documentation>Indicates a XUL grid element.</xsd:documentation>
790
- </xsd:annotation>
791
- </xsd:enumeration>
792
- <xsd:enumeration value="groupbox">
793
- <xsd:annotation>
794
- <xsd:documentation>Indicates a groupbox object, for example a GROUPBOX control in Windows.</xsd:documentation>
795
- </xsd:annotation>
796
- </xsd:enumeration>
797
- <xsd:enumeration value="header">
798
- <xsd:annotation>
799
- <xsd:documentation>Indicates a header item.</xsd:documentation>
800
- </xsd:annotation>
801
- </xsd:enumeration>
802
- <xsd:enumeration value="heading">
803
- <xsd:annotation>
804
- <xsd:documentation>Indicates a heading, such has the content of &lt;h1&gt;, &lt;h2&gt;, etc. in HTML.</xsd:documentation>
805
- </xsd:annotation>
806
- </xsd:enumeration>
807
- <xsd:enumeration value="hedit">
808
- <xsd:annotation>
809
- <xsd:documentation>Indicates a Windows RC HEDIT control.</xsd:documentation>
810
- </xsd:annotation>
811
- </xsd:enumeration>
812
- <xsd:enumeration value="hscrollbar">
813
- <xsd:annotation>
814
- <xsd:documentation>Indicates a horizontal scrollbar.</xsd:documentation>
815
- </xsd:annotation>
816
- </xsd:enumeration>
817
- <xsd:enumeration value="icon">
818
- <xsd:annotation>
819
- <xsd:documentation>Indicates an icon, for example an ICON resource in Windows.</xsd:documentation>
820
- </xsd:annotation>
821
- </xsd:enumeration>
822
- <xsd:enumeration value="iedit">
823
- <xsd:annotation>
824
- <xsd:documentation>Indicates a Windows RC IEDIT control.</xsd:documentation>
825
- </xsd:annotation>
826
- </xsd:enumeration>
827
- <xsd:enumeration value="keywords">
828
- <xsd:annotation>
829
- <xsd:documentation>Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.</xsd:documentation>
830
- </xsd:annotation>
831
- </xsd:enumeration>
832
- <xsd:enumeration value="label">
833
- <xsd:annotation>
834
- <xsd:documentation>Indicates a label object.</xsd:documentation>
835
- </xsd:annotation>
836
- </xsd:enumeration>
837
- <xsd:enumeration value="linklabel">
838
- <xsd:annotation>
839
- <xsd:documentation>Indicates a label that is also a HTML link (not necessarily a URL).</xsd:documentation>
840
- </xsd:annotation>
841
- </xsd:enumeration>
842
- <xsd:enumeration value="list">
843
- <xsd:annotation>
844
- <xsd:documentation>Indicates a list (a group of list-items, for example an &lt;ol&gt; or &lt;ul&gt; element in HTML).</xsd:documentation>
845
- </xsd:annotation>
846
- </xsd:enumeration>
847
- <xsd:enumeration value="listbox">
848
- <xsd:annotation>
849
- <xsd:documentation>Indicates a listbox object, for example an LISTBOX control in Windows.</xsd:documentation>
850
- </xsd:annotation>
851
- </xsd:enumeration>
852
- <xsd:enumeration value="listitem">
853
- <xsd:annotation>
854
- <xsd:documentation>Indicates an list item (an entry in a list).</xsd:documentation>
855
- </xsd:annotation>
856
- </xsd:enumeration>
857
- <xsd:enumeration value="ltext">
858
- <xsd:annotation>
859
- <xsd:documentation>Indicates a Windows RC LTEXT control.</xsd:documentation>
860
- </xsd:annotation>
861
- </xsd:enumeration>
862
- <xsd:enumeration value="menu">
863
- <xsd:annotation>
864
- <xsd:documentation>Indicates a menu (a group of menu-items).</xsd:documentation>
865
- </xsd:annotation>
866
- </xsd:enumeration>
867
- <xsd:enumeration value="menubar">
868
- <xsd:annotation>
869
- <xsd:documentation>Indicates a toolbar containing one or more tope level menus.</xsd:documentation>
870
- </xsd:annotation>
871
- </xsd:enumeration>
872
- <xsd:enumeration value="menuitem">
873
- <xsd:annotation>
874
- <xsd:documentation>Indicates a menu item (an entry in a menu).</xsd:documentation>
875
- </xsd:annotation>
876
- </xsd:enumeration>
877
- <xsd:enumeration value="menuseparator">
878
- <xsd:annotation>
879
- <xsd:documentation>Indicates a XUL menuseparator element.</xsd:documentation>
880
- </xsd:annotation>
881
- </xsd:enumeration>
882
- <xsd:enumeration value="message">
883
- <xsd:annotation>
884
- <xsd:documentation>Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.</xsd:documentation>
885
- </xsd:annotation>
886
- </xsd:enumeration>
887
- <xsd:enumeration value="monthcalendar">
888
- <xsd:annotation>
889
- <xsd:documentation>Indicates a calendar control.</xsd:documentation>
890
- </xsd:annotation>
891
- </xsd:enumeration>
892
- <xsd:enumeration value="numericupdown">
893
- <xsd:annotation>
894
- <xsd:documentation>Indicates an edit box beside a spin control.</xsd:documentation>
895
- </xsd:annotation>
896
- </xsd:enumeration>
897
- <xsd:enumeration value="panel">
898
- <xsd:annotation>
899
- <xsd:documentation>Indicates a catch all for rectangular areas.</xsd:documentation>
900
- </xsd:annotation>
901
- </xsd:enumeration>
902
- <xsd:enumeration value="popupmenu">
903
- <xsd:annotation>
904
- <xsd:documentation>Indicates a standalone menu not necessarily associated with a menubar.</xsd:documentation>
905
- </xsd:annotation>
906
- </xsd:enumeration>
907
- <xsd:enumeration value="pushbox">
908
- <xsd:annotation>
909
- <xsd:documentation>Indicates a pushbox object, for example a PUSHBOX control in Windows.</xsd:documentation>
910
- </xsd:annotation>
911
- </xsd:enumeration>
912
- <xsd:enumeration value="pushbutton">
913
- <xsd:annotation>
914
- <xsd:documentation>Indicates a Windows RC PUSHBUTTON control.</xsd:documentation>
915
- </xsd:annotation>
916
- </xsd:enumeration>
917
- <xsd:enumeration value="radio">
918
- <xsd:annotation>
919
- <xsd:documentation>Indicates a radio button object.</xsd:documentation>
920
- </xsd:annotation>
921
- </xsd:enumeration>
922
- <xsd:enumeration value="radiobuttonmenuitem">
923
- <xsd:annotation>
924
- <xsd:documentation>Indicates a menuitem with associated radio button.</xsd:documentation>
925
- </xsd:annotation>
926
- </xsd:enumeration>
927
- <xsd:enumeration value="rcdata">
928
- <xsd:annotation>
929
- <xsd:documentation>Indicates raw data resources for an application.</xsd:documentation>
930
- </xsd:annotation>
931
- </xsd:enumeration>
932
- <xsd:enumeration value="row">
933
- <xsd:annotation>
934
- <xsd:documentation>Indicates a row in a table.</xsd:documentation>
935
- </xsd:annotation>
936
- </xsd:enumeration>
937
- <xsd:enumeration value="rtext">
938
- <xsd:annotation>
939
- <xsd:documentation>Indicates a Windows RC RTEXT control.</xsd:documentation>
940
- </xsd:annotation>
941
- </xsd:enumeration>
942
- <xsd:enumeration value="scrollpane">
943
- <xsd:annotation>
944
- <xsd:documentation>Indicates a user navigable container used to show a portion of a document.</xsd:documentation>
945
- </xsd:annotation>
946
- </xsd:enumeration>
947
- <xsd:enumeration value="separator">
948
- <xsd:annotation>
949
- <xsd:documentation>Indicates a generic divider object (e.g. menu group separator).</xsd:documentation>
950
- </xsd:annotation>
951
- </xsd:enumeration>
952
- <xsd:enumeration value="shortcut">
953
- <xsd:annotation>
954
- <xsd:documentation>Windows accelerators, shortcuts in resource or property files.</xsd:documentation>
955
- </xsd:annotation>
956
- </xsd:enumeration>
957
- <xsd:enumeration value="spinner">
958
- <xsd:annotation>
959
- <xsd:documentation>Indicates a UI control to indicate process activity but not progress.</xsd:documentation>
960
- </xsd:annotation>
961
- </xsd:enumeration>
962
- <xsd:enumeration value="splitter">
963
- <xsd:annotation>
964
- <xsd:documentation>Indicates a splitter bar.</xsd:documentation>
965
- </xsd:annotation>
966
- </xsd:enumeration>
967
- <xsd:enumeration value="state3">
968
- <xsd:annotation>
969
- <xsd:documentation>Indicates a Windows RC STATE3 control.</xsd:documentation>
970
- </xsd:annotation>
971
- </xsd:enumeration>
972
- <xsd:enumeration value="statusbar">
973
- <xsd:annotation>
974
- <xsd:documentation>Indicates a window for providing feedback to the users, like 'read-only', etc.</xsd:documentation>
975
- </xsd:annotation>
976
- </xsd:enumeration>
977
- <xsd:enumeration value="string">
978
- <xsd:annotation>
979
- <xsd:documentation>Indicates a string, for example an entry in a STRINGTABLE resource in Windows.</xsd:documentation>
980
- </xsd:annotation>
981
- </xsd:enumeration>
982
- <xsd:enumeration value="tabcontrol">
983
- <xsd:annotation>
984
- <xsd:documentation>Indicates a layers of controls with a tab to select layers.</xsd:documentation>
985
- </xsd:annotation>
986
- </xsd:enumeration>
987
- <xsd:enumeration value="table">
988
- <xsd:annotation>
989
- <xsd:documentation>Indicates a display and edits regular two-dimensional tables of cells.</xsd:documentation>
990
- </xsd:annotation>
991
- </xsd:enumeration>
992
- <xsd:enumeration value="textbox">
993
- <xsd:annotation>
994
- <xsd:documentation>Indicates a XUL textbox element.</xsd:documentation>
995
- </xsd:annotation>
996
- </xsd:enumeration>
997
- <xsd:enumeration value="togglebutton">
998
- <xsd:annotation>
999
- <xsd:documentation>Indicates a UI button that can be toggled to on or off state.</xsd:documentation>
1000
- </xsd:annotation>
1001
- </xsd:enumeration>
1002
- <xsd:enumeration value="toolbar">
1003
- <xsd:annotation>
1004
- <xsd:documentation>Indicates an array of controls, usually buttons.</xsd:documentation>
1005
- </xsd:annotation>
1006
- </xsd:enumeration>
1007
- <xsd:enumeration value="tooltip">
1008
- <xsd:annotation>
1009
- <xsd:documentation>Indicates a pop up tool tip text.</xsd:documentation>
1010
- </xsd:annotation>
1011
- </xsd:enumeration>
1012
- <xsd:enumeration value="trackbar">
1013
- <xsd:annotation>
1014
- <xsd:documentation>Indicates a bar with a pointer indicating a position within a certain range.</xsd:documentation>
1015
- </xsd:annotation>
1016
- </xsd:enumeration>
1017
- <xsd:enumeration value="tree">
1018
- <xsd:annotation>
1019
- <xsd:documentation>Indicates a control that displays a set of hierarchical data.</xsd:documentation>
1020
- </xsd:annotation>
1021
- </xsd:enumeration>
1022
- <xsd:enumeration value="uri">
1023
- <xsd:annotation>
1024
- <xsd:documentation>Indicates a URI (URN or URL).</xsd:documentation>
1025
- </xsd:annotation>
1026
- </xsd:enumeration>
1027
- <xsd:enumeration value="userbutton">
1028
- <xsd:annotation>
1029
- <xsd:documentation>Indicates a Windows RC USERBUTTON control.</xsd:documentation>
1030
- </xsd:annotation>
1031
- </xsd:enumeration>
1032
- <xsd:enumeration value="usercontrol">
1033
- <xsd:annotation>
1034
- <xsd:documentation>Indicates a user-defined control like CONTROL control in Windows.</xsd:documentation>
1035
- </xsd:annotation>
1036
- </xsd:enumeration>
1037
- <xsd:enumeration value="var">
1038
- <xsd:annotation>
1039
- <xsd:documentation>Indicates the text of a variable.</xsd:documentation>
1040
- </xsd:annotation>
1041
- </xsd:enumeration>
1042
- <xsd:enumeration value="versioninfo">
1043
- <xsd:annotation>
1044
- <xsd:documentation>Indicates version information about a resource like VERSIONINFO in Windows.</xsd:documentation>
1045
- </xsd:annotation>
1046
- </xsd:enumeration>
1047
- <xsd:enumeration value="vscrollbar">
1048
- <xsd:annotation>
1049
- <xsd:documentation>Indicates a vertical scrollbar.</xsd:documentation>
1050
- </xsd:annotation>
1051
- </xsd:enumeration>
1052
- <xsd:enumeration value="window">
1053
- <xsd:annotation>
1054
- <xsd:documentation>Indicates a graphical window.</xsd:documentation>
1055
- </xsd:annotation>
1056
- </xsd:enumeration>
1057
- </xsd:restriction>
1058
- </xsd:simpleType>
1059
- <xsd:simpleType name="size-unitValueList">
1060
- <xsd:annotation>
1061
- <xsd:documentation>Values for the attribute 'size-unit'.</xsd:documentation>
1062
- </xsd:annotation>
1063
- <xsd:restriction base="xsd:NMTOKEN">
1064
- <xsd:enumeration value="byte">
1065
- <xsd:annotation>
1066
- <xsd:documentation>Indicates a size in 8-bit bytes.</xsd:documentation>
1067
- </xsd:annotation>
1068
- </xsd:enumeration>
1069
- <xsd:enumeration value="char">
1070
- <xsd:annotation>
1071
- <xsd:documentation>Indicates a size in Unicode characters.</xsd:documentation>
1072
- </xsd:annotation>
1073
- </xsd:enumeration>
1074
- <xsd:enumeration value="col">
1075
- <xsd:annotation>
1076
- <xsd:documentation>Indicates a size in columns. Used for HTML text area.</xsd:documentation>
1077
- </xsd:annotation>
1078
- </xsd:enumeration>
1079
- <xsd:enumeration value="cm">
1080
- <xsd:annotation>
1081
- <xsd:documentation>Indicates a size in centimeters.</xsd:documentation>
1082
- </xsd:annotation>
1083
- </xsd:enumeration>
1084
- <xsd:enumeration value="dlgunit">
1085
- <xsd:annotation>
1086
- <xsd:documentation>Indicates a size in dialog units, as defined in Windows resources.</xsd:documentation>
1087
- </xsd:annotation>
1088
- </xsd:enumeration>
1089
- <xsd:enumeration value="em">
1090
- <xsd:annotation>
1091
- <xsd:documentation>Indicates a size in 'font-size' units (as defined in CSS).</xsd:documentation>
1092
- </xsd:annotation>
1093
- </xsd:enumeration>
1094
- <xsd:enumeration value="ex">
1095
- <xsd:annotation>
1096
- <xsd:documentation>Indicates a size in 'x-height' units (as defined in CSS).</xsd:documentation>
1097
- </xsd:annotation>
1098
- </xsd:enumeration>
1099
- <xsd:enumeration value="glyph">
1100
- <xsd:annotation>
1101
- <xsd:documentation>Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'</xsd:documentation>
1102
- </xsd:annotation>
1103
- </xsd:enumeration>
1104
- <xsd:enumeration value="in">
1105
- <xsd:annotation>
1106
- <xsd:documentation>Indicates a size in inches.</xsd:documentation>
1107
- </xsd:annotation>
1108
- </xsd:enumeration>
1109
- <xsd:enumeration value="mm">
1110
- <xsd:annotation>
1111
- <xsd:documentation>Indicates a size in millimeters.</xsd:documentation>
1112
- </xsd:annotation>
1113
- </xsd:enumeration>
1114
- <xsd:enumeration value="percent">
1115
- <xsd:annotation>
1116
- <xsd:documentation>Indicates a size in percentage.</xsd:documentation>
1117
- </xsd:annotation>
1118
- </xsd:enumeration>
1119
- <xsd:enumeration value="pixel">
1120
- <xsd:annotation>
1121
- <xsd:documentation>Indicates a size in pixels.</xsd:documentation>
1122
- </xsd:annotation>
1123
- </xsd:enumeration>
1124
- <xsd:enumeration value="point">
1125
- <xsd:annotation>
1126
- <xsd:documentation>Indicates a size in point.</xsd:documentation>
1127
- </xsd:annotation>
1128
- </xsd:enumeration>
1129
- <xsd:enumeration value="row">
1130
- <xsd:annotation>
1131
- <xsd:documentation>Indicates a size in rows. Used for HTML text area.</xsd:documentation>
1132
- </xsd:annotation>
1133
- </xsd:enumeration>
1134
- </xsd:restriction>
1135
- </xsd:simpleType>
1136
- <xsd:simpleType name="stateValueList">
1137
- <xsd:annotation>
1138
- <xsd:documentation>Values for the attribute 'state'.</xsd:documentation>
1139
- </xsd:annotation>
1140
- <xsd:restriction base="xsd:NMTOKEN">
1141
- <xsd:enumeration value="final">
1142
- <xsd:annotation>
1143
- <xsd:documentation>Indicates the terminating state.</xsd:documentation>
1144
- </xsd:annotation>
1145
- </xsd:enumeration>
1146
- <xsd:enumeration value="needs-adaptation">
1147
- <xsd:annotation>
1148
- <xsd:documentation>Indicates only non-textual information needs adaptation.</xsd:documentation>
1149
- </xsd:annotation>
1150
- </xsd:enumeration>
1151
- <xsd:enumeration value="needs-l10n">
1152
- <xsd:annotation>
1153
- <xsd:documentation>Indicates both text and non-textual information needs adaptation.</xsd:documentation>
1154
- </xsd:annotation>
1155
- </xsd:enumeration>
1156
- <xsd:enumeration value="needs-review-adaptation">
1157
- <xsd:annotation>
1158
- <xsd:documentation>Indicates only non-textual information needs review.</xsd:documentation>
1159
- </xsd:annotation>
1160
- </xsd:enumeration>
1161
- <xsd:enumeration value="needs-review-l10n">
1162
- <xsd:annotation>
1163
- <xsd:documentation>Indicates both text and non-textual information needs review.</xsd:documentation>
1164
- </xsd:annotation>
1165
- </xsd:enumeration>
1166
- <xsd:enumeration value="needs-review-translation">
1167
- <xsd:annotation>
1168
- <xsd:documentation>Indicates that only the text of the item needs to be reviewed.</xsd:documentation>
1169
- </xsd:annotation>
1170
- </xsd:enumeration>
1171
- <xsd:enumeration value="needs-translation">
1172
- <xsd:annotation>
1173
- <xsd:documentation>Indicates that the item needs to be translated.</xsd:documentation>
1174
- </xsd:annotation>
1175
- </xsd:enumeration>
1176
- <xsd:enumeration value="new">
1177
- <xsd:annotation>
1178
- <xsd:documentation>Indicates that the item is new. For example, translation units that were not in a previous version of the document.</xsd:documentation>
1179
- </xsd:annotation>
1180
- </xsd:enumeration>
1181
- <xsd:enumeration value="signed-off">
1182
- <xsd:annotation>
1183
- <xsd:documentation>Indicates that changes are reviewed and approved.</xsd:documentation>
1184
- </xsd:annotation>
1185
- </xsd:enumeration>
1186
- <xsd:enumeration value="translated">
1187
- <xsd:annotation>
1188
- <xsd:documentation>Indicates that the item has been translated.</xsd:documentation>
1189
- </xsd:annotation>
1190
- </xsd:enumeration>
1191
- </xsd:restriction>
1192
- </xsd:simpleType>
1193
- <xsd:simpleType name="state-qualifierValueList">
1194
- <xsd:annotation>
1195
- <xsd:documentation>Values for the attribute 'state-qualifier'.</xsd:documentation>
1196
- </xsd:annotation>
1197
- <xsd:restriction base="xsd:NMTOKEN">
1198
- <xsd:enumeration value="exact-match">
1199
- <xsd:annotation>
1200
- <xsd:documentation>Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.</xsd:documentation>
1201
- </xsd:annotation>
1202
- </xsd:enumeration>
1203
- <xsd:enumeration value="fuzzy-match">
1204
- <xsd:annotation>
1205
- <xsd:documentation>Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).</xsd:documentation>
1206
- </xsd:annotation>
1207
- </xsd:enumeration>
1208
- <xsd:enumeration value="id-match">
1209
- <xsd:annotation>
1210
- <xsd:documentation>Indicates a match based on matching IDs (in addition to matching text).</xsd:documentation>
1211
- </xsd:annotation>
1212
- </xsd:enumeration>
1213
- <xsd:enumeration value="leveraged-glossary">
1214
- <xsd:annotation>
1215
- <xsd:documentation>Indicates a translation derived from a glossary.</xsd:documentation>
1216
- </xsd:annotation>
1217
- </xsd:enumeration>
1218
- <xsd:enumeration value="leveraged-inherited">
1219
- <xsd:annotation>
1220
- <xsd:documentation>Indicates a translation derived from existing translation.</xsd:documentation>
1221
- </xsd:annotation>
1222
- </xsd:enumeration>
1223
- <xsd:enumeration value="leveraged-mt">
1224
- <xsd:annotation>
1225
- <xsd:documentation>Indicates a translation derived from machine translation.</xsd:documentation>
1226
- </xsd:annotation>
1227
- </xsd:enumeration>
1228
- <xsd:enumeration value="leveraged-repository">
1229
- <xsd:annotation>
1230
- <xsd:documentation>Indicates a translation derived from a translation repository.</xsd:documentation>
1231
- </xsd:annotation>
1232
- </xsd:enumeration>
1233
- <xsd:enumeration value="leveraged-tm">
1234
- <xsd:annotation>
1235
- <xsd:documentation>Indicates a translation derived from a translation memory.</xsd:documentation>
1236
- </xsd:annotation>
1237
- </xsd:enumeration>
1238
- <xsd:enumeration value="mt-suggestion">
1239
- <xsd:annotation>
1240
- <xsd:documentation>Indicates the translation is suggested by machine translation.</xsd:documentation>
1241
- </xsd:annotation>
1242
- </xsd:enumeration>
1243
- <xsd:enumeration value="rejected-grammar">
1244
- <xsd:annotation>
1245
- <xsd:documentation>Indicates that the item has been rejected because of incorrect grammar.</xsd:documentation>
1246
- </xsd:annotation>
1247
- </xsd:enumeration>
1248
- <xsd:enumeration value="rejected-inaccurate">
1249
- <xsd:annotation>
1250
- <xsd:documentation>Indicates that the item has been rejected because it is incorrect.</xsd:documentation>
1251
- </xsd:annotation>
1252
- </xsd:enumeration>
1253
- <xsd:enumeration value="rejected-length">
1254
- <xsd:annotation>
1255
- <xsd:documentation>Indicates that the item has been rejected because it is too long or too short.</xsd:documentation>
1256
- </xsd:annotation>
1257
- </xsd:enumeration>
1258
- <xsd:enumeration value="rejected-spelling">
1259
- <xsd:annotation>
1260
- <xsd:documentation>Indicates that the item has been rejected because of incorrect spelling.</xsd:documentation>
1261
- </xsd:annotation>
1262
- </xsd:enumeration>
1263
- <xsd:enumeration value="tm-suggestion">
1264
- <xsd:annotation>
1265
- <xsd:documentation>Indicates the translation is suggested by translation memory.</xsd:documentation>
1266
- </xsd:annotation>
1267
- </xsd:enumeration>
1268
- </xsd:restriction>
1269
- </xsd:simpleType>
1270
- <xsd:simpleType name="unitValueList">
1271
- <xsd:annotation>
1272
- <xsd:documentation>Values for the attribute 'unit'.</xsd:documentation>
1273
- </xsd:annotation>
1274
- <xsd:restriction base="xsd:NMTOKEN">
1275
- <xsd:enumeration value="word">
1276
- <xsd:annotation>
1277
- <xsd:documentation>Refers to words.</xsd:documentation>
1278
- </xsd:annotation>
1279
- </xsd:enumeration>
1280
- <xsd:enumeration value="page">
1281
- <xsd:annotation>
1282
- <xsd:documentation>Refers to pages.</xsd:documentation>
1283
- </xsd:annotation>
1284
- </xsd:enumeration>
1285
- <xsd:enumeration value="trans-unit">
1286
- <xsd:annotation>
1287
- <xsd:documentation>Refers to &lt;trans-unit&gt; elements.</xsd:documentation>
1288
- </xsd:annotation>
1289
- </xsd:enumeration>
1290
- <xsd:enumeration value="bin-unit">
1291
- <xsd:annotation>
1292
- <xsd:documentation>Refers to &lt;bin-unit&gt; elements.</xsd:documentation>
1293
- </xsd:annotation>
1294
- </xsd:enumeration>
1295
- <xsd:enumeration value="glyph">
1296
- <xsd:annotation>
1297
- <xsd:documentation>Refers to glyphs.</xsd:documentation>
1298
- </xsd:annotation>
1299
- </xsd:enumeration>
1300
- <xsd:enumeration value="item">
1301
- <xsd:annotation>
1302
- <xsd:documentation>Refers to &lt;trans-unit&gt; and/or &lt;bin-unit&gt; elements.</xsd:documentation>
1303
- </xsd:annotation>
1304
- </xsd:enumeration>
1305
- <xsd:enumeration value="instance">
1306
- <xsd:annotation>
1307
- <xsd:documentation>Refers to the occurrences of instances defined by the count-type value.</xsd:documentation>
1308
- </xsd:annotation>
1309
- </xsd:enumeration>
1310
- <xsd:enumeration value="character">
1311
- <xsd:annotation>
1312
- <xsd:documentation>Refers to characters.</xsd:documentation>
1313
- </xsd:annotation>
1314
- </xsd:enumeration>
1315
- <xsd:enumeration value="line">
1316
- <xsd:annotation>
1317
- <xsd:documentation>Refers to lines.</xsd:documentation>
1318
- </xsd:annotation>
1319
- </xsd:enumeration>
1320
- <xsd:enumeration value="sentence">
1321
- <xsd:annotation>
1322
- <xsd:documentation>Refers to sentences.</xsd:documentation>
1323
- </xsd:annotation>
1324
- </xsd:enumeration>
1325
- <xsd:enumeration value="paragraph">
1326
- <xsd:annotation>
1327
- <xsd:documentation>Refers to paragraphs.</xsd:documentation>
1328
- </xsd:annotation>
1329
- </xsd:enumeration>
1330
- <xsd:enumeration value="segment">
1331
- <xsd:annotation>
1332
- <xsd:documentation>Refers to segments.</xsd:documentation>
1333
- </xsd:annotation>
1334
- </xsd:enumeration>
1335
- <xsd:enumeration value="placeable">
1336
- <xsd:annotation>
1337
- <xsd:documentation>Refers to placeables (inline elements).</xsd:documentation>
1338
- </xsd:annotation>
1339
- </xsd:enumeration>
1340
- </xsd:restriction>
1341
- </xsd:simpleType>
1342
- <xsd:simpleType name="priorityValueList">
1343
- <xsd:annotation>
1344
- <xsd:documentation>Values for the attribute 'priority'.</xsd:documentation>
1345
- </xsd:annotation>
1346
- <xsd:restriction base="xsd:positiveInteger">
1347
- <xsd:enumeration value="1">
1348
- <xsd:annotation>
1349
- <xsd:documentation>Highest priority.</xsd:documentation>
1350
- </xsd:annotation>
1351
- </xsd:enumeration>
1352
- <xsd:enumeration value="2">
1353
- <xsd:annotation>
1354
- <xsd:documentation>High priority.</xsd:documentation>
1355
- </xsd:annotation>
1356
- </xsd:enumeration>
1357
- <xsd:enumeration value="3">
1358
- <xsd:annotation>
1359
- <xsd:documentation>High priority, but not as important as 2.</xsd:documentation>
1360
- </xsd:annotation>
1361
- </xsd:enumeration>
1362
- <xsd:enumeration value="4">
1363
- <xsd:annotation>
1364
- <xsd:documentation>High priority, but not as important as 3.</xsd:documentation>
1365
- </xsd:annotation>
1366
- </xsd:enumeration>
1367
- <xsd:enumeration value="5">
1368
- <xsd:annotation>
1369
- <xsd:documentation>Medium priority, but more important than 6.</xsd:documentation>
1370
- </xsd:annotation>
1371
- </xsd:enumeration>
1372
- <xsd:enumeration value="6">
1373
- <xsd:annotation>
1374
- <xsd:documentation>Medium priority, but less important than 5.</xsd:documentation>
1375
- </xsd:annotation>
1376
- </xsd:enumeration>
1377
- <xsd:enumeration value="7">
1378
- <xsd:annotation>
1379
- <xsd:documentation>Low priority, but more important than 8.</xsd:documentation>
1380
- </xsd:annotation>
1381
- </xsd:enumeration>
1382
- <xsd:enumeration value="8">
1383
- <xsd:annotation>
1384
- <xsd:documentation>Low priority, but more important than 9.</xsd:documentation>
1385
- </xsd:annotation>
1386
- </xsd:enumeration>
1387
- <xsd:enumeration value="9">
1388
- <xsd:annotation>
1389
- <xsd:documentation>Low priority.</xsd:documentation>
1390
- </xsd:annotation>
1391
- </xsd:enumeration>
1392
- <xsd:enumeration value="10">
1393
- <xsd:annotation>
1394
- <xsd:documentation>Lowest priority.</xsd:documentation>
1395
- </xsd:annotation>
1396
- </xsd:enumeration>
1397
- </xsd:restriction>
1398
- </xsd:simpleType>
1399
- <xsd:simpleType name="reformatValueYesNo">
1400
- <xsd:restriction base="xsd:string">
1401
- <xsd:enumeration value="yes">
1402
- <xsd:annotation>
1403
- <xsd:documentation>This value indicates that all properties can be reformatted. This value must be used alone.</xsd:documentation>
1404
- </xsd:annotation>
1405
- </xsd:enumeration>
1406
- <xsd:enumeration value="no">
1407
- <xsd:annotation>
1408
- <xsd:documentation>This value indicates that no properties should be reformatted. This value must be used alone.</xsd:documentation>
1409
- </xsd:annotation>
1410
- </xsd:enumeration>
1411
- </xsd:restriction>
1412
- </xsd:simpleType>
1413
- <xsd:simpleType name="reformatValueList">
1414
- <xsd:list>
1415
- <xsd:simpleType>
1416
- <xsd:union memberTypes="xlf:XTend">
1417
- <xsd:simpleType>
1418
- <xsd:restriction base="xsd:string">
1419
- <xsd:enumeration value="coord">
1420
- <xsd:annotation>
1421
- <xsd:documentation>This value indicates that all information in the coord attribute can be modified.</xsd:documentation>
1422
- </xsd:annotation>
1423
- </xsd:enumeration>
1424
- <xsd:enumeration value="coord-x">
1425
- <xsd:annotation>
1426
- <xsd:documentation>This value indicates that the x information in the coord attribute can be modified.</xsd:documentation>
1427
- </xsd:annotation>
1428
- </xsd:enumeration>
1429
- <xsd:enumeration value="coord-y">
1430
- <xsd:annotation>
1431
- <xsd:documentation>This value indicates that the y information in the coord attribute can be modified.</xsd:documentation>
1432
- </xsd:annotation>
1433
- </xsd:enumeration>
1434
- <xsd:enumeration value="coord-cx">
1435
- <xsd:annotation>
1436
- <xsd:documentation>This value indicates that the cx information in the coord attribute can be modified.</xsd:documentation>
1437
- </xsd:annotation>
1438
- </xsd:enumeration>
1439
- <xsd:enumeration value="coord-cy">
1440
- <xsd:annotation>
1441
- <xsd:documentation>This value indicates that the cy information in the coord attribute can be modified.</xsd:documentation>
1442
- </xsd:annotation>
1443
- </xsd:enumeration>
1444
- <xsd:enumeration value="font">
1445
- <xsd:annotation>
1446
- <xsd:documentation>This value indicates that all the information in the font attribute can be modified.</xsd:documentation>
1447
- </xsd:annotation>
1448
- </xsd:enumeration>
1449
- <xsd:enumeration value="font-name">
1450
- <xsd:annotation>
1451
- <xsd:documentation>This value indicates that the name information in the font attribute can be modified.</xsd:documentation>
1452
- </xsd:annotation>
1453
- </xsd:enumeration>
1454
- <xsd:enumeration value="font-size">
1455
- <xsd:annotation>
1456
- <xsd:documentation>This value indicates that the size information in the font attribute can be modified.</xsd:documentation>
1457
- </xsd:annotation>
1458
- </xsd:enumeration>
1459
- <xsd:enumeration value="font-weight">
1460
- <xsd:annotation>
1461
- <xsd:documentation>This value indicates that the weight information in the font attribute can be modified.</xsd:documentation>
1462
- </xsd:annotation>
1463
- </xsd:enumeration>
1464
- <xsd:enumeration value="css-style">
1465
- <xsd:annotation>
1466
- <xsd:documentation>This value indicates that the information in the css-style attribute can be modified.</xsd:documentation>
1467
- </xsd:annotation>
1468
- </xsd:enumeration>
1469
- <xsd:enumeration value="style">
1470
- <xsd:annotation>
1471
- <xsd:documentation>This value indicates that the information in the style attribute can be modified.</xsd:documentation>
1472
- </xsd:annotation>
1473
- </xsd:enumeration>
1474
- <xsd:enumeration value="ex-style">
1475
- <xsd:annotation>
1476
- <xsd:documentation>This value indicates that the information in the exstyle attribute can be modified.</xsd:documentation>
1477
- </xsd:annotation>
1478
- </xsd:enumeration>
1479
- </xsd:restriction>
1480
- </xsd:simpleType>
1481
- </xsd:union>
1482
- </xsd:simpleType>
1483
- </xsd:list>
1484
- </xsd:simpleType>
1485
- <xsd:simpleType name="purposeValueList">
1486
- <xsd:restriction base="xsd:string">
1487
- <xsd:enumeration value="information">
1488
- <xsd:annotation>
1489
- <xsd:documentation>Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.</xsd:documentation>
1490
- </xsd:annotation>
1491
- </xsd:enumeration>
1492
- <xsd:enumeration value="location">
1493
- <xsd:annotation>
1494
- <xsd:documentation>Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.</xsd:documentation>
1495
- </xsd:annotation>
1496
- </xsd:enumeration>
1497
- <xsd:enumeration value="match">
1498
- <xsd:annotation>
1499
- <xsd:documentation>Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.</xsd:documentation>
1500
- </xsd:annotation>
1501
- </xsd:enumeration>
1502
- </xsd:restriction>
1503
- </xsd:simpleType>
1504
- <xsd:simpleType name="alttranstypeValueList">
1505
- <xsd:restriction base="xsd:string">
1506
- <xsd:enumeration value="proposal">
1507
- <xsd:annotation>
1508
- <xsd:documentation>Represents a translation proposal from a translation memory or other resource.</xsd:documentation>
1509
- </xsd:annotation>
1510
- </xsd:enumeration>
1511
- <xsd:enumeration value="previous-version">
1512
- <xsd:annotation>
1513
- <xsd:documentation>Represents a previous version of the target element.</xsd:documentation>
1514
- </xsd:annotation>
1515
- </xsd:enumeration>
1516
- <xsd:enumeration value="rejected">
1517
- <xsd:annotation>
1518
- <xsd:documentation>Represents a rejected version of the target element.</xsd:documentation>
1519
- </xsd:annotation>
1520
- </xsd:enumeration>
1521
- <xsd:enumeration value="reference">
1522
- <xsd:annotation>
1523
- <xsd:documentation>Represents a translation to be used for reference purposes only, for example from a related product or a different language.</xsd:documentation>
1524
- </xsd:annotation>
1525
- </xsd:enumeration>
1526
- <xsd:enumeration value="accepted">
1527
- <xsd:annotation>
1528
- <xsd:documentation>Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.</xsd:documentation>
1529
- </xsd:annotation>
1530
- </xsd:enumeration>
1531
- </xsd:restriction>
1532
- </xsd:simpleType>
1533
- <!-- Other Types -->
1534
- <xsd:complexType name="ElemType_ExternalReference">
1535
- <xsd:choice>
1536
- <xsd:element ref="xlf:internal-file"/>
1537
- <xsd:element ref="xlf:external-file"/>
1538
- </xsd:choice>
1539
- </xsd:complexType>
1540
- <xsd:simpleType name="AttrType_purpose">
1541
- <xsd:list>
1542
- <xsd:simpleType>
1543
- <xsd:union memberTypes="xlf:purposeValueList xlf:XTend"/>
1544
- </xsd:simpleType>
1545
- </xsd:list>
1546
- </xsd:simpleType>
1547
- <xsd:simpleType name="AttrType_datatype">
1548
- <xsd:union memberTypes="xlf:datatypeValueList xlf:XTend"/>
1549
- </xsd:simpleType>
1550
- <xsd:simpleType name="AttrType_restype">
1551
- <xsd:union memberTypes="xlf:restypeValueList xlf:XTend"/>
1552
- </xsd:simpleType>
1553
- <xsd:simpleType name="AttrType_alttranstype">
1554
- <xsd:union memberTypes="xlf:alttranstypeValueList xlf:XTend"/>
1555
- </xsd:simpleType>
1556
- <xsd:simpleType name="AttrType_context-type">
1557
- <xsd:union memberTypes="xlf:context-typeValueList xlf:XTend"/>
1558
- </xsd:simpleType>
1559
- <xsd:simpleType name="AttrType_state">
1560
- <xsd:union memberTypes="xlf:stateValueList xlf:XTend"/>
1561
- </xsd:simpleType>
1562
- <xsd:simpleType name="AttrType_state-qualifier">
1563
- <xsd:union memberTypes="xlf:state-qualifierValueList xlf:XTend"/>
1564
- </xsd:simpleType>
1565
- <xsd:simpleType name="AttrType_count-type">
1566
- <xsd:union memberTypes="xlf:restypeValueList xlf:count-typeValueList xlf:datatypeValueList xlf:stateValueList xlf:state-qualifierValueList xlf:XTend"/>
1567
- </xsd:simpleType>
1568
- <xsd:simpleType name="AttrType_InlineDelimiters">
1569
- <xsd:union memberTypes="xlf:InlineDelimitersValueList xlf:XTend"/>
1570
- </xsd:simpleType>
1571
- <xsd:simpleType name="AttrType_InlinePlaceholders">
1572
- <xsd:union memberTypes="xlf:InlinePlaceholdersValueList xlf:XTend"/>
1573
- </xsd:simpleType>
1574
- <xsd:simpleType name="AttrType_size-unit">
1575
- <xsd:union memberTypes="xlf:size-unitValueList xlf:XTend"/>
1576
- </xsd:simpleType>
1577
- <xsd:simpleType name="AttrType_mtype">
1578
- <xsd:union memberTypes="xlf:mtypeValueList xlf:XTend"/>
1579
- </xsd:simpleType>
1580
- <xsd:simpleType name="AttrType_unit">
1581
- <xsd:union memberTypes="xlf:unitValueList xlf:XTend"/>
1582
- </xsd:simpleType>
1583
- <xsd:simpleType name="AttrType_priority">
1584
- <xsd:union memberTypes="xlf:priorityValueList"/>
1585
- </xsd:simpleType>
1586
- <xsd:simpleType name="AttrType_reformat">
1587
- <xsd:union memberTypes="xlf:reformatValueYesNo xlf:reformatValueList"/>
1588
- </xsd:simpleType>
1589
- <xsd:simpleType name="AttrType_YesNo">
1590
- <xsd:restriction base="xsd:NMTOKEN">
1591
- <xsd:enumeration value="yes"/>
1592
- <xsd:enumeration value="no"/>
1593
- </xsd:restriction>
1594
- </xsd:simpleType>
1595
- <xsd:simpleType name="AttrType_Position">
1596
- <xsd:restriction base="xsd:NMTOKEN">
1597
- <xsd:enumeration value="open"/>
1598
- <xsd:enumeration value="close"/>
1599
- </xsd:restriction>
1600
- </xsd:simpleType>
1601
- <xsd:simpleType name="AttrType_assoc">
1602
- <xsd:restriction base="xsd:NMTOKEN">
1603
- <xsd:enumeration value="preceding"/>
1604
- <xsd:enumeration value="following"/>
1605
- <xsd:enumeration value="both"/>
1606
- </xsd:restriction>
1607
- </xsd:simpleType>
1608
- <xsd:simpleType name="AttrType_annotates">
1609
- <xsd:restriction base="xsd:NMTOKEN">
1610
- <xsd:enumeration value="source"/>
1611
- <xsd:enumeration value="target"/>
1612
- <xsd:enumeration value="general"/>
1613
- </xsd:restriction>
1614
- </xsd:simpleType>
1615
- <xsd:simpleType name="AttrType_Coordinates">
1616
- <xsd:annotation>
1617
- <xsd:documentation>Values for the attribute 'coord'.</xsd:documentation>
1618
- </xsd:annotation>
1619
- <xsd:restriction base="xsd:string">
1620
- <xsd:pattern value="(-?\d+|#);(-?\d+|#);(-?\d+|#);(-?\d+|#)"/>
1621
- </xsd:restriction>
1622
- </xsd:simpleType>
1623
- <xsd:simpleType name="AttrType_Version">
1624
- <xsd:annotation>
1625
- <xsd:documentation>Version values: 1.0 and 1.1 are allowed for backward compatibility.</xsd:documentation>
1626
- </xsd:annotation>
1627
- <xsd:restriction base="xsd:string">
1628
- <xsd:enumeration value="1.2"/>
1629
- <xsd:enumeration value="1.1"/>
1630
- <xsd:enumeration value="1.0"/>
1631
- </xsd:restriction>
1632
- </xsd:simpleType>
1633
- <!-- Groups -->
1634
- <xsd:group name="ElemGroup_TextContent">
1635
- <xsd:choice>
1636
- <xsd:element ref="xlf:g"/>
1637
- <xsd:element ref="xlf:bpt"/>
1638
- <xsd:element ref="xlf:ept"/>
1639
- <xsd:element ref="xlf:ph"/>
1640
- <xsd:element ref="xlf:it"/>
1641
- <xsd:element ref="xlf:mrk"/>
1642
- <xsd:element ref="xlf:x"/>
1643
- <xsd:element ref="xlf:bx"/>
1644
- <xsd:element ref="xlf:ex"/>
1645
- </xsd:choice>
1646
- </xsd:group>
1647
- <xsd:attributeGroup name="AttrGroup_TextContent">
1648
- <xsd:attribute name="id" type="xsd:string" use="required"/>
1649
- <xsd:attribute name="xid" type="xsd:string" use="optional"/>
1650
- <xsd:attribute name="equiv-text" type="xsd:string" use="optional"/>
1651
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1652
- </xsd:attributeGroup>
1653
- <!-- XLIFF Structure -->
1654
- <xsd:element name="xliff">
1655
- <xsd:complexType>
1656
- <xsd:sequence maxOccurs="unbounded">
1657
- <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1658
- <xsd:element ref="xlf:file"/>
1659
- </xsd:sequence>
1660
- <xsd:attribute name="version" type="xlf:AttrType_Version" use="required"/>
1661
- <xsd:attribute ref="xml:lang" use="optional"/>
1662
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1663
- </xsd:complexType>
1664
- </xsd:element>
1665
- <xsd:element name="file">
1666
- <xsd:complexType>
1667
- <xsd:sequence>
1668
- <xsd:element minOccurs="0" ref="xlf:header"/>
1669
- <xsd:element ref="xlf:body"/>
1670
- </xsd:sequence>
1671
- <xsd:attribute name="original" type="xsd:string" use="required"/>
1672
- <xsd:attribute name="source-language" type="xsd:language" use="required"/>
1673
- <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="required"/>
1674
- <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
1675
- <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
1676
- <xsd:attribute ref="xml:space" use="optional"/>
1677
- <xsd:attribute name="category" type="xsd:string" use="optional"/>
1678
- <xsd:attribute name="target-language" type="xsd:language" use="optional"/>
1679
- <xsd:attribute name="product-name" type="xsd:string" use="optional"/>
1680
- <xsd:attribute name="product-version" type="xsd:string" use="optional"/>
1681
- <xsd:attribute name="build-num" type="xsd:string" use="optional"/>
1682
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1683
- </xsd:complexType>
1684
- <xsd:unique name="U_group_id">
1685
- <xsd:selector xpath=".//xlf:group"/>
1686
- <xsd:field xpath="@id"/>
1687
- </xsd:unique>
1688
- <xsd:key name="K_unit_id">
1689
- <xsd:selector xpath=".//xlf:trans-unit|.//xlf:bin-unit"/>
1690
- <xsd:field xpath="@id"/>
1691
- </xsd:key>
1692
- <xsd:keyref name="KR_unit_id" refer="xlf:K_unit_id">
1693
- <xsd:selector xpath=".//bpt|.//ept|.//it|.//ph|.//g|.//x|.//bx|.//ex|.//sub"/>
1694
- <xsd:field xpath="@xid"/>
1695
- </xsd:keyref>
1696
- <xsd:key name="K_tool-id">
1697
- <xsd:selector xpath="xlf:header/xlf:tool"/>
1698
- <xsd:field xpath="@tool-id"/>
1699
- </xsd:key>
1700
- <xsd:keyref name="KR_file_tool-id" refer="xlf:K_tool-id">
1701
- <xsd:selector xpath="."/>
1702
- <xsd:field xpath="@tool-id"/>
1703
- </xsd:keyref>
1704
- <xsd:keyref name="KR_phase_tool-id" refer="xlf:K_tool-id">
1705
- <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
1706
- <xsd:field xpath="@tool-id"/>
1707
- </xsd:keyref>
1708
- <xsd:keyref name="KR_alt-trans_tool-id" refer="xlf:K_tool-id">
1709
- <xsd:selector xpath=".//xlf:trans-unit/xlf:alt-trans"/>
1710
- <xsd:field xpath="@tool-id"/>
1711
- </xsd:keyref>
1712
- <xsd:key name="K_count-group_name">
1713
- <xsd:selector xpath=".//xlf:count-group"/>
1714
- <xsd:field xpath="@name"/>
1715
- </xsd:key>
1716
- <xsd:unique name="U_context-group_name">
1717
- <xsd:selector xpath=".//xlf:context-group"/>
1718
- <xsd:field xpath="@name"/>
1719
- </xsd:unique>
1720
- <xsd:key name="K_phase-name">
1721
- <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
1722
- <xsd:field xpath="@phase-name"/>
1723
- </xsd:key>
1724
- <xsd:keyref name="KR_phase-name" refer="xlf:K_phase-name">
1725
- <xsd:selector xpath=".//xlf:count|.//xlf:trans-unit|.//xlf:target|.//bin-unit|.//bin-target"/>
1726
- <xsd:field xpath="@phase-name"/>
1727
- </xsd:keyref>
1728
- <xsd:unique name="U_uid">
1729
- <xsd:selector xpath=".//xlf:external-file"/>
1730
- <xsd:field xpath="@uid"/>
1731
- </xsd:unique>
1732
- </xsd:element>
1733
- <xsd:element name="header">
1734
- <xsd:complexType>
1735
- <xsd:sequence>
1736
- <xsd:element minOccurs="0" name="skl" type="xlf:ElemType_ExternalReference"/>
1737
- <xsd:element minOccurs="0" ref="xlf:phase-group"/>
1738
- <xsd:choice maxOccurs="unbounded" minOccurs="0">
1739
- <xsd:element name="glossary" type="xlf:ElemType_ExternalReference"/>
1740
- <xsd:element name="reference" type="xlf:ElemType_ExternalReference"/>
1741
- <xsd:element ref="xlf:count-group"/>
1742
- <xsd:element ref="xlf:note"/>
1743
- <xsd:element ref="xlf:tool"/>
1744
- </xsd:choice>
1745
- <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1746
- </xsd:sequence>
1747
- </xsd:complexType>
1748
- </xsd:element>
1749
- <xsd:element name="internal-file">
1750
- <xsd:complexType>
1751
- <xsd:simpleContent>
1752
- <xsd:extension base="xsd:string">
1753
- <xsd:attribute name="form" type="xsd:string"/>
1754
- <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
1755
- </xsd:extension>
1756
- </xsd:simpleContent>
1757
- </xsd:complexType>
1758
- </xsd:element>
1759
- <xsd:element name="external-file">
1760
- <xsd:complexType>
1761
- <xsd:attribute name="href" type="xsd:string" use="required"/>
1762
- <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
1763
- <xsd:attribute name="uid" type="xsd:NMTOKEN"/>
1764
- </xsd:complexType>
1765
- </xsd:element>
1766
- <xsd:element name="note">
1767
- <xsd:complexType>
1768
- <xsd:simpleContent>
1769
- <xsd:extension base="xsd:string">
1770
- <xsd:attribute ref="xml:lang" use="optional"/>
1771
- <xsd:attribute default="1" name="priority" type="xlf:AttrType_priority" use="optional"/>
1772
- <xsd:attribute name="from" type="xsd:string" use="optional"/>
1773
- <xsd:attribute default="general" name="annotates" type="xlf:AttrType_annotates" use="optional"/>
1774
- </xsd:extension>
1775
- </xsd:simpleContent>
1776
- </xsd:complexType>
1777
- </xsd:element>
1778
- <xsd:element name="phase-group">
1779
- <xsd:complexType>
1780
- <xsd:sequence maxOccurs="unbounded">
1781
- <xsd:element ref="xlf:phase"/>
1782
- </xsd:sequence>
1783
- </xsd:complexType>
1784
- </xsd:element>
1785
- <xsd:element name="phase">
1786
- <xsd:complexType>
1787
- <xsd:sequence maxOccurs="unbounded" minOccurs="0">
1788
- <xsd:element ref="xlf:note"/>
1789
- </xsd:sequence>
1790
- <xsd:attribute name="phase-name" type="xsd:string" use="required"/>
1791
- <xsd:attribute name="process-name" type="xsd:string" use="required"/>
1792
- <xsd:attribute name="company-name" type="xsd:string" use="optional"/>
1793
- <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
1794
- <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
1795
- <xsd:attribute name="job-id" type="xsd:string" use="optional"/>
1796
- <xsd:attribute name="contact-name" type="xsd:string" use="optional"/>
1797
- <xsd:attribute name="contact-email" type="xsd:string" use="optional"/>
1798
- <xsd:attribute name="contact-phone" type="xsd:string" use="optional"/>
1799
- </xsd:complexType>
1800
- </xsd:element>
1801
- <xsd:element name="count-group">
1802
- <xsd:complexType>
1803
- <xsd:sequence maxOccurs="unbounded" minOccurs="0">
1804
- <xsd:element ref="xlf:count"/>
1805
- </xsd:sequence>
1806
- <xsd:attribute name="name" type="xsd:string" use="required"/>
1807
- </xsd:complexType>
1808
- </xsd:element>
1809
- <xsd:element name="count">
1810
- <xsd:complexType>
1811
- <xsd:simpleContent>
1812
- <xsd:extension base="xsd:string">
1813
- <xsd:attribute name="count-type" type="xlf:AttrType_count-type" use="optional"/>
1814
- <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
1815
- <xsd:attribute default="word" name="unit" type="xlf:AttrType_unit" use="optional"/>
1816
- </xsd:extension>
1817
- </xsd:simpleContent>
1818
- </xsd:complexType>
1819
- </xsd:element>
1820
- <xsd:element name="context-group">
1821
- <xsd:complexType>
1822
- <xsd:sequence maxOccurs="unbounded">
1823
- <xsd:element ref="xlf:context"/>
1824
- </xsd:sequence>
1825
- <xsd:attribute name="name" type="xsd:string" use="optional"/>
1826
- <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
1827
- <xsd:attribute name="purpose" type="xlf:AttrType_purpose" use="optional"/>
1828
- </xsd:complexType>
1829
- </xsd:element>
1830
- <xsd:element name="context">
1831
- <xsd:complexType>
1832
- <xsd:simpleContent>
1833
- <xsd:extension base="xsd:string">
1834
- <xsd:attribute name="context-type" type="xlf:AttrType_context-type" use="required"/>
1835
- <xsd:attribute default="no" name="match-mandatory" type="xlf:AttrType_YesNo" use="optional"/>
1836
- <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
1837
- </xsd:extension>
1838
- </xsd:simpleContent>
1839
- </xsd:complexType>
1840
- </xsd:element>
1841
- <xsd:element name="tool">
1842
- <xsd:complexType mixed="true">
1843
- <xsd:sequence>
1844
- <xsd:any namespace="##any" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
1845
- </xsd:sequence>
1846
- <xsd:attribute name="tool-id" type="xsd:string" use="required"/>
1847
- <xsd:attribute name="tool-name" type="xsd:string" use="required"/>
1848
- <xsd:attribute name="tool-version" type="xsd:string" use="optional"/>
1849
- <xsd:attribute name="tool-company" type="xsd:string" use="optional"/>
1850
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1851
- </xsd:complexType>
1852
- </xsd:element>
1853
- <xsd:element name="body">
1854
- <xsd:complexType>
1855
- <xsd:choice maxOccurs="unbounded" minOccurs="0">
1856
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
1857
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
1858
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
1859
- </xsd:choice>
1860
- </xsd:complexType>
1861
- </xsd:element>
1862
- <xsd:element name="group">
1863
- <xsd:complexType>
1864
- <xsd:sequence>
1865
- <xsd:sequence>
1866
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
1867
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:count-group"/>
1868
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
1869
- <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1870
- </xsd:sequence>
1871
- <xsd:choice maxOccurs="unbounded">
1872
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
1873
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
1874
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
1875
- </xsd:choice>
1876
- </xsd:sequence>
1877
- <xsd:attribute name="id" type="xsd:string" use="optional"/>
1878
- <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
1879
- <xsd:attribute default="default" ref="xml:space" use="optional"/>
1880
- <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
1881
- <xsd:attribute name="resname" type="xsd:string" use="optional"/>
1882
- <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
1883
- <xsd:attribute name="extype" type="xsd:string" use="optional"/>
1884
- <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
1885
- <xsd:attribute name="menu" type="xsd:string" use="optional"/>
1886
- <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
1887
- <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
1888
- <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
1889
- <xsd:attribute name="font" type="xsd:string" use="optional"/>
1890
- <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
1891
- <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
1892
- <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
1893
- <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
1894
- <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
1895
- <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
1896
- <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
1897
- <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
1898
- <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
1899
- <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
1900
- <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
1901
- <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
1902
- <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
1903
- <xsd:attribute default="no" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
1904
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1905
- </xsd:complexType>
1906
- </xsd:element>
1907
- <xsd:element name="trans-unit">
1908
- <xsd:complexType>
1909
- <xsd:sequence>
1910
- <xsd:element ref="xlf:source"/>
1911
- <xsd:element minOccurs="0" ref="xlf:seg-source"/>
1912
- <xsd:element minOccurs="0" ref="xlf:target"/>
1913
- <xsd:choice maxOccurs="unbounded" minOccurs="0">
1914
- <xsd:element ref="xlf:context-group"/>
1915
- <xsd:element ref="xlf:count-group"/>
1916
- <xsd:element ref="xlf:note"/>
1917
- <xsd:element ref="xlf:alt-trans"/>
1918
- </xsd:choice>
1919
- <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1920
- </xsd:sequence>
1921
- <xsd:attribute name="id" type="xsd:string" use="required"/>
1922
- <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
1923
- <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
1924
- <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
1925
- <xsd:attribute default="default" ref="xml:space" use="optional"/>
1926
- <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
1927
- <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
1928
- <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
1929
- <xsd:attribute name="resname" type="xsd:string" use="optional"/>
1930
- <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
1931
- <xsd:attribute name="extype" type="xsd:string" use="optional"/>
1932
- <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
1933
- <xsd:attribute name="menu" type="xsd:string" use="optional"/>
1934
- <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
1935
- <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
1936
- <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
1937
- <xsd:attribute name="font" type="xsd:string" use="optional"/>
1938
- <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
1939
- <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
1940
- <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
1941
- <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
1942
- <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
1943
- <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
1944
- <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
1945
- <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
1946
- <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
1947
- <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
1948
- <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
1949
- <xsd:attribute default="yes" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
1950
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1951
- </xsd:complexType>
1952
- <xsd:unique name="U_tu_segsrc_mid">
1953
- <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
1954
- <xsd:field xpath="@mid"/>
1955
- </xsd:unique>
1956
- <xsd:keyref name="KR_tu_segsrc_mid" refer="xlf:U_tu_segsrc_mid">
1957
- <xsd:selector xpath="./xlf:target/xlf:mrk|./xlf:alt-trans"/>
1958
- <xsd:field xpath="@mid"/>
1959
- </xsd:keyref>
1960
- </xsd:element>
1961
- <xsd:element name="source">
1962
- <xsd:complexType mixed="true">
1963
- <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
1964
- <xsd:attribute ref="xml:lang" use="optional"/>
1965
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1966
- </xsd:complexType>
1967
- <xsd:unique name="U_source_bpt_rid">
1968
- <xsd:selector xpath=".//xlf:bpt"/>
1969
- <xsd:field xpath="@rid"/>
1970
- </xsd:unique>
1971
- <xsd:keyref name="KR_source_ept_rid" refer="xlf:U_source_bpt_rid">
1972
- <xsd:selector xpath=".//xlf:ept"/>
1973
- <xsd:field xpath="@rid"/>
1974
- </xsd:keyref>
1975
- <xsd:unique name="U_source_bx_rid">
1976
- <xsd:selector xpath=".//xlf:bx"/>
1977
- <xsd:field xpath="@rid"/>
1978
- </xsd:unique>
1979
- <xsd:keyref name="KR_source_ex_rid" refer="xlf:U_source_bx_rid">
1980
- <xsd:selector xpath=".//xlf:ex"/>
1981
- <xsd:field xpath="@rid"/>
1982
- </xsd:keyref>
1983
- </xsd:element>
1984
- <xsd:element name="seg-source">
1985
- <xsd:complexType mixed="true">
1986
- <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
1987
- <xsd:attribute ref="xml:lang" use="optional"/>
1988
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
1989
- </xsd:complexType>
1990
- <xsd:unique name="U_segsrc_bpt_rid">
1991
- <xsd:selector xpath=".//xlf:bpt"/>
1992
- <xsd:field xpath="@rid"/>
1993
- </xsd:unique>
1994
- <xsd:keyref name="KR_segsrc_ept_rid" refer="xlf:U_segsrc_bpt_rid">
1995
- <xsd:selector xpath=".//xlf:ept"/>
1996
- <xsd:field xpath="@rid"/>
1997
- </xsd:keyref>
1998
- <xsd:unique name="U_segsrc_bx_rid">
1999
- <xsd:selector xpath=".//xlf:bx"/>
2000
- <xsd:field xpath="@rid"/>
2001
- </xsd:unique>
2002
- <xsd:keyref name="KR_segsrc_ex_rid" refer="xlf:U_segsrc_bx_rid">
2003
- <xsd:selector xpath=".//xlf:ex"/>
2004
- <xsd:field xpath="@rid"/>
2005
- </xsd:keyref>
2006
- </xsd:element>
2007
- <xsd:element name="target">
2008
- <xsd:complexType mixed="true">
2009
- <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2010
- <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
2011
- <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
2012
- <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2013
- <xsd:attribute ref="xml:lang" use="optional"/>
2014
- <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2015
- <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
2016
- <xsd:attribute name="font" type="xsd:string" use="optional"/>
2017
- <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
2018
- <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
2019
- <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
2020
- <xsd:attribute default="yes" name="equiv-trans" type="xlf:AttrType_YesNo" use="optional"/>
2021
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
2022
- </xsd:complexType>
2023
- <xsd:unique name="U_target_bpt_rid">
2024
- <xsd:selector xpath=".//xlf:bpt"/>
2025
- <xsd:field xpath="@rid"/>
2026
- </xsd:unique>
2027
- <xsd:keyref name="KR_target_ept_rid" refer="xlf:U_target_bpt_rid">
2028
- <xsd:selector xpath=".//xlf:ept"/>
2029
- <xsd:field xpath="@rid"/>
2030
- </xsd:keyref>
2031
- <xsd:unique name="U_target_bx_rid">
2032
- <xsd:selector xpath=".//xlf:bx"/>
2033
- <xsd:field xpath="@rid"/>
2034
- </xsd:unique>
2035
- <xsd:keyref name="KR_target_ex_rid" refer="xlf:U_target_bx_rid">
2036
- <xsd:selector xpath=".//xlf:ex"/>
2037
- <xsd:field xpath="@rid"/>
2038
- </xsd:keyref>
2039
- </xsd:element>
2040
- <xsd:element name="alt-trans">
2041
- <xsd:complexType>
2042
- <xsd:sequence>
2043
- <xsd:element minOccurs="0" ref="xlf:source"/>
2044
- <xsd:element minOccurs="0" ref="xlf:seg-source"/>
2045
- <xsd:element maxOccurs="1" ref="xlf:target"/>
2046
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
2047
- <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
2048
- <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
2049
- </xsd:sequence>
2050
- <xsd:attribute name="match-quality" type="xsd:string" use="optional"/>
2051
- <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
2052
- <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
2053
- <xsd:attribute ref="xml:lang" use="optional"/>
2054
- <xsd:attribute name="origin" type="xsd:string" use="optional"/>
2055
- <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
2056
- <xsd:attribute default="default" ref="xml:space" use="optional"/>
2057
- <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2058
- <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2059
- <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
2060
- <xsd:attribute name="extype" type="xsd:string" use="optional"/>
2061
- <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
2062
- <xsd:attribute name="menu" type="xsd:string" use="optional"/>
2063
- <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
2064
- <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
2065
- <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
2066
- <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
2067
- <xsd:attribute name="font" type="xsd:string" use="optional"/>
2068
- <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
2069
- <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
2070
- <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
2071
- <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2072
- <xsd:attribute default="proposal" name="alttranstype" type="xlf:AttrType_alttranstype" use="optional"/>
2073
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
2074
- </xsd:complexType>
2075
- <xsd:unique name="U_at_segsrc_mid">
2076
- <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
2077
- <xsd:field xpath="@mid"/>
2078
- </xsd:unique>
2079
- <xsd:keyref name="KR_at_segsrc_mid" refer="xlf:U_at_segsrc_mid">
2080
- <xsd:selector xpath="./xlf:target/xlf:mrk"/>
2081
- <xsd:field xpath="@mid"/>
2082
- </xsd:keyref>
2083
- </xsd:element>
2084
- <xsd:element name="bin-unit">
2085
- <xsd:complexType>
2086
- <xsd:sequence>
2087
- <xsd:element ref="xlf:bin-source"/>
2088
- <xsd:element minOccurs="0" ref="xlf:bin-target"/>
2089
- <xsd:choice maxOccurs="unbounded" minOccurs="0">
2090
- <xsd:element ref="xlf:context-group"/>
2091
- <xsd:element ref="xlf:count-group"/>
2092
- <xsd:element ref="xlf:note"/>
2093
- <xsd:element ref="xlf:trans-unit"/>
2094
- </xsd:choice>
2095
- <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
2096
- </xsd:sequence>
2097
- <xsd:attribute name="id" type="xsd:string" use="required"/>
2098
- <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="required"/>
2099
- <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
2100
- <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
2101
- <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
2102
- <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2103
- <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2104
- <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
2105
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
2106
- </xsd:complexType>
2107
- </xsd:element>
2108
- <xsd:element name="bin-source">
2109
- <xsd:complexType>
2110
- <xsd:choice>
2111
- <xsd:element ref="xlf:internal-file"/>
2112
- <xsd:element ref="xlf:external-file"/>
2113
- </xsd:choice>
2114
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
2115
- </xsd:complexType>
2116
- </xsd:element>
2117
- <xsd:element name="bin-target">
2118
- <xsd:complexType>
2119
- <xsd:choice>
2120
- <xsd:element ref="xlf:internal-file"/>
2121
- <xsd:element ref="xlf:external-file"/>
2122
- </xsd:choice>
2123
- <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="optional"/>
2124
- <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
2125
- <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
2126
- <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2127
- <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2128
- <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2129
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
2130
- </xsd:complexType>
2131
- </xsd:element>
2132
- <!-- Element for inline codes -->
2133
- <xsd:element name="g">
2134
- <xsd:complexType mixed="true">
2135
- <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2136
- <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2137
- <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2138
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2139
- </xsd:complexType>
2140
- </xsd:element>
2141
- <xsd:element name="x">
2142
- <xsd:complexType>
2143
- <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
2144
- <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2145
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2146
- </xsd:complexType>
2147
- </xsd:element>
2148
- <xsd:element name="bx">
2149
- <xsd:complexType>
2150
- <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2151
- <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2152
- <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2153
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2154
- </xsd:complexType>
2155
- </xsd:element>
2156
- <xsd:element name="ex">
2157
- <xsd:complexType>
2158
- <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2159
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2160
- </xsd:complexType>
2161
- </xsd:element>
2162
- <xsd:element name="ph">
2163
- <xsd:complexType mixed="true">
2164
- <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2165
- <xsd:element ref="xlf:sub"/>
2166
- </xsd:sequence>
2167
- <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
2168
- <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2169
- <xsd:attribute name="assoc" type="xlf:AttrType_assoc" use="optional"/>
2170
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2171
- </xsd:complexType>
2172
- </xsd:element>
2173
- <xsd:element name="bpt">
2174
- <xsd:complexType mixed="true">
2175
- <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2176
- <xsd:element ref="xlf:sub"/>
2177
- </xsd:sequence>
2178
- <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2179
- <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2180
- <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2181
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2182
- </xsd:complexType>
2183
- </xsd:element>
2184
- <xsd:element name="ept">
2185
- <xsd:complexType mixed="true">
2186
- <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2187
- <xsd:element ref="xlf:sub"/>
2188
- </xsd:sequence>
2189
- <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2190
- <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2191
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2192
- </xsd:complexType>
2193
- </xsd:element>
2194
- <xsd:element name="it">
2195
- <xsd:complexType mixed="true">
2196
- <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2197
- <xsd:element ref="xlf:sub"/>
2198
- </xsd:sequence>
2199
- <xsd:attribute name="pos" type="xlf:AttrType_Position" use="required"/>
2200
- <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2201
- <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2202
- <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2203
- <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2204
- </xsd:complexType>
2205
- </xsd:element>
2206
- <xsd:element name="sub">
2207
- <xsd:complexType mixed="true">
2208
- <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2209
- <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
2210
- <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2211
- <xsd:attribute name="xid" type="xsd:string" use="optional"/>
2212
- </xsd:complexType>
2213
- </xsd:element>
2214
- <xsd:element name="mrk">
2215
- <xsd:complexType mixed="true">
2216
- <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2217
- <xsd:attribute name="mtype" type="xlf:AttrType_mtype" use="required"/>
2218
- <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
2219
- <xsd:attribute name="comment" type="xsd:string" use="optional"/>
2220
- <xsd:anyAttribute namespace="##other" processContents="strict"/>
2221
- </xsd:complexType>
2222
- </xsd:element>
2223
- </xsd:schema>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/Translator.php CHANGED
@@ -13,15 +13,9 @@ namespace Symfony\Component\Translation;
13
 
14
  use Symfony\Component\Translation\Loader\LoaderInterface;
15
  use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
17
- use Symfony\Component\Translation\Exception\LogicException;
18
- use Symfony\Component\Translation\Exception\RuntimeException;
19
  use Symfony\Component\Config\ConfigCacheInterface;
20
  use Symfony\Component\Config\ConfigCacheFactoryInterface;
21
  use Symfony\Component\Config\ConfigCacheFactory;
22
- use Symfony\Component\Translation\Formatter\MessageFormatterInterface;
23
- use Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface;
24
- use Symfony\Component\Translation\Formatter\MessageFormatter;
25
 
26
  /**
27
  * @author Fabien Potencier <fabien@symfony.com>
@@ -36,7 +30,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
36
  /**
37
  * @var string
38
  */
39
- private $locale;
40
 
41
  /**
42
  * @var array
@@ -54,9 +48,9 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
54
  private $resources = array();
55
 
56
  /**
57
- * @var MessageFormatterInterface
58
  */
59
- private $formatter;
60
 
61
  /**
62
  * @var string
@@ -74,25 +68,17 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
74
  private $configCacheFactory;
75
 
76
  /**
77
- * @param string $locale The locale
78
- * @param MessageFormatterInterface|null $formatter The message formatter
79
- * @param string|null $cacheDir The directory to use for the cache
80
- * @param bool $debug Use cache in debug mode ?
81
  *
82
- * @throws InvalidArgumentException If a locale contains invalid characters
83
  */
84
- public function __construct($locale, $formatter = null, $cacheDir = null, $debug = false)
85
  {
86
  $this->setLocale($locale);
87
-
88
- if ($formatter instanceof MessageSelector) {
89
- $formatter = new MessageFormatter($formatter);
90
- @trigger_error(sprintf('Passing a "%s" instance into the "%s" as a second argument is deprecated since Symfony 3.4 and will be removed in 4.0. Inject a "%s" implementation instead.', MessageSelector::class, __METHOD__, MessageFormatterInterface::class), E_USER_DEPRECATED);
91
- } elseif (null === $formatter) {
92
- $formatter = new MessageFormatter();
93
- }
94
-
95
- $this->formatter = $formatter;
96
  $this->cacheDir = $cacheDir;
97
  $this->debug = $debug;
98
  }
@@ -121,7 +107,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
121
  * @param string $locale The locale
122
  * @param string $domain The domain
123
  *
124
- * @throws InvalidArgumentException If the locale contains invalid characters
125
  */
126
  public function addResource($format, $resource, $locale, $domain = null)
127
  {
@@ -157,12 +143,28 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
157
  return $this->locale;
158
  }
159
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  /**
161
  * Sets the fallback locales.
162
  *
163
  * @param array $locales The fallback locales
164
  *
165
- * @throws InvalidArgumentException If a locale contains invalid characters
166
  */
167
  public function setFallbackLocales(array $locales)
168
  {
@@ -195,7 +197,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
195
  $domain = 'messages';
196
  }
197
 
198
- return $this->formatter->format($this->getCatalogue($locale)->get((string) $id, $domain), $locale, $parameters);
199
  }
200
 
201
  /**
@@ -203,10 +205,6 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
203
  */
204
  public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
205
  {
206
- if (!$this->formatter instanceof ChoiceMessageFormatterInterface) {
207
- throw new LogicException(sprintf('The formatter "%s" does not support plural translations.', get_class($this->formatter)));
208
- }
209
-
210
  if (null === $domain) {
211
  $domain = 'messages';
212
  }
@@ -223,7 +221,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
223
  }
224
  }
225
 
226
- return $this->formatter->choiceFormat($catalogue->get($id, $domain), $number, $locale, $parameters);
227
  }
228
 
229
  /**
@@ -254,6 +252,28 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
254
  return $this->loaders;
255
  }
256
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  /**
258
  * @param string $locale
259
  */
@@ -294,9 +314,10 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
294
  }
295
 
296
  $this->assertValidLocale($locale);
 
297
  $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale),
298
- function (ConfigCacheInterface $cache) use ($locale) {
299
- $this->dumpCatalogue($locale, $cache);
300
  }
301
  );
302
 
@@ -309,7 +330,12 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
309
  $this->catalogues[$locale] = include $cache->getPath();
310
  }
311
 
312
- private function dumpCatalogue($locale, ConfigCacheInterface $cache)
 
 
 
 
 
313
  {
314
  $this->initializeCatalogue($locale);
315
  $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
@@ -366,7 +392,7 @@ EOF
366
 
367
  private function getCatalogueCachePath($locale)
368
  {
369
- return $this->cacheDir.'/catalogue.'.$locale.'.'.strtr(substr(base64_encode(hash('sha256', serialize($this->fallbackLocales), true)), 0, 7), '/', '_').'.php';
370
  }
371
 
372
  private function doLoadCatalogue($locale)
@@ -376,7 +402,7 @@ EOF
376
  if (isset($this->resources[$locale])) {
377
  foreach ($this->resources[$locale] as $resource) {
378
  if (!isset($this->loaders[$resource[0]])) {
379
- throw new RuntimeException(sprintf('The "%s" translation loader is not registered.', $resource[0]));
380
  }
381
  $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
382
  }
@@ -424,12 +450,12 @@ EOF
424
  *
425
  * @param string $locale Locale to tests
426
  *
427
- * @throws InvalidArgumentException If the locale contains invalid characters
428
  */
429
  protected function assertValidLocale($locale)
430
  {
431
  if (1 !== preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
432
- throw new InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale));
433
  }
434
  }
435
 
13
 
14
  use Symfony\Component\Translation\Loader\LoaderInterface;
15
  use Symfony\Component\Translation\Exception\NotFoundResourceException;
 
 
 
16
  use Symfony\Component\Config\ConfigCacheInterface;
17
  use Symfony\Component\Config\ConfigCacheFactoryInterface;
18
  use Symfony\Component\Config\ConfigCacheFactory;
 
 
 
19
 
20
  /**
21
  * @author Fabien Potencier <fabien@symfony.com>
30
  /**
31
  * @var string
32
  */
33
+ protected $locale;
34
 
35
  /**
36
  * @var array
48
  private $resources = array();
49
 
50
  /**
51
+ * @var MessageSelector
52
  */
53
+ private $selector;
54
 
55
  /**
56
  * @var string
68
  private $configCacheFactory;
69
 
70
  /**
71
+ * @param string $locale The locale
72
+ * @param MessageSelector|null $selector The message selector for pluralization
73
+ * @param string|null $cacheDir The directory to use for the cache
74
+ * @param bool $debug Use cache in debug mode ?
75
  *
76
+ * @throws \InvalidArgumentException If a locale contains invalid characters
77
  */
78
+ public function __construct($locale, MessageSelector $selector = null, $cacheDir = null, $debug = false)
79
  {
80
  $this->setLocale($locale);
81
+ $this->selector = $selector ?: new MessageSelector();
 
 
 
 
 
 
 
 
82
  $this->cacheDir = $cacheDir;
83
  $this->debug = $debug;
84
  }
107
  * @param string $locale The locale
108
  * @param string $domain The domain
109
  *
110
+ * @throws \InvalidArgumentException If the locale contains invalid characters
111
  */
112
  public function addResource($format, $resource, $locale, $domain = null)
113
  {
143
  return $this->locale;
144
  }
145
 
146
+ /**
147
+ * Sets the fallback locale(s).
148
+ *
149
+ * @param string|array $locales The fallback locale(s)
150
+ *
151
+ * @throws \InvalidArgumentException If a locale contains invalid characters
152
+ *
153
+ * @deprecated since version 2.3, to be removed in 3.0. Use setFallbackLocales() instead
154
+ */
155
+ public function setFallbackLocale($locales)
156
+ {
157
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.3 and will be removed in 3.0. Use the setFallbackLocales() method instead.', E_USER_DEPRECATED);
158
+
159
+ $this->setFallbackLocales(is_array($locales) ? $locales : array($locales));
160
+ }
161
+
162
  /**
163
  * Sets the fallback locales.
164
  *
165
  * @param array $locales The fallback locales
166
  *
167
+ * @throws \InvalidArgumentException If a locale contains invalid characters
168
  */
169
  public function setFallbackLocales(array $locales)
170
  {
197
  $domain = 'messages';
198
  }
199
 
200
+ return strtr($this->getCatalogue($locale)->get((string) $id, $domain), $parameters);
201
  }
202
 
203
  /**
205
  */
206
  public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
207
  {
 
 
 
 
208
  if (null === $domain) {
209
  $domain = 'messages';
210
  }
221
  }
222
  }
223
 
224
+ return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters);
225
  }
226
 
227
  /**
252
  return $this->loaders;
253
  }
254
 
255
+ /**
256
+ * Collects all messages for the given locale.
257
+ *
258
+ * @param string|null $locale Locale of translations, by default is current locale
259
+ *
260
+ * @return array[array] indexed by catalog
261
+ *
262
+ * @deprecated since version 2.8, to be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.
263
+ */
264
+ public function getMessages($locale = null)
265
+ {
266
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.', E_USER_DEPRECATED);
267
+
268
+ $catalogue = $this->getCatalogue($locale);
269
+ $messages = $catalogue->all();
270
+ while ($catalogue = $catalogue->getFallbackCatalogue()) {
271
+ $messages = array_replace_recursive($catalogue->all(), $messages);
272
+ }
273
+
274
+ return $messages;
275
+ }
276
+
277
  /**
278
  * @param string $locale
279
  */
314
  }
315
 
316
  $this->assertValidLocale($locale);
317
+ $self = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
318
  $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale),
319
+ function (ConfigCacheInterface $cache) use ($self, $locale) {
320
+ $self->dumpCatalogue($locale, $cache);
321
  }
322
  );
323
 
330
  $this->catalogues[$locale] = include $cache->getPath();
331
  }
332
 
333
+ /**
334
+ * This method is public because it needs to be callable from a closure in PHP 5.3. It should be made protected (or even private, if possible) in 3.0.
335
+ *
336
+ * @internal
337
+ */
338
+ public function dumpCatalogue($locale, ConfigCacheInterface $cache)
339
  {
340
  $this->initializeCatalogue($locale);
341
  $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
392
 
393
  private function getCatalogueCachePath($locale)
394
  {
395
+ return $this->cacheDir.'/catalogue.'.$locale.'.'.sha1(serialize($this->fallbackLocales)).'.php';
396
  }
397
 
398
  private function doLoadCatalogue($locale)
402
  if (isset($this->resources[$locale])) {
403
  foreach ($this->resources[$locale] as $resource) {
404
  if (!isset($this->loaders[$resource[0]])) {
405
+ throw new \RuntimeException(sprintf('The "%s" translation loader is not registered.', $resource[0]));
406
  }
407
  $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
408
  }
450
  *
451
  * @param string $locale Locale to tests
452
  *
453
+ * @throws \InvalidArgumentException If the locale contains invalid characters
454
  */
455
  protected function assertValidLocale($locale)
456
  {
457
  if (1 !== preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
458
+ throw new \InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale));
459
  }
460
  }
461
 
src/common/lib/vendor/symfony/translation/TranslatorBagInterface.php CHANGED
@@ -11,8 +11,6 @@
11
 
12
  namespace Symfony\Component\Translation;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
-
16
  /**
17
  * TranslatorBagInterface.
18
  *
@@ -27,7 +25,7 @@ interface TranslatorBagInterface
27
  *
28
  * @return MessageCatalogueInterface
29
  *
30
- * @throws InvalidArgumentException If the locale contains invalid characters
31
  */
32
  public function getCatalogue($locale = null);
33
  }
11
 
12
  namespace Symfony\Component\Translation;
13
 
 
 
14
  /**
15
  * TranslatorBagInterface.
16
  *
25
  *
26
  * @return MessageCatalogueInterface
27
  *
28
+ * @throws \InvalidArgumentException If the locale contains invalid characters
29
  */
30
  public function getCatalogue($locale = null);
31
  }
src/common/lib/vendor/symfony/translation/TranslatorInterface.php CHANGED
@@ -11,8 +11,6 @@
11
 
12
  namespace Symfony\Component\Translation;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
-
16
  /**
17
  * TranslatorInterface.
18
  *
@@ -30,7 +28,7 @@ interface TranslatorInterface
30
  *
31
  * @return string The translated string
32
  *
33
- * @throws InvalidArgumentException If the locale contains invalid characters
34
  */
35
  public function trans($id, array $parameters = array(), $domain = null, $locale = null);
36
 
@@ -45,7 +43,7 @@ interface TranslatorInterface
45
  *
46
  * @return string The translated string
47
  *
48
- * @throws InvalidArgumentException If the locale contains invalid characters
49
  */
50
  public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null);
51
 
@@ -54,7 +52,7 @@ interface TranslatorInterface
54
  *
55
  * @param string $locale The locale
56
  *
57
- * @throws InvalidArgumentException If the locale contains invalid characters
58
  */
59
  public function setLocale($locale);
60
 
11
 
12
  namespace Symfony\Component\Translation;
13
 
 
 
14
  /**
15
  * TranslatorInterface.
16
  *
28
  *
29
  * @return string The translated string
30
  *
31
+ * @throws \InvalidArgumentException If the locale contains invalid characters
32
  */
33
  public function trans($id, array $parameters = array(), $domain = null, $locale = null);
34
 
43
  *
44
  * @return string The translated string
45
  *
46
+ * @throws \InvalidArgumentException If the locale contains invalid characters
47
  */
48
  public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null);
49
 
52
  *
53
  * @param string $locale The locale
54
  *
55
+ * @throws \InvalidArgumentException If the locale contains invalid characters
56
  */
57
  public function setLocale($locale);
58
 
src/common/lib/vendor/symfony/translation/Writer/TranslationWriter.php CHANGED
@@ -13,15 +13,13 @@ namespace Symfony\Component\Translation\Writer;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
  use Symfony\Component\Translation\Dumper\DumperInterface;
16
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
17
- use Symfony\Component\Translation\Exception\RuntimeException;
18
 
19
  /**
20
  * TranslationWriter writes translation messages.
21
  *
22
  * @author Michel Salib <michelsalib@hotmail.com>
23
  */
24
- class TranslationWriter implements TranslationWriterInterface
25
  {
26
  private $dumpers = array();
27
 
@@ -61,43 +59,26 @@ class TranslationWriter implements TranslationWriterInterface
61
  /**
62
  * Writes translation from the catalogue according to the selected format.
63
  *
64
- * @param MessageCatalogue $catalogue The message catalogue to write
65
  * @param string $format The format to use to dump the messages
66
  * @param array $options Options that are passed to the dumper
67
  *
68
- * @throws InvalidArgumentException
69
  */
70
- public function write(MessageCatalogue $catalogue, $format, $options = array())
71
  {
72
  if (!isset($this->dumpers[$format])) {
73
- throw new InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format));
74
  }
75
 
76
  // get the right dumper
77
  $dumper = $this->dumpers[$format];
78
 
79
  if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) {
80
- throw new RuntimeException(sprintf('Translation Writer was not able to create directory "%s"', $options['path']));
81
  }
82
 
83
  // save
84
  $dumper->dump($catalogue, $options);
85
  }
86
-
87
- /**
88
- * Writes translation from the catalogue according to the selected format.
89
- *
90
- * @param MessageCatalogue $catalogue The message catalogue to write
91
- * @param string $format The format to use to dump the messages
92
- * @param array $options Options that are passed to the dumper
93
- *
94
- * @throws InvalidArgumentException
95
- *
96
- * @deprecated since 3.4 will be removed in 4.0. Use write instead.
97
- */
98
- public function writeTranslations(MessageCatalogue $catalogue, $format, $options = array())
99
- {
100
- @trigger_error(sprintf('Method %s() is deprecated since Symfony 3.4 and will be removed in 4.0. Use write() instead.', __METHOD__), E_USER_DEPRECATED);
101
- $this->write($catalogue, $format, $options);
102
- }
103
  }
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
  use Symfony\Component\Translation\Dumper\DumperInterface;
 
 
16
 
17
  /**
18
  * TranslationWriter writes translation messages.
19
  *
20
  * @author Michel Salib <michelsalib@hotmail.com>
21
  */
22
+ class TranslationWriter
23
  {
24
  private $dumpers = array();
25
 
59
  /**
60
  * Writes translation from the catalogue according to the selected format.
61
  *
62
+ * @param MessageCatalogue $catalogue The message catalogue to dump
63
  * @param string $format The format to use to dump the messages
64
  * @param array $options Options that are passed to the dumper
65
  *
66
+ * @throws \InvalidArgumentException
67
  */
68
+ public function writeTranslations(MessageCatalogue $catalogue, $format, $options = array())
69
  {
70
  if (!isset($this->dumpers[$format])) {
71
+ throw new \InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format));
72
  }
73
 
74
  // get the right dumper
75
  $dumper = $this->dumpers[$format];
76
 
77
  if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) {
78
+ throw new \RuntimeException(sprintf('Translation Writer was not able to create directory "%s"', $options['path']));
79
  }
80
 
81
  // save
82
  $dumper->dump($catalogue, $options);
83
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
src/common/lib/vendor/symfony/translation/Writer/TranslationWriterInterface.php DELETED
@@ -1,34 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Translation\Writer;
13
-
14
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
15
- use Symfony\Component\Translation\MessageCatalogue;
16
-
17
- /**
18
- * TranslationWriter writes translation messages.
19
- *
20
- * @author Michel Salib <michelsalib@hotmail.com>
21
- */
22
- interface TranslationWriterInterface
23
- {
24
- /**
25
- * Writes translation from the catalogue according to the selected format.
26
- *
27
- * @param MessageCatalogue $catalogue The message catalogue to write
28
- * @param string $format The format to use to dump the messages
29
- * @param array $options Options that are passed to the dumper
30
- *
31
- * @throws InvalidArgumentException
32
- */
33
- public function write(MessageCatalogue $catalogue, $format, $options = array());
34
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/lib/vendor/symfony/translation/composer.json CHANGED
@@ -16,21 +16,17 @@
16
  }
17
  ],
18
  "require": {
19
- "php": "^5.5.9|>=7.0.8",
20
  "symfony/polyfill-mbstring": "~1.0"
21
  },
22
  "require-dev": {
23
- "symfony/config": "~2.8|~3.0|~4.0",
24
- "symfony/dependency-injection": "~3.4|~4.0",
25
- "symfony/intl": "^2.8.18|^3.2.5|~4.0",
26
- "symfony/yaml": "~3.4|~4.0",
27
- "symfony/finder": "~2.8|~3.0|~4.0",
28
  "psr/log": "~1.0"
29
  },
30
  "conflict": {
31
- "symfony/config": "<2.8",
32
- "symfony/dependency-injection": "<3.4",
33
- "symfony/yaml": "<3.4"
34
  },
35
  "suggest": {
36
  "symfony/config": "",
@@ -46,7 +42,7 @@
46
  "minimum-stability": "dev",
47
  "extra": {
48
  "branch-alias": {
49
- "dev-master": "3.4-dev"
50
  }
51
  }
52
  }
16
  }
17
  ],
18
  "require": {
19
+ "php": ">=5.3.9",
20
  "symfony/polyfill-mbstring": "~1.0"
21
  },
22
  "require-dev": {
23
+ "symfony/config": "~2.8",
24
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
25
+ "symfony/yaml": "~2.2|~3.0.0",
 
 
26
  "psr/log": "~1.0"
27
  },
28
  "conflict": {
29
+ "symfony/config": "<2.7"
 
 
30
  },
31
  "suggest": {
32
  "symfony/config": "",
42
  "minimum-stability": "dev",
43
  "extra": {
44
  "branch-alias": {
45
+ "dev-master": "2.8-dev"
46
  }
47
  }
48
  }
src/common/lib/vendor/twig/twig/lib/Twig/Compiler.php CHANGED
@@ -25,6 +25,7 @@ class Twig_Compiler implements Twig_CompilerInterface
25
  protected $sourceOffset;
26
  protected $sourceLine;
27
  protected $filename;
 
28
 
29
  public function __construct(Twig_Environment $env)
30
  {
@@ -78,6 +79,7 @@ class Twig_Compiler implements Twig_CompilerInterface
78
  // source code starts at 1 (as we then increment it when we encounter new lines)
79
  $this->sourceLine = 1;
80
  $this->indentation = $indentation;
 
81
 
82
  if ($node instanceof Twig_Node_Module) {
83
  // to be removed in 2.0
@@ -276,7 +278,7 @@ class Twig_Compiler implements Twig_CompilerInterface
276
 
277
  public function getVarName()
278
  {
279
- return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
280
  }
281
  }
282
 
25
  protected $sourceOffset;
26
  protected $sourceLine;
27
  protected $filename;
28
+ private $varNameSalt = 0;
29
 
30
  public function __construct(Twig_Environment $env)
31
  {
79
  // source code starts at 1 (as we then increment it when we encounter new lines)
80
  $this->sourceLine = 1;
81
  $this->indentation = $indentation;
82
+ $this->varNameSalt = 0;
83
 
84
  if ($node instanceof Twig_Node_Module) {
85
  // to be removed in 2.0
278
 
279
  public function getVarName()
280
  {
281
+ return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->varNameSalt++));
282
  }
283
  }
284
 
src/common/lib/vendor/twig/twig/lib/Twig/Environment.php CHANGED
@@ -16,11 +16,11 @@
16
  */
17
  class Twig_Environment
18
  {
19
- const VERSION = '1.35.0';
20
- const VERSION_ID = 13500;
21
  const MAJOR_VERSION = 1;
22
  const MINOR_VERSION = 35;
23
- const RELEASE_VERSION = 0;
24
  const EXTRA_VERSION = '';
25
 
26
  protected $charset;
@@ -132,14 +132,14 @@ class Twig_Environment
132
  // For BC
133
  if (is_string($this->originalCache)) {
134
  $r = new ReflectionMethod($this, 'writeCacheFile');
135
- if ($r->getDeclaringClass()->getName() !== __CLASS__) {
136
  @trigger_error('The Twig_Environment::writeCacheFile method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
137
 
138
  $this->bcWriteCacheFile = true;
139
  }
140
 
141
  $r = new ReflectionMethod($this, 'getCacheFilename');
142
- if ($r->getDeclaringClass()->getName() !== __CLASS__) {
143
  @trigger_error('The Twig_Environment::getCacheFilename method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
144
 
145
  $this->bcGetCacheFilename = true;
@@ -562,12 +562,12 @@ class Twig_Environment
562
  /**
563
  * Tries to load a template consecutively from an array.
564
  *
565
- * Similar to loadTemplate() but it also accepts Twig_TemplateInterface instances and an array
566
- * of templates where each is tried to be loaded.
567
  *
568
- * @param string|Twig_Template|array $names A template or an array of templates to try consecutively
569
  *
570
- * @return Twig_Template
571
  *
572
  * @throws Twig_Error_Loader When none of the templates can be found
573
  * @throws Twig_Error_Syntax When an error occurred during compilation
@@ -583,6 +583,10 @@ class Twig_Environment
583
  return $name;
584
  }
585
 
 
 
 
 
586
  try {
587
  return $this->loadTemplate($name);
588
  } catch (Twig_Error_Loader $e) {
16
  */
17
  class Twig_Environment
18
  {
19
+ const VERSION = '1.35.2';
20
+ const VERSION_ID = 13501;
21
  const MAJOR_VERSION = 1;
22
  const MINOR_VERSION = 35;
23
+ const RELEASE_VERSION = 1;
24
  const EXTRA_VERSION = '';
25
 
26
  protected $charset;
132
  // For BC
133
  if (is_string($this->originalCache)) {
134
  $r = new ReflectionMethod($this, 'writeCacheFile');
135
+ if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
136
  @trigger_error('The Twig_Environment::writeCacheFile method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
137
 
138
  $this->bcWriteCacheFile = true;
139
  }
140
 
141
  $r = new ReflectionMethod($this, 'getCacheFilename');
142
+ if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
143
  @trigger_error('The Twig_Environment::getCacheFilename method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
144
 
145
  $this->bcGetCacheFilename = true;
562
  /**
563
  * Tries to load a template consecutively from an array.
564
  *
565
+ * Similar to loadTemplate() but it also accepts instances of Twig_Template and
566
+ * Twig_TemplateWrapper, and an array of templates where each is tried to be loaded.
567
  *
568
+ * @param string|Twig_Template|Twig_TemplateWrapper|array $names A template or an array of templates to try consecutively
569
  *
570
+ * @return Twig_Template|Twig_TemplateWrapper
571
  *
572
  * @throws Twig_Error_Loader When none of the templates can be found
573
  * @throws Twig_Error_Syntax When an error occurred during compilation
583
  return $name;
584
  }
585
 
586
+ if ($name instanceof Twig_TemplateWrapper) {
587
+ return $name;
588
+ }
589
+
590
  try {
591
  return $this->loadTemplate($name);
592
  } catch (Twig_Error_Loader $e) {
src/common/lib/vendor/twig/twig/lib/Twig/ExpressionParser.php CHANGED
@@ -199,11 +199,14 @@ class Twig_ExpressionParser
199
  break;
200
  }
201
 
 
202
  default:
203
  if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) {
204
  $node = $this->parseArrayExpression();
205
  } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) {
206
  $node = $this->parseHashExpression();
 
 
207
  } else {
208
  throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
209
  }
@@ -313,7 +316,7 @@ class Twig_ExpressionParser
313
  {
314
  while (true) {
315
  $token = $this->parser->getCurrentToken();
316
- if ($token->getType() == Twig_Token::PUNCTUATION_TYPE) {
317
  if ('.' == $token->getValue() || '[' == $token->getValue()) {
318
  $node = $this->parseSubscriptExpression($node);
319
  } elseif ('|' == $token->getValue()) {
@@ -384,14 +387,14 @@ class Twig_ExpressionParser
384
  $lineno = $token->getLine();
385
  $arguments = new Twig_Node_Expression_Array(array(), $lineno);
386
  $type = Twig_Template::ANY_CALL;
387
- if ($token->getValue() == '.') {
388
  $token = $stream->next();
389
  if (
390
- $token->getType() == Twig_Token::NAME_TYPE
391
  ||
392
- $token->getType() == Twig_Token::NUMBER_TYPE
393
  ||
394
- ($token->getType() == Twig_Token::OPERATOR_TYPE && preg_match(Twig_Lexer::REGEX_NAME, $token->getValue()))
395
  ) {
396
  $arg = new Twig_Node_Expression_Constant($token->getValue(), $lineno);
397
 
199
  break;
200
  }
201
 
202
+ // no break
203
  default:
204
  if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) {
205
  $node = $this->parseArrayExpression();
206
  } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) {
207
  $node = $this->parseHashExpression();
208
+ } elseif ($token->test(Twig_Token::OPERATOR_TYPE, '=') && ('==' === $this->parser->getStream()->look(-1)->getValue() || '!=' === $this->parser->getStream()->look(-1)->getValue())) {
209
+ throw new Twig_Error_Syntax(sprintf('Unexpected operator of value "%s". Did you try to use "===" or "!==" for strict comparison? Use "is same as(value)" instead.', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
210
  } else {
211
  throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
212
  }
316
  {
317
  while (true) {
318
  $token = $this->parser->getCurrentToken();
319
+ if (Twig_Token::PUNCTUATION_TYPE == $token->getType()) {
320
  if ('.' == $token->getValue() || '[' == $token->getValue()) {
321
  $node = $this->parseSubscriptExpression($node);
322
  } elseif ('|' == $token->getValue()) {
387
  $lineno = $token->getLine();
388
  $arguments = new Twig_Node_Expression_Array(array(), $lineno);
389
  $type = Twig_Template::ANY_CALL;
390
+ if ('.' == $token->getValue()) {
391
  $token = $stream->next();
392
  if (
393
+ Twig_Token::NAME_TYPE == $token->getType()
394
  ||
395
+ Twig_Token::NUMBER_TYPE == $token->getType()
396
  ||
397
+ (Twig_Token::OPERATOR_TYPE == $token->getType() && preg_match(Twig_Lexer::REGEX_NAME, $token->getValue()))
398
  ) {
399
  $arg = new Twig_Node_Expression_Constant($token->getValue(), $lineno);
400
 
src/common/lib/vendor/twig/twig/lib/Twig/Extension/Core.php CHANGED
@@ -661,7 +661,7 @@ function twig_slice(Twig_Environment $env, $item, $start, $length = null, $prese
661
 
662
  if ($start >= 0 && $length >= 0 && $item instanceof Iterator) {
663
  try {
664
- return iterator_to_array(new LimitIterator($item, $start, $length === null ? -1 : $length), $preserveKeys);
665
  } catch (OutOfBoundsException $exception) {
666
  return array();
667
  }
@@ -1216,7 +1216,7 @@ function _twig_escape_html_attr_callback($matches)
1216
  * The following replaces characters undefined in HTML with the
1217
  * hex entity for the Unicode replacement character.
1218
  */
1219
- if (($ord <= 0x1f && $chr != "\t" && $chr != "\n" && $chr != "\r") || ($ord >= 0x7f && $ord <= 0x9f)) {
1220
  return '&#xFFFD;';
1221
  }
1222
 
@@ -1224,7 +1224,7 @@ function _twig_escape_html_attr_callback($matches)
1224
  * Check if the current character to escape has a name entity we should
1225
  * replace it with while grabbing the hex value of the character.
1226
  */
1227
- if (strlen($chr) == 1) {
1228
  $hex = strtoupper(substr('00'.bin2hex($chr), -2));
1229
  } else {
1230
  $chr = twig_convert_encoding($chr, 'UTF-16BE', 'UTF-8');
@@ -1271,6 +1271,10 @@ if (function_exists('mb_get_info')) {
1271
  return count($thing);
1272
  }
1273
 
 
 
 
 
1274
  return 1;
1275
  }
1276
 
@@ -1370,6 +1374,10 @@ else {
1370
  return count($thing);
1371
  }
1372
 
 
 
 
 
1373
  return 1;
1374
  }
1375
 
@@ -1444,7 +1452,7 @@ function twig_test_empty($value)
1444
  *
1445
  * <pre>
1446
  * {# evaluates to true if the foo variable is an array or a traversable object #}
1447
- * {% if foo is traversable %}
1448
  * {# ... #}
1449
  * {% endif %}
1450
  * </pre>
661
 
662
  if ($start >= 0 && $length >= 0 && $item instanceof Iterator) {
663
  try {
664
+ return iterator_to_array(new LimitIterator($item, $start, null === $length ? -1 : $length), $preserveKeys);
665
  } catch (OutOfBoundsException $exception) {
666
  return array();
667
  }
1216
  * The following replaces characters undefined in HTML with the
1217
  * hex entity for the Unicode replacement character.
1218
  */
1219
+ if (($ord <= 0x1f && "\t" != $chr && "\n" != $chr && "\r" != $chr) || ($ord >= 0x7f && $ord <= 0x9f)) {
1220
  return '&#xFFFD;';
1221
  }
1222
 
1224
  * Check if the current character to escape has a name entity we should
1225
  * replace it with while grabbing the hex value of the character.
1226
  */
1227
+ if (1 == strlen($chr)) {
1228
  $hex = strtoupper(substr('00'.bin2hex($chr), -2));
1229
  } else {
1230
  $chr = twig_convert_encoding($chr, 'UTF-16BE', 'UTF-8');
1271
  return count($thing);
1272
  }
1273
 
1274
+ if ($thing instanceof \IteratorAggregate) {
1275
+ return iterator_count($thing);
1276
+ }
1277
+
1278
  return 1;
1279
  }
1280
 
1374
  return count($thing);
1375
  }
1376
 
1377
+ if ($thing instanceof \IteratorAggregate) {
1378
+ return iterator_count($thing);
1379
+ }
1380
+
1381
  return 1;
1382
  }
1383
 
1452
  *
1453
  * <pre>
1454
  * {# evaluates to true if the foo variable is an array or a traversable object #}
1455
+ * {% if foo is iterable %}
1456
  * {# ... #}
1457
  * {% endif %}
1458
  * </pre>
src/common/lib/vendor/twig/twig/lib/Twig/Lexer.php CHANGED
@@ -235,7 +235,7 @@ class Twig_Lexer implements Twig_LexerInterface
235
  $this->moveCursor($match[0]);
236
 
237
  if ($this->cursor >= $this->end) {
238
- throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $this->state === self::STATE_BLOCK ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source);
239
  }
240
  }
241
 
@@ -337,7 +337,7 @@ class Twig_Lexer implements Twig_LexerInterface
337
  $this->moveCursor($match[0]);
338
  } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
339
  list($expect, $lineno) = array_pop($this->brackets);
340
- if ($this->code[$this->cursor] != '"') {
341
  throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
342
  }
343
 
235
  $this->moveCursor($match[0]);
236
 
237
  if ($this->cursor >= $this->end) {
238
+ throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', self::STATE_BLOCK === $this->state ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source);
239
  }
240
  }
241
 
337
  $this->moveCursor($match[0]);
338
  } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
339
  list($expect, $lineno) = array_pop($this->brackets);
340
+ if ('"' != $this->code[$this->cursor]) {
341
  throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
342
  }
343
 
src/common/lib/vendor/twig/twig/lib/Twig/Loader/Filesystem.php CHANGED
@@ -279,7 +279,7 @@ class Twig_Loader_Filesystem implements Twig_LoaderInterface, Twig_ExistsLoaderI
279
  {
280
  return strspn($file, '/\\', 0, 1)
281
  || (strlen($file) > 3 && ctype_alpha($file[0])
282
- && substr($file, 1, 1) === ':'
283
  && strspn($file, '/\\', 2, 1)
284
  )
285
  || null !== parse_url($file, PHP_URL_SCHEME)
279
  {
280
  return strspn($file, '/\\', 0, 1)
281
  || (strlen($file) > 3 && ctype_alpha($file[0])
282
+ && ':' === substr($file, 1, 1)
283
  && strspn($file, '/\\', 2, 1)
284
  )
285
  || null !== parse_url($file, PHP_URL_SCHEME)
src/common/lib/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php CHANGED
@@ -56,7 +56,7 @@ class Twig_NodeVisitor_Optimizer extends Twig_BaseNodeVisitor
56
  if (PHP_VERSION_ID < 50400 && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) {
57
  if ($this->inABody) {
58
  if (!$node instanceof Twig_Node_Expression) {
59
- if (get_class($node) !== 'Twig_Node') {
60
  array_unshift($this->prependedNodes, array());
61
  }
62
  } else {
@@ -88,7 +88,7 @@ class Twig_NodeVisitor_Optimizer extends Twig_BaseNodeVisitor
88
  if ($node instanceof Twig_Node_Body) {
89
  $this->inABody = false;
90
  } elseif ($this->inABody) {
91
- if (!$expression && get_class($node) !== 'Twig_Node' && $prependedNodes = array_shift($this->prependedNodes)) {
92
  $nodes = array();
93
  foreach (array_unique($prependedNodes) as $name) {
94
  $nodes[] = new Twig_Node_SetTemp($name, $node->getTemplateLine());
56
  if (PHP_VERSION_ID < 50400 && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) {
57
  if ($this->inABody) {
58
  if (!$node instanceof Twig_Node_Expression) {
59
+ if ('Twig_Node' !== get_class($node)) {
60
  array_unshift($this->prependedNodes, array());
61
  }
62
  } else {
88
  if ($node instanceof Twig_Node_Body) {
89
  $this->inABody = false;
90
  } elseif ($this->inABody) {
91
+ if (!$expression && 'Twig_Node' !== get_class($node) && $prependedNodes = array_shift($this->prependedNodes)) {
92
  $nodes = array();
93
  foreach (array_unique($prependedNodes) as $name) {
94
  $nodes[] = new Twig_Node_SetTemp($name, $node->getTemplateLine());
src/common/lib/vendor/twig/twig/lib/Twig/Parser.php CHANGED
@@ -31,6 +31,7 @@ class Twig_Parser implements Twig_ParserInterface
31
  protected $importedSymbols;
32
  protected $traits;
33
  protected $embeddedTemplates = array();
 
34
 
35
  public function __construct(Twig_Environment $env)
36
  {
@@ -49,7 +50,7 @@ class Twig_Parser implements Twig_ParserInterface
49
 
50
  public function getVarName()
51
  {
52
- return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
53
  }
54
 
55
  /**
@@ -98,6 +99,7 @@ class Twig_Parser implements Twig_ParserInterface
98
  $this->blockStack = array();
99
  $this->importedSymbols = array(array());
100
  $this->embeddedTemplates = array();
 
101
 
102
  try {
103
  $body = $this->subparse($test, $dropNeedle);
@@ -153,7 +155,7 @@ class Twig_Parser implements Twig_ParserInterface
153
  $this->stream->next();
154
  $token = $this->getCurrentToken();
155
 
156
- if ($token->getType() !== Twig_Token::NAME_TYPE) {
157
  throw new Twig_Error_Syntax('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext());
158
  }
159
 
@@ -383,7 +385,7 @@ class Twig_Parser implements Twig_ParserInterface
383
  throw new Twig_Error_Syntax('A template that extends another one cannot start with a byte order mark (BOM); it must be removed.', $node->getTemplateLine(), $this->stream->getSourceContext());
384
  }
385
 
386
- throw new Twig_Error_Syntax('A template that extends another one cannot include contents outside Twig blocks. Did you forget to put the contents inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext());
387
  }
388
 
389
  // bypass nodes that will "capture" the output
31
  protected $importedSymbols;
32
  protected $traits;
33
  protected $embeddedTemplates = array();
34
+ private $varNameSalt = 0;
35
 
36
  public function __construct(Twig_Environment $env)
37
  {
50
 
51
  public function getVarName()
52
  {
53
+ return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->varNameSalt++));
54
  }
55
 
56
  /**
99
  $this->blockStack = array();
100
  $this->importedSymbols = array(array());
101
  $this->embeddedTemplates = array();
102
+ $this->varNameSalt = 0;
103
 
104
  try {
105
  $body = $this->subparse($test, $dropNeedle);
155
  $this->stream->next();
156
  $token = $this->getCurrentToken();
157
 
158
+ if (Twig_Token::NAME_TYPE !== $token->getType()) {
159
  throw new Twig_Error_Syntax('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext());
160
  }
161
 
385
  throw new Twig_Error_Syntax('A template that extends another one cannot start with a byte order mark (BOM); it must be removed.', $node->getTemplateLine(), $this->stream->getSourceContext());
386
  }
387
 
388
+ throw new Twig_Error_Syntax('A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext());
389
  }
390
 
391
  // bypass nodes that will "capture" the output
src/common/lib/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php CHANGED
@@ -55,7 +55,7 @@ class Twig_Profiler_NodeVisitor_Profiler extends Twig_BaseNodeVisitor
55
 
56
  private function getVarName()
57
  {
58
- return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
59
  }
60
 
61
  public function getPriority()
55
 
56
  private function getVarName()
57
  {
58
+ return sprintf('__internal_%s', hash('sha256', $this->extensionName));
59
  }
60
 
61
  public function getPriority()
src/common/lib/vendor/twig/twig/lib/Twig/Template.php CHANGED
@@ -568,6 +568,8 @@ abstract class Twig_Template implements Twig_TemplateInterface
568
 
569
  if (null === $object) {
570
  $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item);
 
 
571
  } else {
572
  $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
573
  }
@@ -696,7 +698,7 @@ abstract class Twig_Template implements Twig_TemplateInterface
696
  }
697
  @trigger_error($message, E_USER_DEPRECATED);
698
 
699
- return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset());
700
  }
701
 
702
  return $ret;
568
 
569
  if (null === $object) {
570
  $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item);
571
+ } elseif (is_array($object)) {
572
+ $message = sprintf('Impossible to invoke a method ("%s") on an array.', $item);
573
  } else {
574
  $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
575
  }
698
  }
699
  @trigger_error($message, E_USER_DEPRECATED);
700
 
701
+ return '' === $ret ? '' : new Twig_Markup($ret, $this->env->getCharset());
702
  }
703
 
704
  return $ret;
src/common/lib/vendor/twig/twig/lib/Twig/TokenParser/For.php CHANGED
@@ -40,7 +40,7 @@ class Twig_TokenParser_For extends Twig_TokenParser
40
 
41
  $stream->expect(Twig_Token::BLOCK_END_TYPE);
42
  $body = $this->parser->subparse(array($this, 'decideForFork'));
43
- if ($stream->next()->getValue() == 'else') {
44
  $stream->expect(Twig_Token::BLOCK_END_TYPE);
45
  $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
46
  } else {
40
 
41
  $stream->expect(Twig_Token::BLOCK_END_TYPE);
42
  $body = $this->parser->subparse(array($this, 'decideForFork'));
43
+ if ('else' == $stream->next()->getValue()) {
44
  $stream->expect(Twig_Token::BLOCK_END_TYPE);
45
  $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
46
  } else {
src/common/lib/vendor/twig/twig/lib/Twig/TokenParserBroker.php CHANGED
@@ -61,12 +61,12 @@ class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface
61
  }
62
  }
63
 
64
- public function addTokenParserBroker(Twig_TokenParserBroker $broker)
65
  {
66
  $this->brokers[] = $broker;
67
  }
68
 
69
- public function removeTokenParserBroker(Twig_TokenParserBroker $broker)
70
  {
71
  if (false !== $pos = array_search($broker, $this->brokers)) {
72
  unset($this->brokers[$pos]);
61
  }
62
  }
63
 
64
+ public function addTokenParserBroker(self $broker)
65
  {
66
  $this->brokers[] = $broker;
67
  }
68
 
69
+ public function removeTokenParserBroker(self $broker)
70
  {
71
  if (false !== $pos = array_search($broker, $this->brokers)) {
72
  unset($this->brokers[$pos]);
src/common/lib/vendor/twig/twig/lib/Twig/TokenStream.php CHANGED
@@ -139,7 +139,7 @@ class Twig_TokenStream
139
  */
140
  public function isEOF()
141
  {
142
- return $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE;
143
  }
144
 
145
  /**
139
  */
140
  public function isEOF()
141
  {
142
+ return Twig_Token::EOF_TYPE === $this->tokens[$this->current]->getType();
143
  }
144
 
145
  /**
src/common/wp-admin-notices.php CHANGED
@@ -39,9 +39,30 @@ class ICWP_WPSF_WpAdminNotices extends ICWP_WPSF_Foundation {
39
  add_action( 'admin_notices', array( $this, 'onWpAdminNotices' ) );
40
  add_action( 'network_admin_notices', array( $this, 'onWpAdminNotices' ) );
41
  add_action( 'wp_loaded', array( $this, 'flushFlashMessage' ) );
42
- if ( $this->loadWp()->isAjax() ) {
43
- add_action( 'wp_ajax_icwp_wpsf_DismissAdminNotice', array( $this, 'ajaxDismissAdminNotice' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
 
45
  }
46
 
47
  public function onWpAdminNotices() {
@@ -52,19 +73,6 @@ class ICWP_WPSF_WpAdminNotices extends ICWP_WPSF_Foundation {
52
  $this->flashNotice();
53
  }
54
 
55
- public function ajaxDismissAdminNotice() {
56
-
57
- if ( $this->checkAjaxNonce() ) {
58
- // Get all notices and if this notice exists, we set it to "hidden"
59
- $sNoticeId = sanitize_key( $this->loadDP()->query( 'notice_id', '' ) );
60
- $aNotices = apply_filters( $this->getActionPrefix().'register_admin_notices', array() );
61
- if ( !empty( $sNoticeId ) && array_key_exists( $sNoticeId, $aNotices ) ) {
62
- $this->setMeta( $aNotices[ $sNoticeId ][ 'id' ] );
63
- }
64
- $this->sendAjaxResponse( true );
65
- }
66
- }
67
-
68
  /**
69
  * @param string $sNoticeId
70
  * @return true
@@ -115,36 +123,6 @@ class ICWP_WPSF_WpAdminNotices extends ICWP_WPSF_Foundation {
115
  return;
116
  }
117
 
118
- /**
119
- * Will send ajax error response immediately upon failure
120
- * @return bool
121
- */
122
- protected function checkAjaxNonce() {
123
-
124
- $sNonce = $this->loadDP()->FetchRequest( '_ajax_nonce', '' );
125
- if ( empty( $sNonce ) ) {
126
- $sMessage = 'Nonce security checking failed - the nonce value was empty.';
127
- }
128
- else if ( wp_verify_nonce( $sNonce, 'icwp_ajax' ) === false ) {
129
- $sMessage = sprintf( 'Nonce security checking failed - the nonce supplied was "%s".', $sNonce );
130
- }
131
- else {
132
- return true; // At this stage we passed the nonce check
133
- }
134
-
135
- // At this stage we haven't returned after success so we failed the nonce check
136
- $this->sendAjaxResponse( false, array( 'message' => $sMessage ) );
137
- return false; //unreachable
138
- }
139
-
140
- /**
141
- * @param $bSuccess
142
- * @param array $aData
143
- */
144
- protected function sendAjaxResponse( $bSuccess, $aData = array() ) {
145
- $bSuccess ? wp_send_json_success( $aData ) : wp_send_json_error( $aData );
146
- }
147
-
148
  /**
149
  * @return string
150
  */
39
  add_action( 'admin_notices', array( $this, 'onWpAdminNotices' ) );
40
  add_action( 'network_admin_notices', array( $this, 'onWpAdminNotices' ) );
41
  add_action( 'wp_loaded', array( $this, 'flushFlashMessage' ) );
42
+ }
43
+
44
+ /**
45
+ * @param array $aAjaxResponse
46
+ * @return array
47
+ */
48
+ public function handleAuthAjax( $aAjaxResponse ) {
49
+ if ( empty( $aAjaxResponse ) && $this->loadDP()->request( 'exec' ) === 'dismiss_admin_notice' ) {
50
+ $aAjaxResponse = $this->ajaxExec_DismissAdminNotice();
51
+ }
52
+ return $aAjaxResponse;
53
+ }
54
+
55
+ /**
56
+ * @return array
57
+ */
58
+ protected function ajaxExec_DismissAdminNotice() {
59
+ // Get all notices and if this notice exists, we set it to "hidden"
60
+ $sNoticeId = sanitize_key( $this->loadDP()->query( 'notice_id', '' ) );
61
+ $aNotices = apply_filters( $this->getActionPrefix().'register_admin_notices', array() );
62
+ if ( !empty( $sNoticeId ) && array_key_exists( $sNoticeId, $aNotices ) ) {
63
+ $this->setMeta( $aNotices[ $sNoticeId ][ 'id' ] );
64
  }
65
+ return array( 'success' => true );
66
  }
67
 
68
  public function onWpAdminNotices() {
73
  $this->flashNotice();
74
  }
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  /**
77
  * @param string $sNoticeId
78
  * @return true
123
  return;
124
  }
125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  /**
127
  * @return string
128
  */
src/common/wp-comments.php CHANGED
@@ -80,7 +80,6 @@ class ICWP_WPSF_WpComments extends ICWP_WPSF_Foundation {
80
  * @return bool
81
  */
82
  public function isCommentPost() {
83
- return $this->loadDataProcessor()->GetIsRequestPost() && $this->loadWp()
84
- ->getIsCurrentPage( 'wp-comments-post.php' );
85
  }
86
  }
80
  * @return bool
81
  */
82
  public function isCommentPost() {
83
+ return $this->loadDP()->isMethodPost() && $this->loadWp()->getIsCurrentPage( 'wp-comments-post.php' );
 
84
  }
85
  }
src/config/feature-admin_access_restriction.php CHANGED
@@ -46,6 +46,14 @@
46
  "Recommendation - Use of this feature is highly recommend."
47
  ]
48
  },
 
 
 
 
 
 
 
 
49
  {
50
  "slug": "section_enable_plugin_feature_admin_access_restriction",
51
  "title": "Enable Module: WordPress Security Admin",
@@ -203,6 +211,85 @@
203
  "link_blog": "http://icwp.io/wpsf21",
204
  "summary": "Restrict Access To Key WordPress Posts And Pages Actions",
205
  "description": "Careful: This will restrict access to page/post creation, editing and deletion."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  }
207
  ],
208
  "definitions": {
46
  "Recommendation - Use of this feature is highly recommend."
47
  ]
48
  },
49
+ {
50
+ "slug": "section_whitelabel",
51
+ "title": "Shield White Label",
52
+ "title_short": "White Label",
53
+ "summary": [
54
+ "Purpose - Rename and re-brand the Shield Security plugin for your client site installations."
55
+ ]
56
+ },
57
  {
58
  "slug": "section_enable_plugin_feature_admin_access_restriction",
59
  "title": "Enable Module: WordPress Security Admin",
211
  "link_blog": "http://icwp.io/wpsf21",
212
  "summary": "Restrict Access To Key WordPress Posts And Pages Actions",
213
  "description": "Careful: This will restrict access to page/post creation, editing and deletion."
214
+ },
215
+ {
216
+ "key": "whitelabel_enable",
217
+ "section": "section_non_ui",
218
+ "premium": true,
219
+ "default": "N",
220
+ "type": "checkbox",
221
+ "link_info": "",
222
+ "link_blog": "",
223
+ "name": "Enable White Label",
224
+ "summary": "Activate Your White Label Settings",
225
+ "description": "Use this option to turn on/off the whole White Label feature."
226
+ },
227
+ {
228
+ "key": "_wl_hide_updates",
229
+ "section": "section_non_ui",
230
+ "premium": true,
231
+ "default": "Y",
232
+ "type": "checkbox",
233
+ "link_info": "",
234
+ "link_blog": "",
235
+ "name": "Hide Updates",
236
+ "summary": "Hide Available Updates From Non Security Admins",
237
+ "description": "Hides the availability of Shield updates from non-security admins."
238
+ },
239
+ {
240
+ "key": "_wl_namemain",
241
+ "section": "section_non_ui",
242
+ "default": "Shield Security",
243
+ "type": "text",
244
+ "link_info": "",
245
+ "link_blog": "",
246
+ "name": "Plugin Name",
247
+ "summary": "The Name Of The Plugin",
248
+ "description": "The Name Of The Plugin."
249
+ },
250
+ {
251
+ "key": "_wl_namemenu",
252
+ "section": "section_non_ui",
253
+ "default": "",
254
+ "type": "text",
255
+ "link_info": "",
256
+ "link_blog": "",
257
+ "name": "Menu Title",
258
+ "summary": "The Main Menu Title Of The Plugin",
259
+ "description": "The Main Menu Title Of The Plugin. If left empty, the Plugin Name will be used."
260
+ },
261
+ {
262
+ "key": "_wl_description",
263
+ "section": "section_non_ui",
264
+ "default": "Secure Your Sites With The World's Most Powerful WordPress Security Plugin",
265
+ "type": "text",
266
+ "link_info": "",
267
+ "link_blog": "",
268
+ "name": "Plugin Tag Line",
269
+ "summary": "The Tag Line Of The Plugin",
270
+ "description": "The Tag Line Of The Plugin."
271
+ },
272
+ {
273
+ "key": "_wl_homeurl",
274
+ "section": "section_non_ui",
275
+ "default": "http://icwp.io/home",
276
+ "type": "text",
277
+ "link_info": "",
278
+ "link_blog": "",
279
+ "name": "Home URL",
280
+ "summary": "Plugin Home Page URL",
281
+ "description": "When a user clicks the home link for this plugin, this is where they'll be directed."
282
+ },
283
+ {
284
+ "key": "_wl_iconurl",
285
+ "section": "section_non_ui",
286
+ "default": "",
287
+ "type": "text",
288
+ "link_info": "",
289
+ "link_blog": "",
290
+ "name": "Icon URL",
291
+ "summary": "Plugin Icon URL",
292
+ "description": "The URL of the icon displayed in the menu and in the admin pages."
293
  }
294
  ],
295
  "definitions": {
src/config/feature-autoupdates.php CHANGED
@@ -173,7 +173,7 @@
173
  "key": "override_email_address",
174
  "section": "section_options",
175
  "sensitive": true,
176
- "default": "Y",
177
  "type": "email",
178
  "link_info": "",
179
  "link_blog": "",
173
  "key": "override_email_address",
174
  "section": "section_options",
175
  "sensitive": true,
176
+ "default": "",
177
  "type": "email",
178
  "link_info": "",
179
  "link_blog": "",
src/config/feature-hack_protect.php CHANGED
@@ -375,7 +375,25 @@
375
  "description": "Show links to re-install plugins and offer re-install when activating plugins."
376
  },
377
  {
378
- "key": "ptg_last_build_at",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  "transferable": false,
380
  "section": "section_non_ui",
381
  "value": 0
375
  "description": "Show links to re-install plugins and offer re-install when activating plugins."
376
  },
377
  {
378
+ "key": "ptg_last_scan_at",
379
+ "transferable": false,
380
+ "section": "section_non_ui",
381
+ "value": 0
382
+ },
383
+ {
384
+ "key": "wcf_last_scan_at",
385
+ "transferable": false,
386
+ "section": "section_non_ui",
387
+ "value": 0
388
+ },
389
+ {
390
+ "key": "ufc_last_scan_at",
391
+ "transferable": false,
392
+ "section": "section_non_ui",
393
+ "value": 0
394
+ },
395
+ {
396
+ "key": "wpv_last_scan_at",
397
  "transferable": false,
398
  "section": "section_non_ui",
399
  "value": 0
src/config/feature-license.php CHANGED
@@ -27,14 +27,9 @@
27
  "options": [
28
  {
29
  "key": "license_key",
30
- "section": "section_license_options",
31
  "default": "",
32
- "type": "text",
33
- "link_info": "",
34
- "link_blog": "",
35
- "name": "License Key",
36
- "summary": "License Key",
37
- "description": "License Key."
38
  },
39
  {
40
  "key": "license_activated_at",
@@ -54,6 +49,12 @@
54
  "default": 0,
55
  "section": "section_non_ui"
56
  },
 
 
 
 
 
 
57
  {
58
  "key": "license_expires_at",
59
  "transferable": false,
@@ -79,7 +80,7 @@
79
  "section": "section_non_ui"
80
  },
81
  {
82
- "key": "is_license_shield_central",
83
  "transferable": false,
84
  "default": false,
85
  "section": "section_non_ui"
@@ -95,6 +96,18 @@
95
  "transferable": false,
96
  "default": 0,
97
  "section": "section_non_ui"
 
 
 
 
 
 
 
 
 
 
 
 
98
  }
99
  ],
100
  "definitions": {
@@ -103,8 +116,11 @@
103
  "license_item_id": "6047",
104
  "license_item_name_sc": "Shield Security Pro (via Shield Central)",
105
  "license_item_id_sc": "968",
106
- "license_lack_check_expire_days": 3,
 
107
  "license_key_length": 32,
108
- "license_key_type": "alphanumeric"
 
 
109
  }
110
  }
27
  "options": [
28
  {
29
  "key": "license_key",
30
+ "transferable": false,
31
  "default": "",
32
+ "section": "section_non_ui"
 
 
 
 
 
33
  },
34
  {
35
  "key": "license_activated_at",
49
  "default": 0,
50
  "section": "section_non_ui"
51
  },
52
+ {
53
+ "key": "license_verified_at",
54
+ "transferable": false,
55
+ "default": 0,
56
+ "section": "section_non_ui"
57
+ },
58
  {
59
  "key": "license_expires_at",
60
  "transferable": false,
80
  "section": "section_non_ui"
81
  },
82
  {
83
+ "key": "is_shield_central",
84
  "transferable": false,
85
  "default": false,
86
  "section": "section_non_ui"
96
  "transferable": false,
97
  "default": 0,
98
  "section": "section_non_ui"
99
+ },
100
+ {
101
+ "key": "keyless_request_hash",
102
+ "transferable": false,
103
+ "default": "",
104
+ "section": "section_non_ui"
105
+ },
106
+ {
107
+ "key": "keyless_request_at",
108
+ "transferable": false,
109
+ "default": 0,
110
+ "section": "section_non_ui"
111
  }
112
  ],
113
  "definitions": {
116
  "license_item_id": "6047",
117
  "license_item_name_sc": "Shield Security Pro (via Shield Central)",
118
  "license_item_id_sc": "968",
119
+ "lic_verify_expire_days": 3,
120
+ "lic_verify_expire_grace_days": 1,
121
  "license_key_length": 32,
122
+ "license_key_type": "alphanumeric",
123
+ "keyless": true,
124
+ "keyless_handshake_expire": 15
125
  }
126
  }
src/config/feature-plugin.php CHANGED
@@ -17,6 +17,7 @@
17
  "id": "override-forceoff",
18
  "schedule": "conditions",
19
  "valid_admin": true,
 
20
  "type": "error"
21
  },
22
  "plugin-update-available": {
17
  "id": "override-forceoff",
18
  "schedule": "conditions",
19
  "valid_admin": true,
20
+ "can_dismiss": false,
21
  "type": "error"
22
  },
23
  "plugin-update-available": {
src/config/feature-user_management.php CHANGED
@@ -23,6 +23,18 @@
23
  "Recommendation - Use of this feature is highly recommend."
24
  ]
25
  },
 
 
 
 
 
 
 
 
 
 
 
 
26
  {
27
  "slug": "section_admin_login_notification",
28
  "title": "Admin Login Notification",
@@ -114,6 +126,102 @@
114
  "summary": "Limit Simultaneous Sessions For The Same Username",
115
  "description": "The number provided here is the maximum number of simultaneous, distinct, sessions allowed for any given username. Use '0' for no limits."
116
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  {
118
  "key": "autoadd_sessions_started_at",
119
  "transferable": false,
@@ -121,5 +229,7 @@
121
  }
122
  ],
123
  "definitions": {
 
 
124
  }
125
  }
23
  "Recommendation - Use of this feature is highly recommend."
24
  ]
25
  },
26
+ {
27
+ "slug": "section_passwords",
28
+ "reqs" : {
29
+ "php_min": "5.4"
30
+ },
31
+ "title": "Password Policies",
32
+ "title_short": "Password Policies",
33
+ "summary": [
34
+ "Purpose - Have full control over passwords used by users on the site.",
35
+ "Recommendation - Use of this feature is highly recommend."
36
+ ]
37
+ },
38
  {
39
  "slug": "section_admin_login_notification",
40
  "title": "Admin Login Notification",
126
  "summary": "Limit Simultaneous Sessions For The Same Username",
127
  "description": "The number provided here is the maximum number of simultaneous, distinct, sessions allowed for any given username. Use '0' for no limits."
128
  },
129
+ {
130
+ "key": "enable_password_policies",
131
+ "section": "section_passwords",
132
+ "type": "checkbox",
133
+ "default": "N",
134
+ "link_info": "http://icwp.io/c4",
135
+ "link_blog": "",
136
+ "name": "Enable Password Policies",
137
+ "summary": "Enable The Password Policies Below",
138
+ "description": "Turn on/off all password policies."
139
+ },
140
+ {
141
+ "key": "pass_prevent_pwned",
142
+ "section": "section_passwords",
143
+ "type": "checkbox",
144
+ "default": "Y",
145
+ "link_info": "http://icwp.io/by",
146
+ "link_blog": "",
147
+ "name": "Prevent Pwned Passwords",
148
+ "summary": "Prevent Use Of Pwned Passwords",
149
+ "description": "Prevents users from using any passwords found on the public available list of pwned passwords."
150
+ },
151
+ {
152
+ "key": "pass_min_length",
153
+ "premium": true,
154
+ "section": "section_passwords",
155
+ "premium": true,
156
+ "type": "integer",
157
+ "default": "12",
158
+ "link_info": "",
159
+ "link_blog": "",
160
+ "name": "Minimum Length",
161
+ "summary": "Minimum Password Length",
162
+ "description": "All passwords that a user sets must be at least this many characters in length."
163
+ },
164
+ {
165
+ "key": "pass_min_strength",
166
+ "premium": true,
167
+ "section": "section_passwords",
168
+ "premium": true,
169
+ "type": "select",
170
+ "default": "4",
171
+ "value_options": [
172
+ {
173
+ "value_key": "0",
174
+ "text": "Very Weak"
175
+ },
176
+ {
177
+ "value_key": "1",
178
+ "text": "Weak"
179
+ },
180
+ {
181
+ "value_key": "2",
182
+ "text": "Medium"
183
+ },
184
+ {
185
+ "value_key": "3",
186
+ "text": "Strong"
187
+ },
188
+ {
189
+ "value_key": "4",
190
+ "text": "Very Strong"
191
+ }
192
+ ],
193
+ "link_info": "",
194
+ "link_blog": "",
195
+ "name": "Minimum Strength",
196
+ "summary": "Minimum Password Strength",
197
+ "description": "All passwords that a user sets must meet this minimum strength."
198
+ },
199
+ {
200
+ "key": "pass_force_existing",
201
+ "premium": true,
202
+ "section": "section_passwords",
203
+ "premium": true,
204
+ "type": "checkbox",
205
+ "default": "N",
206
+ "link_info": "",
207
+ "link_blog": "",
208
+ "name": "Apply To Existing Users",
209
+ "summary": "Apply Password Policies To Existing Users and Their Passwords",
210
+ "description": "Forces existing users to update their passwords if they don't meet requirements, after they next login ."
211
+ },
212
+ {
213
+ "key": "pass_expire",
214
+ "premium": true,
215
+ "section": "section_passwords",
216
+ "premium": true,
217
+ "type": "integer",
218
+ "default": "60",
219
+ "link_info": "",
220
+ "link_blog": "",
221
+ "name": "Password Expiration",
222
+ "summary": "Passwords Expire After This Many Days",
223
+ "description": "Users will be forced to reset their passwords after the number of days specified."
224
+ },
225
  {
226
  "key": "autoadd_sessions_started_at",
227
  "transferable": false,
229
  }
230
  ],
231
  "definitions": {
232
+ "pwned_api_url_password_single": "https://api.pwnedpasswords.com/pwnedpassword/",
233
+ "pwned_api_url_password_range": "https://api.pwnedpasswords.com/range/"
234
  }
235
  }
src/features/admin_access_restriction.php CHANGED
@@ -17,64 +17,106 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
17
  return parent::isReadyToExecute() && $this->hasAccessKey() && !$this->isVisitorWhitelisted();
18
  }
19
 
20
- protected function adminAjaxHandlers() {
21
- parent::adminAjaxHandlers();
22
- add_action( 'wp_ajax_icwp_wpsf_LoadAdminAccessForm', array( $this, 'ajaxLoadAdminAccessForm' ) );
23
- add_action( $this->prefixWpAjax( 'AdminAccessLogin' ), array( $this, 'ajaxAdminAccessLogin' ) );
24
- add_action( $this->prefixWpAjax( 'RestrictedAccessKey' ), array( $this, 'ajaxRestrictedAccessKey' ) );
25
- }
26
-
27
- public function ajaxLoadAdminAccessForm() {
28
- $bSuccess = $this->checkAjaxNonce();
29
- if ( $bSuccess ) {
30
- $sResponseData = array();
31
- $sResponseData[ 'html' ] = $this->renderAdminAccessAjaxLoginForm();
32
- $this->sendAjaxResponse( true, $sResponseData );
 
 
 
 
 
 
 
 
 
 
33
  }
 
34
  }
35
 
36
  /**
37
- * @param string $sMessage
38
- * @return string
39
  */
40
- protected function renderAdminAccessAjaxLoginForm( $sMessage = '' ) {
41
- $aData = $this->getBaseAjaxActionRenderData( 'AdminAccessLogin' );
42
- $aData[ 'admin_access_message' ] = empty( $sMessage ) ? _wpsf__( 'Enter your Security Admin Access Key' ) : $sMessage;
43
- return $this->renderTemplate( 'snippets/admin_access_login', $aData );
44
- }
45
 
46
- public function ajaxAdminAccessLogin() {
47
 
48
- if ( $this->isValidAjaxRequestForModule() ) {
49
- $sResponseData = array();
50
- $bSuccess = $this->checkAdminAccessKeySubmission();
51
- if ( $bSuccess ) {
52
- $bSuccess = $this->setPermissionToSubmit( true );
53
- if ( $bSuccess ) {
54
- $sResponseData[ 'html' ] = _wpsf__( 'Security Admin Access Key Accepted.' ).' '._wpsf__( 'Please wait' ).' ...';
55
- }
56
- else {
57
- $sResponseData[ 'html' ] = _wpsf__( 'Failed to process key - you may need to re-login to WordPress.' );
58
- }
59
  }
60
  else {
61
- $sResponseData[ 'html' ] = $this->renderAdminAccessAjaxLoginForm( _wpsf__( 'Error - Invalid Key' ) );
62
  }
63
- $this->sendAjaxResponse( $bSuccess, $sResponseData );
64
  }
 
 
 
 
 
65
  }
66
 
67
- public function ajaxRestrictedAccessKey() {
68
- $sResponseData = array();
69
- $bSuccess = $this->checkAdminAccessKeySubmission();
70
- if ( $bSuccess ) {
71
- $this->setPermissionToSubmit( true );
72
- $sResponseData[ 'html' ] = _wpsf__( 'Security Admin Access Key Accepted.' ).' '._wpsf__( 'Please wait' ).' ...';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  }
74
  else {
75
- $sResponseData[ 'html' ] = $this->renderAdminAccessAjaxLoginForm( _wpsf__( 'Error - Invalid Key' ) );
76
  }
77
- $this->sendAjaxResponse( $bSuccess, $sResponseData );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
 
80
  /**
@@ -267,6 +309,39 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
267
  return !empty( $sKey ) && ( $this->getAccessKeyHash() === md5( $sKey ) );
268
  }
269
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  /**
271
  * @param string $sKey
272
  * @return $this
@@ -324,6 +399,16 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
324
  $sTitleShort = _wpsf__( 'Access Restriction Zones' );
325
  break;
326
 
 
 
 
 
 
 
 
 
 
 
327
  default:
328
  throw new Exception( sprintf( 'A section slug was defined but with no associated strings. Slug: "%s".', $sSectionSlug ) );
329
  }
@@ -408,6 +493,42 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
408
  );
409
  break;
410
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
411
  default:
412
  throw new Exception( sprintf( 'An option has been defined but without strings assigned to it. Option key: "%s".', $sKey ) );
413
  }
17
  return parent::isReadyToExecute() && $this->hasAccessKey() && !$this->isVisitorWhitelisted();
18
  }
19
 
20
+ /**
21
+ * @param array $aAjaxResponse
22
+ * @return array
23
+ */
24
+ public function handleAuthAjax( $aAjaxResponse ) {
25
+
26
+ if ( empty( $aAjaxResponse ) ) {
27
+ switch ( $this->loadDP()->request( 'exec' ) ) {
28
+
29
+ case 'sec_admin_login':
30
+ case 'restricted_access':
31
+ $aAjaxResponse = $this->ajaxExec_SecAdminLogin();
32
+ break;
33
+
34
+ case 'sec_admin_login_box':
35
+ $aAjaxResponse = $this->ajaxExec_SecAdminLoginBox();
36
+ break;
37
+
38
+ break;
39
+
40
+ default:
41
+ break;
42
+ }
43
  }
44
+ return parent::handleAuthAjax( $aAjaxResponse );
45
  }
46
 
47
  /**
48
+ * @return array
 
49
  */
50
+ protected function ajaxExec_SecAdminLogin() {
51
+ $aResponse = array();
 
 
 
52
 
53
+ if ( $this->checkAdminAccessKeySubmission() ) {
54
 
55
+ if ( $this->setPermissionToSubmit( true ) ) {
56
+ $aResponse[ 'success' ] = true;
57
+ $aResponse[ 'html' ] = _wpsf__( 'Security Admin Access Key Accepted.' )
58
+ .' '._wpsf__( 'Please wait' ).' ...';
 
 
 
 
 
 
 
59
  }
60
  else {
61
+ $aResponse[ 'html' ] = _wpsf__( 'Failed to process key - you may need to re-login to WordPress.' );
62
  }
 
63
  }
64
+ else {
65
+ $aResponse[ 'html' ] = $this->renderAdminAccessAjaxLoginForm( _wpsf__( 'Error - Invalid Key' ) );
66
+ }
67
+
68
+ return $aResponse;
69
  }
70
 
71
+ /**
72
+ * @return array
73
+ */
74
+ protected function ajaxExec_SecAdminLoginBox() {
75
+ return array(
76
+ 'success' => 'true',
77
+ 'html' => $this->renderAdminAccessAjaxLoginForm()
78
+ );
79
+ }
80
+
81
+ /**
82
+ * @return array
83
+ */
84
+ protected function ajaxExec_RestrictedAccess() {
85
+ $aResponse = array();
86
+
87
+ if ( $this->checkAdminAccessKeySubmission() ) {
88
+
89
+ if ( $this->setPermissionToSubmit( true ) ) {
90
+ $aResponse[ 'success' ] = true;
91
+ $aResponse[ 'html' ] = _wpsf__( 'Security Admin Access Key Accepted.' )
92
+ .' '._wpsf__( 'Please wait' ).' ...';
93
+ }
94
+ else {
95
+ $aResponse[ 'html' ] = _wpsf__( 'Failed to process key - you may need to re-login to WordPress.' );
96
+ }
97
  }
98
  else {
99
+ $aResponse[ 'html' ] = $this->renderAdminAccessAjaxLoginForm( _wpsf__( 'Error - Invalid Key' ) );
100
  }
101
+
102
+ return $aResponse;
103
+ }
104
+
105
+ /**
106
+ * @param string $sMessage
107
+ * @return string
108
+ */
109
+ protected function renderAdminAccessAjaxLoginForm( $sMessage = '' ) {
110
+
111
+ $aData = array(
112
+ 'ajax' => array(
113
+ 'sec_admin_login' => json_encode( $this->getSecAdminLoginAjaxData() )
114
+ ),
115
+ 'strings' => array(
116
+ 'access_message' => empty( $sMessage ) ? _wpsf__( 'Enter your Security Admin Access Key' ) : $sMessage
117
+ )
118
+ );
119
+ return $this->renderTemplate( 'snippets/admin_access_login', $aData );
120
  }
121
 
122
  /**
309
  return !empty( $sKey ) && ( $this->getAccessKeyHash() === md5( $sKey ) );
310
  }
311
 
312
+ /**
313
+ * @return array
314
+ */
315
+ public function getWhitelabelOptions() {
316
+ $sMain = $this->getOpt( 'wl_namemain' );
317
+ $sMenu = $this->getOpt( 'wl_namemenu' );
318
+ if ( empty( $sMenu ) ) {
319
+ $sMenu = $sMain;
320
+ }
321
+
322
+ return array(
323
+ 'name_main' => $sMain,
324
+ 'name_menu' => $sMenu,
325
+ 'description' => $this->getOpt( 'wl_description' ),
326
+ 'url_home' => $this->getOpt( 'wl_homeurl' ),
327
+ 'url_icon' => $this->getOpt( 'wl_iconurl' ),
328
+ );
329
+ }
330
+
331
+ /**
332
+ * @return bool
333
+ */
334
+ public function isWlEnabled() {
335
+ return $this->getOptIs( 'whitelabel_enable', 'Y' ) && $this->isPremium();
336
+ }
337
+
338
+ /**
339
+ * @return bool
340
+ */
341
+ public function isWlHideUpdates() {
342
+ return $this->isWlEnabled() && $this->getOptIs( 'wl_hide_updates', 'Y' );
343
+ }
344
+
345
  /**
346
  * @param string $sKey
347
  * @return $this
399
  $sTitleShort = _wpsf__( 'Access Restriction Zones' );
400
  break;
401
 
402
+ case 'section_whitelabel' :
403
+ $sTitle = _wpsf__( 'Shield White Label' );
404
+ $aSummary = array(
405
+ sprintf( _wpsf__( 'Purpose - %s' ),
406
+ sprintf( _wpsf__( 'Rename and re-brand the %s plugin for your client site installations.' ),
407
+ $this->getConn()->getHumanName() ) ),
408
+ );
409
+ $sTitleShort = _wpsf__( 'White Label' );
410
+ break;
411
+
412
  default:
413
  throw new Exception( sprintf( 'A section slug was defined but with no associated strings. Slug: "%s".', $sSectionSlug ) );
414
  }
493
  );
494
  break;
495
 
496
+ case 'whitelabel_enable' :
497
+ $sName = sprintf( '%s: %s', _wpsf__( 'Enable' ), _wpsf__( 'White Label' ) );
498
+ $sSummary = _wpsf__( 'Activate Your White Label Settings' );
499
+ $sDescription = _wpsf__( 'Turn on/off the application of your White Label settings.' );
500
+ break;
501
+ case 'wl_hide_updates' :
502
+ $sName = _wpsf__( 'Hide Updates' );
503
+ $sSummary = _wpsf__( 'Hide Plugin Updates From Non-Security Admins' );
504
+ $sDescription = _wpsf__( 'Do not show the availability of updates to non-security administrators.' );
505
+ break;
506
+ case 'wl_namemain' :
507
+ $sName = _wpsf__( 'Plugin Name' );
508
+ $sSummary = _wpsf__( 'The Name Of The Plugin' );
509
+ $sDescription = _wpsf__( 'The name of the plugin that will be displayed to your site users.' );
510
+ break;
511
+ case 'wl_namemenu' :
512
+ $sName = _wpsf__( 'Menu Title' );
513
+ $sSummary = _wpsf__( 'The Main Menu Title Of The Plugin' );
514
+ $sDescription = sprintf( _wpsf__( 'The Main Menu Title Of The Plugin. If left empty, the "%s" will be used.' ), _wpsf__( 'Plugin Name' ) );
515
+ break;
516
+ case 'wl_description' :
517
+ $sName = _wpsf__( 'Description' );
518
+ $sSummary = _wpsf__( 'The Description Of The Plugin' );
519
+ $sDescription = _wpsf__( 'The description of the plugin displayed on the plugins page.' );
520
+ break;
521
+ case 'wl_homeurl' :
522
+ $sName = _wpsf__( 'Home URL' );
523
+ $sSummary = _wpsf__( 'Plugin Home Page URL' );
524
+ $sDescription = _wpsf__( "When a user clicks the home link for this plugin, this is where they'll be directed." );
525
+ break;
526
+ case 'wl_iconurl' :
527
+ $sName = _wpsf__( 'Icon URL' );
528
+ $sSummary = _wpsf__( 'Plugin Icon URL' );
529
+ $sDescription = _wpsf__( 'The URL of the icon displayed in the menu and in the admin pages.' );
530
+ break;
531
+
532
  default:
533
  throw new Exception( sprintf( 'An option has been defined but without strings assigned to it. Option key: "%s".', $sKey ) );
534
  }
src/features/audit_trail.php CHANGED
@@ -22,15 +22,35 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
22
  }
23
  }
24
 
25
- protected function adminAjaxHandlers() {
26
- parent::adminAjaxHandlers();
27
- add_action( $this->prefixWpAjax( 'AuditTable' ), array( $this, 'ajaxAuditTable' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
 
30
- public function ajaxAuditTable() {
 
31
  $aParams = array_intersect_key( $_POST, array_flip( array( 'paged', 'order', 'orderby' ) ) );
32
- $sContext = $this->loadDP()->FetchPost( 'auditcontext' );
33
- $this->sendAjaxResponse( true, array( 'tablecontent' => $this->renderTableForContext( $sContext, $aParams ) ) );
 
 
34
  }
35
 
36
  /**
@@ -40,7 +60,7 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
40
  protected function getTableRendererForContext( $sContext ) {
41
  $this->requireCommonLib( 'Components/Tables/AuditTrailTable.php' );
42
  /** @var ICWP_WPSF_Processor_AuditTrail $oAuditTrail */
43
- $oAuditTrail = $this->loadFeatureProcessor();
44
  $nCount = $oAuditTrail->countAuditEntriesForContext( $sContext );
45
 
46
  $oTable = new AuditTrailTable();
@@ -74,7 +94,7 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
74
  $nPage = (int)$aParams[ 'paged' ];
75
 
76
  /** @var ICWP_WPSF_Processor_AuditTrail $oAuditTrail */
77
- $oAuditTrail = $this->loadFeatureProcessor();
78
  $aEntries = $oAuditTrail->getAuditEntriesForContext(
79
  $sContext,
80
  $aParams[ 'orderby' ],
@@ -158,13 +178,13 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
158
  $aAuditTables[ $sContext ] = $this->renderTableForContext( $sContext );
159
  }
160
 
161
- return array_merge(
162
- array(
163
- 'aAuditTables' => $aAuditTables,
164
- 'aContexts' => $aContexts,
165
- 'sTitle' => _wpsf__( 'Audit Trail Viewer' ),
166
- ),
167
- $this->getBaseAjaxActionRenderData( 'AuditTable' )
168
  );
169
  }
170
 
22
  }
23
  }
24
 
25
+ /**
26
+ * @param array $aAjaxResponse
27
+ * @return array
28
+ */
29
+ public function handleAuthAjax( $aAjaxResponse ) {
30
+
31
+ if ( empty( $aAjaxResponse ) ) {
32
+ switch ( $this->loadDP()->request( 'exec' ) ) {
33
+
34
+ case 'render_audit_table':
35
+ $aAjaxResponse = $this->ajaxExec_RenderAuditTable();
36
+ break;
37
+
38
+ break;
39
+
40
+ default:
41
+ break;
42
+ }
43
+ }
44
+ return parent::handleAuthAjax( $aAjaxResponse );
45
  }
46
 
47
+ public function ajaxExec_RenderAuditTable() {
48
+ $sContext = $this->loadDP()->post( 'auditcontext' );
49
  $aParams = array_intersect_key( $_POST, array_flip( array( 'paged', 'order', 'orderby' ) ) );
50
+ return array(
51
+ 'success' => true,
52
+ 'html' => $this->renderTableForContext( $sContext, $aParams )
53
+ );
54
  }
55
 
56
  /**
60
  protected function getTableRendererForContext( $sContext ) {
61
  $this->requireCommonLib( 'Components/Tables/AuditTrailTable.php' );
62
  /** @var ICWP_WPSF_Processor_AuditTrail $oAuditTrail */
63
+ $oAuditTrail = $this->loadProcessor();
64
  $nCount = $oAuditTrail->countAuditEntriesForContext( $sContext );
65
 
66
  $oTable = new AuditTrailTable();
94
  $nPage = (int)$aParams[ 'paged' ];
95
 
96
  /** @var ICWP_WPSF_Processor_AuditTrail $oAuditTrail */
97
+ $oAuditTrail = $this->loadProcessor();
98
  $aEntries = $oAuditTrail->getAuditEntriesForContext(
99
  $sContext,
100
  $aParams[ 'orderby' ],
178
  $aAuditTables[ $sContext ] = $this->renderTableForContext( $sContext );
179
  }
180
 
181
+ return array(
182
+ 'aAuditTables' => $aAuditTables,
183
+ 'aContexts' => $aContexts,
184
+ 'sTitle' => _wpsf__( 'Audit Trail Viewer' ),
185
+ 'ajax' => array(
186
+ 'render_audit_table' => $this->getAjaxActionData( 'render_audit_table', true )
187
+ )
188
  );
189
  }
190
 
src/features/autoupdates.php CHANGED
@@ -95,39 +95,56 @@ class ICWP_WPSF_FeatureHandler_Autoupdates extends ICWP_WPSF_FeatureHandler_Base
95
  return in_array( $sPluginFile, $this->getAutoupdatePlugins() );
96
  }
97
 
98
- protected function adminAjaxHandlers() {
99
- parent::adminAjaxHandlers();
100
- if ( $this->isAutoupdateIndividualPlugins() && $this->getConn()->getIsValidAdminArea() ) {
101
- add_action( 'wp_ajax_icwp_wpsf_TogglePluginAutoupdate', array( $this, 'ajaxTogglePluginAutoupdate' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  }
 
103
  }
104
 
105
- public function ajaxTogglePluginAutoupdate() {
 
 
 
106
 
107
  $bSuccess = false;
108
- if ( $this->checkAjaxNonce() ) {
109
-
110
- $oWpPlugins = $this->loadWpPlugins();
111
- $sFile = $this->loadDataProcessor()->FetchPost( 'pluginfile' );
112
- if ( $oWpPlugins->isInstalled( $sFile ) ) {
113
- $this->setPluginToAutoUpdate( $sFile );
114
-
115
- $aPlugin = $oWpPlugins->getPlugin( $sFile );
116
- $sMessage = sprintf( _wpsf__( 'Plugin "%s" will %s.' ),
117
- $aPlugin[ 'Name' ],
118
- $this->loadWp()
119
- ->getIsPluginAutomaticallyUpdated( $sFile ) ? _wpsf__( 'update automatically' ) : _wpsf__( 'not update automatically' )
120
- );
121
- $bSuccess = true;
122
- }
123
- else {
124
- $sMessage = _wpsf__( 'Failed to change the update status of the plugin.' );
125
- }
126
  }
127
  else {
128
- $sMessage = _wpsf__( 'Nonce security checking failed. Please reload.' );
129
  }
130
- $this->sendAjaxResponse( $bSuccess, array( 'message' => $sMessage ) );
 
 
 
 
131
  }
132
 
133
  /**
95
  return in_array( $sPluginFile, $this->getAutoupdatePlugins() );
96
  }
97
 
98
+ /**
99
+ * @param array $aAjaxResponse
100
+ * @return array
101
+ */
102
+ public function handleAuthAjax( $aAjaxResponse ) {
103
+
104
+ if ( empty( $aAjaxResponse ) ) {
105
+ switch ( $this->loadDP()->request( 'exec' ) ) {
106
+
107
+ case 'toggle_plugin_autoupdate':
108
+ if ( $this->isAutoupdateIndividualPlugins() && $this->getConn()->getIsValidAdminArea() ) {
109
+ $aAjaxResponse = $this->ajaxExec_TogglePluginAutoupdate();
110
+ }
111
+ break;
112
+
113
+ default:
114
+ break;
115
+ }
116
  }
117
+ return parent::handleAuthAjax( $aAjaxResponse );
118
  }
119
 
120
+ /**
121
+ * @return array
122
+ */
123
+ public function ajaxExec_TogglePluginAutoupdate() {
124
 
125
  $bSuccess = false;
126
+
127
+ $oWpPlugins = $this->loadWpPlugins();
128
+ $sFile = $this->loadDP()->post( 'pluginfile' );
129
+ if ( $oWpPlugins->isInstalled( $sFile ) ) {
130
+ $this->setPluginToAutoUpdate( $sFile );
131
+
132
+ $aPlugin = $oWpPlugins->getPlugin( $sFile );
133
+ $sMessage = sprintf( _wpsf__( 'Plugin "%s" will %s.' ),
134
+ $aPlugin[ 'Name' ],
135
+ $this->loadWp()
136
+ ->getIsPluginAutomaticallyUpdated( $sFile ) ? _wpsf__( 'update automatically' ) : _wpsf__( 'not update automatically' )
137
+ );
138
+ $bSuccess = true;
 
 
 
 
 
139
  }
140
  else {
141
+ $sMessage = _wpsf__( 'Failed to change the update status of the plugin.' );
142
  }
143
+
144
+ return array(
145
+ 'success' => $bSuccess,
146
+ 'message' => $sMessage,
147
+ );
148
  }
149
 
150
  /**
src/features/base.php CHANGED
@@ -109,9 +109,14 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
109
  add_action( $this->prefix( 'run_processors' ), array( $this, 'onRunProcessors' ), $nRunPriority );
110
  add_action( 'init', array( $this, 'onWpInit' ), 1 );
111
  add_action( $this->prefix( 'import_options' ), array( $this, 'processImportOptions' ) );
112
- if ( $this->isThisModuleRequest() ) {
113
- add_action( $this->prefix( 'form_submit' ), array( $this, 'handleFormSubmit' ) );
 
 
 
 
114
  }
 
115
  add_filter( $this->prefix( 'filter_plugin_submenu_items' ), array( $this, 'filter_addPluginSubMenuItem' ) );
116
  add_filter( $this->prefix( 'get_feature_summary_data' ), array( $this, 'filter_getFeatureSummaryData' ) );
117
  add_action( $this->prefix( 'plugin_shutdown' ), array( $this, 'action_doFeatureShutdown' ) );
@@ -127,6 +132,78 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
127
  }
128
  }
129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  /**
131
  * @param array $aAdminNotices
132
  * @return array
@@ -252,14 +329,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
252
  public function onWpInit() {
253
  $this->runWizards();
254
  $this->updateHandler();
255
- $this->setupAjaxHandlers();
256
  }
257
 
258
  /**
259
  * Override this and adapt per feature
260
  * @return ICWP_WPSF_Processor_Base
261
  */
262
- protected function loadFeatureProcessor() {
263
  if ( !isset( $this->oProcessor ) ) {
264
  include_once( self::getConn()
265
  ->getPath_SourceFile( sprintf( 'processors/%s.php', $this->getFeatureSlug() ) ) );
@@ -355,7 +431,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
355
  * @return ICWP_WPSF_Processor_Base
356
  */
357
  public function getProcessor() {
358
- return $this->loadFeatureProcessor();
359
  }
360
 
361
  /**
@@ -678,7 +754,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
678
  * @param array|string $mErrors
679
  * @return $this
680
  */
681
- public function setLastErrors( $mErrors ) {
682
  if ( !is_array( $mErrors ) ) {
683
  if ( is_string( $mErrors ) ) {
684
  $mErrors = array( $mErrors );
@@ -713,42 +789,11 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
713
  }
714
  }
715
 
716
- protected function setupAjaxHandlers() {
717
- $bAdminRun = false;
718
-
719
- if ( $this->isValidAjaxRequestForModule() ) { // TODO replicate all this for the backend
720
- $this->frontEndAjaxHandlers();
721
- $this->adminAjaxHandlers();
722
- $bAdminRun = true;
723
- // $this->sendAjaxResponse( false, array( 'message' => 'Failed Ajax Nonce' ) );
724
- }
725
-
726
- if ( !$bAdminRun && $this->loadWp()->isAjax() ) { //TODO: isValidAjaxRequest()
727
- if ( is_admin() || is_network_admin() ) {
728
- $this->adminAjaxHandlers();
729
- }
730
- }
731
- }
732
-
733
  /**
734
- * A valid Ajax request must have all the icwp items as posted with getBaseAjaxActionRenderData()
735
- * Note: Also performs nonce checking
736
  * @return bool
737
  */
738
- protected function isValidAjaxRequestForModule() {
739
- $oDp = $this->loadDP();
740
-
741
- $bValid = $this->loadWp()->isAjax()
742
- && ( $this->getModSlug() == $oDp->post( 'icwp_action_module', '' ) );
743
- if ( $bValid ) {
744
- $aItems = array_keys( $this->getBaseAjaxActionRenderData() );
745
- foreach ( $aItems as $sKey ) {
746
- if ( strpos( $sKey, 'icwp_' ) === 0 ) {
747
- $bValid = $bValid && ( strlen( $oDp->post( $sKey, '' ) ) > 0 );
748
- }
749
- }
750
- }
751
- return $bValid && $this->checkNonceAction( $oDp->post( 'icwp_nonce' ), $oDp->post( 'icwp_nonce_action' ) );
752
  }
753
 
754
  /**
@@ -756,46 +801,23 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
756
  * @param bool $bAsJsonEncodedObject
757
  * @return array
758
  */
759
- public function getBaseAjaxActionRenderData( $sAction = '', $bAsJsonEncodedObject = false ) {
760
  $aData = array(
761
- 'action' => $this->prefix( $sAction ), //wp ajax doesn't work without this.
762
- 'icwp_ajax_action' => $this->prefix( $sAction ),
763
- 'icwp_nonce' => $this->genNonce( $sAction ),
764
- 'icwp_nonce_action' => $sAction,
765
- 'icwp_action_module' => $this->getModSlug(),
766
- 'ajaxurl' => admin_url( 'admin-ajax.php' ),
767
  );
768
  return $bAsJsonEncodedObject ? json_encode( (object)$aData ) : $aData;
769
  }
770
 
771
- protected function adminAjaxHandlers() {
772
- add_action( 'wp_ajax_icwp_OptionsFormSave', array( $this, 'ajaxOptionsFormSave' ) );
773
-
774
- // TODO: move this to the wizard handler itself
775
- if ( $this->canRunWizards() && $this->hasWizard() ) {
776
- $oWiz = $this->getWizardHandler();
777
- if ( !is_null( $oWiz ) ) {
778
- add_action( $this->prefixWpAjax( 'WizardProcessStepSubmit' ), array(
779
- $oWiz,
780
- 'ajaxWizardProcessStepSubmit'
781
- ) );
782
- add_action( $this->prefixWpAjax( 'WizardRenderStep' ), array(
783
- $oWiz,
784
- 'ajaxWizardRenderStep'
785
- ) );
786
- }
787
- }
788
- }
789
-
790
- protected function frontEndAjaxHandlers() {
791
- }
792
-
793
  /**
794
  * @param string $sAction
795
  * @return string
796
  */
797
- protected function genNonce( $sAction = '' ) {
798
- return wp_create_nonce( $this->prefix( $sAction ) );
799
  }
800
 
801
  /**
@@ -803,33 +825,10 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
803
  * @param string $sAction
804
  * @return bool
805
  */
806
- protected function checkNonceAction( $sNonce, $sAction = '' ) {
807
  return wp_verify_nonce( $sNonce, $this->prefix( $sAction ) );
808
  }
809
 
810
- /**
811
- * Will send ajax error response immediately upon failure
812
- * @return bool
813
- */
814
- protected function checkAjaxNonce() {
815
-
816
- $sNonce = $this->loadDataProcessor()->FetchRequest( '_ajax_nonce', '' );
817
- if ( empty( $sNonce ) ) {
818
- $sMessage = $this->getTranslatedString( 'nonce_failed_empty', 'Nonce security checking failed - the nonce value was empty.' );
819
- }
820
- else if ( wp_verify_nonce( $sNonce, 'icwp_ajax' ) === false ) {
821
- $sMessage = $this->getTranslatedString( 'nonce_failed_supplied', 'Nonce security checking failed - the nonce supplied was "%s".' );
822
- $sMessage = sprintf( $sMessage, $sNonce );
823
- }
824
- else {
825
- return true; // At this stage we passed the nonce check
826
- }
827
-
828
- // At this stage we haven't returned after success so we failed the nonce check
829
- $this->sendAjaxResponse( false, array( 'message' => $sMessage ) );
830
- return false; //unreachable
831
- }
832
-
833
  /**
834
  * @return bool
835
  */
@@ -861,14 +860,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
861
  return $this->oWizard;
862
  }
863
 
864
- /**
865
- * @param $bSuccess
866
- * @param array $aData
867
- */
868
- public function sendAjaxResponse( $bSuccess, $aData = array() ) {
869
- $bSuccess ? wp_send_json_success( $aData ) : wp_send_json_error( $aData );
870
- }
871
-
872
  /**
873
  * Saves the options to the WordPress Options store.
874
  * It will also update the stored plugin options version.
@@ -952,12 +943,21 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
952
  $aWarnings,
953
  $this->getSectionWarnings( $aSection[ 'slug' ] )
954
  );
 
955
  }
956
  }
957
 
958
  return $aOptions;
959
  }
960
 
 
 
 
 
 
 
 
 
961
  /**
962
  * @param string $sSectionSlug
963
  * @return array
@@ -1077,19 +1077,18 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1077
  return implode( self::CollateSeparator, $aToJoin );
1078
  }
1079
 
1080
- public function ajaxOptionsFormSave() {
1081
-
1082
- if ( $this->getModSlug() != $this->loadDP()->post( 'mod_slug' ) ) {
1083
- return;
1084
- }
1085
 
1086
  $oCon = self::getConn();
1087
  $bSuccess = false;
1088
  $sName = $oCon->getHumanName();
1089
  $sMessage = sprintf( _wpsf__( 'Failed up to update %s plugin options.' ), $sName );
1090
 
1091
- if ( $oCon->getIsValidAdminArea() && $this->isThisModuleRequest() ) {
1092
- $bSuccess = $this->handleFormSubmit();
1093
  if ( $bSuccess ) {
1094
  $sMessage = sprintf( _wpsf__( '%s Plugin options updated successfully.' ), $sName );
1095
  }
@@ -1098,23 +1097,26 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1098
  $sMessage = sprintf( _wpsf__( 'Failed to update %s options as you are not authenticated with %s as a Security Admin.' ), $sName, $sName );
1099
  }
1100
 
1101
- $this->sendAjaxResponse(
1102
- $bSuccess,
1103
- array(
1104
- 'options_form' => $this->renderOptionsForm(),
1105
- 'message' => $sMessage
1106
- )
 
 
 
 
1107
  );
1108
  }
1109
 
1110
  /**
1111
  * @return bool
1112
  */
1113
- public function handleFormSubmit() {
1114
  $bVerified = $this->verifyFormSubmit();
1115
  if ( $bVerified ) {
1116
- $this->doSaveStandardOptions();
1117
- $this->doExtraSubmitProcessing();
1118
  $this->setSaveUserResponse();
1119
  }
1120
  return $bVerified;
@@ -1123,8 +1125,17 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1123
  /**
1124
  * @return bool
1125
  */
1126
- protected function isThisModuleRequest() {
1127
- return ( $this->loadDP()->FetchRequest( 'mod_slug' ) == $this->prefix( $this->getFeatureSlug() ) );
 
 
 
 
 
 
 
 
 
1128
  }
1129
 
1130
  protected function verifyFormSubmit() {
@@ -1311,18 +1322,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1311
  * @return string
1312
  */
1313
  public function prefix( $sSuffix = '', $sGlue = '-' ) {
1314
- return self::getConn()->doPluginPrefix( $sSuffix, $sGlue );
1315
- }
1316
-
1317
- /**
1318
- * @param string $sSuffix
1319
- * @return string
1320
- */
1321
- public function prefixWpAjax( $sSuffix = '' ) {
1322
- return sprintf( '%s%s',
1323
- 'wp_ajax_',
1324
- $this->prefix( $sSuffix )
1325
- );
1326
  }
1327
 
1328
  /**
@@ -1369,7 +1369,9 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1369
  protected function displayRestrictedPage() {
1370
  $this->display(
1371
  array(
1372
- 'data' => array( 'ajax' => $this->getBaseAjaxActionRenderData( 'RestrictedAccessKey' ) )
 
 
1373
  ),
1374
  'access_restricted.php'
1375
  );
@@ -1379,7 +1381,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1379
  * @param bool $bRenderEmbeddedContent
1380
  * @return array
1381
  */
1382
- protected function getBaseDisplayData( $bRenderEmbeddedContent = true ) {
1383
  $oCon = self::getConn();
1384
  self::$sActivelyDisplayedModuleOptions = $this->getFeatureSlug();
1385
 
@@ -1402,13 +1404,11 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1402
  'width' => 772,
1403
  'height' => 454,
1404
  ),
1405
- 'sAjaxNonce' => wp_create_nonce( 'icwp_ajax' ),
1406
-
1407
- 'aSummaryData' => apply_filters( $this->prefix( 'get_feature_summary_data' ), array() ),
1408
 
1409
  // 'sPageTitle' => sprintf( '%s: %s', $oCon->getHumanName(), $this->getMainFeatureName() ),
1410
- 'sPageTitle' => $this->getMainFeatureName(),
1411
- 'data' => array(
1412
  'form_nonce' => $this->genNonce( '' ),
1413
  'mod_slug' => $this->getModSlug( true ),
1414
  'mod_slug_short' => $this->getModSlug( false ),
@@ -1416,11 +1416,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1416
  'all_options_input' => $this->collateAllFormInputsForAllOptions(),
1417
  'hidden_options' => $this->getOptionsVo()->getHiddenOptions()
1418
  ),
1419
- 'strings' => $this->getDisplayStrings(),
1420
- 'flags' => array(
 
 
 
1421
  'access_restricted' => !$this->canDisplayOptionsForm(),
1422
  'show_ads' => $this->getIsShowMarketing(),
1423
- 'show_summary' => false,
1424
  'wrap_page_content' => true,
1425
  'show_standard_options' => true,
1426
  'show_content_actions' => $this->hasCustomActions(),
@@ -1429,15 +1431,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1429
  'can_wizard' => $this->canRunWizards(),
1430
  'has_wizard' => $this->hasWizard(),
1431
  ),
1432
- 'hrefs' => array(
1433
- 'go_pro' => 'http://icwp.io/shieldgoprofeature',
1434
- 'goprofooter' => 'http://icwp.io/goprofooter',
1435
- 'img_wizard_wand' => $oCon->getPluginUrl_Image( 'wand.png' ),
1436
- 'wizard_link' => $this->getUrl_WizardLanding(),
1437
- 'wizard_landing' => $this->getUrl_WizardLanding(),
1438
- 'primary_wizard' => $this->getUrl_WizardPrimary(),
1439
  ),
1440
- 'content' => array(
1441
  'options_form' => '',
1442
  'alt' => '',
1443
  'actions' => '',
@@ -1447,7 +1447,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1447
  );
1448
 
1449
  if ( $bRenderEmbeddedContent ) { // prevents recursive loops
1450
-
1451
  $aData[ 'content' ] = array(
1452
  'options_form' => 'no form',
1453
  'alt' => '',
@@ -1472,6 +1471,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1472
  'blog' => __( 'Blog' ),
1473
  'save_all_settings' => __( 'Save All Settings' ),
1474
  'see_help_video' => __( 'Watch Help Video' ),
 
1475
  'btn_options' => __( 'Options' ),
1476
  'btn_help' => __( 'Help' ),
1477
  'btn_actions' => $this->hasCustomActions() ? __( 'Actions' ) : __( 'No Actions' ),
@@ -1515,13 +1515,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1515
  return $this->renderTemplate( 'snippets/module-wizard-template.php', $aData );
1516
  }
1517
 
1518
- /**
1519
- * @return string|null
1520
- */
1521
- protected function getPrimaryWizard() {
1522
- return $this->hasWizard() ? key( $this->getWizardDefinitions() ) : null;
1523
- }
1524
-
1525
  /**
1526
  * @uses nonce
1527
  * @param string $sWizardSlug
@@ -1546,14 +1539,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1546
  return $this->getUrl_Wizard( 'landing' );
1547
  }
1548
 
1549
- /**
1550
- * @return string
1551
- */
1552
- protected function getUrl_WizardPrimary() {
1553
- $sPrimary = $this->getPrimaryWizard();
1554
- return $this->getUrl_Wizard( $sPrimary );
1555
- }
1556
-
1557
  /**
1558
  * @return array
1559
  */
@@ -1599,7 +1584,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1599
  // Get the same Base Data as normal display
1600
  return $this->loadRenderer( self::getConn()->getPath_Templates() )
1601
  ->setTemplate( $sTemplate )
1602
- ->setRenderVars( $this->getBaseDisplayData() )
1603
  ->render();
1604
  }
1605
 
@@ -1633,7 +1618,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1633
  $oDp = $this->loadDataProcessor();
1634
 
1635
  // Get Base Data
1636
- $aData = $oDp->mergeArraysRecursive( $this->getBaseDisplayData(), $aData );
1637
  if ( empty( $sSubView ) || !$oRndr->getTemplateExists( $sSubView ) ) {
1638
  $sModuleView = 'feature-'.$this->getFeatureSlug();
1639
  $sSubView = $oRndr->getTemplateExists( $sModuleView ) ? $sModuleView : 'feature-default';
@@ -1663,9 +1648,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1663
  throw new Exception( 'notice_attributes is empty' );
1664
  }
1665
 
1666
- if ( !isset( $aData[ 'icwp_ajax_nonce' ] ) ) {
1667
- $aData[ 'icwp_ajax_nonce' ] = wp_create_nonce( 'icwp_ajax' );
1668
- }
1669
  if ( !isset( $aData[ 'icwp_admin_notice_template' ] ) ) {
1670
  $aData[ 'icwp_admin_notice_template' ] = $aData[ 'notice_attributes' ][ 'notice_id' ];
1671
  }
@@ -1682,7 +1664,12 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1682
  }
1683
  $aData[ 'notice_classes' ] = implode( ' ', $aData[ 'notice_classes' ] );
1684
 
1685
- return $this->renderTemplate( 'notices'.DIRECTORY_SEPARATOR.'admin-notice-template', $aData );
 
 
 
 
 
1686
  }
1687
 
1688
  /**
@@ -1871,4 +1858,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends ICWP_WPSF_Foundation {
1871
  $aOpts[ $sKey ] = $mValue;
1872
  return $this->setOpt( 'help_video_options', $aOpts );
1873
  }
 
 
 
 
 
 
 
 
 
1874
  }
109
  add_action( $this->prefix( 'run_processors' ), array( $this, 'onRunProcessors' ), $nRunPriority );
110
  add_action( 'init', array( $this, 'onWpInit' ), 1 );
111
  add_action( $this->prefix( 'import_options' ), array( $this, 'processImportOptions' ) );
112
+
113
+ if ( $this->isModuleRequest() ) {
114
+ add_action( $this->prefix( 'form_submit' ), array( $this, 'handleOptionsSubmit' ) );
115
+ add_filter( $this->prefix( 'ajaxAction' ), array( $this, 'handleAjax' ) );
116
+ add_filter( $this->prefix( 'ajaxAuthAction' ), array( $this, 'handleAuthAjax' ) );
117
+ add_filter( $this->prefix( 'ajaxNonAuthAction' ), array( $this, 'handleNonAuthAjax' ) );
118
  }
119
+
120
  add_filter( $this->prefix( 'filter_plugin_submenu_items' ), array( $this, 'filter_addPluginSubMenuItem' ) );
121
  add_filter( $this->prefix( 'get_feature_summary_data' ), array( $this, 'filter_getFeatureSummaryData' ) );
122
  add_action( $this->prefix( 'plugin_shutdown' ), array( $this, 'action_doFeatureShutdown' ) );
132
  }
133
  }
134
 
135
+ /**
136
+ * This is ajax for anyone logged-in or not logged-care. Due care must be taken here.
137
+ * @param array $aAjaxResponse
138
+ * @return array
139
+ */
140
+ public function handleAjax( $aAjaxResponse ) {
141
+ return $this->normaliseAjaxResponse( $aAjaxResponse );
142
+ }
143
+
144
+ /**
145
+ * Ajax for any request not logged-in.
146
+ * @param array $aAjaxResponse
147
+ * @return array
148
+ */
149
+ public function handleNonAuthAjax( $aAjaxResponse ) {
150
+ return $this->normaliseAjaxResponse( $aAjaxResponse );
151
+ }
152
+
153
+ /**
154
+ * @param array $aAjaxResponse
155
+ * @return array
156
+ */
157
+ public function handleAuthAjax( $aAjaxResponse ) {
158
+
159
+ if ( empty( $aAjaxResponse ) ) {
160
+ switch ( $this->loadDP()->request( 'exec' ) ) {
161
+
162
+ case 'mod_options':
163
+ $aAjaxResponse = $this->ajaxExec_ModOptions();
164
+ break;
165
+
166
+ case 'wiz_process_step':
167
+ $aAjaxResponse = $this->ajaxExec_ModOptions();
168
+ if ( $this->canRunWizards() && $this->hasWizard() ) {
169
+ $aAjaxResponse = $this->getWizardHandler()
170
+ ->ajaxExec_WizProcessStep();
171
+ }
172
+ break;
173
+
174
+ case 'wiz_render_step':
175
+ if ( $this->canRunWizards() && $this->hasWizard() ) {
176
+ $aAjaxResponse = $this->getWizardHandler()
177
+ ->ajaxExec_WizRenderStep();
178
+ }
179
+ break;
180
+ }
181
+ }
182
+
183
+ return $this->normaliseAjaxResponse( $aAjaxResponse );
184
+ }
185
+
186
+ /**
187
+ * We check for empty since if it's empty, there's nothing to normalize. It's a filter,
188
+ * so if we send something back non-empty, it'll be treated like a "handled" response and
189
+ * processing will finish
190
+ * @param array $aAjaxResponse
191
+ * @return array
192
+ */
193
+ protected function normaliseAjaxResponse( $aAjaxResponse ) {
194
+ if ( !empty( $aAjaxResponse ) ) {
195
+ $aAjaxResponse = array_merge(
196
+ array(
197
+ 'success' => false,
198
+ 'message' => 'Unknown',
199
+ 'html' => '',
200
+ ),
201
+ $aAjaxResponse
202
+ );
203
+ }
204
+ return $aAjaxResponse;
205
+ }
206
+
207
  /**
208
  * @param array $aAdminNotices
209
  * @return array
329
  public function onWpInit() {
330
  $this->runWizards();
331
  $this->updateHandler();
 
332
  }
333
 
334
  /**
335
  * Override this and adapt per feature
336
  * @return ICWP_WPSF_Processor_Base
337
  */
338
+ protected function loadProcessor() {
339
  if ( !isset( $this->oProcessor ) ) {
340
  include_once( self::getConn()
341
  ->getPath_SourceFile( sprintf( 'processors/%s.php', $this->getFeatureSlug() ) ) );
431
  * @return ICWP_WPSF_Processor_Base
432
  */
433
  public function getProcessor() {
434
+ return $this->loadProcessor();
435
  }
436
 
437
  /**
754
  * @param array|string $mErrors
755
  * @return $this
756
  */
757
+ public function setLastErrors( $mErrors = array() ) {
758
  if ( !is_array( $mErrors ) ) {
759
  if ( is_string( $mErrors ) ) {
760
  $mErrors = array( $mErrors );
789
  }
790
  }
791
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
792
  /**
 
 
793
  * @return bool
794
  */
795
+ protected function isModuleRequest() {
796
+ return ( $this->getModSlug() == $this->loadDP()->request( 'mod_slug' ) );
 
 
 
 
 
 
 
 
 
 
 
 
797
  }
798
 
799
  /**
801
  * @param bool $bAsJsonEncodedObject
802
  * @return array
803
  */
804
+ public function getAjaxActionData( $sAction = '', $bAsJsonEncodedObject = false ) {
805
  $aData = array(
806
+ 'action' => $this->prefix(), //wp ajax doesn't work without this.
807
+ 'exec' => $sAction,
808
+ 'exec_nonce' => $this->genNonce( $sAction ),
809
+ 'mod_slug' => $this->getModSlug(),
810
+ 'ajaxurl' => admin_url( 'admin-ajax.php' ),
 
811
  );
812
  return $bAsJsonEncodedObject ? json_encode( (object)$aData ) : $aData;
813
  }
814
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
815
  /**
816
  * @param string $sAction
817
  * @return string
818
  */
819
+ public function genNonce( $sAction = '' ) {
820
+ return wp_create_nonce( $sAction );
821
  }
822
 
823
  /**
825
  * @param string $sAction
826
  * @return bool
827
  */
828
+ public function checkNonceAction( $sNonce, $sAction = '' ) {
829
  return wp_verify_nonce( $sNonce, $this->prefix( $sAction ) );
830
  }
831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
832
  /**
833
  * @return bool
834
  */
860
  return $this->oWizard;
861
  }
862
 
 
 
 
 
 
 
 
 
863
  /**
864
  * Saves the options to the WordPress Options store.
865
  * It will also update the stored plugin options version.
943
  $aWarnings,
944
  $this->getSectionWarnings( $aSection[ 'slug' ] )
945
  );
946
+ $aOptions[ $nSectionKey ][ 'notices' ] = $this->getSectionNotices( $aSection[ 'slug' ] );
947
  }
948
  }
949
 
950
  return $aOptions;
951
  }
952
 
953
+ /**
954
+ * @param string $sSectionSlug
955
+ * @return array
956
+ */
957
+ protected function getSectionNotices( $sSectionSlug ) {
958
+ return array();
959
+ }
960
+
961
  /**
962
  * @param string $sSectionSlug
963
  * @return array
1077
  return implode( self::CollateSeparator, $aToJoin );
1078
  }
1079
 
1080
+ /**
1081
+ * @return array
1082
+ */
1083
+ protected function ajaxExec_ModOptions() {
 
1084
 
1085
  $oCon = self::getConn();
1086
  $bSuccess = false;
1087
  $sName = $oCon->getHumanName();
1088
  $sMessage = sprintf( _wpsf__( 'Failed up to update %s plugin options.' ), $sName );
1089
 
1090
+ if ( $oCon->getIsValidAdminArea() ) {
1091
+ $bSuccess = $this->saveOptionsSubmit();
1092
  if ( $bSuccess ) {
1093
  $sMessage = sprintf( _wpsf__( '%s Plugin options updated successfully.' ), $sName );
1094
  }
1097
  $sMessage = sprintf( _wpsf__( 'Failed to update %s options as you are not authenticated with %s as a Security Admin.' ), $sName, $sName );
1098
  }
1099
 
1100
+ try {
1101
+ $sForm = $this->renderOptionsForm();
1102
+ }
1103
+ catch ( Exception $oE ) {
1104
+ $sForm = 'Error during form render';
1105
+ }
1106
+ return array(
1107
+ 'success' => $bSuccess,
1108
+ 'html' => $sForm,
1109
+ 'message' => $sMessage
1110
  );
1111
  }
1112
 
1113
  /**
1114
  * @return bool
1115
  */
1116
+ public function handleOptionsSubmit() {
1117
  $bVerified = $this->verifyFormSubmit();
1118
  if ( $bVerified ) {
1119
+ $this->saveOptionsSubmit();
 
1120
  $this->setSaveUserResponse();
1121
  }
1122
  return $bVerified;
1125
  /**
1126
  * @return bool
1127
  */
1128
+ protected function saveOptionsSubmit() {
1129
+ $bSuccess = true;
1130
+ if ( self::getConn()->getHasPermissionToManage() ) {
1131
+ $this->doSaveStandardOptions();
1132
+ $this->doExtraSubmitProcessing();
1133
+ }
1134
+ else {
1135
+ // TODO: manage how we react to prohibited submissions
1136
+ $bSuccess = false;
1137
+ }
1138
+ return $bSuccess;
1139
  }
1140
 
1141
  protected function verifyFormSubmit() {
1322
  * @return string
1323
  */
1324
  public function prefix( $sSuffix = '', $sGlue = '-' ) {
1325
+ return self::getConn()->prefix( $sSuffix, $sGlue );
 
 
 
 
 
 
 
 
 
 
 
1326
  }
1327
 
1328
  /**
1369
  protected function displayRestrictedPage() {
1370
  $this->display(
1371
  array(
1372
+ 'ajax' => array(
1373
+ 'restricted_access' => $this->getAjaxActionData( 'restricted_access' )
1374
+ )
1375
  ),
1376
  'access_restricted.php'
1377
  );
1381
  * @param bool $bRenderEmbeddedContent
1382
  * @return array
1383
  */
1384
+ protected function getBaseDisplayData( $bRenderEmbeddedContent = false ) {
1385
  $oCon = self::getConn();
1386
  self::$sActivelyDisplayedModuleOptions = $this->getFeatureSlug();
1387
 
1404
  'width' => 772,
1405
  'height' => 454,
1406
  ),
1407
+ 'aSummaryData' => apply_filters( $this->prefix( 'get_feature_summary_data' ), array() ),
 
 
1408
 
1409
  // 'sPageTitle' => sprintf( '%s: %s', $oCon->getHumanName(), $this->getMainFeatureName() ),
1410
+ 'sPageTitle' => $this->getMainFeatureName(),
1411
+ 'data' => array(
1412
  'form_nonce' => $this->genNonce( '' ),
1413
  'mod_slug' => $this->getModSlug( true ),
1414
  'mod_slug_short' => $this->getModSlug( false ),
1416
  'all_options_input' => $this->collateAllFormInputsForAllOptions(),
1417
  'hidden_options' => $this->getOptionsVo()->getHiddenOptions()
1418
  ),
1419
+ 'ajax' => array(
1420
+ 'mod_options' => $this->getAjaxActionData( 'mod_options' ),
1421
+ ),
1422
+ 'strings' => $this->getDisplayStrings(),
1423
+ 'flags' => array(
1424
  'access_restricted' => !$this->canDisplayOptionsForm(),
1425
  'show_ads' => $this->getIsShowMarketing(),
 
1426
  'wrap_page_content' => true,
1427
  'show_standard_options' => true,
1428
  'show_content_actions' => $this->hasCustomActions(),
1431
  'can_wizard' => $this->canRunWizards(),
1432
  'has_wizard' => $this->hasWizard(),
1433
  ),
1434
+ 'hrefs' => array(
1435
+ 'go_pro' => 'http://icwp.io/shieldgoprofeature',
1436
+ 'goprofooter' => 'http://icwp.io/goprofooter',
1437
+ 'wizard_link' => $this->getUrl_WizardLanding(),
1438
+ 'wizard_landing' => $this->getUrl_WizardLanding()
 
 
1439
  ),
1440
+ 'content' => array(
1441
  'options_form' => '',
1442
  'alt' => '',
1443
  'actions' => '',
1447
  );
1448
 
1449
  if ( $bRenderEmbeddedContent ) { // prevents recursive loops
 
1450
  $aData[ 'content' ] = array(
1451
  'options_form' => 'no form',
1452
  'alt' => '',
1471
  'blog' => __( 'Blog' ),
1472
  'save_all_settings' => __( 'Save All Settings' ),
1473
  'see_help_video' => __( 'Watch Help Video' ),
1474
+ 'btn_save' => __( 'Save Options' ),
1475
  'btn_options' => __( 'Options' ),
1476
  'btn_help' => __( 'Help' ),
1477
  'btn_actions' => $this->hasCustomActions() ? __( 'Actions' ) : __( 'No Actions' ),
1515
  return $this->renderTemplate( 'snippets/module-wizard-template.php', $aData );
1516
  }
1517
 
 
 
 
 
 
 
 
1518
  /**
1519
  * @uses nonce
1520
  * @param string $sWizardSlug
1539
  return $this->getUrl_Wizard( 'landing' );
1540
  }
1541
 
 
 
 
 
 
 
 
 
1542
  /**
1543
  * @return array
1544
  */
1584
  // Get the same Base Data as normal display
1585
  return $this->loadRenderer( self::getConn()->getPath_Templates() )
1586
  ->setTemplate( $sTemplate )
1587
+ ->setRenderVars( $this->getBaseDisplayData( true ) )
1588
  ->render();
1589
  }
1590
 
1618
  $oDp = $this->loadDataProcessor();
1619
 
1620
  // Get Base Data
1621
+ $aData = $oDp->mergeArraysRecursive( $this->getBaseDisplayData( true ), $aData );
1622
  if ( empty( $sSubView ) || !$oRndr->getTemplateExists( $sSubView ) ) {
1623
  $sModuleView = 'feature-'.$this->getFeatureSlug();
1624
  $sSubView = $oRndr->getTemplateExists( $sModuleView ) ? $sModuleView : 'feature-default';
1648
  throw new Exception( 'notice_attributes is empty' );
1649
  }
1650
 
 
 
 
1651
  if ( !isset( $aData[ 'icwp_admin_notice_template' ] ) ) {
1652
  $aData[ 'icwp_admin_notice_template' ] = $aData[ 'notice_attributes' ][ 'notice_id' ];
1653
  }
1664
  }
1665
  $aData[ 'notice_classes' ] = implode( ' ', $aData[ 'notice_classes' ] );
1666
 
1667
+ $aAjaxData = $this->getAjaxActionData( 'dismiss_admin_notice' );
1668
+ $aAjaxData[ 'hide' ] = 1;
1669
+ $aAjaxData[ 'notice_id' ] = $aData[ 'notice_attributes' ][ 'notice_id' ];
1670
+ $aData[ 'ajax' ][ 'dismiss_admin_notice' ] = json_encode( $aAjaxData );
1671
+
1672
+ return $this->renderTemplate( 'notices/admin-notice-template', $aData );
1673
  }
1674
 
1675
  /**
1858
  $aOpts[ $sKey ] = $mValue;
1859
  return $this->setOpt( 'help_video_options', $aOpts );
1860
  }
1861
+
1862
+ /**
1863
+ * @param string $sOpt
1864
+ * @param int $nAt
1865
+ * @return $this
1866
+ */
1867
+ protected function setOptAt( $sOpt, $nAt = null ) {
1868
+ return $this->setOpt( $sOpt, is_null( $nAt ) ? $this->loadDP()->time() : max( 0, (int)$nAt ) );
1869
+ }
1870
  }
src/features/base_wpsf.php CHANGED
@@ -89,6 +89,16 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
89
  return ( !empty( $sSecret ) && !empty( $sKey ) && $this->loadDataProcessor()->getPhpSupportsNamespaces() );
90
  }
91
 
 
 
 
 
 
 
 
 
 
 
92
  /**
93
  * @param bool $bRenderEmbeddedContent
94
  * @return array
@@ -97,6 +107,9 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
97
  return $this->loadDP()->mergeArraysRecursive(
98
  parent::getBaseDisplayData( $bRenderEmbeddedContent ),
99
  array(
 
 
 
100
  'strings' => array(
101
  'go_to_settings' => _wpsf__( 'Settings' ),
102
  'on' => _wpsf__( 'On' ),
@@ -120,8 +133,7 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
120
  'aar_forget_key' => _wpsf__( "Forgotten Key" )
121
  ),
122
  'flags' => array(
123
- 'show_summary' => true,
124
- 'has_session' => $this->hasSession()
125
  ),
126
  'hrefs' => array(
127
  'aar_forget_key' => 'http://icwp.io/b5',
@@ -161,6 +173,13 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
161
  );
162
  }
163
 
 
 
 
 
 
 
 
164
  protected function getTranslatedString( $sKey, $sDefault ) {
165
  $aStrings = array(
166
  'nonce_failed_empty' => _wpsf__( 'Nonce security checking failed - the nonce value was empty.' ),
89
  return ( !empty( $sSecret ) && !empty( $sKey ) && $this->loadDataProcessor()->getPhpSupportsNamespaces() );
90
  }
91
 
92
+ /**
93
+ * @return array
94
+ */
95
+ protected function getSecAdminLoginAjaxData() {
96
+ // We set a custom mod_slug so that this module handles the ajax request
97
+ $aAjaxData = $this->getAjaxActionData( 'sec_admin_login' );
98
+ $aAjaxData[ 'mod_slug' ] = $this->prefix( 'admin_access_restriction' );
99
+ return $aAjaxData;
100
+ }
101
+
102
  /**
103
  * @param bool $bRenderEmbeddedContent
104
  * @return array
107
  return $this->loadDP()->mergeArraysRecursive(
108
  parent::getBaseDisplayData( $bRenderEmbeddedContent ),
109
  array(
110
+ 'ajax' => array(
111
+ 'sec_admin_login' => $this->getSecAdminLoginAjaxData(),
112
+ ),
113
  'strings' => array(
114
  'go_to_settings' => _wpsf__( 'Settings' ),
115
  'on' => _wpsf__( 'On' ),
133
  'aar_forget_key' => _wpsf__( "Forgotten Key" )
134
  ),
135
  'flags' => array(
136
+ 'has_session' => $this->hasSession()
 
137
  ),
138
  'hrefs' => array(
139
  'aar_forget_key' => 'http://icwp.io/b5',
173
  );
174
  }
175
 
176
+ /**
177
+ * @return bool
178
+ */
179
+ public function getIfSupport3rdParty() {
180
+ return $this->isPremium();
181
+ }
182
+
183
  protected function getTranslatedString( $sKey, $sDefault ) {
184
  $aStrings = array(
185
  'nonce_failed_empty' => _wpsf__( 'Nonce security checking failed - the nonce value was empty.' ),
src/features/email.php CHANGED
@@ -1,85 +1,78 @@
1
  <?php
2
 
3
- if ( !class_exists( 'ICWP_WPSF_FeatureHandler_Email', false ) ):
 
 
4
 
5
- require_once( dirname(__FILE__ ).'/base_wpsf.php' );
6
 
7
- class ICWP_WPSF_FeatureHandler_Email extends ICWP_WPSF_FeatureHandler_BaseWpsf {
8
 
9
- protected function doPostConstruction() {
10
- // add filters to email sending (for now only Mandrill)
11
- // add_filter( 'mandrill_payload', array( $this, 'customiseMandrill' ) );
12
- // add_filter( 'mandrill_nl2br', '__return_true' );
13
- }
14
-
15
- /**
16
- * @param array $aMessage
17
- * @return array
18
- */
19
- public function customiseMandrill( $aMessage ) {
20
- if ( empty( $aMessage['text'] ) ) {
21
- $aMessage['text'] = $aMessage['html'];
22
- }
23
- return $aMessage;
24
- }
25
-
26
- /**
27
- * @param array $aOptionsParams
28
- * @return array
29
- * @throws Exception
30
- */
31
- protected function loadStrings_SectionTitles( $aOptionsParams ) {
32
-
33
- $sSectionSlug = $aOptionsParams['slug'];
34
- switch( $sSectionSlug ) {
35
-
36
- case 'section_email_options' :
37
- $sTitle = _wpsf__( 'Email Options' );
38
- break;
39
-
40
- default:
41
- throw new Exception( sprintf( 'A section slug was defined but with no associated strings. Slug: "%s".', $sSectionSlug ) );
42
- }
43
- $aOptionsParams['title'] = $sTitle;
44
- return $aOptionsParams;
45
  }
 
 
46
 
47
- /**
48
- * @param array $aOptionsParams
49
- * @return array
50
- * @throws Exception
51
- */
52
- protected function loadStrings_Options( $aOptionsParams ) {
53
 
54
- $sKey = $aOptionsParams['key'];
55
- switch( $sKey ) {
56
- case 'send_email_throttle_limit' :
57
- $sName = _wpsf__( 'Email Throttle Limit' );
58
- $sSummary = _wpsf__( 'Limit Emails Per Second' );
59
- $sDescription = _wpsf__( 'You throttle emails sent by this plugin by limiting the number of emails sent every second. This is useful in case you get hit by a bot attack. Zero (0) turns this off. Suggested: 10' );
60
- break;
61
 
62
- default:
63
- throw new Exception( sprintf( 'An option has been defined but without strings assigned to it. Option key: "%s".', $sKey ) );
64
- }
65
 
66
- $aOptionsParams['name'] = $sName;
67
- $aOptionsParams['summary'] = $sSummary;
68
- $aOptionsParams['description'] = $sDescription;
69
- return $aOptionsParams;
70
  }
 
 
 
71
 
72
- /**
73
- * This is the point where you would want to do any options verification
74
- */
75
- protected function doPrePluginOptionsSave() {
76
- $sLimit = $this->getOpt( 'send_email_throttle_limit' );
77
- if ( !is_numeric( $sLimit ) || $sLimit < 0 ) {
78
- $sLimit = 0;
79
- }
80
- $this->setOpt( 'send_email_throttle_limit', $sLimit );
 
 
 
 
 
 
 
 
81
  }
82
 
 
 
 
 
83
  }
84
 
85
- endif;
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
 
3
+ if ( class_exists( 'ICWP_WPSF_FeatureHandler_Email', false ) ) {
4
+ return;
5
+ }
6
 
7
+ require_once( dirname( __FILE__ ).'/base_wpsf.php' );
8
 
9
+ class ICWP_WPSF_FeatureHandler_Email extends ICWP_WPSF_FeatureHandler_BaseWpsf {
10
 
11
+ /**
12
+ * @param array $aMessage
13
+ * @return array
14
+ */
15
+ public function customiseMandrill( $aMessage ) {
16
+ if ( empty( $aMessage[ 'text' ] ) ) {
17
+ $aMessage[ 'text' ] = $aMessage[ 'html' ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  }
19
+ return $aMessage;
20
+ }
21
 
22
+ /**
23
+ * @param array $aOptionsParams
24
+ * @return array
25
+ * @throws Exception
26
+ */
27
+ protected function loadStrings_SectionTitles( $aOptionsParams ) {
28
 
29
+ $sSectionSlug = $aOptionsParams[ 'slug' ];
30
+ switch ( $sSectionSlug ) {
 
 
 
 
 
31
 
32
+ case 'section_email_options' :
33
+ $sTitle = _wpsf__( 'Email Options' );
34
+ break;
35
 
36
+ default:
37
+ throw new Exception( sprintf( 'A section slug was defined but with no associated strings. Slug: "%s".', $sSectionSlug ) );
 
 
38
  }
39
+ $aOptionsParams[ 'title' ] = $sTitle;
40
+ return $aOptionsParams;
41
+ }
42
 
43
+ /**
44
+ * @param array $aOptionsParams
45
+ * @return array
46
+ * @throws Exception
47
+ */
48
+ protected function loadStrings_Options( $aOptionsParams ) {
49
+
50
+ $sKey = $aOptionsParams[ 'key' ];
51
+ switch ( $sKey ) {
52
+ case 'send_email_throttle_limit' :
53
+ $sName = _wpsf__( 'Email Throttle Limit' );
54
+ $sSummary = _wpsf__( 'Limit Emails Per Second' );
55
+ $sDescription = _wpsf__( 'You throttle emails sent by this plugin by limiting the number of emails sent every second. This is useful in case you get hit by a bot attack. Zero (0) turns this off. Suggested: 10' );
56
+ break;
57
+
58
+ default:
59
+ throw new Exception( sprintf( 'An option has been defined but without strings assigned to it. Option key: "%s".', $sKey ) );
60
  }
61
 
62
+ $aOptionsParams[ 'name' ] = $sName;
63
+ $aOptionsParams[ 'summary' ] = $sSummary;
64
+ $aOptionsParams[ 'description' ] = $sDescription;
65
+ return $aOptionsParams;
66
  }
67
 
68
+ /**
69
+ * This is the point where you would want to do any options verification
70
+ */
71
+ protected function doPrePluginOptionsSave() {
72
+ $sLimit = $this->getOpt( 'send_email_throttle_limit' );
73
+ if ( !is_numeric( $sLimit ) || $sLimit < 0 ) {
74
+ $sLimit = 0;
75
+ }
76
+ $this->setOpt( 'send_email_throttle_limit', $sLimit );
77
+ }
78
+ }
src/features/hack_protect.php CHANGED
@@ -19,9 +19,24 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
19
  }
20
  }
21
 
22
- protected function adminAjaxHandlers() {
23
- parent::adminAjaxHandlers();
24
- add_action( $this->prefixWpAjax( 'PluginReinstall' ), array( $this, 'ajaxPluginReinstall' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
26
 
27
  /**
@@ -59,6 +74,23 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
59
  }
60
  }
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  /**
63
  * @return int
64
  */
@@ -465,7 +497,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
465
  return $this->setOpt( 'ptg_enable', $sValue );
466
  }
467
 
468
- public function ajaxPluginReinstall() {
 
 
 
469
  $oDP = $this->loadDP();
470
  $bReinstall = (bool)$oDP->post( 'reinstall' );
471
  $bActivate = (bool)$oDP->post( 'activate' );
@@ -483,7 +518,9 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
483
  $oWpP->activate( $sFile );
484
  }
485
 
486
- $this->sendAjaxResponse( true );
 
 
487
  }
488
 
489
  public function insertCustomJsVars() {
@@ -493,7 +530,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
493
  $this->prefix( 'global-plugin' ),
494
  'icwp_wpsf_vars_hp',
495
  array(
496
- 'ajax_reinstall' => $this->getBaseAjaxActionRenderData( 'PluginReinstall' ),
497
  'reinstallable' => $this->getReinstallablePlugins()
498
  )
499
  );
@@ -516,6 +553,42 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
516
  return $aP;
517
  }
518
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
  /**
520
  * @param string $sSectionSlug
521
  * @return array
19
  }
20
  }
21
 
22
+ /**
23
+ * @param array $aAjaxResponse
24
+ * @return array
25
+ */
26
+ public function handleAuthAjax( $aAjaxResponse ) {
27
+
28
+ if ( empty( $aAjaxResponse ) ) {
29
+ switch ( $this->loadDP()->request( 'exec' ) ) {
30
+
31
+ case 'plugin_reinstall':
32
+ $aAjaxResponse = $this->ajaxExec_PluginReinstall();
33
+ break;
34
+
35
+ default:
36
+ break;
37
+ }
38
+ }
39
+ return parent::handleAuthAjax( $aAjaxResponse );
40
  }
41
 
42
  /**
74
  }
75
  }
76
 
77
+ /**
78
+ * @param string $sScan ptg, wcf, ufc, wpv
79
+ * @return int
80
+ */
81
+ public function getLastScanAt( $sScan ) {
82
+ return (int)$this->getOpt( $sScan.'_last_scan_at', 0 );
83
+ }
84
+
85
+ /**
86
+ * @param string $sScan ptg, wcf, ufc, wpv
87
+ * @param int|null $nAt
88
+ * @return $this
89
+ */
90
+ public function setLastScanAt( $sScan, $nAt = null ) {
91
+ return $this->setOpt( $sScan.'_last_scan_at', is_null( $nAt ) ? $this->loadDP()->time() : $nAt );
92
+ }
93
+
94
  /**
95
  * @return int
96
  */
497
  return $this->setOpt( 'ptg_enable', $sValue );
498
  }
499
 
500
+ /**
501
+ * @return array
502
+ */
503
+ public function ajaxExec_PluginReinstall() {
504
  $oDP = $this->loadDP();
505
  $bReinstall = (bool)$oDP->post( 'reinstall' );
506
  $bActivate = (bool)$oDP->post( 'activate' );
518
  $oWpP->activate( $sFile );
519
  }
520
 
521
+ return array(
522
+ 'success' => true
523
+ );
524
  }
525
 
526
  public function insertCustomJsVars() {
530
  $this->prefix( 'global-plugin' ),
531
  'icwp_wpsf_vars_hp',
532
  array(
533
+ 'ajax_reinstall' => $this->getAjaxActionData( 'plugin_reinstall' ),
534
  'reinstallable' => $this->getReinstallablePlugins()
535
  )
536
  );
553
  return $aP;
554
  }
555
 
556
+ /**
557
+ * @param string $sSectionSlug
558
+ * @return array
559
+ */
560
+ protected function getSectionNotices( $sSectionSlug ) {
561
+ $aNotices = array();
562
+ switch ( $sSectionSlug ) {
563
+
564
+ case 'section_core_file_integrity_scan':
565
+ $nTime = $this->getLastScanAt( 'wcf' );
566
+ break;
567
+
568
+ case 'section_unrecognised_file_scan':
569
+ $nTime = $this->getLastScanAt( 'ufc' );
570
+ break;
571
+
572
+ case 'section_pluginthemes_guard':
573
+ $nTime = $this->getLastScanAt( 'ptg' );
574
+ break;
575
+
576
+ case 'section_wpvuln_scan':
577
+ $nTime = $this->getLastScanAt( 'wpv' );
578
+ break;
579
+
580
+ default:
581
+ $nTime = null;
582
+ break;
583
+ }
584
+
585
+ if ( !is_null( $nTime ) ) {
586
+ $nTime = ( $nTime > 0 ) ? $this->loadWp()->getTimeStampForDisplay( $nTime ) : _wpsf__( 'Never' );
587
+ $aNotices[] = sprintf( _wpsf__( 'Last Scan Time: %s' ), $nTime );
588
+ }
589
+ return $aNotices;
590
+ }
591
+
592
  /**
593
  * @param string $sSectionSlug
594
  * @return array
src/features/ips.php CHANGED
@@ -74,7 +74,7 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
74
  return array(
75
  'ajax' => $this->getAjaxDataSets(),
76
  );
77
- }//fable_ip_list_action
78
 
79
  /**
80
  * @return array
@@ -132,52 +132,72 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
132
  return !$this->getOptIs( 'track_404', 'disabled' );
133
  }
134
 
135
- protected function adminAjaxHandlers() {
136
- parent::adminAjaxHandlers();
137
- add_action( $this->prefixWpAjax( 'GetIpList' ), array( $this, 'ajaxGetIpList' ) );
138
- add_action( $this->prefixWpAjax( 'AddIpToWhiteList' ), array( $this, 'ajaxAddIpToWhiteList' ) );
139
- add_action( $this->prefixWpAjax( 'RemoveIpFromList' ), array( $this, 'ajaxRemoveIpFromList' ) );
140
- }
 
 
 
 
 
 
141
 
142
- public function ajaxGetIpList() {
143
- $sResponseData = array();
144
- $sResponseData[ 'html' ] = $this->renderListTable( $this->loadDP()->post( 'list', '' ) );
145
- $this->sendAjaxResponse( true, $sResponseData );
 
 
 
 
 
 
 
 
 
146
  }
147
 
148
- public function ajaxRemoveIpFromList() {
 
 
 
 
 
 
 
 
149
 
 
150
  /** @var ICWP_WPSF_Processor_Ips $oProcessor */
151
  $oProcessor = $this->getProcessor();
152
- $sResponseData = array();
153
-
154
  $oDp = $this->loadDP();
 
155
  $oProcessor->removeIpFromList( $oDp->post( 'ip' ), $oDp->post( 'list' ) );
156
 
157
- $sResponseData[ 'html' ] = $this->renderListTable( $oDp->post( 'list', '' ) );
158
- $this->sendAjaxResponse( true, $sResponseData );
 
 
159
  }
160
 
161
- public function ajaxAddIpToWhiteList() {
162
-
163
  /** @var ICWP_WPSF_Processor_Ips $oProcessor */
164
  $oProcessor = $this->getProcessor();
165
- $sResponseData = array();
166
-
167
  $oDp = $this->loadDP();
168
 
169
  $sIp = $oDp->post( 'ip', '' );
170
  $sLabel = $oDp->post( 'label', '' );
171
  if ( !empty( $sIp ) ) {
172
- $mResult = $oProcessor->addIpToWhiteList( $sIp, $sLabel );
173
  }
174
 
175
- $sResponseData[ 'html' ] = $this->renderListTable( $oDp->post( 'list', '' ) );
176
-
177
- // if ( $mResult === false || $mResult < 1 ) {
178
- // $bSuccess = false;
179
- // }
180
- $this->sendAjaxResponse( true, $sResponseData );
181
  }
182
 
183
  /**
@@ -185,9 +205,9 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
185
  */
186
  protected function getAjaxDataSets() {
187
  return array(
188
- 'glist' => $this->getBaseAjaxActionRenderData( 'GetIpList', true ),
189
- 'alist' => $this->getBaseAjaxActionRenderData( 'AddIpToWhiteList', true ),
190
- 'rlist' => $this->getBaseAjaxActionRenderData( 'RemoveIpFromList', true ),
191
  );
192
  }
193
 
74
  return array(
75
  'ajax' => $this->getAjaxDataSets(),
76
  );
77
+ }
78
 
79
  /**
80
  * @return array
132
  return !$this->getOptIs( 'track_404', 'disabled' );
133
  }
134
 
135
+ /**
136
+ * @param array $aAjaxResponse
137
+ * @return array
138
+ */
139
+ public function handleAuthAjax( $aAjaxResponse ) {
140
+
141
+ if ( empty( $aAjaxResponse ) ) {
142
+ switch ( $this->loadDP()->request( 'exec' ) ) {
143
+
144
+ case 'get_ip_list':
145
+ $aAjaxResponse = $this->ajaxExec_GetIpList();
146
+ break;
147
 
148
+ case 'add_ip_white':
149
+ $aAjaxResponse = $this->ajaxExec_AddIpToWhitelist();
150
+ break;
151
+
152
+ case 'remove_ip':
153
+ $aAjaxResponse = $this->ajaxExec_RemoveIpFromList();
154
+ break;
155
+
156
+ default:
157
+ break;
158
+ }
159
+ }
160
+ return parent::handleAuthAjax( $aAjaxResponse );
161
  }
162
 
163
+ /**
164
+ * @return array
165
+ */
166
+ protected function ajaxExec_GetIpList() {
167
+ return array(
168
+ 'success' => true,
169
+ 'html' => $this->renderListTable( $this->loadDP()->post( 'list', '' ) )
170
+ );
171
+ }
172
 
173
+ public function ajaxExec_RemoveIpFromList() {
174
  /** @var ICWP_WPSF_Processor_Ips $oProcessor */
175
  $oProcessor = $this->getProcessor();
 
 
176
  $oDp = $this->loadDP();
177
+
178
  $oProcessor->removeIpFromList( $oDp->post( 'ip' ), $oDp->post( 'list' ) );
179
 
180
+ return array(
181
+ 'success' => true,
182
+ 'html' => $this->renderListTable( $oDp->post( 'list', '' ) ),
183
+ );
184
  }
185
 
186
+ protected function ajaxExec_AddIpToWhitelist() {
 
187
  /** @var ICWP_WPSF_Processor_Ips $oProcessor */
188
  $oProcessor = $this->getProcessor();
 
 
189
  $oDp = $this->loadDP();
190
 
191
  $sIp = $oDp->post( 'ip', '' );
192
  $sLabel = $oDp->post( 'label', '' );
193
  if ( !empty( $sIp ) ) {
194
+ $oProcessor->addIpToWhiteList( $sIp, $sLabel );
195
  }
196
 
197
+ return array(
198
+ 'success' => true,
199
+ 'html' => $this->renderListTable( $oDp->post( 'list', '' ) ),
200
+ );
 
 
201
  }
202
 
203
  /**
205
  */
206
  protected function getAjaxDataSets() {
207
  return array(
208
+ 'glist' => $this->getAjaxActionData( 'get_ip_list', true ),
209
+ 'alist' => $this->getAjaxActionData( 'add_ip_white', true ),
210
+ 'rlist' => $this->getAjaxActionData( 'remove_ip', true ),
211
  );
212
  }
213
 
src/features/license.php CHANGED
@@ -19,47 +19,52 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
19
 
20
  $nExpiresAt = $this->getLicenseExpiresAt();
21
  if ( $nExpiresAt > 0 && $nExpiresAt != PHP_INT_MAX ) {
22
- $sExpiresAt = date( $oWp->getDateFormat().' '.$oWp->getTimeFormat(), $oWp->getTimeAsGmtOffset( $this->getLicenseExpiresAt() ) );
23
  }
24
  else {
25
  $sExpiresAt = 'n/a';
26
  }
27
 
28
- $sCheckedAt = date( $oWp->getDateFormat().' '.$oWp->getTimeFormat(), $oWp->getTimeAsGmtOffset( $this->getLicenseLastCheckedAt() ) );
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
  $aData = array(
31
- 'vars' => array(
32
- 'product_name' => $this->getLicenseItemName(),
33
- 'license_active' => $this->hasValidWorkingLicense() ? 'Active' : 'Not Active',
34
- 'license_status' => $this->getOfficialLicenseStatus(),
35
- 'license_key' => $this->hasLicenseKey() ? $this->getLicenseKey() : 'n/a',
36
- 'license_expires' => $sExpiresAt,
37
- 'license_email' => $this->getOfficialLicenseRegisteredEmail(),
38
- 'last_checked' => $sCheckedAt,
39
- 'last_errors' => $this->hasLastErrors() ? $this->getLastErrors() : ''
40
- ),
41
- 'inputs' => array(
42
  'license_key' => array(
43
  'name' => $this->prefixOptionKey( 'license_key' ),
44
- 'maxlength' => $this->getDefinition( 'license_key_length' ),
45
  )
46
  ),
47
- 'ajax_vars' => $this->getBaseAjaxActionRenderData( 'LicenseHandling' ),
48
- 'aHrefs' => array(
 
 
49
  'shield_pro_url' => 'http://icwp.io/shieldpro',
50
  'shield_pro_more_info_url' => 'http://icwp.io/shld1',
51
  'iframe_url' => $this->getDef( 'landing_page_url' ),
52
  ),
53
- 'flags' => array(
54
- 'has_license_key' => $this->isLicenseKeyValidFormat(),
55
- 'show_summary' => false,
56
- 'show_ads' => false,
57
- 'button_enabled_recheck' => $this->isLicenseKeyValidFormat(),
58
- 'button_enabled_remove' => $this->isLicenseKeyValidFormat(),
59
- 'show_standard_options' => false,
60
- 'show_alt_content' => true,
61
  ),
62
- 'strings' => $this->getDisplayStrings(),
63
  );
64
  $aData[ 'content' ] = array(
65
  'alt' => $this->loadRenderer( self::getConn()->getPath_Templates() )
@@ -94,55 +99,67 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
94
 
95
  /**
96
  * Used to store a valid license.
97
- * @param string $sLicenseKey
98
  * @param ICWP_EDD_LicenseVO $oLicense
 
99
  * @throws Exception
100
  */
101
- protected function storeLicense( $sLicenseKey, $oLicense ) {
102
  if ( !( $oLicense instanceof ICWP_EDD_LicenseVO ) ) {
103
  throw new Exception( sprintf( 'Attempt to store something that is not even a license: %s', gettype( $oLicense ) ) );
104
  }
105
- else if ( !$oLicense->isSuccess() || $oLicense->getLicenseStatus() != 'valid' ) {
 
 
 
106
  throw new Exception( 'Attempt to store invalid license.' );
107
  }
108
 
109
- $nRequestTime = $this->loadDataProcessor()->time();
110
-
111
- $sPreviousKey = $this->getLicenseKey();
112
  $bLicenseWasValid = $this->hasValidWorkingLicense();
113
 
114
- $this->setOpt( 'license_key', $sLicenseKey )
115
- ->setOpt( 'license_expires_at', $oLicense->getExpiresAt() )
116
- ->setOpt( 'license_last_checked_at', $nRequestTime )
117
- ->setOpt( 'license_official_status', $oLicense->getLicenseStatus() )
118
  ->setOfficialLicenseRegisteredEmail( $oLicense->getCustomerEmail() );
119
 
120
- $bIsNewLicense = $sPreviousKey != $sLicenseKey;
121
  $bCurrentLicenseValid = $this->isOfficialLicenseStatusValid() && !$this->isLicenseExpired();
122
 
123
- if ( $bIsNewLicense || !$this->isLicenseActive() || ( !$bLicenseWasValid && $bCurrentLicenseValid ) ) {
124
- $this->setOpt( 'license_activated_at', $nRequestTime );
125
  }
 
126
  }
127
 
128
- protected function adminAjaxHandlers() {
129
- add_action( $this->prefixWpAjax( 'LicenseHandling' ), array( $this, 'ajaxLicenseHandling' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  }
131
 
132
- public function ajaxLicenseHandling() {
 
 
 
133
  $bSuccess = false;
134
- $oDp = $this->loadDataProcessor();
135
 
136
- $sLicenseAction = $oDp->FetchPost( 'license-action' );
137
 
138
- if ( $sLicenseAction == 'recheck' ) {
139
- $this->validateCurrentLicenseKey();
140
- $bSuccess = $this->hasValidWorkingLicense();
141
- }
142
- else if ( $sLicenseAction == 'activate' ) {
143
- $sKey = $oDp->FetchPost( $this->prefixOptionKey( 'license_key' ) );
144
- $this->activateOfficialLicense( $sKey );
145
- $bSuccess = $this->hasValidWorkingLicense();
146
  }
147
  else if ( $sLicenseAction == 'remove' ) {
148
  $oLicense = $this->loadEdd()
@@ -155,27 +172,26 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
155
  $bSuccess = $oLicense->isSuccess();
156
  }
157
  $this->deactivate( 'User submitted deactivation' );
158
- $this->setOpt( 'license_key', '' )
159
- ->setOpt( 'license_official_status', 'n/a' );
160
  }
161
 
162
- $this->sendAjaxResponse( $bSuccess );
163
  }
164
 
165
  /**
166
  * @param string $sDeactivatedReason
167
  */
168
- public function deactivate( $sDeactivatedReason = '' ) {
169
 
170
  $this->setOpt( 'license_expires_at', 0 )
171
- ->setOpt( 'is_license_shield_central', false )
172
  ->setOfficialLicenseRegisteredEmail( 'n/a' );
173
 
174
  if ( $this->isOfficialLicenseStatusValid() ) {
175
  $this->setOpt( 'license_official_status', 'cleared' );
176
  }
177
  if ( $this->isLicenseActive() ) {
178
- $this->setOpt( 'license_deactivated_at', $this->loadDataProcessor()->time() );
179
  }
180
  if ( !empty( $sDeactivatedReason ) ) {
181
  $this->setOpt( 'license_deactivated_reason', $sDeactivatedReason );
@@ -184,141 +200,61 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
184
  add_filter( $this->prefix( 'force_options_resave' ), '__return_true' );
185
  }
186
 
187
- protected function validateCurrentLicenseKey() {
188
- $oLicense = $this->activateOfficialLicense( $this->getLicenseKey(), true );
189
- if ( is_null( $oLicense ) || !$oLicense->isSuccess() ) {
190
- $this->deactivate();
191
- }
192
- }
 
193
 
194
- // protected function validateLicenseKey( $sKey ) {
195
- // $nRequestTime = $this->loadDataProcessor()->time();
196
- //
197
- // $bCurrentLicenseValid = $this->isOfficialLicenseStatusValid() && !$this->isLastCheckExpired();
198
- // $sErrorMessage = '';
199
- //
200
- // $oLicense = $this->activateOfficialLicense( $sKey );
201
- //
202
- // if ( is_null( $oLicense ) ) {
203
- // $sErrorMessage = 'Could not successfully request license server.'; // error for license lookup
204
- // }
205
- // else if ( !$oLicense->isReady() ) {
206
- // $sErrorMessage = 'Unexpected response from license server.';
207
- // }
208
- // else if ( $oLicense->isReady() ) {
209
- //
210
- // $bLicenseWasValid = $this->isLicenseActive();
211
- //
212
- // if ( $oLicense->getLicenseStatus() == 'valid' ) {
213
- // $this->setOpt( 'license_expires_at', $oLicense->getExpiresAt() )
214
- // ->setOpt( 'license_last_checked_at', $nRequestTime )
215
- // ->setOfficialLicenseRegisteredEmail( $oLicense->getCustomerEmail() );
216
- // }
217
- // $this->setOpt( 'license_official_status', $oLicense->getLicenseStatus() );
218
- //
219
- // $bCurrentLicenseValid = $this->isOfficialLicenseStatusValid() && !$this->isLicenseExpired();
220
- //
221
- // $bNewlyActivated = !$bLicenseWasValid && $bCurrentLicenseValid;
222
- // $bNewlyDeactivated = $bLicenseWasValid && !$bCurrentLicenseValid;
223
- //
224
- // if ( $bNewlyActivated || !$this->isLicenseActive() ) {
225
- // $this->setOpt( 'license_activated_at', $nRequestTime );
226
- // }
227
- // else if ( $bNewlyDeactivated ) {
228
- // $sErrorMessage = sprintf( 'Official license check returned as %s.', $oLicense->getLicenseStatus() );
229
- // }
230
- // }
231
- //
232
- // if ( !$bCurrentLicenseValid ) {
233
- // $this->deactivate( $sErrorMessage );
234
- // }
235
- // }
236
 
237
- /**
238
- * @param string $sKey
239
- * @param bool $bForceUpdate
240
- * @return ICWP_EDD_LicenseVO
241
- */
242
- public function activateOfficialLicense( $sKey, $bForceUpdate = false ) {
243
- $oLicense = null;
244
- $sKey = $this->verifyLicenseKeyFormat( $sKey );
245
- $sErrorMessage = '';
246
-
247
- // i.e. only continue if the keys are different, or, if they're the same only if your license is expired.
248
- if ( !is_null( $sKey ) ) {
249
-
250
- $sOrigKey = $this->getLicenseKey();
251
- $bIsNewKey = $sOrigKey != $sKey;
252
- $bIsOrigValid = $this->hasValidWorkingLicense();
253
- $bDeactivateOriginal = $bIsNewKey && $bIsOrigValid;
254
- $bIsShieldCentral = false;
255
-
256
- if ( $bForceUpdate || $bIsNewKey || !$bIsOrigValid ) {
257
- $oEDD = $this->loadEdd();
258
- $sPing = $oEDD->ping( $this->getLicenseStoreUrl() );
259
-
260
- if ( $sPing == 'success' ) {
261
- $oLicense = $oEDD->activateLicense(
262
- $this->getLicenseStoreUrl(),
263
- $sKey,
264
- $this->getLicenseItemId()
265
- );
266
-
267
- if ( !is_null( $oLicense ) ) {
268
-
269
- if ( !$oLicense->isSuccess() ) {
270
- $oScLicense = $this->activateOfficialLicenseAsShieldCentral( $sKey );
271
- if ( $oScLicense->isSuccess() ) {
272
- $bIsShieldCentral = true;
273
- $oLicense = $oScLicense;
274
- }
275
- }
276
- }
277
- else {
278
- $sErrorMessage = 'Could not successfully request license server.'; // error for license lookup
279
- }
280
 
281
- try {
282
- $this->storeLicense( $sKey, $oLicense );
283
- $this->setOpt( 'is_license_shield_central', $bIsShieldCentral );
284
- $this->clearLastErrors();
285
- // We also officially deactivate any existing valid licenses
286
- if ( $bDeactivateOriginal && $oLicense->isSuccess() ) {
287
- $this->loadEdd()
288
- ->deactivateLicense( $this->getLicenseStoreUrl(), $sOrigKey, $this->getLicenseItemId() );
289
- }
290
- }
291
- catch ( Exception $oE ) {
292
- $sErrorMessage = $oE->getMessage();
293
- }
294
- }
295
- else {
296
- $sErrorMessage = $sPing;
297
- }
298
  }
299
- }
300
- else {
301
- $sErrorMessage = 'Invalid License Key Format';
302
- }
303
 
304
- if ( !empty( $sErrorMessage ) ) {
305
- $this->clearLastErrors()->setLastErrors( $sErrorMessage );
 
306
  }
307
 
308
- return $oLicense;
309
  }
310
 
311
  /**
312
- * @param string $sKey
313
- * @return ICWP_EDD_LicenseVO
314
  */
315
- protected function activateOfficialLicenseAsShieldCentral( $sKey ) {
316
- return $this->loadEdd()
317
- ->activateLicense(
318
- $this->getLicenseStoreUrl(),
319
- $sKey,
320
- $this->getLicenseItemIdShieldCentral()
321
- );
 
 
 
 
 
 
 
 
 
 
 
322
  }
323
 
324
  /**
@@ -353,30 +289,30 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
353
  * @return string
354
  */
355
  public function getLicenseItemId() {
356
- return $this->getDefinition( 'license_item_id' );
357
  }
358
 
359
  /**
360
  * @return string
361
  */
362
  public function getLicenseItemIdShieldCentral() {
363
- return $this->getDefinition( 'license_item_id_sc' );
364
  }
365
 
366
  /**
367
  * @return string
368
  */
369
  public function getLicenseItemName() {
370
- return $this->getOpt( 'is_license_shield_central' ) ?
371
- $this->getDefinition( 'license_item_name_sc' ) :
372
- $this->getDefinition( 'license_item_name' );
373
  }
374
 
375
  /**
376
  * @return string
377
  */
378
  public function getLicenseStoreUrl() {
379
- return $this->getDefinition( 'license_store_url' );
380
  }
381
 
382
  /**
@@ -393,6 +329,13 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
393
  return $this->getOpt( 'license_last_checked_at' );
394
  }
395
 
 
 
 
 
 
 
 
396
  /**
397
  * @return string
398
  */
@@ -426,7 +369,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
426
  * @return bool
427
  */
428
  public function isLicenseShieldCentral() {
429
- return $this->getOpt( 'is_license_shield_central', true );
430
  }
431
 
432
  /**
@@ -440,19 +383,12 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
440
  * @return bool
441
  */
442
  protected function isLicenseExpired() {
443
- return ( $this->getLicenseExpiresAt() < $this->loadDataProcessor()->GetRequestTime() );
444
- }
445
-
446
- /**
447
- * Expires between 2 and 3 days.
448
- * @return bool
449
- */
450
- protected function isLastCheckExpired() {
451
- return ( $this->loadDP()->time() - $this->getLicenseLastCheckedAt()
452
- > $this->getDefinition( 'license_lack_check_expire_days' )*DAY_IN_SECONDS*( mt_rand( 20, 30 )/10 ) );
453
  }
454
 
455
  /**
 
 
456
  * We test various data points:
457
  * 1) the key is valid format
458
  * 2) the official license status is 'valid'
@@ -462,8 +398,33 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
462
  * @return bool
463
  */
464
  public function hasValidWorkingLicense() {
465
- return $this->isLicenseKeyValidFormat() && $this->isOfficialLicenseStatusValid()
466
- && $this->isLicenseActive() && !$this->isLicenseExpired();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
467
  }
468
 
469
  /**
@@ -474,6 +435,22 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
474
  return $this->setOpt( 'license_registered_email', $sEmail );
475
  }
476
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
477
  /**
478
  * @param string $sKey
479
  * @return string|null
@@ -483,10 +460,10 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
483
 
484
  $sKey = $this->cleanLicenseKey( $sKey );
485
  $bValid = !empty( $sKey ) && is_string( $sKey )
486
- && ( strlen( $sKey ) == $this->getDefinition( 'license_key_length' ) );
487
 
488
  if ( $bValid ) {
489
- switch ( $this->getDefinition( 'license_key_type' ) ) {
490
  case 'alphanumeric':
491
  default:
492
  if ( preg_match( '#[^a-z0-9]#i', $sKey ) === 0 ) {
@@ -501,7 +478,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
501
 
502
  protected function cleanLicenseKey( $sKey ) {
503
 
504
- switch ( $this->getDefinition( 'license_key_type' ) ) {
505
  case 'alphanumeric':
506
  default:
507
  $sKey = preg_replace( '#[^a-z0-9]#i', '', $sKey );
@@ -524,7 +501,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
524
  // clean the key.
525
  $sLicKey = $this->getLicenseKey();
526
  if ( strlen( $sLicKey ) > 0 ) {
527
- switch ( $this->getDefinition( 'license_key_type' ) ) {
528
  case 'alphanumeric':
529
  default:
530
  $this->setOpt( 'license_key', preg_replace( '#[^a-z0-9]#i', '', $sLicKey ) );
@@ -533,14 +510,50 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
533
  }
534
  }
535
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
536
  /**
537
  * Hooked to the plugin's main plugin_shutdown action
538
  */
539
  public function action_doFeatureShutdown() {
540
- // Automatically validate active licenses if they've expired.
541
- if ( $this->hasValidWorkingLicense() && $this->isLastCheckExpired() ) {
542
- $this->validateCurrentLicenseKey();
543
- }
544
  parent::action_doFeatureShutdown();
545
  }
546
 
19
 
20
  $nExpiresAt = $this->getLicenseExpiresAt();
21
  if ( $nExpiresAt > 0 && $nExpiresAt != PHP_INT_MAX ) {
22
+ $sExpiresAt = $oWp->getTimeStampForDisplay( $this->getLicenseExpiresAt() );
23
  }
24
  else {
25
  $sExpiresAt = 'n/a';
26
  }
27
 
28
+ $sCheckedAt = $oWp->getTimeStampForDisplay( $this->getLicenseVerifiedAt() );
29
+
30
+ $aLicenseTableVars = array(
31
+ 'product_name' => $this->getLicenseItemName(),
32
+ 'license_active' => $this->hasValidWorkingLicense() ? 'Active' : 'Not Active',
33
+ 'license_expires' => $sExpiresAt,
34
+ 'license_email' => $this->getOfficialLicenseRegisteredEmail(),
35
+ 'last_checked' => $sCheckedAt,
36
+ 'last_errors' => $this->hasLastErrors() ? $this->getLastErrors() : ''
37
+ );
38
+ if ( !$this->isKeyless() ) {
39
+ $aLicenseTableVars[ 'license_key' ] = $this->hasLicenseKey() ? $this->getLicenseKey() : 'n/a';
40
+ }
41
 
42
  $aData = array(
43
+ 'vars' => $aLicenseTableVars,
44
+ 'inputs' => array(
 
 
 
 
 
 
 
 
 
45
  'license_key' => array(
46
  'name' => $this->prefixOptionKey( 'license_key' ),
47
+ 'maxlength' => $this->getDef( 'license_key_length' ),
48
  )
49
  ),
50
+ 'ajax' => array(
51
+ 'license_handling' => $this->getAjaxActionData( 'license_handling' )
52
+ ),
53
+ 'aHrefs' => array(
54
  'shield_pro_url' => 'http://icwp.io/shieldpro',
55
  'shield_pro_more_info_url' => 'http://icwp.io/shld1',
56
  'iframe_url' => $this->getDef( 'landing_page_url' ),
57
  ),
58
+ 'flags' => array(
59
+ 'show_key' => !$this->isKeyless(),
60
+ 'has_license_key' => $this->isLicenseKeyValidFormat(),
61
+ 'show_ads' => false,
62
+ 'button_enabled_check' => true,
63
+ 'button_enabled_remove' => $this->isLicenseKeyValidFormat(),
64
+ 'show_standard_options' => false,
65
+ 'show_alt_content' => true,
66
  ),
67
+ 'strings' => $this->getDisplayStrings(),
68
  );
69
  $aData[ 'content' ] = array(
70
  'alt' => $this->loadRenderer( self::getConn()->getPath_Templates() )
99
 
100
  /**
101
  * Used to store a valid license.
 
102
  * @param ICWP_EDD_LicenseVO $oLicense
103
+ * @return $this
104
  * @throws Exception
105
  */
106
+ protected function storeLicense( $oLicense ) {
107
  if ( !( $oLicense instanceof ICWP_EDD_LicenseVO ) ) {
108
  throw new Exception( sprintf( 'Attempt to store something that is not even a license: %s', gettype( $oLicense ) ) );
109
  }
110
+
111
+ $this->setOpt( 'license_official_status', $oLicense->getLicenseStatus() );
112
+
113
+ if ( !$oLicense->isSuccess() || $oLicense->getLicenseStatus() != 'valid' ) {
114
  throw new Exception( 'Attempt to store invalid license.' );
115
  }
116
 
 
 
 
117
  $bLicenseWasValid = $this->hasValidWorkingLicense();
118
 
119
+ $this->setOpt( 'license_key', '' )
120
+ ->setOpt( 'is_shield_central', $oLicense->isShieldCentral() )
121
+ ->setOptAt( 'license_expires_at', $oLicense->getExpiresAt() )
 
122
  ->setOfficialLicenseRegisteredEmail( $oLicense->getCustomerEmail() );
123
 
 
124
  $bCurrentLicenseValid = $this->isOfficialLicenseStatusValid() && !$this->isLicenseExpired();
125
 
126
+ if ( !$this->isLicenseActive() || ( !$bLicenseWasValid && $bCurrentLicenseValid ) ) {
127
+ $this->setOpt( 'license_activated_at', $this->loadDP()->time() );
128
  }
129
+ return $this->setLastErrors();
130
  }
131
 
132
+ /**
133
+ * @param array $aAjaxResponse
134
+ * @return array
135
+ */
136
+ public function handleAuthAjax( $aAjaxResponse ) {
137
+
138
+ if ( empty( $aAjaxResponse ) ) {
139
+ switch ( $this->loadDP()->request( 'exec' ) ) {
140
+
141
+ case 'license_handling':
142
+ $aAjaxResponse = $this->ajaxExec_LicenseHandling();
143
+ break;
144
+
145
+ default:
146
+ break;
147
+ }
148
+ }
149
+ return parent::handleAuthAjax( $aAjaxResponse );
150
  }
151
 
152
+ /**
153
+ * @return array
154
+ */
155
+ protected function ajaxExec_LicenseHandling() {
156
  $bSuccess = false;
 
157
 
158
+ $sLicenseAction = $this->loadDP()->post( 'license-action' );
159
 
160
+ if ( $sLicenseAction == 'check' ) {
161
+ $bSuccess = $this->verifyLicense( true )
162
+ ->hasValidWorkingLicense();
 
 
 
 
 
163
  }
164
  else if ( $sLicenseAction == 'remove' ) {
165
  $oLicense = $this->loadEdd()
172
  $bSuccess = $oLicense->isSuccess();
173
  }
174
  $this->deactivate( 'User submitted deactivation' );
175
+ $this->setOpt( 'license_official_status', 'n/a' );
 
176
  }
177
 
178
+ return array( 'success' => $bSuccess );
179
  }
180
 
181
  /**
182
  * @param string $sDeactivatedReason
183
  */
184
+ private function deactivate( $sDeactivatedReason = '' ) {
185
 
186
  $this->setOpt( 'license_expires_at', 0 )
187
+ ->setOpt( 'is_shield_central', false )
188
  ->setOfficialLicenseRegisteredEmail( 'n/a' );
189
 
190
  if ( $this->isOfficialLicenseStatusValid() ) {
191
  $this->setOpt( 'license_official_status', 'cleared' );
192
  }
193
  if ( $this->isLicenseActive() ) {
194
+ $this->setOptAt( 'license_deactivated_at' );
195
  }
196
  if ( !empty( $sDeactivatedReason ) ) {
197
  $this->setOpt( 'license_deactivated_reason', $sDeactivatedReason );
200
  add_filter( $this->prefix( 'force_options_resave' ), '__return_true' );
201
  }
202
 
203
+ /**
204
+ * License check normally only happens when the verification_at expires (~3 days) for a currently valid license.
205
+ * @param bool $bForceCheck
206
+ * @return $this
207
+ */
208
+ public function verifyLicense( $bForceCheck = true ) {
209
+ $nNow = $this->loadDP()->time();
210
 
211
+ // If your last license verification has expired and it's been 4hrs since your last check.
212
+ $bCheck = $bForceCheck || ( $this->hasValidWorkingLicense() && $this->isLastVerifiedExpired()
213
+ && ( $nNow - $this->getLicenseLastCheckedAt() > HOUR_IN_SECONDS*4 ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
 
215
+ if ( $bCheck ) {
216
+ $this->setLicenseLastCheckedAt();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
 
218
+ $oLicense = $this->retrieveLicense();
219
+ try {
220
+ $this->storeLicense( $oLicense )
221
+ ->setLicenseVerifiedAt( $nNow );
222
+ $bSuccess = true;
223
+ }
224
+ catch ( Exception $oE ) {
225
+ $this->setLastErrors( 'Could not find a valid license' );
226
+ $bSuccess = false;
 
 
 
 
 
 
 
 
227
  }
 
 
 
 
228
 
229
+ if ( !$bSuccess && ( $bForceCheck || $this->isLastVerifiedGraceExpired() ) ) {
230
+ $this->deactivate();
231
+ }
232
  }
233
 
234
+ return $this;
235
  }
236
 
237
  /**
238
+ * @return ICWP_EDD_LicenseVO|null
 
239
  */
240
+ private function retrieveLicense() {
241
+
242
+ $sPass = wp_generate_password( 16 );
243
+
244
+ $this->setKeylessRequestAt()
245
+ ->setKeylessRequestHash( sha1( $sPass.$this->loadWp()->getHomeUrl() ) )
246
+ ->savePluginOptions();
247
+
248
+ $oLicense = $this->loadEdd()
249
+ ->setRequestParams( array( 'nonce' => $sPass ) )
250
+ ->activateLicenseKeyless( $this->getLicenseStoreUrl(), $this->getLicenseItemId() );
251
+
252
+ // clear the handshake data
253
+ $this->setKeylessRequestAt( 0 )
254
+ ->setKeylessRequestHash( '' )
255
+ ->savePluginOptions();
256
+
257
+ return $oLicense;
258
  }
259
 
260
  /**
289
  * @return string
290
  */
291
  public function getLicenseItemId() {
292
+ return $this->getDef( 'license_item_id' );
293
  }
294
 
295
  /**
296
  * @return string
297
  */
298
  public function getLicenseItemIdShieldCentral() {
299
+ return $this->getDef( 'license_item_id_sc' );
300
  }
301
 
302
  /**
303
  * @return string
304
  */
305
  public function getLicenseItemName() {
306
+ return $this->isLicenseShieldCentral() ?
307
+ $this->getDef( 'license_item_name_sc' ) :
308
+ $this->getDef( 'license_item_name' );
309
  }
310
 
311
  /**
312
  * @return string
313
  */
314
  public function getLicenseStoreUrl() {
315
+ return $this->getDef( 'license_store_url' );
316
  }
317
 
318
  /**
329
  return $this->getOpt( 'license_last_checked_at' );
330
  }
331
 
332
+ /**
333
+ * @return int
334
+ */
335
+ protected function getLicenseVerifiedAt() {
336
+ return $this->getOpt( 'license_verified_at' );
337
+ }
338
+
339
  /**
340
  * @return string
341
  */
369
  * @return bool
370
  */
371
  public function isLicenseShieldCentral() {
372
+ return $this->getOpt( 'is_shield_central', false );
373
  }
374
 
375
  /**
383
  * @return bool
384
  */
385
  protected function isLicenseExpired() {
386
+ return ( $this->getLicenseExpiresAt() < $this->loadDP()->time() );
 
 
 
 
 
 
 
 
 
387
  }
388
 
389
  /**
390
+ * IMPORTANT: Method used by Shield Central. Modify with care.
391
+ *
392
  * We test various data points:
393
  * 1) the key is valid format
394
  * 2) the official license status is 'valid'
398
  * @return bool
399
  */
400
  public function hasValidWorkingLicense() {
401
+ return ( $this->isKeyless() || $this->isLicenseKeyValidFormat() )
402
+ && $this->isOfficialLicenseStatusValid() && $this->isLicenseActive() && !$this->isLicenseExpired();
403
+ }
404
+
405
+ /**
406
+ * @return bool
407
+ */
408
+ protected function isKeyless() {
409
+ return (bool)$this->getDef( 'keyless' );
410
+ }
411
+
412
+ /**
413
+ * Expires between 2 and 3 days.
414
+ * @return bool
415
+ */
416
+ protected function isLastVerifiedExpired() {
417
+ return ( $this->loadDP()->time() - $this->getLicenseVerifiedAt()
418
+ > $this->getDef( 'lic_verify_expire_days' )*DAY_IN_SECONDS );
419
+ }
420
+
421
+ /**
422
+ * @return bool
423
+ */
424
+ protected function isLastVerifiedGraceExpired() {
425
+ $nGracePeriod = ( $this->getDef( 'lic_verify_expire_days' ) + $this->getDef( 'lic_verify_expire_grace_days' ) )
426
+ *DAY_IN_SECONDS;
427
+ return $this->loadDP()->time() - $this->getLicenseVerifiedAt() > $nGracePeriod;
428
  }
429
 
430
  /**
435
  return $this->setOpt( 'license_registered_email', $sEmail );
436
  }
437
 
438
+ /**
439
+ * @param int $nAt
440
+ * @return $this
441
+ */
442
+ protected function setLicenseLastCheckedAt( $nAt = null ) {
443
+ return $this->setOptAt( 'license_last_checked_at', $nAt );
444
+ }
445
+
446
+ /**
447
+ * @param int $nAt
448
+ * @return $this
449
+ */
450
+ protected function setLicenseVerifiedAt( $nAt = null ) {
451
+ return $this->setOptAt( 'license_verified_at', $nAt );
452
+ }
453
+
454
  /**
455
  * @param string $sKey
456
  * @return string|null
460
 
461
  $sKey = $this->cleanLicenseKey( $sKey );
462
  $bValid = !empty( $sKey ) && is_string( $sKey )
463
+ && ( strlen( $sKey ) == $this->getDef( 'license_key_length' ) );
464
 
465
  if ( $bValid ) {
466
+ switch ( $this->getDef( 'license_key_type' ) ) {
467
  case 'alphanumeric':
468
  default:
469
  if ( preg_match( '#[^a-z0-9]#i', $sKey ) === 0 ) {
478
 
479
  protected function cleanLicenseKey( $sKey ) {
480
 
481
+ switch ( $this->getDef( 'license_key_type' ) ) {
482
  case 'alphanumeric':
483
  default:
484
  $sKey = preg_replace( '#[^a-z0-9]#i', '', $sKey );
501
  // clean the key.
502
  $sLicKey = $this->getLicenseKey();
503
  if ( strlen( $sLicKey ) > 0 ) {
504
+ switch ( $this->getDef( 'license_key_type' ) ) {
505
  case 'alphanumeric':
506
  default:
507
  $this->setOpt( 'license_key', preg_replace( '#[^a-z0-9]#i', '', $sLicKey ) );
510
  }
511
  }
512
 
513
+ /**
514
+ * @return int
515
+ */
516
+ public function getKeylessRequestAt() {
517
+ return (int)$this->getOpt( 'keyless_request_at', 0 );
518
+ }
519
+
520
+ /**
521
+ * @return string
522
+ */
523
+ public function getKeylessRequestHash() {
524
+ return (string)$this->getOpt( 'keyless_request_hash', '' );
525
+ }
526
+
527
+ /**
528
+ * @return bool
529
+ */
530
+ public function isKeylessHandshakeExpired() {
531
+ return ( $this->loadDP()->time() - $this->getKeylessRequestAt() )
532
+ > $this->getDef( 'keyless_handshake_expire' );
533
+ }
534
+
535
+ /**
536
+ * @param string $sHash
537
+ * @return $this
538
+ */
539
+ public function setKeylessRequestHash( $sHash ) {
540
+ return $this->setOpt( 'keyless_request_hash', $sHash );
541
+ }
542
+
543
+ /**
544
+ * @param int|null $nTime
545
+ * @return $this
546
+ */
547
+ public function setKeylessRequestAt( $nTime = null ) {
548
+ $nTime = is_numeric( $nTime ) ? $nTime : $this->loadDP()->time();
549
+ return $this->setOpt( 'keyless_request_at', $nTime );
550
+ }
551
+
552
  /**
553
  * Hooked to the plugin's main plugin_shutdown action
554
  */
555
  public function action_doFeatureShutdown() {
556
+ $this->verifyLicense( false );
 
 
 
557
  parent::action_doFeatureShutdown();
558
  }
559
 
src/features/login_protect.php CHANGED
@@ -45,13 +45,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
45
  return $this->getOptIs( 'use_login_intent_page', true );
46
  }
47
 
48
- /**
49
- * @return bool
50
- */
51
- public function getIfSupport3rdParty() {
52
- return $this->isPremium();
53
- }
54
-
55
  protected function doExtraSubmitProcessing() {
56
  /**
57
  * $oWp = $this->loadWpFunctionsProcessor();
45
  return $this->getOptIs( 'use_login_intent_page', true );
46
  }
47
 
 
 
 
 
 
 
 
48
  protected function doExtraSubmitProcessing() {
49
  /**
50
  * $oWp = $this->loadWpFunctionsProcessor();
src/features/plugin.php CHANGED
@@ -13,10 +13,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
13
  add_filter( $this->prefix( 'report_email_address' ), array( $this, 'getPluginReportEmail' ) );
14
  add_filter( $this->prefix( 'globally_disabled' ), array( $this, 'filter_IsPluginGloballyDisabled' ) );
15
  add_filter( $this->prefix( 'google_recaptcha_config' ), array( $this, 'supplyGoogleRecaptchaConfig' ), 10, 0 );
16
-
17
- if ( !$this->isTrackingPermissionSet() ) {
18
- add_action( 'wp_ajax_icwp_PluginTrackingPermission', array( $this, 'ajaxSetPluginTrackingPermission' ) );
19
- }
20
  $this->setVisitorIp();
21
  }
22
 
@@ -163,10 +159,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
163
  return $this->getVisitorAddressSource() == 'AUTO_DETECT_IP';
164
  }
165
 
166
- protected function frontEndAjaxHandlers() {
167
- add_action( $this->prefixWpAjax( 'PluginBadgeClose' ), array( $this, 'ajaxPluginBadgeClose' ) );
168
- }
169
-
170
  /**
171
  * @return string
172
  */
@@ -175,24 +167,49 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
175
  }
176
 
177
  /**
 
 
178
  */
179
- public function ajaxPluginBadgeClose() {
180
- $bSuccess = $this->loadDataProcessor()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  ->setCookie(
182
  $this->getCookieIdBadgeState(),
183
  'closed',
184
  DAY_IN_SECONDS
185
  );
186
  $sMessage = $bSuccess ? 'Badge Closed' : 'Badge Not Closed';
187
- $this->sendAjaxResponse( $bSuccess, array( 'message' => $sMessage ) );
 
 
 
188
  }
189
 
190
- public function ajaxSetPluginTrackingPermission() {
191
- $bValid = self::getConn()->getIsValidAdminArea() && $this->checkAjaxNonce();
192
- if ( $bValid ) {
193
- $this->setPluginTrackingPermission( (bool)$this->loadDP()->query( 'agree', false ) );
194
- }
195
- $this->sendAjaxResponse( $bValid );
196
  }
197
 
198
  /**
@@ -588,10 +605,16 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
588
  */
589
  public function renderPluginBadge() {
590
  $oCon = $this->getConn();
 
 
 
 
 
 
591
  $sContents = $this->loadRenderer( $oCon->getPath_Templates() )
592
  ->setTemplateEnginePhp()
593
  ->clearRenderVars()
594
- ->setRenderVars( $this->getBaseAjaxActionRenderData( 'PluginBadgeClose' ) )
595
  ->setTemplate( 'snippets/plugin_badge' )
596
  ->render();
597
 
13
  add_filter( $this->prefix( 'report_email_address' ), array( $this, 'getPluginReportEmail' ) );
14
  add_filter( $this->prefix( 'globally_disabled' ), array( $this, 'filter_IsPluginGloballyDisabled' ) );
15
  add_filter( $this->prefix( 'google_recaptcha_config' ), array( $this, 'supplyGoogleRecaptchaConfig' ), 10, 0 );
 
 
 
 
16
  $this->setVisitorIp();
17
  }
18
 
159
  return $this->getVisitorAddressSource() == 'AUTO_DETECT_IP';
160
  }
161
 
 
 
 
 
162
  /**
163
  * @return string
164
  */
167
  }
168
 
169
  /**
170
+ * @param array $aAjaxResponse
171
+ * @return array
172
  */
173
+ public function handleAjax( $aAjaxResponse ) {
174
+
175
+ if ( empty( $aAjaxResponse ) ) {
176
+ switch ( $this->loadDP()->request( 'exec' ) ) {
177
+ case 'plugin_badge_close':
178
+ $aAjaxResponse = $this->ajaxExec_PluginBadgeClose();
179
+ break;
180
+ case 'set_plugin_tracking_perm':
181
+ if ( !$this->isTrackingPermissionSet() ) {
182
+ $aAjaxResponse = $this->ajaxExec_SetPluginTrackingPerm();
183
+ }
184
+ break;
185
+ }
186
+ }
187
+ return parent::handleAjax( $aAjaxResponse );
188
+ }
189
+
190
+ /**
191
+ * @return array
192
+ */
193
+ public function ajaxExec_PluginBadgeClose() {
194
+ $bSuccess = $this->loadDP()
195
  ->setCookie(
196
  $this->getCookieIdBadgeState(),
197
  'closed',
198
  DAY_IN_SECONDS
199
  );
200
  $sMessage = $bSuccess ? 'Badge Closed' : 'Badge Not Closed';
201
+ return array(
202
+ 'success' => $bSuccess,
203
+ 'message' => $sMessage
204
+ );
205
  }
206
 
207
+ /**
208
+ * @return array
209
+ */
210
+ public function ajaxExec_SetPluginTrackingPerm() {
211
+ $this->setPluginTrackingPermission( (bool)$this->loadDP()->query( 'agree', false ) );
212
+ return array( 'success' => true );
213
  }
214
 
215
  /**
605
  */
606
  public function renderPluginBadge() {
607
  $oCon = $this->getConn();
608
+
609
+ $aData = array(
610
+ 'ajax' => array(
611
+ 'plugin_badge_close' => $this->getAjaxActionData( 'plugin_badge_close', true ),
612
+ )
613
+ );
614
  $sContents = $this->loadRenderer( $oCon->getPath_Templates() )
615
  ->setTemplateEnginePhp()
616
  ->clearRenderVars()
617
+ ->setRenderVars( $aData )
618
  ->setTemplate( 'snippets/plugin_badge' )
619
  ->render();
620
 
src/features/sessions.php CHANGED
@@ -12,8 +12,8 @@ class ICWP_WPSF_FeatureHandler_Sessions extends ICWP_WPSF_FeatureHandler_BaseWps
12
  * Override this and adapt per feature
13
  * @return ICWP_WPSF_Processor_Base
14
  */
15
- protected function loadFeatureProcessor() {
16
- $oP = parent::loadFeatureProcessor();
17
  self::$oSessProcessor = $oP;
18
  return $oP;
19
  }
12
  * Override this and adapt per feature
13
  * @return ICWP_WPSF_Processor_Base
14
  */
15
+ protected function loadProcessor() {
16
+ $oP = parent::loadProcessor();
17
  self::$oSessProcessor = $oP;
18
  return $oP;
19
  }
src/features/user_management.php CHANGED
@@ -8,17 +8,6 @@ require_once( dirname( __FILE__ ).'/base_wpsf.php' );
8
 
9
  class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_BaseWpsf {
10
 
11
- /**
12
- * TODO: remove on next release
13
- */
14
- protected function updateHandler() {
15
- $oDb = $this->loadDbProcessor();
16
- $sDbName = $oDb->getPrefix().$this->prefix( 'user_management', '_' );
17
- if ( $oDb->getIfTableExists( $sDbName ) ) {
18
- $oDb->doDropTable( $sDbName );
19
- }
20
- }
21
-
22
  /**
23
  * @return array
24
  */
@@ -52,8 +41,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_B
52
 
53
  return array(
54
  'strings' => $this->getDisplayStrings(),
55
- 'time_now' => sprintf( _wpsf__( 'now: %s' ), date_i18n( $sTimeFormat.' '.$sDateFormat, $this->loadDP()
56
- ->time() ) ),
57
  'sUserSessionsTable' => $sUserSessionsTable
58
  );
59
  }
@@ -64,7 +52,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_B
64
  protected function getTableRendererForSessions() {
65
  $this->requireCommonLib( 'Components/Tables/SessionsTable.php' );
66
  /** @var ICWP_WPSF_Processor_UserManagement $oProc */
67
- $oProc = $this->loadFeatureProcessor();
68
  // $nCount = $oProc->countAuditEntriesForContext( $sContext );
69
 
70
  $oTable = new SessionsTable();
@@ -150,6 +138,71 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_B
150
  return $this->loadDP()->validEmail( $this->getOpt( 'enable_admin_login_email_notification' ) );
151
  }
152
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  /**
154
  * @param array $aOptionsParams
155
  * @return array
@@ -169,6 +222,16 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_B
169
  $sTitleShort = sprintf( _wpsf__( '%s/%s Module' ), _wpsf__( 'Enable' ), _wpsf__( 'Disable' ) );
170
  break;
171
 
 
 
 
 
 
 
 
 
 
 
172
  case 'section_admin_login_notification' :
173
  $sTitle = _wpsf__( 'Admin Login Notification' );
174
  $aSummary = array(
@@ -258,6 +321,45 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_B
258
  .'<br />'._wpsf__( "Zero (0) will allow unlimited simultaneous sessions." );
259
  break;
260
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  default:
262
  throw new Exception( sprintf( 'An option has been defined but without strings assigned to it. Option key: "%s".', $sKey ) );
263
  }
8
 
9
  class ICWP_WPSF_FeatureHandler_UserManagement extends ICWP_WPSF_FeatureHandler_BaseWpsf {
10
 
 
 
 
 
 
 
 
 
 
 
 
11
  /**
12
  * @return array
13
  */
41
 
42
  return array(
43
  'strings' => $this->getDisplayStrings(),
44
+ 'time_now' => sprintf( _wpsf__( 'now: %s' ), date_i18n( $sTimeFormat.' '.$sDateFormat, $this->loadDP()->time() ) ),
 
45
  'sUserSessionsTable' => $sUserSessionsTable
46
  );
47
  }
52
  protected function getTableRendererForSessions() {
53
  $this->requireCommonLib( 'Components/Tables/SessionsTable.php' );
54
  /** @var ICWP_WPSF_Processor_UserManagement $oProc */
55
+ $oProc = $this->loadProcessor();
56
  // $nCount = $oProc->countAuditEntriesForContext( $sContext );
57
 
58
  $oTable = new SessionsTable();
138
  return $this->loadDP()->validEmail( $this->getOpt( 'enable_admin_login_email_notification' ) );
139
  }
140
 
141
+ /**
142
+ * @return int days
143
+ */
144
+ public function getPassExpireDays() {
145
+ return max( 0, (int)$this->getOpt( 'pass_expire' ) );
146
+ }
147
+
148
+ /**
149
+ * @return int seconds
150
+ */
151
+ public function getPassExpireTimeout() {
152
+ return $this->isPremium() ? $this->getPassExpireDays()*DAY_IN_SECONDS : 0;
153
+ }
154
+
155
+ /**
156
+ * @return int
157
+ */
158
+ public function getPassMinLength() {
159
+ return $this->isPremium() ? (int)$this->getOpt( 'pass_min_length' ) : 0;
160
+ }
161
+
162
+ /**
163
+ * @return int
164
+ */
165
+ public function getPassMinStrength() {
166
+ return $this->isPremium() ? (int)$this->getOpt( 'pass_min_strength' ) : 0;
167
+ }
168
+
169
+ /**
170
+ * @param int $nStrength
171
+ * @return int
172
+ */
173
+ public function getPassStrengthName( $nStrength ) {
174
+ $aMap = array(
175
+ _wpsf__( 'Very Weak' ),
176
+ _wpsf__( 'Weak' ),
177
+ _wpsf__( 'Medium' ),
178
+ _wpsf__( 'Strong' ),
179
+ _wpsf__( 'Very Strong' ),
180
+ );
181
+ return $aMap[ max( 0, min( 4, $nStrength ) ) ];
182
+ }
183
+
184
+ /**
185
+ * @return bool
186
+ */
187
+ public function isPasswordPoliciesEnabled() {
188
+ return $this->getOptIs( 'enable_password_policies', 'Y' )
189
+ && $this->getOptionsVo()->isOptReqsMet( 'enable_password_policies' );
190
+ }
191
+
192
+ /**
193
+ * @return bool
194
+ */
195
+ public function isPassForceUpdateExisting() {
196
+ return $this->getOptIs( 'pass_force_existing', 'Y' );
197
+ }
198
+
199
+ /**
200
+ * @return bool
201
+ */
202
+ public function isPassPreventPwned() {
203
+ return $this->getOptIs( 'pass_prevent_pwned', 'Y' );
204
+ }
205
+
206
  /**
207
  * @param array $aOptionsParams
208
  * @return array
222
  $sTitleShort = sprintf( _wpsf__( '%s/%s Module' ), _wpsf__( 'Enable' ), _wpsf__( 'Disable' ) );
223
  break;
224
 
225
+ case 'section_passwords' :
226
+ $sTitle = _wpsf__( 'Password Policies' );
227
+ $sTitleShort = _wpsf__( 'Password Policies' );
228
+ $aSummary = array(
229
+ sprintf( _wpsf__( 'Purpose - %s' ), _wpsf__( 'Have full control over passwords used by users on the site.' ) ),
230
+ sprintf( _wpsf__( 'Recommendation - %s' ), _wpsf__( 'Use of this feature is highly recommend.' ) ),
231
+ sprintf( _wpsf__( 'Note - %s' ), _wpsf__( 'Requires PHP v5.4 and above.' ) )
232
+ );
233
+ break;
234
+
235
  case 'section_admin_login_notification' :
236
  $sTitle = _wpsf__( 'Admin Login Notification' );
237
  $aSummary = array(
321
  .'<br />'._wpsf__( "Zero (0) will allow unlimited simultaneous sessions." );
322
  break;
323
 
324
+ case 'enable_password_policies' :
325
+ $sName = _wpsf__( 'Enable Password Policies' );
326
+ $sSummary = _wpsf__( 'Enable The Password Policies Detailed Below' );
327
+ $sDescription = _wpsf__( 'Turn on/off all password policy settings.' );
328
+ break;
329
+
330
+ case 'pass_prevent_pwned' :
331
+ $sName = _wpsf__( 'Prevent Pwned Passwords' );
332
+ $sSummary = _wpsf__( 'Prevent Use Of "Pwned" Passwords' );
333
+ $sDescription = _wpsf__( 'Prevents users from using any passwords found on the public available list of "pwned" passwords.' );
334
+ break;
335
+
336
+ case 'pass_min_length' :
337
+ $sName = _wpsf__( 'Minimum Length' );
338
+ $sSummary = _wpsf__( 'Minimum Password Length' );
339
+ $sDescription = _wpsf__( 'All passwords that a user sets must be at least this many characters in length.' )
340
+ .'<br/>'._wpsf__( 'Set to Zero(0) to disable.' );
341
+ break;
342
+
343
+ case 'pass_min_strength' :
344
+ $sName = _wpsf__( 'Minimum Strength' );
345
+ $sSummary = _wpsf__( 'Minimum Password Strength' );
346
+ $sDescription = _wpsf__( 'All passwords that a user sets must meet this minimum strength.' );
347
+ break;
348
+
349
+ case 'pass_force_existing' :
350
+ $sName = _wpsf__( 'Apply To Existing Users' );
351
+ $sSummary = _wpsf__( 'Apply Password Policies To Existing Users and Their Passwords' );
352
+ $sDescription = _wpsf__( "Forces existing users to update their passwords if they don't meet requirements, after they next login." )
353
+ .'<br/>'._wpsf__( 'Note: You may want to warn users prior to enabling this option.' );
354
+ break;
355
+
356
+ case 'pass_expire' :
357
+ $sName = _wpsf__( 'Password Expiration' );
358
+ $sSummary = _wpsf__( 'Passwords Expire After This Many Days' );
359
+ $sDescription = _wpsf__( 'Users will be forced to reset their passwords after the number of days specified.' )
360
+ .'<br/>'._wpsf__( 'Set to Zero(0) to disable.' );
361
+ break;
362
+
363
  default:
364
  throw new Exception( sprintf( 'An option has been defined but without strings assigned to it. Option key: "%s".', $sKey ) );
365
  }
src/processors/admin_access_restriction.php CHANGED
@@ -46,6 +46,30 @@ class ICWP_WPSF_Processor_AdminAccessRestriction extends ICWP_WPSF_Processor_Bas
46
  }
47
 
48
  add_action( 'admin_footer', array( $this, 'printAdminAccessAjaxForm' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  }
50
 
51
  /**
@@ -421,13 +445,15 @@ class ICWP_WPSF_Processor_AdminAccessRestriction extends ICWP_WPSF_Processor_Bas
421
  'editing_restricted' => _wpsf__( 'Editing this option is currently restricted.' ),
422
  'unlock_link' => $this->getUnlockLinkHtml(),
423
  ),
424
- 'sAjaxNonce' => wp_create_nonce( 'icwp_ajax' ),
425
  'js_snippets' => array(
426
  'options_to_restrict' => "'".implode( "','", $oFO->getOptionsToRestrict() )."'",
 
 
 
427
  )
428
  );
429
  add_thickbox();
430
- echo $oFO->renderTemplate( 'snippets'.DIRECTORY_SEPARATOR.'admin_access_login_box.php', $aRenderData );
431
  }
432
 
433
  /**
46
  }
47
 
48
  add_action( 'admin_footer', array( $this, 'printAdminAccessAjaxForm' ) );
49
+
50
+ if ( $oFO->isWlEnabled() ) {
51
+ $this->runWhiteLabel();
52
+ }
53
+ }
54
+
55
+ /**
56
+ */
57
+ protected function runWhiteLabel() {
58
+ $this->getSubProcessorWhitelabel()
59
+ ->run();
60
+ }
61
+
62
+ /**
63
+ * @return ICWP_WPSF_Processor_AdminAccess_Whitelabel
64
+ */
65
+ protected function getSubProcessorWhitelabel() {
66
+ $oProc = $this->getSubProcessor( 'checksum' );
67
+ if ( is_null( $oProc ) ) {
68
+ require_once( dirname( __FILE__ ).'/adminaccess_whitelabel.php' );
69
+ $oProc = new ICWP_WPSF_Processor_AdminAccess_Whitelabel( $this->getFeature() );
70
+ $this->aSubProcessors[ 'wl' ] = $oProc;
71
+ }
72
+ return $oProc;
73
  }
74
 
75
  /**
445
  'editing_restricted' => _wpsf__( 'Editing this option is currently restricted.' ),
446
  'unlock_link' => $this->getUnlockLinkHtml(),
447
  ),
 
448
  'js_snippets' => array(
449
  'options_to_restrict' => "'".implode( "','", $oFO->getOptionsToRestrict() )."'",
450
+ ),
451
+ 'ajax' => array(
452
+ 'sec_admin_login_box' => $oFO->getAjaxActionData( 'sec_admin_login_box', true )
453
  )
454
  );
455
  add_thickbox();
456
+ echo $oFO->renderTemplate( 'snippets/admin_access_login_box.php', $aRenderData );
457
  }
458
 
459
  /**
src/processors/adminaccess_whitelabel.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( class_exists( 'ICWP_WPSF_Processor_AdminAccess_Whitelabel', false ) ) {
4
+ return;
5
+ }
6
+
7
+ require_once( dirname( __FILE__ ).'/base_wpsf.php' );
8
+
9
+ class ICWP_WPSF_Processor_AdminAccess_Whitelabel extends ICWP_WPSF_Processor_BaseWpsf {
10
+
11
+ /**
12
+ */
13
+ public function run() {
14
+ /** @var ICWP_WPSF_FeatureHandler_AdminAccessRestriction $oFO */
15
+ $oFO = $this->getFeature();
16
+ add_filter( $this->getController()->prefix( 'plugin_labels' ), array( $this, 'doRelabelPlugin' ) );
17
+ add_filter( 'plugin_row_meta', array( $this, 'fRemoveDetailsMetaLink' ), 200, 2 );
18
+ if ( $oFO->isWlHideUpdates() && $this->isNeedToHideUpdates() ) {
19
+ add_filter( 'site_transient_update_plugins', array( $this, 'hidePluginUpdatesFromUI' ) );
20
+ }
21
+ add_action( 'admin_print_footer_scripts-plugin-editor.php', array( $this, 'hideFromPluginEditor' ) );
22
+ }
23
+
24
+ public function hideFromPluginEditor() {
25
+ $oCon = $this->getController();
26
+ $sJs = $this->loadDP()->readFileContentsUsingInclude( $oCon->getPath_AssetJs( 'whitelabel.js' ) );
27
+ echo sprintf( '<script type="text/javascript">%s</script>', sprintf( $sJs, $oCon->getPluginBaseFile() ) );
28
+ }
29
+
30
+ /**
31
+ * @param array $aPluginLabels
32
+ * @return array
33
+ */
34
+ public function doRelabelPlugin( $aPluginLabels ) {
35
+ /** @var ICWP_WPSF_FeatureHandler_AdminAccessRestriction $oFO */
36
+ $oFO = $this->getFeature();
37
+
38
+ $aWhiteLabels = $oFO->getWhitelabelOptions();
39
+
40
+ // these are the old white labelling keys which will be replaced upon final release of white labelling.
41
+ $sServiceName = $aWhiteLabels[ 'name_main' ];
42
+ if ( !empty( $sServiceName ) ) {
43
+ $aPluginLabels[ 'Name' ] = $sServiceName;
44
+ $aPluginLabels[ 'Title' ] = $sServiceName;
45
+ $aPluginLabels[ 'Author' ] = $sServiceName;
46
+ $aPluginLabels[ 'AuthorName' ] = $sServiceName;
47
+ $aPluginLabels[ 'MenuTitle' ] = $aWhiteLabels[ 'name_menu' ];
48
+ }
49
+ $sTagLine = $aWhiteLabels[ 'description' ];
50
+ if ( !empty( $sTagLine ) ) {
51
+ $aPluginLabels[ 'Description' ] = $sTagLine;
52
+ }
53
+
54
+ $sUrl = $aWhiteLabels[ 'url_home' ];
55
+ if ( !empty( $sUrl ) ) {
56
+ $aPluginLabels[ 'PluginURI' ] = $sUrl;
57
+ $aPluginLabels[ 'AuthorURI' ] = $sUrl;
58
+ }
59
+
60
+ $sIconUrl = $aWhiteLabels[ 'url_icon' ];
61
+ if ( !empty( $sIcon16 ) ) {
62
+ $aPluginLabels[ 'icon_url_16x16' ] = $sIconUrl;
63
+ }
64
+
65
+ $sIcon32 = $this->getOption( 'icon_url_32x32' );
66
+ if ( !empty( $sIcon32 ) ) {
67
+ $aPluginLabels[ 'icon_url_32x32' ] = $sIconUrl;
68
+ }
69
+
70
+ return $aPluginLabels;
71
+ }
72
+
73
+ /**
74
+ * @filter
75
+ * @param array $aPluginMeta
76
+ * @param string $sPluginBaseFileName
77
+ * @return array
78
+ */
79
+ public function fRemoveDetailsMetaLink( $aPluginMeta, $sPluginBaseFileName ) {
80
+ if ( $sPluginBaseFileName == $this->getController()->getPluginBaseFile() ) {
81
+ unset( $aPluginMeta[ 2 ] ); // View details
82
+ unset( $aPluginMeta[ 3 ] ); // Rate 5*
83
+ }
84
+ return $aPluginMeta;
85
+ }
86
+
87
+ /**
88
+ * @param stdClass $oPlugins
89
+ * @return stdClass
90
+ */
91
+ public function hidePluginUpdatesFromUI( $oPlugins ) {
92
+ $oCon = $this->getController();
93
+
94
+ if ( !$oCon->getHasPermissionToManage() ) {
95
+ $sFile = $oCon->getPluginBaseFile();
96
+ if ( isset( $oPlugins->response[ $sFile ] ) ) {
97
+ unset( $oPlugins->response[ $sFile ] );
98
+ }
99
+ }
100
+ return $oPlugins;
101
+ }
102
+
103
+ /**
104
+ * @return bool
105
+ */
106
+ private function isNeedToHideUpdates() {
107
+ $oWp = $this->loadWp();
108
+ return is_admin() && !$oWp->isCron()
109
+ && ( in_array( $oWp->getCurrentPage(), array( 'plugins.php', 'update-core.php' ) ) );
110
+ }
111
+ }
src/processors/autoupdates.php CHANGED
@@ -505,14 +505,12 @@ class ICWP_WPSF_Processor_Autoupdates extends ICWP_WPSF_Processor_BaseWpsf {
505
  class="icwp-autoupdate-plugin"
506
  data-pluginfile="%s"
507
  data-disabled="%s"
508
- %s
509
- data-nonce="%s">
510
  <span class="slider"></span></label>',
511
  $bDisabled ? 'disabled' : '',
512
  $sPluginBaseFileName,
513
  $bDisabled ? _wpsf__( 'Automatic updates for this plugin is controlled by another plugin or setting.' ) : 'no',
514
- $bIsAutoupdate ? 'checked="checked"' : '',
515
- wp_create_nonce( 'icwp_ajax' )
516
  );
517
  }
518
 
505
  class="icwp-autoupdate-plugin"
506
  data-pluginfile="%s"
507
  data-disabled="%s"
508
+ %s />
 
509
  <span class="slider"></span></label>',
510
  $bDisabled ? 'disabled' : '',
511
  $sPluginBaseFileName,
512
  $bDisabled ? _wpsf__( 'Automatic updates for this plugin is controlled by another plugin or setting.' ) : 'no',
513
+ $bIsAutoupdate ? 'checked="checked"' : ''
 
514
  );
515
  }
516
 
src/processors/base.php CHANGED
@@ -106,7 +106,6 @@ abstract class ICWP_WPSF_Processor_Base extends ICWP_WPSF_Foundation {
106
  return false;
107
  }
108
  }
109
-
110
  return true;
111
  }
112
 
@@ -141,8 +140,11 @@ abstract class ICWP_WPSF_Processor_Base extends ICWP_WPSF_Foundation {
141
  return;
142
  }
143
 
 
 
 
144
  $oNotices = $this->loadAdminNoticesProcessor();
145
- if ( !$oNotices->isDismissed( $aAttrs[ 'id' ] ) ) {
146
 
147
  $sRenderedNotice = $this->getFeature()->renderAdminNotice( $aNoticeData );
148
  if ( !empty( $sRenderedNotice ) ) {
106
  return false;
107
  }
108
  }
 
109
  return true;
110
  }
111
 
140
  return;
141
  }
142
 
143
+ $bCantDismiss = isset( $aNoticeData[ 'notice_attributes' ][ 'can_dismiss' ] )
144
+ && !$aNoticeData[ 'notice_attributes' ][ 'can_dismiss' ];
145
+
146
  $oNotices = $this->loadAdminNoticesProcessor();
147
+ if ( !$oNotices->isDismissed( $aAttrs[ 'id' ] ) || $bCantDismiss ) {
148
 
149
  $sRenderedNotice = $this->getFeature()->renderAdminNotice( $aNoticeData );
150
  if ( !empty( $sRenderedNotice ) ) {
src/processors/base_plugin.php CHANGED
@@ -214,10 +214,6 @@ class ICWP_WPSF_Processor_BasePlugin extends ICWP_WPSF_Processor_BaseWpsf {
214
  return $bShow;
215
  }
216
 
217
- if ( $this->getInstallationDays() < 1 ) {
218
- $bShow = false;
219
- }
220
-
221
  $oWpFunctions = $this->loadWp();
222
  if ( class_exists( 'Worpit_Plugin' ) ) {
223
  if ( method_exists( 'Worpit_Plugin', 'IsLinked' ) ) {
214
  return $bShow;
215
  }
216
 
 
 
 
 
217
  $oWpFunctions = $this->loadWp();
218
  if ( class_exists( 'Worpit_Plugin' ) ) {
219
  if ( method_exists( 'Worpit_Plugin', 'IsLinked' ) ) {
src/processors/base_wpsf.php CHANGED
@@ -44,7 +44,7 @@ abstract class ICWP_WPSF_Processor_BaseWpsf extends ICWP_WPSF_Processor_Base {
44
  if ( empty( $nTimeInstalled ) ) {
45
  return 0;
46
  }
47
- return (int)round( ( $this->loadDataProcessor()->time() - $nTimeInstalled )/DAY_IN_SECONDS );
48
  }
49
 
50
  /**
@@ -60,7 +60,7 @@ abstract class ICWP_WPSF_Processor_BaseWpsf extends ICWP_WPSF_Processor_Base {
60
  * @return string
61
  */
62
  protected function getRecaptchaResponse() {
63
- return $this->loadDataProcessor()->FetchPost( 'g-recaptcha-response' );
64
  }
65
 
66
  /**
44
  if ( empty( $nTimeInstalled ) ) {
45
  return 0;
46
  }
47
+ return (int)round( ( $this->loadDP()->time() - $nTimeInstalled )/DAY_IN_SECONDS );
48
  }
49
 
50
  /**
60
  * @return string
61
  */
62
  protected function getRecaptchaResponse() {
63
+ return $this->loadDP()->post( 'g-recaptcha-response' );
64
  }
65
 
66
  /**
src/processors/basedb.php CHANGED
@@ -247,7 +247,7 @@ abstract class ICWP_WPSF_BaseDbProcessor extends ICWP_WPSF_Processor_BaseWpsf {
247
  * @return string
248
  */
249
  protected function getDbCleanupHookName() {
250
- return $this->getController()->doPluginPrefix( $this->getFeature()->getFeatureSlug() . '_db_cleanup' );
251
  }
252
 
253
  /**
247
  * @return string
248
  */
249
  protected function getDbCleanupHookName() {
250
+ return $this->getController()->prefix( $this->getFeature()->getFeatureSlug().'_db_cleanup' );
251
  }
252
 
253
  /**
src/processors/hackprotect_corechecksumscan.php CHANGED
@@ -16,31 +16,25 @@ class ICWP_WPSF_Processor_HackProtect_CoreChecksumScan extends ICWP_WPSF_Process
16
  if ( $this->loadWpUsers()->isUserAdmin() ) {
17
  $oDp = $this->loadDP();
18
 
19
- if ( $oDp->query( 'force_checksumscan' ) == 1 ) {
20
- $this->cron_dailyChecksumScan();
21
- }
22
- else {
23
- $sAction = $oDp->query( 'shield_action' );
24
- switch ( $sAction ) {
25
-
26
- case 'repair_file':
27
- $sPath = '/'.trim( $oDp->FetchGet( 'repair_file_path' ) ); // "/" prevents esc_url() from prepending http.
28
- $sMd5FilePath = urldecode( esc_url( $sPath ) );
29
- if ( !empty( $sMd5FilePath ) ) {
30
- if ( $this->repairCoreFile( $sMd5FilePath ) ) {
31
- $this->loadAdminNoticesProcessor()
32
- ->addFlashMessage(
33
- _wpsf__( 'File was successfully replaced with an original from WordPress.org' )
34
- );
35
- }
36
- else {
37
- $this->loadAdminNoticesProcessor()
38
- ->addFlashMessage(
39
- _wpsf__( 'File was not replaced' )
40
- );
41
- }
42
  }
43
- }
 
 
 
 
 
 
44
  }
45
  }
46
  }
@@ -120,6 +114,10 @@ class ICWP_WPSF_Processor_HackProtect_CoreChecksumScan extends ICWP_WPSF_Process
120
  }
121
  }
122
 
 
 
 
 
123
  return $aDiscoveredFiles;
124
  }
125
 
16
  if ( $this->loadWpUsers()->isUserAdmin() ) {
17
  $oDp = $this->loadDP();
18
 
19
+ switch ( $oDp->query( 'shield_action' ) ) {
20
+
21
+ case 'repair_file':
22
+ $sPath = '/'.trim( $oDp->query( 'repair_file_path' ) ); // "/" prevents esc_url() from prepending http.
23
+ $sMd5FilePath = urldecode( esc_url( $sPath ) );
24
+ if ( !empty( $sMd5FilePath ) ) {
25
+ if ( $this->repairCoreFile( $sMd5FilePath ) ) {
26
+ $this->loadAdminNoticesProcessor()
27
+ ->addFlashMessage(
28
+ _wpsf__( 'File was successfully replaced with an original from WordPress.org' )
29
+ );
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
31
+ else {
32
+ $this->loadAdminNoticesProcessor()
33
+ ->addFlashMessage(
34
+ _wpsf__( 'File was not replaced' )
35
+ );
36
+ }
37
+ }
38
  }
39
  }
40
  }
114
  }
115
  }
116
 
117
+ /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
118
+ $oFO = $this->getFeature();
119
+ $oFO->setLastScanAt( 'wcf' );
120
+
121
  return $aDiscoveredFiles;
122
  }
123
 
src/processors/hackprotect_filecleanerscan.php CHANGED
@@ -21,15 +21,10 @@ class ICWP_WPSF_Processor_HackProtect_FileCleanerScan extends ICWP_WPSF_Processo
21
  if ( $this->loadWpUsers()->isUserAdmin() ) {
22
  $oDp = $this->loadDP();
23
 
24
- if ( $oDp->query( 'force_filecleanscan' ) == 1 ) {
25
- $this->runScan();
26
- }
27
- else {
28
- $sAction = $oDp->query( 'shield_action' );
29
- switch ( $sAction ) {
30
- case 'delete_unrecognised_file':
31
- $sPath = '/'.trim( $oDp->FetchGet( 'repair_file_path' ) ); // "/" prevents esc_url() from prepending http.
32
- }
33
  }
34
  }
35
  }
@@ -189,6 +184,7 @@ class ICWP_WPSF_Processor_HackProtect_FileCleanerScan extends ICWP_WPSF_Processo
189
  public function runScan() {
190
  /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
191
  $oFO = $this->getFeature();
 
192
  $aDiscoveredFiles = $this->discoverFiles();
193
  if ( !empty( $aDiscoveredFiles ) ) {
194
  if ( $oFO->isUfcDeleteFiles() ) {
@@ -206,6 +202,7 @@ class ICWP_WPSF_Processor_HackProtect_FileCleanerScan extends ICWP_WPSF_Processo
206
  public function discoverFiles() {
207
  /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
208
  $oFO = $this->getFeature();
 
209
 
210
  $aDiscoveredFiles = $this->scanCore();
211
  if ( $oFO->isUfsScanUploads() ) {
21
  if ( $this->loadWpUsers()->isUserAdmin() ) {
22
  $oDp = $this->loadDP();
23
 
24
+ switch ( $oDp->query( 'shield_action' ) ) {
25
+ case 'delete_unrecognised_file':
26
+ $sPath = '/'.trim( $oDp->query( 'repair_file_path' ) ); // "/" prevents esc_url() from prepending http.
27
+ break;
 
 
 
 
 
28
  }
29
  }
30
  }
184
  public function runScan() {
185
  /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
186
  $oFO = $this->getFeature();
187
+
188
  $aDiscoveredFiles = $this->discoverFiles();
189
  if ( !empty( $aDiscoveredFiles ) ) {
190
  if ( $oFO->isUfcDeleteFiles() ) {
202
  public function discoverFiles() {
203
  /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
204
  $oFO = $this->getFeature();
205
+ $oFO->setLastScanAt( 'ufc' );
206
 
207
  $aDiscoveredFiles = $this->scanCore();
208
  if ( $oFO->isUfsScanUploads() ) {
src/processors/hackprotect_ptguard.php CHANGED
@@ -551,6 +551,9 @@ class ICWP_WPSF_Processor_HackProtect_PTGuard extends ICWP_WPSF_Processor_CronBa
551
  * @return array[][] - keys are slugs
552
  */
553
  protected function runSnapshotScan( $sContext = self::CONTEXT_PLUGINS ) {
 
 
 
554
 
555
  $aResults = array();
556
 
551
  * @return array[][] - keys are slugs
552
  */
553
  protected function runSnapshotScan( $sContext = self::CONTEXT_PLUGINS ) {
554
+ /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
555
+ $oFO = $this->getFeature();
556
+ $oFO->setLastScanAt( 'ptg' );
557
 
558
  $aResults = array();
559
 
src/processors/hackprotect_wpvulnscan.php CHANGED
@@ -32,11 +32,6 @@ class ICWP_WPSF_Processor_HackProtect_WpVulnScan extends ICWP_WPSF_Processor_Bas
32
  */
33
  public function run() {
34
 
35
- if ( $this->loadDP()->FetchGet( 'force_wpvulnscan' ) == 1 ) {
36
- $this->scanPlugins();
37
- die();
38
- }
39
-
40
  // For display on the Plugins page
41
  add_action( 'admin_init', array( $this, 'addPluginVulnerabilityRows' ), 10, 2 );
42
 
@@ -95,7 +90,7 @@ class ICWP_WPSF_Processor_HackProtect_WpVulnScan extends ICWP_WPSF_Processor_Bas
95
  }
96
 
97
  public function addVulnerablePluginStatusView() {
98
- if ( $this->loadDP()->FetchGet( 'plugin_status' ) == 'vulnerable' ) {
99
  global $status;
100
  $status = 'vulnerable';
101
  }
@@ -125,7 +120,7 @@ class ICWP_WPSF_Processor_HackProtect_WpVulnScan extends ICWP_WPSF_Processor_Bas
125
  * @return array
126
  */
127
  public function filterPluginsToView( $aPlugins ) {
128
- if ( $this->loadDP()->FetchGet( 'plugin_status' ) == 'vulnerable' ) {
129
  global $status;
130
  $status = 'vulnerable';
131
  $aPlugins = array_intersect_key( $aPlugins, $this->getVulnerablePlugins() );
@@ -235,6 +230,10 @@ class ICWP_WPSF_Processor_HackProtect_WpVulnScan extends ICWP_WPSF_Processor_Bas
235
  }
236
 
237
  public function cron_dailyWpVulnScan() {
 
 
 
 
238
  $this->scanPlugins();
239
  $this->scanThemes();
240
  }
32
  */
33
  public function run() {
34
 
 
 
 
 
 
35
  // For display on the Plugins page
36
  add_action( 'admin_init', array( $this, 'addPluginVulnerabilityRows' ), 10, 2 );
37
 
90
  }
91
 
92
  public function addVulnerablePluginStatusView() {
93
+ if ( $this->loadDP()->query( 'plugin_status' ) == 'vulnerable' ) {
94
  global $status;
95
  $status = 'vulnerable';
96
  }
120
  * @return array
121
  */
122
  public function filterPluginsToView( $aPlugins ) {
123
+ if ( $this->loadDP()->query( 'plugin_status' ) == 'vulnerable' ) {
124
  global $status;
125
  $status = 'vulnerable';
126
  $aPlugins = array_intersect_key( $aPlugins, $this->getVulnerablePlugins() );
230
  }
231
 
232
  public function cron_dailyWpVulnScan() {
233
+ /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
234
+ $oFO = $this->getFeature();
235
+ $oFO->setLastScanAt( 'wpv' );
236
+
237
  $this->scanPlugins();
238
  $this->scanThemes();
239
  }
src/processors/license.php CHANGED
@@ -4,12 +4,38 @@ if ( class_exists( 'ICWP_WPSF_Processor_License' ) ) {
4
  return;
5
  }
6
 
7
- require_once( dirname( __FILE__ ).'/base.php' );
8
 
9
- class ICWP_WPSF_Processor_License extends ICWP_WPSF_Processor_Base {
10
 
11
  /**
12
  */
13
  public function run() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
  }
4
  return;
5
  }
6
 
7
+ require_once( dirname( __FILE__ ).'/base_wpsf.php' );
8
 
9
+ class ICWP_WPSF_Processor_License extends ICWP_WPSF_Processor_BaseWpsf {
10
 
11
  /**
12
  */
13
  public function run() {
14
+ /** @var ICWP_WPSF_FeatureHandler_License $oFO */
15
+ $oFO = $this->getFeature();
16
+ $oDp = $this->loadDP();
17
+
18
+ // performs the license check
19
+ add_action( $oFO->prefix( 'adhoc_cron_license_check' ), array( $oFO, 'verifyLicense' ) );
20
+
21
+ switch ( $oDp->query( 'shield_action' ) ) {
22
+
23
+ case 'keyless_handshake':
24
+ $sNonce = $oDp->query( 'nonce' );
25
+ if ( !empty( $sNonce ) && $sNonce == $oFO->getKeylessRequestHash() ) {
26
+ $aHandshakeData = array( 'success' => false );
27
+ if ( !$oFO->isKeylessHandshakeExpired() ) {
28
+ $aHandshakeData[ 'success' ] = true;
29
+ }
30
+ die( json_encode( $aHandshakeData ) );
31
+ }
32
+ break;
33
+
34
+ case 'license_check':
35
+ if ( !wp_next_scheduled( $oFO->prefix( 'license_check' ) ) ) {
36
+ wp_schedule_single_event( $oDp->time() + 12, $oFO->prefix( 'adhoc_cron_license_check' ) );
37
+ }
38
+ break;
39
+ }
40
  }
41
  }
src/processors/plugin.php CHANGED
@@ -119,12 +119,11 @@ class ICWP_WPSF_Processor_Plugin extends ICWP_WPSF_Processor_BasePlugin {
119
  'strings' => array(
120
  'tracking_data' => print_r( $this->getTrackingProcessor()->collectTrackingData(), true ),
121
  ),
122
- // 'sAjaxNonce' => wp_create_nonce( 'icwp_ajax' ),
123
- 'js_snippets' => array(// 'options_to_restrict' => "'".implode( "','", $oFO->getOptionsToRestrict() )."'",
124
  )
125
  );
126
  add_thickbox();
127
- echo $oFO->renderTemplate( 'snippets'.DIRECTORY_SEPARATOR.'plugin_tracking_data_dump.php', $aRenderData );
128
  }
129
 
130
  /**
119
  'strings' => array(
120
  'tracking_data' => print_r( $this->getTrackingProcessor()->collectTrackingData(), true ),
121
  ),
122
+ 'js_snippets' => array(
 
123
  )
124
  );
125
  add_thickbox();
126
+ echo $oFO->renderTemplate( 'snippets/plugin_tracking_data_dump.php', $aRenderData );
127
  }
128
 
129
  /**
src/processors/plugin_badgewidget.php CHANGED
@@ -72,7 +72,7 @@ class ICWP_WPSF_Processor_Plugin_BadgeWidget extends ICWP_WPSF_WpWidget {
72
  return self::$oFeatureOptions
73
  ->loadRenderer( $oCon->getPath_Templates().'php' )
74
  ->setRenderVars( $aData )
75
- ->setTemplate( 'snippets'.DIRECTORY_SEPARATOR.'plugin_badge_widget' )
76
  ->setTemplateEnginePhp()
77
  ->render();
78
  }
72
  return self::$oFeatureOptions
73
  ->loadRenderer( $oCon->getPath_Templates().'php' )
74
  ->setRenderVars( $aData )
75
+ ->setTemplate( 'snippets/plugin_badge_widget' )
76
  ->setTemplateEnginePhp()
77
  ->render();
78
  }
src/processors/plugin_tracking.php CHANGED
@@ -23,7 +23,6 @@ class ICWP_WPSF_Processor_Plugin_Tracking extends ICWP_WPSF_Processor_BasePlugin
23
  protected function addNotice_allow_tracking( $aNoticeAttributes ) {
24
  /** @var ICWP_WPSF_FeatureHandler_Plugin $oFO */
25
  $oFO = $this->getFeature();
26
-
27
  if ( $this->getIfShowAdminNotices() && !$oFO->isTrackingPermissionSet() ) {
28
  $oCon = $this->getController();
29
  $aRenderData = array(
@@ -39,6 +38,9 @@ class ICWP_WPSF_Processor_Plugin_Tracking extends ICWP_WPSF_Processor_BasePlugin
39
  'site_url' => 'translate.icontrolwp.com',
40
  'yes' => _wpsf__( 'Absolutely' )
41
  ),
 
 
 
42
  'hrefs' => array(
43
  'learn_more' => 'http://translate.icontrolwp.com',
44
  'link_to_see' => $oFO->getLinkToTrackingDataDump(),
23
  protected function addNotice_allow_tracking( $aNoticeAttributes ) {
24
  /** @var ICWP_WPSF_FeatureHandler_Plugin $oFO */
25
  $oFO = $this->getFeature();
 
26
  if ( $this->getIfShowAdminNotices() && !$oFO->isTrackingPermissionSet() ) {
27
  $oCon = $this->getController();
28
  $aRenderData = array(
38
  'site_url' => 'translate.icontrolwp.com',
39
  'yes' => _wpsf__( 'Absolutely' )
40
  ),
41
+ 'ajax' => array(
42
+ 'set_plugin_tracking_perm' => $oFO->getAjaxActionData( 'set_plugin_tracking_perm', true ),
43
+ ),
44
  'hrefs' => array(
45
  'learn_more' => 'http://translate.icontrolwp.com',
46
  'link_to_see' => $oFO->getLinkToTrackingDataDump(),
src/processors/user_management.php CHANGED
@@ -19,13 +19,19 @@ class ICWP_WPSF_Processor_UserManagement extends ICWP_WPSF_Processor_BaseWpsf {
19
  /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
20
  $oFO = $this->getFeature();
21
 
22
- // Adds last login indicator column to all plugins in plugin listing.
23
  add_filter( 'manage_users_columns', array( $this, 'fAddUserListLastLoginColumn' ) );
24
  add_filter( 'wpmu_users_columns', array( $this, 'fAddUserListLastLoginColumn' ) );
25
 
26
- // Handles login notification emails and setting last user login
27
  add_action( 'wp_login', array( $this, 'onWpLogin' ) );
28
 
 
 
 
 
 
 
29
  // XML-RPC Compatibility
30
  if ( $this->loadWp()->getIsXmlrpc() && $oFO->isXmlrpcBypass() ) {
31
  return;
@@ -37,6 +43,16 @@ class ICWP_WPSF_Processor_UserManagement extends ICWP_WPSF_Processor_BaseWpsf {
37
  }
38
  }
39
 
 
 
 
 
 
 
 
 
 
 
40
  /**
41
  * Hooked to action wp_login
42
  * @param $sUsername
@@ -44,6 +60,9 @@ class ICWP_WPSF_Processor_UserManagement extends ICWP_WPSF_Processor_BaseWpsf {
44
  public function onWpLogin( $sUsername ) {
45
  $oUser = $this->loadWpUsers()->getUserByUsername( $sUsername );
46
  if ( $oUser instanceof WP_User ) {
 
 
 
47
  /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
48
  $oFO = $this->getFeature();
49
  if ( $oFO->isSendEmailLoginNotification() ) {
@@ -53,12 +72,27 @@ class ICWP_WPSF_Processor_UserManagement extends ICWP_WPSF_Processor_BaseWpsf {
53
  }
54
  }
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  /**
57
  * @param WP_User $oUser
58
  * @return $this
59
  */
60
  protected function setUserLastLoginTime( $oUser ) {
61
- $oMeta = $this->loadWpUsers()->metaVoForUser( $this->prefix(), $oUser->ID );
62
  $oMeta->last_login_at = $this->time();
63
  return $this;
64
  }
@@ -168,6 +202,19 @@ class ICWP_WPSF_Processor_UserManagement extends ICWP_WPSF_Processor_BaseWpsf {
168
  );
169
  }
170
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  /**
172
  * @return ICWP_WPSF_Processor_UserManagement_Sessions
173
  */
@@ -193,6 +240,6 @@ class ICWP_WPSF_Processor_UserManagement extends ICWP_WPSF_Processor_BaseWpsf {
193
  * @return string
194
  */
195
  protected function getUserLastLoginKey() {
196
- return $this->getController()->doPluginOptionPrefix( 'last_login_at' );
197
  }
198
  }
19
  /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
20
  $oFO = $this->getFeature();
21
 
22
+ // Adds last login indicator column
23
  add_filter( 'manage_users_columns', array( $this, 'fAddUserListLastLoginColumn' ) );
24
  add_filter( 'wpmu_users_columns', array( $this, 'fAddUserListLastLoginColumn' ) );
25
 
26
+ add_action( 'init', array( $this, 'onWpInit' ) );
27
  add_action( 'wp_login', array( $this, 'onWpLogin' ) );
28
 
29
+ if ( $oFO->isPasswordPoliciesEnabled() ) {
30
+ $this->getProcessorPasswords()->run();
31
+ }
32
+
33
+ /** Everything from this point on must consider XMLRPC compatibility **/
34
+
35
  // XML-RPC Compatibility
36
  if ( $this->loadWp()->getIsXmlrpc() && $oFO->isXmlrpcBypass() ) {
37
  return;
43
  }
44
  }
45
 
46
+ /**
47
+ */
48
+ public function onWpInit() {
49
+ $oWpUsers = $this->loadWpUsers();
50
+ if ( $oWpUsers->isUserLoggedIn() ) {
51
+ $oUser = $oWpUsers->getCurrentWpUser();
52
+ $this->setPasswordStartedAt( $oUser ); // used by Password Policies
53
+ }
54
+ }
55
+
56
  /**
57
  * Hooked to action wp_login
58
  * @param $sUsername
60
  public function onWpLogin( $sUsername ) {
61
  $oUser = $this->loadWpUsers()->getUserByUsername( $sUsername );
62
  if ( $oUser instanceof WP_User ) {
63
+
64
+ $this->setPasswordStartedAt( $oUser ); // used by Password Policies
65
+
66
  /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
67
  $oFO = $this->getFeature();
68
  if ( $oFO->isSendEmailLoginNotification() ) {
72
  }
73
  }
74
 
75
+ /**
76
+ * @param WP_User $oUser
77
+ * @return $this
78
+ */
79
+ private function setPasswordStartedAt( $oUser ) {
80
+ $oMeta = $this->getFeature()->getUserMeta( $oUser );
81
+
82
+ $sCurrentPassHash = substr( sha1( $oUser->user_pass ), 6, 4 );
83
+ if ( !isset( $oMeta->pass_hash ) || ( $oMeta->pass_hash != $sCurrentPassHash ) ) {
84
+ $oMeta->pass_hash = $sCurrentPassHash;
85
+ $oMeta->pass_started_at = $this->time();
86
+ }
87
+ return $this;
88
+ }
89
+
90
  /**
91
  * @param WP_User $oUser
92
  * @return $this
93
  */
94
  protected function setUserLastLoginTime( $oUser ) {
95
+ $oMeta = $this->getFeature()->getUserMeta( $oUser );
96
  $oMeta->last_login_at = $this->time();
97
  return $this;
98
  }
202
  );
203
  }
204
 
205
+ /**
206
+ * @return ICWP_WPSF_Processor_UserManagement_Passwords
207
+ */
208
+ protected function getProcessorPasswords() {
209
+ $oProc = $this->getSubProcessor( 'passwords' );
210
+ if ( is_null( $oProc ) ) {
211
+ require_once( dirname( __FILE__ ).'/usermanagement_passwords.php' );
212
+ $oProc = new ICWP_WPSF_Processor_UserManagement_Passwords( $this->getFeature() );
213
+ $this->aSubProcessors[ 'passwords' ] = $oProc;
214
+ }
215
+ return $oProc;
216
+ }
217
+
218
  /**
219
  * @return ICWP_WPSF_Processor_UserManagement_Sessions
220
  */
240
  * @return string
241
  */
242
  protected function getUserLastLoginKey() {
243
+ return $this->getController()->prefixOption( 'last_login_at' );
244
  }
245
  }
src/processors/usermanagement_passwords.php ADDED
@@ -0,0 +1,337 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( class_exists( 'ICWP_WPSF_Processor_UserManagement_Passwords', false ) ) {
4
+ return;
5
+ }
6
+
7
+ require_once( dirname( __FILE__ ).'/base_wpsf.php' );
8
+
9
+ /**
10
+ * Referenced some of https://github.com/BenjaminNelan/PwnedPasswordChecker
11
+ * Class ICWP_WPSF_Processor_UserManagement_Pwned
12
+ */
13
+ class ICWP_WPSF_Processor_UserManagement_Passwords extends ICWP_WPSF_Processor_BaseWpsf {
14
+
15
+ public function run() {
16
+ add_filter( 'registration_errors', array( $this, 'checkPassword' ), 100, 3 );
17
+ add_action( 'user_profile_update_errors', array( $this, 'checkPassword' ), 100, 3 );
18
+ add_action( 'validate_password_reset', array( $this, 'checkPassword' ), 100, 3 );
19
+ add_action( 'wp_login', array( $this, 'onWpLogin' ) );
20
+ add_action( 'wp_loaded', array( $this, 'onWpLoaded' ) );
21
+ $this->loadAutoload();
22
+ }
23
+
24
+ /**
25
+ * @param string $sUsername
26
+ */
27
+ public function onWpLogin( $sUsername ) {
28
+ $oUser = $this->loadWpUsers()->getUserByUsername( $sUsername );
29
+ $sPassword = $this->getLoginPassword();
30
+
31
+ if ( $oUser instanceof WP_User && !empty( $sPassword ) ) {
32
+ try {
33
+ $this->applyPasswordChecks( $sPassword );
34
+ $bFailed = false;
35
+ }
36
+ catch ( Exception $oE ) {
37
+ $bFailed = true;
38
+ }
39
+ $this->setPasswordFailedFlag( $oUser, $bFailed );
40
+ }
41
+ }
42
+
43
+ public function onWpLoaded() {
44
+ if ( !$this->loadDP()->isMethodPost() && $this->loadWpUsers()->isUserLoggedIn() ) {
45
+ $this->processExpiredPassword();
46
+ $this->processFailedCheckPassword();
47
+ }
48
+ }
49
+
50
+ private function processExpiredPassword() {
51
+ /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
52
+ $oFO = $this->getFeature();
53
+ $oMeta = $oFO->getCurrentUserMeta();
54
+
55
+ $nExpireTimeout = $oFO->getPassExpireTimeout();
56
+ if ( $nExpireTimeout > 0 && $oMeta->pass_started_at > 0 ) {
57
+ if ( $this->time() - $oMeta->pass_started_at > $nExpireTimeout ) {
58
+ $this->addToAuditEntry( _wpsf__( 'Forcing user to update expired password.' ) );
59
+ $this->redirectToProfile(
60
+ sprintf( _wpsf__( 'Your password has expired (%s days).' ), $oFO->getPassExpireDays() )
61
+ );
62
+ }
63
+ }
64
+ }
65
+
66
+ private function processFailedCheckPassword() {
67
+ /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
68
+ $oFO = $this->getFeature();
69
+ $oMeta = $oFO->getCurrentUserMeta();
70
+
71
+ $bPassCheckFailed = false;
72
+ if ( $oFO->isPassForceUpdateExisting() ) {
73
+ $bPassCheckFailed = isset( $oMeta->pass_check_failed_at ) ? $oMeta->pass_check_failed_at > 0 : false;
74
+ }
75
+
76
+ if ( $bPassCheckFailed ) {
77
+ $this->addToAuditEntry(
78
+ _wpsf__( 'Forcing user to update password that fails to meet policies.' ),
79
+ '1', 'um_password_force_update'
80
+ );
81
+ $this->redirectToProfile(
82
+ _wpsf__( "Your password doesn't meet requirements set by your security administrator." )
83
+ );
84
+ }
85
+ }
86
+
87
+ private function redirectToProfile( $sMessage ) {
88
+ $this->loadAdminNoticesProcessor()
89
+ ->addFlashMessage( $sMessage.'<br/>'._wpsf__( 'Please update your password.' ) );
90
+
91
+ $this->loadWp()
92
+ ->doRedirect(
93
+ self_admin_url( 'profile.php' ),
94
+ array( $this->getFeature()->prefix( 'force-user-password' ) => 1 )
95
+ );
96
+ }
97
+
98
+ /**
99
+ * @param WP_Error $oErrors
100
+ * @return WP_Error
101
+ */
102
+ public function checkPassword( $oErrors ) {
103
+ $aExistingCodes = $oErrors->get_error_code();
104
+ if ( empty( $aExistingCodes ) ) {
105
+ $sPassword = $this->getLoginPassword();
106
+
107
+ if ( !empty( $sPassword ) ) {
108
+ try {
109
+ $this->applyPasswordChecks( $sPassword );
110
+
111
+ $oWpUser = $this->loadWpUsers();
112
+ if ( $oWpUser->isUserLoggedIn() ) {
113
+ $this->getCurrentUserMeta()->pass_check_failed_at = 0;
114
+ }
115
+ }
116
+ catch ( Exception $oE ) {
117
+ $sMessage = _wpsf__( 'Your security administrator has imposed requirements for password quality.' )
118
+ .'<br/>'.sprintf( _wpsf__( 'Reason' ).': '.$oE->getMessage() );
119
+ $oErrors->add( 'shield_password_policy', $sMessage );
120
+ $this->addToAuditEntry(
121
+ _wpsf__( 'Blocked attempted password update that failed policy requirements.' ),
122
+ '1', 'um_password_update_blocked'
123
+ );
124
+ }
125
+ }
126
+ }
127
+
128
+ return $oErrors;
129
+ }
130
+
131
+ /**
132
+ * @param string $sPassword
133
+ * @throws Exception
134
+ */
135
+ protected function applyPasswordChecks( $sPassword ) {
136
+ $this->testPasswordMeetsMinimumLength( $sPassword );
137
+ $this->testPasswordMeetsMinimumStrength( $sPassword );
138
+ $this->sendRequestToPwnedRange( $sPassword );
139
+ }
140
+
141
+ /**
142
+ * @param string $sPassword
143
+ * @return bool
144
+ * @throws Exception
145
+ */
146
+ protected function testPasswordMeetsMinimumStrength( $sPassword ) {
147
+ /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
148
+ $oFO = $this->getFeature();
149
+ $nMin = $oFO->getPassMinStrength();
150
+
151
+ $oStengther = new \ZxcvbnPhp\Zxcvbn();
152
+ $aResults = $oStengther->passwordStrength( $sPassword );
153
+ $nScore = $aResults[ 'score' ];
154
+
155
+ if ( $nMin > 0 && $nScore < $nMin ) {
156
+ throw new Exception( sprintf( "Password strength (%s) doesn't meet the minimum required strength (%s).",
157
+ $oFO->getPassStrengthName( $nScore ), $oFO->getPassStrengthName( $nMin ) ) );
158
+ }
159
+ return true;
160
+ }
161
+
162
+ /**
163
+ * @param string $sPassword
164
+ * @return bool
165
+ * @throws Exception
166
+ */
167
+ protected function testPasswordMeetsMinimumLength( $sPassword ) {
168
+ /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
169
+ $oFO = $this->getFeature();
170
+ $nMin = $oFO->getPassMinLength();
171
+ $nLength = strlen( $sPassword );
172
+ if ( $nMin > 0 && $nLength < $nMin ) {
173
+ throw new Exception( sprintf( _wpsf__( 'Password length (%s) too short (min: %s characters)' ), $nLength, $nMin ) );
174
+ }
175
+ return true;
176
+ }
177
+
178
+ /**
179
+ * @return bool
180
+ */
181
+ protected function verifyApiAccess() {
182
+ try {
183
+ $this->sendRequestToPwnedRange( 'P@ssw0rd' );
184
+ }
185
+ catch ( Exception $oE ) {
186
+ return false;
187
+ }
188
+ return true;
189
+ }
190
+
191
+ /**
192
+ * @param string $sPass
193
+ * @return bool
194
+ * @throws Exception
195
+ */
196
+ protected function sendRequestToPwned( $sPass ) {
197
+ /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
198
+ $oFO = $this->getFeature();
199
+ $oConn = $oFO->getConn();
200
+
201
+ $aResponse = $this->loadFS()->requestUrl(
202
+ sprintf( '%s/%s', $oFO->getDef( 'pwned_api_url_password_single' ), hash( 'sha1', $sPass ) ),
203
+ array(
204
+ 'headers' => array(
205
+ 'user-agent' => sprintf( '%s WP Plugin-v%s', $oConn->getHumanName(), $oConn->getVersion() )
206
+ )
207
+ ),
208
+ true
209
+ );
210
+
211
+ $sError = '';
212
+ if ( is_wp_error( $aResponse ) ) {
213
+ $sError = $aResponse->get_error_message();
214
+ }
215
+ else if ( empty( $aResponse ) ) {
216
+ $sError = 'Response was empty';
217
+ }
218
+ else if ( is_array( $aResponse ) ) {
219
+ if ( empty( $aResponse[ 'response' ][ 'code' ] ) ) {
220
+ $sError = 'Unexpected Error: No response code available from the API';
221
+ }
222
+ else if ( $aResponse[ 'response' ][ 'code' ] == 404 ) {
223
+ // means that the password isn't on the pwned list. It's acceptable.
224
+ }
225
+ else if ( empty( $aResponse[ 'body' ] ) ) {
226
+ $sError = 'Unexpected Error: The response from the API was empty';
227
+ }
228
+ else {
229
+ // password pwned
230
+ $nCount = intval( $aResponse[ 'body' ] );
231
+ if ( $nCount == 0 ) {
232
+ $sError = 'Unexpected Error: The API response could not be properly parsed.';
233
+ }
234
+ else {
235
+ $sError = _wpsf__( 'Please use a different password.' )
236
+ .' '._wpsf__( 'This password has already been pwned.' )
237
+ .' '.sprintf(
238
+ '(<a href="%s" target="_blank">%s</a>)',
239
+ 'https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/',
240
+ sprintf( _wpsf__( '%s times' ), $nCount )
241
+ );
242
+ }
243
+ }
244
+ }
245
+
246
+ if ( !empty( $sError ) ) {
247
+ throw new Exception( $sError );
248
+ }
249
+
250
+ return true;
251
+ }
252
+
253
+ /**
254
+ * @param string $sPass
255
+ * @return bool
256
+ * @throws Exception
257
+ */
258
+ protected function sendRequestToPwnedRange( $sPass ) {
259
+ /** @var ICWP_WPSF_FeatureHandler_UserManagement $oFO */
260
+ $oFO = $this->getFeature();
261
+ $oConn = $oFO->getConn();
262
+
263
+ $sPassHash = strtoupper( hash( 'sha1', $sPass ) );
264
+ $sSubHash = substr( $sPassHash, 0, 5 );
265
+
266
+ $aResponse = $this->loadFS()->requestUrl(
267
+ sprintf( '%s/%s', $oFO->getDef( 'pwned_api_url_password_range' ), $sSubHash ),
268
+ array(
269
+ 'headers' => array(
270
+ 'user-agent' => sprintf( '%s WP Plugin-v%s', $oConn->getHumanName(), $oConn->getVersion() )
271
+ )
272
+ ),
273
+ true
274
+ );
275
+
276
+ $sError = '';
277
+ if ( is_wp_error( $aResponse ) ) {
278
+ $sError = $aResponse->get_error_message();
279
+ }
280
+ else if ( empty( $aResponse ) ) {
281
+ $sError = 'Response was empty';
282
+ }
283
+ else if ( is_array( $aResponse ) ) {
284
+ if ( empty( $aResponse[ 'response' ][ 'code' ] ) ) {
285
+ $sError = 'Unexpected Error: No response code available from the Pwned API';
286
+ }
287
+ else if ( $aResponse[ 'response' ][ 'code' ] != 200 ) {
288
+ $sError = 'Unexpected Error: The response from the Pwned API was unexpected';
289
+ }
290
+ else if ( empty( $aResponse[ 'body' ] ) ) {
291
+ $sError = 'Unexpected Error: The response from the Pwned API was empty';
292
+ }
293
+ else {
294
+ $nCount = 0;
295
+ foreach ( array_map( 'trim', explode( "\n", trim( $aResponse[ 'body' ] ) ) ) as $sRow ) {
296
+ if ( $sSubHash.substr( strtoupper( $sRow ), 0, 35 ) == $sPassHash ) {
297
+ $nCount = substr( $sRow, 36 );
298
+ break;
299
+ }
300
+ }
301
+ if ( $nCount > 0 ) {
302
+ $sError = _wpsf__( 'Please use a different password.' )
303
+ .'<br/>'._wpsf__( 'This password has been pwned.' )
304
+ .' '.sprintf(
305
+ '(<a href="%s" target="_blank">%s</a>)',
306
+ 'https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/',
307
+ sprintf( _wpsf__( '%s times' ), $nCount )
308
+ );
309
+ }
310
+ }
311
+ }
312
+
313
+ if ( !empty( $sError ) ) {
314
+ throw new Exception( $sError );
315
+ }
316
+
317
+ return true;
318
+ }
319
+
320
+ /**
321
+ * @return string
322
+ */
323
+ private function getLoginPassword() {
324
+ return $this->loadDP()->post( 'pass1' );
325
+ }
326
+
327
+ /**
328
+ * @param WP_User $oUser
329
+ * @param bool $bFailed
330
+ * @return $this
331
+ */
332
+ private function setPasswordFailedFlag( $oUser, $bFailed = false ) {
333
+ $oMeta = $this->getFeature()->getUserMeta( $oUser );
334
+ $oMeta->pass_check_failed_at = $bFailed ? $this->time() : 0;
335
+ return $this;
336
+ }
337
+ }
src/wizards/base.php CHANGED
@@ -36,9 +36,14 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
36
  /**
37
  * Ensure to only ever process supported wizards
38
  */
39
- public function ajaxWizardRenderStep() {
40
  $oDP = $this->loadDP();
41
 
 
 
 
 
 
42
  try {
43
  $this->setCurrentWizard( $oDP->post( 'wizard_slug' ) );
44
  if ( $this->getUserCan() ) {
@@ -46,19 +51,17 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
46
  $oDP->post( 'wizard_steps' ),
47
  (int)$oDP->post( 'current_index' )
48
  );
49
- $this->getModCon()
50
- ->sendAjaxResponse(
51
- true,
52
- array( 'next_step' => $aNextStep )
53
- );
54
  }
55
  else {
56
- $this->loadWp()
57
- ->wpDie( 'Please login to run this wizard.' );
58
  }
59
  }
60
  catch ( Exception $oE ) {
61
  }
 
 
62
  }
63
 
64
  public function onWpLoaded() {
@@ -174,12 +177,19 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
174
  return array_keys( $this->getModCon()->getWizardDefinitions() );
175
  }
176
 
177
- public function ajaxWizardProcessStepSubmit() {
 
 
 
178
  $this->loadAutoload(); // for Response
179
  $oResponse = $this->processWizardStep( $this->loadDP()->post( 'wizard-step' ) );
180
  if ( !empty( $oResponse ) ) {
181
- $this->sendWizardResponse( $oResponse );
182
  }
 
 
 
 
183
  }
184
 
185
  /**
@@ -197,8 +207,9 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
197
 
198
  /**
199
  * @param \FernleafSystems\Utilities\Response $oResponse
 
200
  */
201
- protected function sendWizardResponse( $oResponse ) {
202
 
203
  $sMessage = $oResponse->getMessageText();
204
  if ( $oResponse->successful() ) {
@@ -211,9 +222,7 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
211
  $aData = $oResponse->getData();
212
  $aData[ 'message' ] = $sMessage;
213
  $oResponse->setData( $aData );
214
-
215
- $this->getModCon()
216
- ->sendAjaxResponse( $oResponse->successful(), $aData );
217
  }
218
 
219
  /**
@@ -278,9 +287,9 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
278
  'goprofooter' => 'http://icwp.io/goprofooter',
279
  ),
280
  'ajax' => array(
281
- 'content' => $oFO->getBaseAjaxActionRenderData( 'WizardProcessStepSubmit' ),
282
- 'steps' => $oFO->getBaseAjaxActionRenderData( 'WizardRenderStep' ),
283
- 'steps_as_json' => $oFO->getBaseAjaxActionRenderData( 'WizardRenderStep', true ),
284
  )
285
  )
286
  );
@@ -343,9 +352,9 @@ abstract class ICWP_WPSF_Wizard_Base extends ICWP_WPSF_Foundation {
343
  'goprofooter' => 'http://icwp.io/goprofooter',
344
  ),
345
  'ajax' => array(
346
- 'content' => $oFO->getBaseAjaxActionRenderData( 'WizardProcessStepSubmit' ),
347
- 'steps' => $oFO->getBaseAjaxActionRenderData( 'WizardRenderStep' ),
348
- 'steps_as_json' => $oFO->getBaseAjaxActionRenderData( 'WizardRenderStep', true ),
349
  )
350
  )
351
  );
36
  /**
37
  * Ensure to only ever process supported wizards
38
  */
39
+ public function ajaxExec_WizRenderStep() {
40
  $oDP = $this->loadDP();
41
 
42
+ $aResponse = array(
43
+ 'success' => false,
44
+ 'next_step' => array(),
45
+ );
46
+
47
  try {
48
  $this->setCurrentWizard( $oDP->post( 'wizard_slug' ) );
49
  if ( $this->getUserCan() ) {
51
  $oDP->post( 'wizard_steps' ),
52
  (int)$oDP->post( 'current_index' )
53
  );
54
+ $aResponse[ 'success' ] = true;
55
+ $aResponse[ 'next_step' ] = $aNextStep;
 
 
 
56
  }
57
  else {
58
+ $aResponse[ 'message' ] = 'Please login to run this wizard.';
 
59
  }
60
  }
61
  catch ( Exception $oE ) {
62
  }
63
+
64
+ return $aResponse;
65
  }
66
 
67
  public function onWpLoaded() {
177
  return array_keys( $this->getModCon()->getWizardDefinitions() );
178
  }
179
 
180
+ /**
181
+ * @return array
182
+ */
183
+ public function ajaxExec_WizProcessStep() {
184
  $this->loadAutoload(); // for Response
185
  $oResponse = $this->processWizardStep( $this->loadDP()->post( 'wizard-step' ) );
186
  if ( !empty( $oResponse ) ) {
187
+ $this->buildWizardResponse( $oResponse );
188
  }
189
+
190
+ $aData = $oResponse->getData();
191
+ $aData[ 'success' ] = $oResponse->successful();
192
+ return $aData;
193
  }
194
 
195
  /**
207
 
208
  /**
209
  * @param \FernleafSystems\Utilities\Response $oResponse
210
+ * @return \FernleafSystems\Utilities\Response
211
  */
212
+ protected function buildWizardResponse( $oResponse ) {
213
 
214
  $sMessage = $oResponse->getMessageText();
215
  if ( $oResponse->successful() ) {
222
  $aData = $oResponse->getData();
223
  $aData[ 'message' ] = $sMessage;
224
  $oResponse->setData( $aData );
225
+ return $oResponse;
 
 
226
  }
227
 
228
  /**
287
  'goprofooter' => 'http://icwp.io/goprofooter',
288
  ),
289
  'ajax' => array(
290
+ 'content' => $oFO->getAjaxActionData( 'wiz_process_step' ),
291
+ 'steps' => $oFO->getAjaxActionData( 'wiz_render_step' ),
292
+ 'steps_as_json' => $oFO->getAjaxActionData( 'wiz_render_step', true ),
293
  )
294
  )
295
  );
352
  'goprofooter' => 'http://icwp.io/goprofooter',
353
  ),
354
  'ajax' => array(
355
+ 'content' => $oFO->getAjaxActionData( 'wiz_process_step' ),
356
+ 'steps' => $oFO->getAjaxActionData( 'wiz_render_step' ),
357
+ 'steps_as_json' => $oFO->getAjaxActionData( 'wiz_render_step', true ),
358
  )
359
  )
360
  );
src/wizards/plugin.php CHANGED
@@ -315,29 +315,24 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
315
  * @return \FernleafSystems\Utilities\Response
316
  */
317
  private function wizardLicense() {
318
- $sKey = $this->loadDP()->post( 'LicenseKey' );
319
 
320
  $bSuccess = false;
321
- if ( empty( $sKey ) ) {
322
- $sMessage = 'License key was empty.';
323
- }
324
- else {
325
- /** @var ICWP_WPSF_FeatureHandler_License $oModule */
326
- $oModule = $this->getPluginCon()->getModule( 'license' );
327
- try {
328
- $oModule->activateOfficialLicense( $sKey, true );
329
- if ( $oModule->hasValidWorkingLicense() ) {
330
- $bSuccess = true;
331
- $sMessage = _wpsf__( 'License key was accepted and installed successfully.' );
332
- }
333
- else {
334
- $sMessage = _wpsf__( 'License key was not accepted.' );
335
- }
336
  }
337
- catch ( Exception $oE ) {
338
- $sMessage = _wpsf__( $oE->getMessage() );
339
  }
340
  }
 
 
 
341
 
342
  $oResponse = new \FernleafSystems\Utilities\Response();
343
  return $oResponse->setSuccessful( $bSuccess )
@@ -502,10 +497,10 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
502
  $oModule->setEnabledGaspCheck( $bEnabled )
503
  ->savePluginOptions();
504
 
505
- $bSuccess = $oModule->isModuleEnabled() === $bEnabled;
506
  if ( $bSuccess ) {
507
  $sMessage = sprintf( '%s has been %s.', _wpsf__( 'Login Guard' ),
508
- $oModule->isModuleEnabled() ? _wpsf__( 'Enabled' ) : _wpsf__( 'Disabled' )
509
  );
510
  }
511
  else {
@@ -576,10 +571,10 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
576
  $oModule->setEnabledGasp( $bEnabled )
577
  ->savePluginOptions();
578
 
579
- $bSuccess = $oModule->isModuleEnabled() === $bEnabled;
580
  if ( $bSuccess ) {
581
  $sMessage = sprintf( '%s has been %s.', _wpsf__( 'Comment SPAM Protection' ),
582
- $oModule->isModuleEnabled() ? _wpsf__( 'Enabled' ) : _wpsf__( 'Disabled' )
583
  );
584
  }
585
  else {
315
  * @return \FernleafSystems\Utilities\Response
316
  */
317
  private function wizardLicense() {
 
318
 
319
  $bSuccess = false;
320
+
321
+ /** @var ICWP_WPSF_FeatureHandler_License $oModule */
322
+ $oModule = $this->getPluginCon()->getModule( 'license' );
323
+ try {
324
+ $bSuccess = $oModule->verifyLicense( true )
325
+ ->hasValidWorkingLicense();
326
+ if ( $bSuccess ) {
327
+ $sMessage = _wpsf__( 'License was found and successfully installed.' );
 
 
 
 
 
 
 
328
  }
329
+ else {
330
+ $sMessage = _wpsf__( 'License could not be found.' );
331
  }
332
  }
333
+ catch ( Exception $oE ) {
334
+ $sMessage = _wpsf__( $oE->getMessage() );
335
+ }
336
 
337
  $oResponse = new \FernleafSystems\Utilities\Response();
338
  return $oResponse->setSuccessful( $bSuccess )
497
  $oModule->setEnabledGaspCheck( $bEnabled )
498
  ->savePluginOptions();
499
 
500
+ $bSuccess = $oModule->isEnabledGaspCheck() === $bEnabled;
501
  if ( $bSuccess ) {
502
  $sMessage = sprintf( '%s has been %s.', _wpsf__( 'Login Guard' ),
503
+ $bEnabled ? _wpsf__( 'Enabled' ) : _wpsf__( 'Disabled' )
504
  );
505
  }
506
  else {
571
  $oModule->setEnabledGasp( $bEnabled )
572
  ->savePluginOptions();
573
 
574
+ $bSuccess = $oModule->isEnabledGaspCheck() === $bEnabled;
575
  if ( $bSuccess ) {
576
  $sMessage = sprintf( '%s has been %s.', _wpsf__( 'Comment SPAM Protection' ),
577
+ $bEnabled ? _wpsf__( 'Enabled' ) : _wpsf__( 'Disabled' )
578
  );
579
  }
580
  else {
templates/php/access_restricted.php CHANGED
@@ -5,13 +5,15 @@
5
 
6
  <h3><?php echo $strings[ 'aar_title' ]; ?></h3>
7
  <p><?php echo $strings[ 'aar_what_should_you_enter' ]; ?>
8
- <br /><?php echo $strings[ 'aar_must_supply_key_first' ]; ?></p>
 
9
 
10
  <form action="<?php echo $form_action; ?>" method="post" class="form-horizontal" id="SecurityAdminForm">
11
- <input type="hidden" name="plugin_form_submit" value="Y" />
12
- <?php foreach ( $data[ 'ajax' ] as $sName => $sVal ) : ?>
13
  <input type="hidden" value="<?php echo $sVal; ?>" name="<?php echo $sName; ?>" />
14
  <?php endforeach; ?>
 
15
  <div class="form-group row no-gutters">
16
 
17
  <label class="form-label col-3 col-form-label" for="admin_access_key_request">
@@ -22,19 +24,19 @@
22
 
23
  <div class="option_section">
24
  <label class="admin_access_key_request">
25
- <input type="password" name="admin_access_key_request" id="admin_access_key_request"
26
- value="" autocomplete="off" autofocus />
27
  </label>
28
  <p class="help-block"><?php echo $strings[ 'aar_to_manage_must_enter_key' ]; ?></p>
29
  </div>
30
  </div>
31
  </div>
32
  <div class="form-group row no-gutters">
33
- <div class="col-6">
34
  <button type="submit" class="btn btn-primary" name="submit">
35
  <?php echo $strings[ 'aar_submit_access_key' ]; ?></button>
36
  </div>
37
- <div class="col-6 text-right">
38
  <a class="btn btn-link "
39
  href="<?php echo $hrefs[ 'aar_forget_key' ]; ?>" target="_blank">
40
  <?php echo $strings[ 'aar_forget_key' ]; ?></a>
@@ -42,6 +44,7 @@
42
 
43
  </div>
44
  </form>
 
45
  </div>
46
- </div>
47
  </div>
5
 
6
  <h3><?php echo $strings[ 'aar_title' ]; ?></h3>
7
  <p><?php echo $strings[ 'aar_what_should_you_enter' ]; ?>
8
+ <br /><?php echo $strings[ 'aar_must_supply_key_first' ]; ?>
9
+ </p>
10
 
11
  <form action="<?php echo $form_action; ?>" method="post" class="form-horizontal" id="SecurityAdminForm">
12
+
13
+ <?php foreach ( $ajax[ 'sec_admin_login' ] as $sName => $sVal ) : ?>
14
  <input type="hidden" value="<?php echo $sVal; ?>" name="<?php echo $sName; ?>" />
15
  <?php endforeach; ?>
16
+
17
  <div class="form-group row no-gutters">
18
 
19
  <label class="form-label col-3 col-form-label" for="admin_access_key_request">
24
 
25
  <div class="option_section">
26
  <label class="admin_access_key_request">
27
+ <input type="password" name="admin_access_key_request"
28
+ id="admin_access_key_request" value="" autocomplete="off" autofocus />
29
  </label>
30
  <p class="help-block"><?php echo $strings[ 'aar_to_manage_must_enter_key' ]; ?></p>
31
  </div>
32
  </div>
33
  </div>
34
  <div class="form-group row no-gutters">
35
+ <div class="col-6 order-2 text-right">
36
  <button type="submit" class="btn btn-primary" name="submit">
37
  <?php echo $strings[ 'aar_submit_access_key' ]; ?></button>
38
  </div>
39
+ <div class="col-6 order-1 text-left">
40
  <a class="btn btn-link "
41
  href="<?php echo $hrefs[ 'aar_forget_key' ]; ?>" target="_blank">
42
  <?php echo $strings[ 'aar_forget_key' ]; ?></a>
44
 
45
  </div>
46
  </form>
47
+ </div>
48
  </div>
49
+ </div>
50
  </div>
templates/php/index.php CHANGED
@@ -3,7 +3,7 @@ $sBaseDirName = dirname( __FILE__ ).DIRECTORY_SEPARATOR;
3
 
4
  if ( $flags[ 'wrap_page_content' ] ) : ?>
5
  <div class="wrap">
6
- <div class="bootstrap-wpadmin1 <?php echo $data[ 'mod_slug' ]; ?> icwp-options-page">
7
  <h1 style="height: 0; display: none"></h1>
8
  <?php endif;?>
9
 
3
 
4
  if ( $flags[ 'wrap_page_content' ] ) : ?>
5
  <div class="wrap">
6
+ <div class="bootstrap-wpadmin1 icwp-options-page <?php echo $data[ 'mod_slug' ]; ?>">
7
  <h1 style="height: 0; display: none"></h1>
8
  <?php endif;?>
9
 
templates/php/index_body.php CHANGED
@@ -17,7 +17,6 @@
17
  <?php endif; ?>
18
  <?php echo $aSummary[ 'name' ]; ?>
19
  </div>
20
-
21
  </a>
22
  <?php endforeach; ?>
23
  </div>
17
  <?php endif; ?>
18
  <?php echo $aSummary[ 'name' ]; ?>
19
  </div>
 
20
  </a>
21
  <?php endforeach; ?>
22
  </div>
templates/php/index_footer.php CHANGED
@@ -2,12 +2,12 @@
2
  <div id="FooterWizardBanner" class="container-fluid">
3
  <div id="WizardBanner" class="row">
4
  <div class="col-lg-6 offset-lg-1 col-7">
5
- <h6 class="text-left">Get exclusive security features with Pro, for just $1/month:</h6>
6
  <p>Vulnerability Scanner; Plugins Hack Guard; More Frequent Scans; Email Support +much more.</p>
7
  </div>
8
  <div class="col-lg-4 col-5">
9
  <a href="<?php echo $hrefs['goprofooter'];?>" target="_blank" class="btn btn-success">
10
- Go Pro Today For Just $1/month &rarr;</a>
11
  </div>
12
  </div>
13
  </div>
2
  <div id="FooterWizardBanner" class="container-fluid">
3
  <div id="WizardBanner" class="row">
4
  <div class="col-lg-6 offset-lg-1 col-7">
5
+ <h6 class="text-left">Exclusive Security Extras when you go Pro:</h6>
6
  <p>Vulnerability Scanner; Plugins Hack Guard; More Frequent Scans; Email Support +much more.</p>
7
  </div>
8
  <div class="col-lg-4 col-5">
9
  <a href="<?php echo $hrefs['goprofooter'];?>" target="_blank" class="btn btn-success">
10
+ Get Even More Protection With Pro &rarr;</a>
11
  </div>
12
  </div>
13
  </div>
templates/php/notices/admin-notice-template.php CHANGED
@@ -1,19 +1,20 @@
1
- <?php $sBaseDirName = dirname(__FILE__).DIRECTORY_SEPARATOR; ?>
2
 
3
- <div id="<?php echo $unique_render_id;?>" class="<?php echo $notice_classes; ?> icwp-admin-notice notice is-dismissible notice-<?php echo $icwp_admin_notice_template; ?>">
 
4
 
5
  <div class="notice-icon">
6
  <span class="dashicons dashicons-shield"></span>&nbsp;
7
  </div>
8
 
9
  <div class="notice-content">
10
- <h3 class="notice-title"><?php echo $strings['title'];?></h3>
11
  <?php require_once( $sBaseDirName.$icwp_admin_notice_template.'.php' ); ?>
12
  </div>
13
 
14
- <?php if ( !empty( $strings['dismiss'] ) ) : ?>
15
  <div class="dismiss-p">
16
- <a class="icwp-notice-dismiss" href="#"><?php echo $strings['dismiss']; ?></a>
17
  </div>
18
  <?php endif; ?>
19
 
@@ -29,13 +30,10 @@
29
 
30
  function icwp_dismiss_notice() {
31
  var $oContainer = jQuery( '#<?php echo $unique_render_id; ?>' );
32
- var requestData = {
33
- 'action': 'icwp_wpsf_DismissAdminNotice',
34
- '_ajax_nonce': '<?php echo $icwp_ajax_nonce; ?>',
35
- 'hide': '1',
36
- 'notice_id': '<?php echo $notice_attributes['notice_id']; ?>'
37
- };
38
- jQuery.get( ajaxurl, requestData );
39
- $oContainer.fadeOut( 500, function() { $oContainer.remove(); } );
40
  }
41
  </script>
1
+ <?php $sBaseDirName = dirname( __FILE__ ).DIRECTORY_SEPARATOR; ?>
2
 
3
+ <div id="<?php echo $unique_render_id; ?>"
4
+ class="<?php echo $notice_classes; ?> icwp-admin-notice notice is-dismissible notice-<?php echo $icwp_admin_notice_template; ?>">
5
 
6
  <div class="notice-icon">
7
  <span class="dashicons dashicons-shield"></span>&nbsp;
8
  </div>
9
 
10
  <div class="notice-content">
11
+ <h3 class="notice-title"><?php echo $strings[ 'title' ]; ?></h3>
12
  <?php require_once( $sBaseDirName.$icwp_admin_notice_template.'.php' ); ?>
13
  </div>
14
 
15
+ <?php if ( !empty( $strings[ 'dismiss' ] ) ) : ?>
16
  <div class="dismiss-p">
17
+ <a class="icwp-notice-dismiss" href="#"><?php echo $strings[ 'dismiss' ]; ?></a>
18
  </div>
19
  <?php endif; ?>
20
 
30
 
31
  function icwp_dismiss_notice() {
32
  var $oContainer = jQuery( '#<?php echo $unique_render_id; ?>' );
33
+ var aData = <?php echo $ajax[ 'dismiss_admin_notice' ]; ?>;
34
+ jQuery.get( ajaxurl, aData );
35
+ $oContainer.fadeOut( 500, function () {
36
+ $oContainer.remove();
37
+ } );
 
 
 
38
  }
39
  </script>
templates/php/notices/allow-tracking.php CHANGED
@@ -1,4 +1,4 @@
1
- <p><?php echo $strings[ 'want_to_track' ]; ?> <?php echo $strings[ 'what_we_collect' ]; ?></p>
2
  <p><?php echo $strings[ 'data_anon' ]; ?> <?php echo $strings[ 'can_turn_off' ]; ?>
3
  <a target="_blank" href="<?php echo $hrefs[ 'link_to_see' ]; ?>"><?php echo $strings[ 'click_to_see' ]; ?></a>
4
  </p>
@@ -25,14 +25,12 @@
25
  icwp_PluginTrackingAgreement( 0 );
26
  }
27
 
28
- function icwp_PluginTrackingAgreement( $bAgree ) {
29
- var requestData = {
30
- 'action': 'icwp_PluginTrackingPermission',
31
- 'agree': $bAgree,
32
- '_ajax_nonce': '<?php echo $icwp_ajax_nonce; ?>',
33
- 'hide': '1',
34
- 'notice_id': '<?php echo $notice_attributes[ 'notice_id' ]; ?>'
35
- };
36
  jQuery.get( ajaxurl, requestData );
37
  $oContainer.fadeOut( 500, function () {
38
  $oContainer.remove();
1
+ <p><?php echo $strings[ 'want_to_track' ]; ?><?php echo $strings[ 'what_we_collect' ]; ?></p>
2
  <p><?php echo $strings[ 'data_anon' ]; ?> <?php echo $strings[ 'can_turn_off' ]; ?>
3
  <a target="_blank" href="<?php echo $hrefs[ 'link_to_see' ]; ?>"><?php echo $strings[ 'click_to_see' ]; ?></a>
4
  </p>
25
  icwp_PluginTrackingAgreement( 0 );
26
  }
27
 
28
+ function icwp_PluginTrackingAgreement( bAgree ) {
29
+ var requestData = <?php echo $ajax[ 'set_plugin_tracking_perm' ]; ?>;
30
+ requestData[ 'agree' ] = bAgree;
31
+ requestData[ 'hide' ] = 1;
32
+ requestData[ 'notice_id' ] = '<?php echo $notice_attributes[ 'notice_id' ]; ?>';
33
+
 
 
34
  jQuery.get( ajaxurl, requestData );
35
  $oContainer.fadeOut( 500, function () {
36
  $oContainer.remove();
templates/php/snippets/admin_access_login.php CHANGED
@@ -1,50 +1,44 @@
1
- <div class="input-holder" id="AdminInputHolder-<?php echo $unique_render_id;?>">
2
  <label>
3
- <?php echo $admin_access_message; ?>:
4
- <input type="password" name="admin_access_key_request" data-nonce="<?php echo $sAjaxNonce; ?>" />
5
  <button type="submit">Go!</button>
6
  </label>
7
  </div>
8
 
9
  <script type="text/javascript">
10
- var $oThisAAL = jQuery('#AdminInputHolder-<?php echo $unique_render_id;?>');
11
  var $oInput = jQuery( 'input', $oThisAAL );
12
  var $oSubmit = jQuery( 'button', $oThisAAL );
13
  jQuery( document ).ready(
14
- function() {
15
  $oSubmit.click( submit_admin_access );
16
- $oInput.keypress( function(e) {
17
- if( e.which == 13 ) {
18
  submit_admin_access();
19
  }
20
- });
21
  }
22
  );
23
 
24
  function submit_admin_access() {
25
- $oThisAAL.html( '<div class="spinner"></div>');
26
  $oInput.prop( 'disabled', true );
27
 
28
- var requestData = {
29
- 'action': '<?php echo $icwp_ajax_action; ?>',
30
- 'icwp_ajax_action': '<?php echo $icwp_ajax_action; ?>',
31
- 'icwp_nonce': '<?php echo $icwp_nonce; ?>',
32
- 'icwp_nonce_action': '<?php echo $icwp_nonce_action; ?>',
33
- 'icwp_action_module': '<?php echo $icwp_action_module; ?>',
34
- 'admin_access_key_request': $oInput.val()
35
- };
36
 
37
- jQuery.post(ajaxurl, requestData, function( oResponse ) {
38
- if( oResponse.success ) {
39
- location.reload(true);
40
  }
41
- if( oResponse.data ) {
42
  $oThisAAL.html( oResponse.data.html );
43
  }
44
  else {
45
  $oThisAAL.html( 'There was an unknown error' );
46
  }
47
- });
48
  }
49
 
50
 
1
+ <div class="input-holder" id="AdminInputHolder-<?php echo $unique_render_id; ?>">
2
  <label>
3
+ <?php echo $strings[ 'access_message' ]; ?>:
4
+ <input type="password" name="admin_access_key_request" />
5
  <button type="submit">Go!</button>
6
  </label>
7
  </div>
8
 
9
  <script type="text/javascript">
10
+ var $oThisAAL = jQuery( '#AdminInputHolder-<?php echo $unique_render_id;?>' );
11
  var $oInput = jQuery( 'input', $oThisAAL );
12
  var $oSubmit = jQuery( 'button', $oThisAAL );
13
  jQuery( document ).ready(
14
+ function () {
15
  $oSubmit.click( submit_admin_access );
16
+ $oInput.keypress( function ( e ) {
17
+ if ( e.which === 13 ) {
18
  submit_admin_access();
19
  }
20
+ } );
21
  }
22
  );
23
 
24
  function submit_admin_access() {
25
+ $oThisAAL.html( '<div class="spinner"></div>' );
26
  $oInput.prop( 'disabled', true );
27
 
28
+ var requestData = <?php echo $ajax[ 'sec_admin_login' ]; ?>;
29
+ requestData[ 'admin_access_key_request' ] = $oInput.val();
 
 
 
 
 
 
30
 
31
+ jQuery.post( ajaxurl, requestData, function ( oResponse ) {
32
+ if ( oResponse.success ) {
33
+ location.reload( true );
34
  }
35
+ if ( oResponse.data ) {
36
  $oThisAAL.html( oResponse.data.html );
37
  }
38
  else {
39
  $oThisAAL.html( 'There was an unknown error' );
40
  }
41
+ } );
42
  }
43
 
44
 
templates/php/snippets/admin_access_login_box.php CHANGED
@@ -1,12 +1,12 @@
1
  <div id="WpsfAdminAccessLogin" style="display:none;">
2
- <div class="bootstrap-wpadmin wpsf-admin-access-login" id="AdminAccessLogin-<?php echo $unique_render_id;?>"></div>
3
  </div>
4
 
5
  <script type="text/javascript">
6
 
7
  jQuery( document ).ready(
8
- function() {
9
- aItems = [ <?php echo $js_snippets['options_to_restrict']; ?> ];
10
  aItems.forEach( disable_input );
11
  }
12
  );
@@ -14,38 +14,36 @@
14
  function disable_input( element, index, array ) {
15
  $oItem = jQuery( 'input[name=' + element + ']' );
16
  $oItem.prop( 'disabled', true );
17
- $oParentTr = $oItem.parents('tr');
18
  $oParentTr.addClass( 'restricted-option-row' );
19
- $oItem.parents('td').append(
20
  '<div style="clear:both"></div><div class="restricted-option">' +
21
  '<span class="dashicons dashicons-lock"></span>' +
22
- '<?php echo $strings['editing_restricted'];?>'+' <?php echo $strings['unlock_link'];?>' +
23
  '</div>'
24
  );
25
  }
26
 
27
- jQuery( document ).ready(function() {
28
- load_admin_access_form( jQuery('#AdminAccessLogin-<?php echo $unique_render_id;?>') );
29
- });
30
 
31
  function load_admin_access_form( $oTarget ) {
32
-
33
- var aData = {
34
- 'action': 'icwp_wpsf_LoadAdminAccessForm',
35
- '_ajax_nonce': '<?php echo $sAjaxNonce; ?>'
36
- };
37
  request_and_html( aData, $oTarget );
38
  }
 
39
  function request_and_html( requestData, $oTarget ) {
40
 
41
- $oTarget.html( '<div class="spinner"></div>');
42
- jQuery.post(ajaxurl, requestData, function( oResponse ) {
43
- if( oResponse.data ) {
 
44
  $oTarget.html( oResponse.data.html );
45
  }
46
  else {
47
  $oTarget.html( 'There was an unknown error' );
48
  }
49
- });
50
  }
51
  </script>
1
  <div id="WpsfAdminAccessLogin" style="display:none;">
2
+ <div class="bootstrap-wpadmin wpsf-admin-access-login" id="AdminAccessLogin-<?php echo $unique_render_id; ?>"></div>
3
  </div>
4
 
5
  <script type="text/javascript">
6
 
7
  jQuery( document ).ready(
8
+ function () {
9
+ aItems = [ <?php echo $js_snippets[ 'options_to_restrict' ]; ?> ];
10
  aItems.forEach( disable_input );
11
  }
12
  );
14
  function disable_input( element, index, array ) {
15
  $oItem = jQuery( 'input[name=' + element + ']' );
16
  $oItem.prop( 'disabled', true );
17
+ $oParentTr = $oItem.parents( 'tr' );
18
  $oParentTr.addClass( 'restricted-option-row' );
19
+ $oItem.parents( 'td' ).append(
20
  '<div style="clear:both"></div><div class="restricted-option">' +
21
  '<span class="dashicons dashicons-lock"></span>' +
22
+ '<?php echo $strings[ 'editing_restricted' ];?>' + ' <?php echo $strings[ 'unlock_link' ];?>' +
23
  '</div>'
24
  );
25
  }
26
 
27
+ jQuery( document ).ready( function () {
28
+ load_admin_access_form( jQuery( '#AdminAccessLogin-<?php echo $unique_render_id;?>' ) );
29
+ } );
30
 
31
  function load_admin_access_form( $oTarget ) {
32
+ var aData = <?php echo $ajax[ 'sec_admin_login_box' ]; ?>;
 
 
 
 
33
  request_and_html( aData, $oTarget );
34
  }
35
+
36
  function request_and_html( requestData, $oTarget ) {
37
 
38
+ $oTarget.html( '<div class="spinner"></div>' );
39
+ jQuery.post( ajaxurl, requestData, function ( oResponse ) {
40
+ console.log( oResponse );
41
+ if ( oResponse.data ) {
42
  $oTarget.html( oResponse.data.html );
43
  }
44
  else {
45
  $oTarget.html( 'There was an unknown error' );
46
  }
47
+ } );
48
  }
49
  </script>
templates/php/snippets/module-actions-audit_trail.php CHANGED
@@ -1,4 +1,4 @@
1
- <h2 style="margin: 0 0 20px"><?php echo $sTitle;?></h2>
2
  <div id="AuditTrailTabs">
3
  <ul class="nav nav-tabs">
4
  <?php foreach ( $aAuditTables as $sContext => $aAuditDataContext ) : ?>
@@ -55,18 +55,12 @@ var iCWP_WPSF_AuditTrailTable = new function () {
55
  iCWP_WPSF_BodyOverlay.show();
56
  $oMainContainer.html( '' );
57
 
58
- var requestData = {
59
- 'action': '<?php echo $icwp_ajax_action; ?>',
60
- 'icwp_ajax_action': '<?php echo $icwp_ajax_action; ?>',
61
- 'icwp_nonce': '<?php echo $icwp_nonce; ?>',
62
- 'icwp_nonce_action': '<?php echo $icwp_nonce_action; ?>',
63
- 'icwp_action_module': '<?php echo $icwp_action_module; ?>',
64
- 'auditcontext': $oMainContainer.data( 'auditcontext' )
65
- };
66
 
67
  jQuery.post( ajaxurl, jQuery.extend( aTableRequestParams, requestData ),
68
  function ( oResponse ) {
69
- $oMainContainer.html( oResponse.data.tablecontent )
70
  }
71
  ).always(
72
  function () {
1
+ <h2 style="margin: 0 0 20px"><?php echo $sTitle; ?></h2>
2
  <div id="AuditTrailTabs">
3
  <ul class="nav nav-tabs">
4
  <?php foreach ( $aAuditTables as $sContext => $aAuditDataContext ) : ?>
55
  iCWP_WPSF_BodyOverlay.show();
56
  $oMainContainer.html( '' );
57
 
58
+ var requestData = <?php echo $ajax['render_audit_table']; ?>;
59
+ requestData[ 'auditcontext' ] = $oMainContainer.data( 'auditcontext' );
 
 
 
 
 
 
60
 
61
  jQuery.post( ajaxurl, jQuery.extend( aTableRequestParams, requestData ),
62
  function ( oResponse ) {
63
+ $oMainContainer.html( oResponse.data.html )
64
  }
65
  ).always(
66
  function () {
templates/php/snippets/module-actions-ips.php CHANGED
@@ -37,7 +37,6 @@
37
  function request_and_reload( requestData, $oTarget ) {
38
 
39
  $oTarget.html( '<div class="spinner"></div>' );
40
- // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
41
  jQuery.post( ajaxurl, requestData, function ( oResponse ) {
42
 
43
  if ( oResponse.data ) {
37
  function request_and_reload( requestData, $oTarget ) {
38
 
39
  $oTarget.html( '<div class="spinner"></div>' );
 
40
  jQuery.post( ajaxurl, requestData, function ( oResponse ) {
41
 
42
  if ( oResponse.data ) {
templates/php/snippets/options_form.php CHANGED
@@ -1,11 +1,14 @@
1
- <form action="<?php echo $form_action; ?>" method="post" class=" icwpOptionsForm">
2
  <input type="hidden" id="_wpnonce" name="_wpnonce" value="<?php echo $data[ 'form_nonce' ] ?>">
3
  <input type="hidden" name="mod_slug" value="<?php echo $data[ 'mod_slug' ]; ?>" />
4
  <input type="hidden" name="all_options_input" value="<?php echo $data[ 'all_options_input' ]; ?>" />
5
  <input type="hidden" name="plugin_form_submit" value="Y" />
6
 
 
 
 
7
 
8
- <div style="margin-bottom: -1px">
9
  <div class="row no-gutters">
10
  <div class="col">
11
  <div class="module-headline">
@@ -14,7 +17,7 @@
14
  <div class="float-right">
15
  <button type="submit" class="btn btn-primary icwp-form-button"
16
  name="submit" style="margin-right: 12px">
17
- <?php _wpsf_e( 'Save Options' ); ?>
18
  </button>
19
 
20
  <div class="btn-group" role="group" aria-label="Basic example">
@@ -56,10 +59,11 @@
56
  </div>
57
  </div>
58
  </div>
 
59
  <div class="row no-gutters">
60
  <div class="col-2 smoothwidth">
61
 
62
- <ul id="ModuleOptionsNav" class="nav flex-column" id="v-pills-tab"
63
  role="tablist" aria-orientation="vertical">
64
  <?php foreach ( $data[ 'all_options' ] as $aOptSection ) : ?>
65
  <li class="nav-item">
@@ -67,9 +71,8 @@
67
  id="pills-tab-<?php echo $aOptSection[ 'slug' ]; ?>"
68
  data-toggle="pill" href="#pills-<?php echo $aOptSection[ 'slug' ]; ?>"
69
  role="tab" aria-controls="pills-<?php echo $aOptSection[ 'slug' ]; ?>"
70
- <?php echo $aOptSection[ 'primary' ] ? 'aria-selected="true"' : '' ?>>
71
- <?php echo $aOptSection[ 'title_short' ]; ?>
72
- </a>
73
  </li>
74
  <?php endforeach; ?>
75
  </ul>
@@ -84,21 +87,7 @@
84
  <div class="option_section_row <?php echo $aOptSection[ 'primary' ] ? 'primary_section' : 'non_primary_section'; ?>"
85
  id="row-<?php echo $aOptSection[ 'slug' ]; ?>">
86
  <div class="options-body">
87
- <legend>
88
- <?php echo $aOptSection[ 'title' ]; ?>
89
- <?php if ( !empty( $aOptSection[ 'help_video_url' ] ) ) : ?>
90
- <div style="float:right;">
91
-
92
- <a href="<?php echo $aOptSection[ 'help_video_url' ]; ?>"
93
- class="btn"
94
- data-featherlight-iframe-height="454"
95
- data-featherlight-iframe-width="772"
96
- data-featherlight="iframe">
97
- <span class="dashicons dashicons-controls-play"></span> Help Video
98
- </a>
99
- </div>
100
- <?php endif; ?>
101
- </legend>
102
 
103
  <div class="row_section_summary row">
104
  <div class="col-8">
@@ -126,9 +115,9 @@
126
  <div class="collapse section_video"
127
  id="sectionVideo<?php echo $aOptSection[ 'help_video' ][ 'id' ]; ?>">
128
  <div class="embed-responsive embed-responsive-16by9">
129
- <iframe src="<?php echo $aOptSection[ 'help_video' ][ 'embed_url' ]; ?>" width="640"
130
- height="360"
131
- class="embed-responsive-item" allowfullscreen></iframe>
132
  </div>
133
  </div>
134
  </div>
@@ -138,10 +127,18 @@
138
  <?php if ( !empty( $aOptSection[ 'warnings' ] ) ) : ?>
139
  <div class="row">
140
  <div class="col">
141
- <?php foreach ( $aOptSection[ 'warnings' ] as $sWarning ) :?>
142
- <div class="alert alert-warning text-center">
143
- <?php echo $sWarning; ?>
144
- </div>
 
 
 
 
 
 
 
 
145
  <?php endforeach; ?>
146
  </div>
147
  </div>
@@ -207,13 +204,13 @@
207
  id="<?php echo $sOptKey; ?>"
208
  placeholder="<?php echo $mOptValue; ?>"
209
  rows="<?php echo $aOption[ 'rows' ]; ?>"
210
- class="span7" <?php echo $sDisabledText; ?>><?php echo $mOptValue; ?></textarea>
 
211
 
212
  <?php elseif ( $sOptType == 'noneditable_text' ) : ?>
213
 
214
  <p><?php echo $aOption[ 'summary' ]; ?></p>
215
- <input type="text" readonly class="span8"
216
- value="<?php echo $mOptValue; ?>" />
217
 
218
  <?php elseif ( $sOptType == 'password' ) : ?>
219
 
@@ -222,7 +219,7 @@
222
  id="<?php echo $sOptKey; ?>"
223
  value="<?php echo $mOptValue; ?>"
224
  placeholder="<?php echo $mOptValue; ?>"
225
- class="span7" <?php echo $sDisabledText; ?> />
226
 
227
  <?php elseif ( $sOptType == 'email' ) : ?>
228
 
@@ -231,7 +228,7 @@
231
  id="<?php echo $sOptKey; ?>"
232
  value="<?php echo $mOptValue; ?>"
233
  placeholder="<?php echo $mOptValue; ?>"
234
- class="span7" <?php echo $sDisabledText; ?> />
235
 
236
  <?php elseif ( $sOptType == 'select' ) : ?>
237
 
@@ -263,23 +260,15 @@
263
  <?php endforeach; ?>
264
  </select>
265
 
266
- <?php elseif ( $sOptType == 'array' ) : ?>
267
 
268
  <p><?php echo $aOption[ 'summary' ]; ?></p>
269
  <textarea name="<?php echo $sOptKey; ?>"
270
  id="<?php echo $sOptKey; ?>"
271
  placeholder="<?php echo $mOptValue; ?>"
272
  rows="<?php echo $aOption[ 'rows' ]; ?>"
273
- class="span7" <?php echo $sDisabledText; ?>><?php echo $mOptValue; ?></textarea>
274
-
275
- <?php elseif ( $sOptType == 'comma_separated_lists' ) : ?>
276
-
277
- <p><?php echo $aOption[ 'summary' ]; ?></p>
278
- <textarea name="<?php echo $sOptKey; ?>"
279
- id="<?php echo $sOptKey; ?>"
280
- placeholder="<?php echo $mOptValue; ?>"
281
- rows="<?php echo $aOption[ 'rows' ]; ?>"
282
- class="span7" <?php echo $sDisabledText; ?> ><?php echo $mOptValue; ?></textarea>
283
 
284
  <?php elseif ( $sOptType == 'integer' ) : ?>
285
 
@@ -288,7 +277,7 @@
288
  id="<?php echo $sOptKey; ?>"
289
  value="<?php echo $mOptValue; ?>"
290
  placeholder="<?php echo $mOptValue; ?>"
291
- class="span7" <?php echo $sDisabledText; ?> />
292
 
293
  <?php else : ?>
294
  ERROR: Should never reach this point.
@@ -309,26 +298,4 @@
309
  </div>
310
  </div>
311
  </div>
312
- </form>
313
-
314
-
315
-
316
-
317
-
318
- <!--<div class="pull-right well">-->
319
- <!-- <h5 style="margin-bottom: 10px;">Options Legend</h5>-->
320
- <!-- <label class="forcheckbox">-->
321
- <!-- <span class="switch">-->
322
- <!-- <input type="checkbox" name="legend" id="legend" value="Y" checked="checked" disabled="disabled">-->
323
- <!-- <span class="icwp-slider round"></span>-->
324
- <!-- </span>-->
325
- <!-- <span class="summary">Option is turned on / enabled</span>-->
326
- <!-- </label>-->
327
- <!-- <label class="forcheckbox">-->
328
- <!-- <span class="switch">-->
329
- <!-- <input type="checkbox" name="legend" id="legend" value="Y" disabled="disabled">-->
330
- <!-- <span class="icwp-slider round"></span>-->
331
- <!-- </span>-->
332
- <!-- <span class="summary">Option is turned off / disabled</span>-->
333
- <!-- </label>-->
334
- <!--</div>-->
1
+ <form action="<?php echo $form_action; ?>" method="post" class="icwpOptionsForm">
2
  <input type="hidden" id="_wpnonce" name="_wpnonce" value="<?php echo $data[ 'form_nonce' ] ?>">
3
  <input type="hidden" name="mod_slug" value="<?php echo $data[ 'mod_slug' ]; ?>" />
4
  <input type="hidden" name="all_options_input" value="<?php echo $data[ 'all_options_input' ]; ?>" />
5
  <input type="hidden" name="plugin_form_submit" value="Y" />
6
 
7
+ <?php foreach ( $ajax[ 'mod_options' ] as $sAjKey => $sAjVal ) : ?>
8
+ <input type="hidden" name="<?php echo $sAjKey; ?>" value="<?php echo $sAjVal; ?>" />
9
+ <?php endforeach; ?>
10
 
11
+ <div style="margin-bottom: -1px">
12
  <div class="row no-gutters">
13
  <div class="col">
14
  <div class="module-headline">
17
  <div class="float-right">
18
  <button type="submit" class="btn btn-primary icwp-form-button"
19
  name="submit" style="margin-right: 12px">
20
+ <?php echo $strings[ 'btn_save' ]; ?>
21
  </button>
22
 
23
  <div class="btn-group" role="group" aria-label="Basic example">
59
  </div>
60
  </div>
61
  </div>
62
+
63
  <div class="row no-gutters">
64
  <div class="col-2 smoothwidth">
65
 
66
+ <ul id="ModuleOptionsNav" class="nav flex-column"
67
  role="tablist" aria-orientation="vertical">
68
  <?php foreach ( $data[ 'all_options' ] as $aOptSection ) : ?>
69
  <li class="nav-item">
71
  id="pills-tab-<?php echo $aOptSection[ 'slug' ]; ?>"
72
  data-toggle="pill" href="#pills-<?php echo $aOptSection[ 'slug' ]; ?>"
73
  role="tab" aria-controls="pills-<?php echo $aOptSection[ 'slug' ]; ?>"
74
+ <?php echo $aOptSection[ 'primary' ] ? 'aria-selected="true"' : '' ?>
75
+ ><?php echo $aOptSection[ 'title_short' ]; ?></a>
 
76
  </li>
77
  <?php endforeach; ?>
78
  </ul>
87
  <div class="option_section_row <?php echo $aOptSection[ 'primary' ] ? 'primary_section' : 'non_primary_section'; ?>"
88
  id="row-<?php echo $aOptSection[ 'slug' ]; ?>">
89
  <div class="options-body">
90
+ <legend><?php echo $aOptSection[ 'title' ]; ?></legend>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
 
92
  <div class="row_section_summary row">
93
  <div class="col-8">
115
  <div class="collapse section_video"
116
  id="sectionVideo<?php echo $aOptSection[ 'help_video' ][ 'id' ]; ?>">
117
  <div class="embed-responsive embed-responsive-16by9">
118
+ <iframe src="<?php echo $aOptSection[ 'help_video' ][ 'embed_url' ]; ?>"
119
+ width="640" height="360" class="embed-responsive-item"
120
+ allowfullscreen></iframe>
121
  </div>
122
  </div>
123
  </div>
127
  <?php if ( !empty( $aOptSection[ 'warnings' ] ) ) : ?>
128
  <div class="row">
129
  <div class="col">
130
+ <?php foreach ( $aOptSection[ 'warnings' ] as $sWarning ) : ?>
131
+ <div class="alert alert-warning text-center"><?php echo $sWarning; ?></div>
132
+ <?php endforeach; ?>
133
+ </div>
134
+ </div>
135
+ <?php endif; ?>
136
+
137
+ <?php if ( !empty( $aOptSection[ 'notices' ] ) ) : ?>
138
+ <div class="row">
139
+ <div class="col">
140
+ <?php foreach ( $aOptSection[ 'notices' ] as $sNotices ) : ?>
141
+ <div class="alert alert-info text-center"><?php echo $sNotices; ?></div>
142
  <?php endforeach; ?>
143
  </div>
144
  </div>
204
  id="<?php echo $sOptKey; ?>"
205
  placeholder="<?php echo $mOptValue; ?>"
206
  rows="<?php echo $aOption[ 'rows' ]; ?>"
207
+ <?php echo $sDisabledText; ?>
208
+ ><?php echo $mOptValue; ?></textarea>
209
 
210
  <?php elseif ( $sOptType == 'noneditable_text' ) : ?>
211
 
212
  <p><?php echo $aOption[ 'summary' ]; ?></p>
213
+ <input type="text" value="<?php echo $mOptValue; ?>" readonly />
 
214
 
215
  <?php elseif ( $sOptType == 'password' ) : ?>
216
 
219
  id="<?php echo $sOptKey; ?>"
220
  value="<?php echo $mOptValue; ?>"
221
  placeholder="<?php echo $mOptValue; ?>"
222
+ <?php echo $sDisabledText; ?> />
223
 
224
  <?php elseif ( $sOptType == 'email' ) : ?>
225
 
228
  id="<?php echo $sOptKey; ?>"
229
  value="<?php echo $mOptValue; ?>"
230
  placeholder="<?php echo $mOptValue; ?>"
231
+ <?php echo $sDisabledText; ?> />
232
 
233
  <?php elseif ( $sOptType == 'select' ) : ?>
234
 
260
  <?php endforeach; ?>
261
  </select>
262
 
263
+ <?php elseif ( in_array( $sOptType, array( 'comma_separated_lists', 'array' ) ) ) : ?>
264
 
265
  <p><?php echo $aOption[ 'summary' ]; ?></p>
266
  <textarea name="<?php echo $sOptKey; ?>"
267
  id="<?php echo $sOptKey; ?>"
268
  placeholder="<?php echo $mOptValue; ?>"
269
  rows="<?php echo $aOption[ 'rows' ]; ?>"
270
+ <?php echo $sDisabledText; ?>
271
+ ><?php echo $mOptValue; ?></textarea>
 
 
 
 
 
 
 
 
272
 
273
  <?php elseif ( $sOptType == 'integer' ) : ?>
274
 
277
  id="<?php echo $sOptKey; ?>"
278
  value="<?php echo $mOptValue; ?>"
279
  placeholder="<?php echo $mOptValue; ?>"
280
+ <?php echo $sDisabledText; ?> />
281
 
282
  <?php else : ?>
283
  ERROR: Should never reach this point.
298
  </div>
299
  </div>
300
  </div>
301
+ </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
templates/php/snippets/plugin_badge.php CHANGED
@@ -1,25 +1,25 @@
1
  <style type="text/css">
2
  #icwpWpsfSiteBadge {
3
- background-color: rgba(241, 241, 241, 0.99);
4
- border-radius: 5px;
5
- bottom: 9px;
6
- box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.47);
7
- box-sizing: content-box;
8
- color: #000000;
9
- height: 33px;
10
- left: 9px;
11
- opacity: 0.9;
12
- padding: 7px 4px 7px 10px;
13
- position: fixed;
14
- text-align: left;
15
- width: 180px;
16
- z-index: 10000;
17
- -webkit-transition: width 0.5s; /* Safari */
18
- transition: width 0.5s;
 
 
 
19
  }
20
- #icwpWpsfSiteBadge:hover {
21
- opacity: 1.0;
22
- }
23
  #icwpWpsfSiteBadge a {
24
  border: 0 none;
25
  box-sizing: inherit;
@@ -33,50 +33,50 @@
33
  text-decoration: none;
34
  }
35
  #icwpWpsfSiteBadge .badge-text {
36
- font-family: sans-serif;
37
  font-size: 12px;
38
  line-height: 17px;
39
  padding-left: 43px;
40
  letter-spacing: 0;
41
- -webkit-transition: opacity 1s; /* Safari */
42
- transition: opacity 1s;
43
  }
44
  #icwpWpsfSiteBadge img {
45
  float: left;
46
  }
47
  a#icwpWpsfCloseButton {
48
- background-color: #ffffff;
49
- border: 1px solid #ddd;
50
- border-radius: 4px;
51
- font-size: 10px;
52
- height: 10px;
53
- left: -2px;
54
- line-height: 6px;
55
- padding: 2px 1px 0 2px !important;
56
- position: absolute;
57
- text-align: center;
58
- top: -3px;
59
- width: 10px;
60
- z-index: 1001;
61
  }
62
  #icwpWpsfCloseButton:hover {
63
  cursor: pointer;
64
  }
65
- @media (max-width: 600px) {
66
- #icwpWpsfSiteBadge {
67
- height: 16px;
68
- width: 112px;
69
- }
70
- #icwpWpsfSiteBadge .badge-text {
71
- font-size: 8px;
72
- line-height: 10px;
73
- padding-left: 20px;
74
- }
75
- #icwpWpsfSiteBadge img {
76
- height: 16px;
77
- width: 16px;
78
- }
79
- }
80
  </style>
81
  <div id="icwpWpsfSiteBadge">
82
  <a id="icwpWpsfCloseButton">x</a>
@@ -93,19 +93,12 @@
93
 
94
  var closeBadge = function () {
95
 
96
- var requestData = {
97
- 'action': '<?php echo $icwp_ajax_action; ?>',
98
- 'icwp_ajax_action': '<?php echo $icwp_ajax_action; ?>',
99
- 'icwp_nonce': '<?php echo $icwp_nonce; ?>',
100
- 'icwp_nonce_action': '<?php echo $icwp_nonce_action; ?>',
101
- 'icwp_action_module': '<?php echo $icwp_action_module; ?>'
102
- };
103
-
104
- jQuery.post( '<?php echo $ajaxurl; ?>', requestData,
105
  function ( oResponse ) {
106
  }
107
  ).always( function () {
108
- jQuery( '#icwpWpsfSiteBadge' ).remove();
109
  }
110
  );
111
 
1
  <style type="text/css">
2
  #icwpWpsfSiteBadge {
3
+ background-color: rgba(241, 241, 241, 0.99);
4
+ border-radius: 5px;
5
+ bottom: 9px;
6
+ box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.47);
7
+ box-sizing: content-box;
8
+ color: #000000;
9
+ height: 33px;
10
+ left: 9px;
11
+ opacity: 0.9;
12
+ padding: 7px 4px 7px 10px;
13
+ position: fixed;
14
+ text-align: left;
15
+ width: 180px;
16
+ z-index: 10000;
17
+ -webkit-transition: width 0.5s; /* Safari */
18
+ transition: width 0.5s;
19
+ }
20
+ #icwpWpsfSiteBadge:hover {
21
+ opacity: 1.0;
22
  }
 
 
 
23
  #icwpWpsfSiteBadge a {
24
  border: 0 none;
25
  box-sizing: inherit;
33
  text-decoration: none;
34
  }
35
  #icwpWpsfSiteBadge .badge-text {
36
+ font-family: sans-serif;
37
  font-size: 12px;
38
  line-height: 17px;
39
  padding-left: 43px;
40
  letter-spacing: 0;
41
+ -webkit-transition: opacity 1s; /* Safari */
42
+ transition: opacity 1s;
43
  }
44
  #icwpWpsfSiteBadge img {
45
  float: left;
46
  }
47
  a#icwpWpsfCloseButton {
48
+ background-color: #ffffff;
49
+ border: 1px solid #ddd;
50
+ border-radius: 4px;
51
+ font-size: 10px;
52
+ height: 10px;
53
+ left: -2px;
54
+ line-height: 6px;
55
+ padding: 2px 1px 0 2px !important;
56
+ position: absolute;
57
+ text-align: center;
58
+ top: -3px;
59
+ width: 10px;
60
+ z-index: 1001;
61
  }
62
  #icwpWpsfCloseButton:hover {
63
  cursor: pointer;
64
  }
65
+ @media (max-width: 600px) {
66
+ #icwpWpsfSiteBadge {
67
+ height: 16px;
68
+ width: 112px;
69
+ }
70
+ #icwpWpsfSiteBadge .badge-text {
71
+ font-size: 8px;
72
+ line-height: 10px;
73
+ padding-left: 20px;
74
+ }
75
+ #icwpWpsfSiteBadge img {
76
+ height: 16px;
77
+ width: 16px;
78
+ }
79
+ }
80
  </style>
81
  <div id="icwpWpsfSiteBadge">
82
  <a id="icwpWpsfCloseButton">x</a>
93
 
94
  var closeBadge = function () {
95
 
96
+ var aData = <?php echo $ajax[ 'plugin_badge_close' ]; ?>;
97
+ jQuery.post( aData[ 'ajaxurl' ], aData,
 
 
 
 
 
 
 
98
  function ( oResponse ) {
99
  }
100
  ).always( function () {
101
+ jQuery( '#icwpWpsfSiteBadge' ).remove();
102
  }
103
  );
104
 
templates/php/snippets/pro.php CHANGED
@@ -3,7 +3,7 @@
3
  /** @var string[] $inputs */
4
  /** @var string[] $flags */
5
  /** @var string[] $vars */
6
- /** @var string[] $ajax_vars */
7
  /** @var array $aLicKeyInput */
8
  $aLicKeyInput = $inputs[ 'license_key' ];
9
  ?>
@@ -65,20 +65,23 @@ $aLicKeyInput = $inputs[ 'license_key' ];
65
  <hr />
66
 
67
  <h4>License Actions</h4>
 
68
  <div class="row">
69
  <div class="col card">
70
  <form action="<?php echo $form_action; ?>" method="post" class="licenseForm">
71
- <input type="hidden" name="license-action" value="activate" />
 
 
 
 
 
72
  <div class="form-group">
73
- <label for="<?php echo $aLicKeyInput[ 'name' ]; ?>">Activate New License Key</label>
74
- <input type="text" name="<?php echo $aLicKeyInput[ 'name' ]; ?>"
75
- class="form-control"
76
- id="<?php echo $aLicKeyInput[ 'name' ]; ?>"
77
- maxlength="<?php echo $aLicKeyInput[ 'maxlength' ]; ?>"
78
- value="" />
79
- <button class="btn btn-success" type="submit" id="ButtonActivate" name="activate">
80
- Activate Key</button>
81
- <span class="form-text text-muted">This will replace any existing license key.</span>
82
  </div>
83
  </form>
84
  </div>
@@ -88,22 +91,11 @@ $aLicKeyInput = $inputs[ 'license_key' ];
88
  <div class="row">
89
  <div class="col card">
90
  <form action="<?php echo $form_action; ?>" method="post" class="licenseForm">
91
- <input type="hidden" name="license-action" value="recheck" />
92
- <div class="form-group">
93
- <label>Recheck Key</label>
94
- <button class="btn btn-info" type="submit"
95
- <?php echo $flags[ 'button_enabled_remove' ] ? '' : 'disabled="disabled"'; ?> >
96
- Recheck
97
- </button>
98
- <span class="form-text text-muted">Verify and refresh the current license registration.</span>
99
- </div>
100
- </form>
101
- </div>
102
- </div>
103
 
104
- <div class="row">
105
- <div class="col card">
106
- <form action="<?php echo $form_action; ?>" method="post" class="licenseForm">
 
107
  <input type="hidden" name="license-action" value="remove" />
108
  <div class="form-group">
109
  <label>Remove Current License</label>
@@ -132,7 +124,7 @@ $aLicKeyInput = $inputs[ 'license_key' ];
132
  </h5>
133
  </div>
134
 
135
- <div id="collone" class="collapse" aria-labelledby="headingOne"
136
  data-parent="#accordion">
137
  <div class="card-body">
138
  <dl>
@@ -141,24 +133,24 @@ $aLicKeyInput = $inputs[ 'license_key' ];
141
  Shield can then automatically upgrade as updates become available.
142
  </dd>
143
 
 
 
 
144
  <dt>Support for WooCommerce &amp; other 3rd party plugins</dt>
145
- <dd>Shield Pro works seamlessly with WooCommerce, providing tighter security
146
- for your customer accounts.
147
  </dd>
148
 
149
  <dt>Exclusive Customer Support</dt>
150
- <dd>Technical email support for Shield Security is exclusive to Pro customers.
151
- </dd>
152
 
153
  <dt>Import and Export of plugin options</dt>
154
- <dd>Automatically import plugin settings directly from 1 site to another.</dd>
155
 
156
- <dt>Exclusive Early-Access to new features </dt>
157
- <dd>Be the first to access new security features, as soon as they're available.
158
- </dd>
159
 
160
  <dt>Unlimited Audit Trail</dt>
161
- <dd>Retain the audit trail logs for as long as you need - no limits.</dd>
162
 
163
  <dt>Customize text shown to visitors</dt>
164
  <dd>Edit customer-facing messages/text of the Shield plugin.</dd>
@@ -179,9 +171,6 @@ $aLicKeyInput = $inputs[ 'license_key' ];
179
  <div id="colltwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
180
  <div class="card-body">
181
  <dl>
182
- <dt>Catch Hacks Immediately - Plugins and Themes Guard</dt>
183
- <dd>Be alerted immediately to ANY unauthorized changes to plugin and theme files.</dd>
184
-
185
  <dt>White Label</dt>
186
  <dd>Re-Brand Shield Security as your own!</dd>
187
 
@@ -254,26 +243,9 @@ var iCWP_WPSF_LicenseHandler = new function () {
254
  return false;
255
  }
256
  bRequestCurrentlyRunning = true;
257
-
258
  event.preventDefault();
259
 
260
  var $oForm = jQuery( this );
261
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'action' )
262
- .attr( 'value', "<?php echo $ajax_vars[ 'icwp_ajax_action' ]; ?>" )
263
- .appendTo( $oForm );
264
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_ajax_action' )
265
- .attr( 'value', "<?php echo $ajax_vars[ 'icwp_ajax_action' ]; ?>" )
266
- .appendTo( $oForm );
267
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_nonce' )
268
- .attr( 'value', "<?php echo $ajax_vars[ 'icwp_nonce' ]; ?>" )
269
- .appendTo( $oForm );
270
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_nonce_action' )
271
- .attr( 'value', "<?php echo $ajax_vars[ 'icwp_nonce_action' ]; ?>" )
272
- .appendTo( $oForm );
273
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_action_module' )
274
- .attr( 'value', "<?php echo $ajax_vars[ 'icwp_action_module' ]; ?>" )
275
- .appendTo( $oForm );
276
-
277
  jQuery.post( ajaxurl, $oForm.serialize(),
278
  function ( oResponse ) {
279
  }
3
  /** @var string[] $inputs */
4
  /** @var string[] $flags */
5
  /** @var string[] $vars */
6
+ /** @var string[] $aLicenseAjax */
7
  /** @var array $aLicKeyInput */
8
  $aLicKeyInput = $inputs[ 'license_key' ];
9
  ?>
65
  <hr />
66
 
67
  <h4>License Actions</h4>
68
+
69
  <div class="row">
70
  <div class="col card">
71
  <form action="<?php echo $form_action; ?>" method="post" class="licenseForm">
72
+
73
+ <?php foreach ( $ajax[ 'license_handling' ] as $sAjKey => $sAjVal ) : ?>
74
+ <input type="hidden" name="<?php echo $sAjKey; ?>" value="<?php echo $sAjVal; ?>" />
75
+ <?php endforeach; ?>
76
+
77
+ <input type="hidden" name="license-action" value="check" />
78
  <div class="form-group">
79
+ <label>Check License Availability For This Site</label>
80
+ <button class="btn btn-info" type="submit"
81
+ <?php echo $flags[ 'button_enabled_check' ] ? '' : 'disabled="disabled"'; ?> >
82
+ Check License
83
+ </button>
84
+ <span class="form-text text-muted">Verify License Registration</span>
 
 
 
85
  </div>
86
  </form>
87
  </div>
91
  <div class="row">
92
  <div class="col card">
93
  <form action="<?php echo $form_action; ?>" method="post" class="licenseForm">
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
+ <?php foreach ( $ajax[ 'license_handling' ] as $sAjKey => $sAjVal ) : ?>
96
+ <input type="hidden" name="<?php echo $sAjKey; ?>" value="<?php echo $sAjVal; ?>" />
97
+ <?php endforeach; ?>
98
+
99
  <input type="hidden" name="license-action" value="remove" />
100
  <div class="form-group">
101
  <label>Remove Current License</label>
124
  </h5>
125
  </div>
126
 
127
+ <div id="collone" class="collapse show" aria-labelledby="headingOne"
128
  data-parent="#accordion">
129
  <div class="card-body">
130
  <dl>
133
  Shield can then automatically upgrade as updates become available.
134
  </dd>
135
 
136
+ <dt>Catch Hacks Immediately - Plugins and Themes Guard</dt>
137
+ <dd>Be alerted to ANY unauthorized changes to plugins/themes.</dd>
138
+
139
  <dt>Support for WooCommerce &amp; other 3rd party plugins</dt>
140
+ <dd>Provide tighter security for your WooCommerce customers.
 
141
  </dd>
142
 
143
  <dt>Exclusive Customer Support</dt>
144
+ <dd>Technical support for Shield is exclusive to Pro customers.</dd>
 
145
 
146
  <dt>Import and Export of plugin options</dt>
147
+ <dd>Automatically import settings directly from 1 site to another.</dd>
148
 
149
+ <dt>Exclusive Early-Access </dt>
150
+ <dd>Be 1st to get new security features, as soon as they're available.</dd>
 
151
 
152
  <dt>Unlimited Audit Trail</dt>
153
+ <dd>Retain logs for as long as you need - no limits.</dd>
154
 
155
  <dt>Customize text shown to visitors</dt>
156
  <dd>Edit customer-facing messages/text of the Shield plugin.</dd>
171
  <div id="colltwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
172
  <div class="card-body">
173
  <dl>
 
 
 
174
  <dt>White Label</dt>
175
  <dd>Re-Brand Shield Security as your own!</dd>
176
 
243
  return false;
244
  }
245
  bRequestCurrentlyRunning = true;
 
246
  event.preventDefault();
247
 
248
  var $oForm = jQuery( this );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  jQuery.post( ajaxurl, $oForm.serialize(),
250
  function ( oResponse ) {
251
  }
templates/twig/snippets/state_summary.twig DELETED
@@ -1,33 +0,0 @@
1
-
2
- {% if aSummaryData is defined and aSummaryData|length %}
3
-
4
- <div class="row-fluid">
5
- <div class="span">
6
- <h3>{{ strings.plugin_activated_features_summary }}</h3>
7
- </div>
8
- </div>
9
-
10
- <div class="row-fluid feature-summary-blocks">
11
- {% for key, aSummary in aSummaryData %}
12
- {% if (key > 0) and ( key is divisible by(4) )%}
13
- </div><div class="row-fluid feature-summary-blocks">
14
- {% endif %}
15
-
16
- <div class="span3 feature-summary-block state-{{ aSummary.enabled? 'on' : 'off' }}" id="feature-{{ aSummary.slug }}">
17
- <div class="row-fluid">
18
- <div class="feature-icon span3"></div>
19
- <div class="span8 offset1">
20
- <a class="btn btn-{{ aSummary.enabled ? 'success' : 'warning' }}"
21
- href="{{ aSummary.href }}">
22
- {{ strings.go_to_settings }}
23
- </a>
24
- </div>
25
- </div>
26
- <div class="feature-name">
27
- {{ aSummary.name }} : <span class="feature-enabled-text">{{ aSummary.enabled ? 'on' : 'off' }}</span>
28
- </div>
29
- </div>
30
-
31
- {% endfor %}
32
- </div>
33
- {% endif %}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
templates/twig/wizard/pages/wizard.twig CHANGED
@@ -128,19 +128,16 @@ var iCWP_WPSF_Wizard_FormHandler = new function () {
128
  bRequestCurrentlyRunning = true;
129
 
130
  jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'action' )
131
- .attr( 'value', "{{ ajax.content.icwp_ajax_action }}" )
132
  .appendTo( $oForm );
133
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_ajax_action' )
134
- .attr( 'value', "{{ ajax.content.icwp_ajax_action }}" )
135
  .appendTo( $oForm );
136
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_nonce' )
137
- .attr( 'value', "{{ ajax.content.icwp_nonce }}" )
138
  .appendTo( $oForm );
139
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_nonce_action' )
140
- .attr( 'value', "{{ ajax.content.icwp_nonce_action }}" )
141
- .appendTo( $oForm );
142
- jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'icwp_action_module' )
143
- .attr( 'value', "{{ ajax.content.icwp_action_module }}" )
144
  .appendTo( $oForm );
145
 
146
  if ( jQuery( 'p.wizard-response', $oForm ).length === 0 ) {
@@ -157,6 +154,11 @@ var iCWP_WPSF_Wizard_FormHandler = new function () {
157
  jQuery.post( '{{ ajax.content.ajaxurl }}', $oForm.serialize(),
158
  function ( oResponse ) {
159
 
 
 
 
 
 
160
  if ( oResponse.success ) {
161
  $oResponseField.removeClass( 'alert-danger' )
162
  .addClass( 'alert-success' );
@@ -219,6 +221,11 @@ var iCWP_WPSF_Wizard_FormHandler = new function () {
219
 
220
  jQuery.post( '{{ ajax.steps.ajaxurl }}', reqData,
221
  function ( oResponse ) {
 
 
 
 
 
222
  if ( undefined !== oResponse.data.next_step ) {
223
  $oWizard.steps( 'add', oResponse.data.next_step );
224
  $oWizard.steps( 'next' );
128
  bRequestCurrentlyRunning = true;
129
 
130
  jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'action' )
131
+ .attr( 'value', "{{ ajax.content.action }}" )
132
  .appendTo( $oForm );
133
+ jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'exec' )
134
+ .attr( 'value', "{{ ajax.content.exec }}" )
135
  .appendTo( $oForm );
136
+ jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'exec_nonce' )
137
+ .attr( 'value', "{{ ajax.content.exec_nonce }}" )
138
  .appendTo( $oForm );
139
+ jQuery( '<input />' ).attr( 'type', 'hidden' ).attr( 'name', 'mod_slug' )
140
+ .attr( 'value', "{{ ajax.content.mod_slug }}" )
 
 
 
141
  .appendTo( $oForm );
142
 
143
  if ( jQuery( 'p.wizard-response', $oForm ).length === 0 ) {
154
  jQuery.post( '{{ ajax.content.ajaxurl }}', $oForm.serialize(),
155
  function ( oResponse ) {
156
 
157
+ if ( typeof oResponse === "undefined" || typeof oResponse.data === "undefined" ) {
158
+ alert( 'There was a critical failure in the request. Cannot proceed. Example causes are HTTPS misconfiguration or PHP error warnings output.' );
159
+ return;
160
+ }
161
+
162
  if ( oResponse.success ) {
163
  $oResponseField.removeClass( 'alert-danger' )
164
  .addClass( 'alert-success' );
221
 
222
  jQuery.post( '{{ ajax.steps.ajaxurl }}', reqData,
223
  function ( oResponse ) {
224
+ if ( typeof oResponse === "undefined" || typeof oResponse.data === "undefined" ) {
225
+ alert( 'There was a critical failure in the request. Cannot proceed. Example causes are HTTPS misconfiguration or PHP error warnings output.' );
226
+ return;
227
+ }
228
+
229
  if ( undefined !== oResponse.data.next_step ) {
230
  $oWizard.steps( 'add', oResponse.data.next_step );
231
  $oWizard.steps( 'next' );
templates/twig/wizard/slides/welcome/ip_detect.twig CHANGED
@@ -26,7 +26,7 @@
26
  <p>Copy and paste the IP address from Step 1 into the text box below and click submit.</p>
27
 
28
  <form class="form-horizontal icwp-wizard-form">
29
- {{ slideMacros.formInput_Password( 'ip', '', 'My IP Address', '123.456.789.012' ) }}
30
 
31
  {{ slideMacros.formInput_Hidden( 'wizard-step', 'ip_detect' ) }}
32
  {{ slideMacros.formInput_Submit( 'Submit: This Is My IP' ) }}
26
  <p>Copy and paste the IP address from Step 1 into the text box below and click submit.</p>
27
 
28
  <form class="form-horizontal icwp-wizard-form">
29
+ {{ slideMacros.formInput_Text( 'ip', '', 'My IP Address', '123.456.789.012' ) }}
30
 
31
  {{ slideMacros.formInput_Hidden( 'wizard-step', 'ip_detect' ) }}
32
  {{ slideMacros.formInput_Submit( 'Submit: This Is My IP' ) }}