Plugin Directory

Changeset 3445838


Ignore:
Timestamp:
01/23/2026 09:21:49 PM (4 weeks ago)
Author:
blaminhor
Message:
  1. 1.1.0
Location:
blaminhor-essentials
Files:
118 added
2 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • blaminhor-essentials/trunk/assets/css/admin.css

    r3445615 r3445838  
    265265.ap-modules-grid.active {
    266266    display: grid;
    267     grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    268     gap: 16px;
     267    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
     268    gap: 10px;
    269269}
    270270
     
    293293    align-items: center;
    294294    justify-content: space-between;
    295     padding: 16px 16px 12px;
     295    padding: 10px 12px 8px;
    296296}
    297297
    298298.ap-module-card .ap-module-icon {
    299     width: 44px;
    300     height: 44px;
     299    width: 32px;
     300    height: 32px;
    301301    display: flex;
    302302    align-items: center;
    303303    justify-content: center;
    304304    background: #f0f0f1;
    305     border-radius: 8px;
     305    border-radius: 6px;
    306306    color: var(--ap-gray-600);
    307307}
     
    313313
    314314.ap-module-card .ap-module-icon .dashicons {
    315     font-size: 22px;
    316     width: 22px;
    317     height: 22px;
     315    font-size: 18px;
     316    width: 18px;
     317    height: 18px;
    318318}
    319319
    320320.ap-module-card .ap-module-body {
    321     padding: 0 16px 16px;
     321    padding: 0 12px 10px;
    322322    flex: 1;
    323323}
    324324
    325325.ap-module-card .ap-module-name {
    326     margin: 0 0 4px;
    327     font-size: 14px;
     326    margin: 0 0 2px;
     327    font-size: 12px;
    328328    font-weight: 600;
    329329    color: var(--ap-gray-800);
     
    332332.ap-module-card .ap-module-desc {
    333333    margin: 0;
    334     font-size: 12px;
     334    font-size: 11px;
    335335    color: var(--ap-gray-500);
    336     line-height: 1.5;
     336    line-height: 1.4;
    337337}
    338338
     
    342342    justify-content: center;
    343343    gap: 4px;
    344     padding: 10px 16px;
     344    padding: 6px 12px;
    345345    background: #f6f7f7;
    346346    border-top: 1px solid #c3c4c7;
    347347    color: var(--ap-primary);
    348     font-size: 13px;
     348    font-size: 11px;
    349349    font-weight: 500;
    350350    text-decoration: none;
  • blaminhor-essentials/trunk/assets/css/admin.min.css

    r3445615 r3445838  
    265265.ap-modules-grid.active {
    266266    display: grid;
    267     grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    268     gap: 16px;
     267    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
     268    gap: 10px;
    269269}
    270270
     
    293293    align-items: center;
    294294    justify-content: space-between;
    295     padding: 16px 16px 12px;
     295    padding: 10px 12px 8px;
    296296}
    297297
    298298.ap-module-card .ap-module-icon {
    299     width: 44px;
    300     height: 44px;
     299    width: 32px;
     300    height: 32px;
    301301    display: flex;
    302302    align-items: center;
    303303    justify-content: center;
    304304    background: #f0f0f1;
    305     border-radius: 8px;
     305    border-radius: 6px;
    306306    color: var(--ap-gray-600);
    307307}
     
    313313
    314314.ap-module-card .ap-module-icon .dashicons {
    315     font-size: 22px;
    316     width: 22px;
    317     height: 22px;
     315    font-size: 18px;
     316    width: 18px;
     317    height: 18px;
    318318}
    319319
    320320.ap-module-card .ap-module-body {
    321     padding: 0 16px 16px;
     321    padding: 0 12px 10px;
    322322    flex: 1;
    323323}
    324324
    325325.ap-module-card .ap-module-name {
    326     margin: 0 0 4px;
    327     font-size: 14px;
     326    margin: 0 0 2px;
     327    font-size: 12px;
    328328    font-weight: 600;
    329329    color: var(--ap-gray-800);
     
    332332.ap-module-card .ap-module-desc {
    333333    margin: 0;
    334     font-size: 12px;
     334    font-size: 11px;
    335335    color: var(--ap-gray-500);
    336     line-height: 1.5;
     336    line-height: 1.4;
    337337}
    338338
     
    342342    justify-content: center;
    343343    gap: 4px;
    344     padding: 10px 16px;
     344    padding: 6px 12px;
    345345    background: #f6f7f7;
    346346    border-top: 1px solid #c3c4c7;
    347347    color: var(--ap-primary);
    348     font-size: 13px;
     348    font-size: 11px;
    349349    font-weight: 500;
    350350    text-decoration: none;
  • blaminhor-essentials/trunk/blaminhor-essentials.php

    r3445615 r3445838  
    44 * Plugin URI:        https://wp.blaminhor.com/
    55 * Description:       A modular toolkit for WordPress with activatable features. Lightweight, secure, and reliable.
    6  * Version:           1.0.0
     6 * Version:           1.1.0
    77 * Requires at least: 6.2
    88 * Requires PHP:      7.4
     
    2323
    2424// Plugin constants
    25 define('BLAMINHOR_ESSENTIALS_VERSION', '1.0.0');
     25define('BLAMINHOR_ESSENTIALS_VERSION', '1.1.0');
    2626define('BLAMINHOR_ESSENTIALS_PLUGIN_FILE', __FILE__);
    2727define('BLAMINHOR_ESSENTIALS_PLUGIN_DIR', plugin_dir_path(__FILE__));
     
    3636 * __( 'Content Duplicator', 'blaminhor-essentials' );
    3737 * __( 'Duplicate any post type or taxonomy with all metadata.', 'blaminhor-essentials' );
     38 * __( 'Classic Editor', 'blaminhor-essentials' );
     39 * __( 'Enables the previous "classic" editor and the old-style Edit Post screen.', 'blaminhor-essentials' );
     40 * __( 'Image Sizes', 'blaminhor-essentials' );
     41 * __( 'Manage WordPress image sizes and disable unused ones.', 'blaminhor-essentials' );
     42 * __( 'Favicon Generator', 'blaminhor-essentials' );
     43 * __( 'Generate all favicon formats from a single image.', 'blaminhor-essentials' );
     44 * __( 'GSO/SEO Manager', 'blaminhor-essentials' );
     45 * __( 'Complete SEO toolkit: meta tags, indexing control, social sharing, and XML sitemaps.', 'blaminhor-essentials' );
     46 * __( 'Broken Links Checker', 'blaminhor-essentials' );
     47 * __( 'Scan your site for broken internal and external links.', 'blaminhor-essentials' );
     48 * __( 'Redirections 301', 'blaminhor-essentials' );
     49 * __( 'Manage 301 redirections with simple rules or regex patterns.', 'blaminhor-essentials' );
     50 * __( 'Backup', 'blaminhor-essentials' );
     51 * __( 'Create local backups of your site files and database.', 'blaminhor-essentials' );
     52 * __( 'Database Optimizer', 'blaminhor-essentials' );
     53 * __( 'Clean and optimize your WordPress database for better performance.', 'blaminhor-essentials' );
     54 * __( 'Domain Changer', 'blaminhor-essentials' );
     55 * __( 'Change your site domain and update all database references in one click.', 'blaminhor-essentials' );
     56 * __( 'HTTPS Redirect', 'blaminhor-essentials' );
     57 * __( 'Force HTTPS redirection for your site.', 'blaminhor-essentials' );
     58 * __( 'Fatal Error Recovery', 'blaminhor-essentials' );
     59 * __( 'Recover from fatal errors by disabling problematic plugins without FTP access.', 'blaminhor-essentials' );
    3860 * __( 'Coming soon / Maintenance', 'blaminhor-essentials' );
    3961 * __( 'Enable Coming Soon or Maintenance mode for your site.', 'blaminhor-essentials' );
    4062 * __( 'SMTP Mailer', 'blaminhor-essentials' );
    4163 * __( 'Configure SMTP relay with fallback support and email logging.', 'blaminhor-essentials' );
     64 * __( 'Mute Core Emails', 'blaminhor-essentials' );
     65 * __( 'Mute automatic emails from WordPress core.', 'blaminhor-essentials' );
    4266 * __( 'Content & Media', 'blaminhor-essentials' );
     67 * __( 'SEO & Links', 'blaminhor-essentials' );
     68 * __( 'Database & Migration', 'blaminhor-essentials' );
    4369 * __( 'Security & Maintenance', 'blaminhor-essentials' );
    4470 * __( 'Emails', 'blaminhor-essentials' );
    4571 */
     72
     73/**
     74 * STANDALONE RECOVERY HANDLER
     75 * This runs BEFORE anything else to ensure recovery works even during fatal errors.
     76 * It doesn't depend on any module or class.
     77 *
     78 * Note: Nonce verification is not used here because:
     79 * 1. This is a recovery mechanism that must work even when WordPress is broken
     80 * 2. Authentication is done via a secret recovery key stored in DB/file
     81 * 3. The recovery key acts as a CSRF token for form submissions
     82 */
     83// phpcs:disable WordPress.Security.NonceVerification.Recommended -- Recovery mode uses secret key authentication instead of nonce
     84if ( isset( $_GET['be_recovery'] ) && ! empty( $_GET['be_recovery'] ) ) {
     85    blaminhor_essentials_standalone_recovery( sanitize_text_field( wp_unslash( $_GET['be_recovery'] ) ) );
     86}
     87// phpcs:enable WordPress.Security.NonceVerification.Recommended
     88
     89/**
     90 * Standalone recovery function - completely independent of the plugin
     91 *
     92 * @param string $provided_key The recovery key from URL.
     93 */
     94function blaminhor_essentials_standalone_recovery( $provided_key ) {
     95    // Get recovery key from options (may fail if DB issue, so also check file)
     96    $stored_key = get_option( 'blaminhor_essentials_module_fatal-error-recovery_settings', array() );
     97    $stored_key = isset( $stored_key['recovery_key'] ) ? $stored_key['recovery_key'] : '';
     98
     99    // Also check file-based key as fallback
     100    $upload_dir = wp_upload_dir();
     101    $key_file   = $upload_dir['basedir'] . '/blaminhor-essentials/.recovery-key';
     102    if ( empty( $stored_key ) && file_exists( $key_file ) ) {
     103        $stored_key = trim( file_get_contents( $key_file ) );
     104    }
     105
     106    // Verify key
     107    if ( empty( $stored_key ) || ! hash_equals( $stored_key, $provided_key ) ) {
     108        return; // Invalid key, continue normal plugin load
     109    }
     110
     111    // We're in recovery mode - handle actions and display page
     112    blaminhor_essentials_recovery_handle_actions( $stored_key );
     113    blaminhor_essentials_recovery_display_page( $stored_key );
     114    exit; // Stop all further execution
     115}
     116
     117/**
     118 * Handle recovery actions (enable/disable plugins)
     119 * Uses simple token verification since wp_create_nonce() may not be available yet
     120 *
     121 * Note: This function intentionally uses WP_Filesystem because:
     122 * 1. It's the WordPress-recommended way to handle file operations
     123 * 2. Recovery mode initializes filesystem in direct mode for reliability
     124 *
     125 * @param string $recovery_key The recovery key for CSRF protection.
     126 */
     127function blaminhor_essentials_recovery_handle_actions( $recovery_key ) {
     128    // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Recovery mode uses secret key authentication instead of nonce
     129    if ( ! isset( $_POST['be_fer_token'] ) ) {
     130        return;
     131    }
     132
     133    // Use recovery key as CSRF token since it's already secret
     134    // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Recovery mode uses secret key as CSRF token
     135    $token = sanitize_text_field( wp_unslash( $_POST['be_fer_token'] ) );
     136    if ( ! hash_equals( $recovery_key, $token ) ) {
     137        return;
     138    }
     139
     140    // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified via recovery key above
     141    $action = isset( $_POST['be_fer_action'] ) ? sanitize_key( wp_unslash( $_POST['be_fer_action'] ) ) : '';
     142    // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified via recovery key above
     143    $plugin = isset( $_POST['be_fer_plugin'] ) ? sanitize_file_name( wp_unslash( $_POST['be_fer_plugin'] ) ) : '';
     144
     145    if ( empty( $action ) || empty( $plugin ) ) {
     146        return;
     147    }
     148
     149    // Additional validation: only allow specific actions
     150    if ( ! in_array( $action, array( 'enable', 'disable', 'disable_https' ), true ) ) {
     151        return;
     152    }
     153
     154    // Handle HTTPS disable action
     155    if ( 'disable_https' === $action ) {
     156        $https_settings = get_option( 'blaminhor_essentials_module_https-redirect_settings', array() );
     157        $https_settings['enabled'] = false;
     158        update_option( 'blaminhor_essentials_module_https-redirect_settings', $https_settings );
     159        return;
     160    }
     161
     162    // Get active plugins from database
     163    $active_plugins = get_option( 'active_plugins', array() );
     164
     165    if ( 'disable' === $action ) {
     166        // Find and remove plugin from active_plugins
     167        $plugin_file = blaminhor_essentials_find_plugin_file( $plugin );
     168        if ( $plugin_file ) {
     169            $key = array_search( $plugin_file, $active_plugins, true );
     170            if ( false !== $key ) {
     171                unset( $active_plugins[ $key ] );
     172                update_option( 'active_plugins', array_values( $active_plugins ) );
     173            }
     174        }
     175    } elseif ( 'enable' === $action ) {
     176        // Find and add plugin to active_plugins
     177        $plugin_file = blaminhor_essentials_find_plugin_file( $plugin );
     178        if ( $plugin_file && ! in_array( $plugin_file, $active_plugins, true ) ) {
     179            $active_plugins[] = $plugin_file;
     180            update_option( 'active_plugins', $active_plugins );
     181        }
     182    }
     183}
     184
     185/**
     186 * Find the main plugin file for a plugin folder
     187 *
     188 * @param string $plugin_folder Plugin folder name.
     189 * @return string|false Plugin file path (folder/file.php) or false.
     190 */
     191function blaminhor_essentials_find_plugin_file( $plugin_folder ) {
     192    $plugins_dir = WP_PLUGIN_DIR;
     193    $plugin_path = $plugins_dir . '/' . $plugin_folder;
     194
     195    if ( ! is_dir( $plugin_path ) ) {
     196        return false;
     197    }
     198
     199    // Check for plugin-name.php
     200    $main_file = $plugin_path . '/' . $plugin_folder . '.php';
     201    if ( file_exists( $main_file ) ) {
     202        $content = file_get_contents( $main_file, false, null, 0, 8192 );
     203        if ( strpos( $content, 'Plugin Name:' ) !== false ) {
     204            return $plugin_folder . '/' . $plugin_folder . '.php';
     205        }
     206    }
     207
     208    // Scan for any PHP file with Plugin Name header
     209    $files = glob( $plugin_path . '/*.php' );
     210    if ( $files ) {
     211        foreach ( $files as $file ) {
     212            $content = file_get_contents( $file, false, null, 0, 8192 );
     213            if ( strpos( $content, 'Plugin Name:' ) !== false ) {
     214                return $plugin_folder . '/' . basename( $file );
     215            }
     216        }
     217    }
     218
     219    return false;
     220}
     221
     222/**
     223 * Display standalone recovery page
     224 *
     225 * @param string $recovery_key The recovery key for CSRF protection.
     226 */
     227function blaminhor_essentials_recovery_display_page( $recovery_key ) {
     228    $plugins_dir    = WP_PLUGIN_DIR;
     229    $plugins        = array();
     230    $active_plugins = get_option( 'active_plugins', array() );
     231
     232    // Scan plugins directory
     233    $dirs = @scandir( $plugins_dir );
     234    if ( $dirs ) {
     235        foreach ( $dirs as $dir ) {
     236            if ( in_array( $dir, array( '.', '..', 'index.php' ), true ) ) {
     237                continue;
     238            }
     239
     240            // Skip folders starting with underscore (legacy disabled plugins)
     241            if ( strpos( $dir, '_' ) === 0 ) {
     242                continue;
     243            }
     244
     245            $plugin_path = $plugins_dir . '/' . $dir;
     246
     247            if ( ! is_dir( $plugin_path ) ) {
     248                continue;
     249            }
     250
     251            // Find the main plugin file
     252            $plugin_file = blaminhor_essentials_find_plugin_file( $dir );
     253            if ( ! $plugin_file ) {
     254                continue;
     255            }
     256
     257            // Check if plugin is active
     258            $is_active = in_array( $plugin_file, $active_plugins, true );
     259
     260            // Try to get plugin name from main file
     261            $plugin_name = $dir;
     262            $main_file   = $plugins_dir . '/' . $plugin_file;
     263            if ( file_exists( $main_file ) ) {
     264                $plugin_data = get_file_data( $main_file, array( 'Name' => 'Plugin Name' ) );
     265                if ( ! empty( $plugin_data['Name'] ) ) {
     266                    $plugin_name = $plugin_data['Name'];
     267                }
     268            }
     269
     270            $plugins[] = array(
     271                'name'     => $plugin_name,
     272                'folder'   => $dir,
     273                'active'   => $is_active,
     274                'is_self'  => ( strpos( $dir, 'blaminhor-essentials' ) !== false ),
     275            );
     276        }
     277    }
     278
     279    // Sort: active first, then inactive
     280    usort( $plugins, function( $a, $b ) {
     281        if ( $a['active'] === $b['active'] ) {
     282            return strcasecmp( $a['name'], $b['name'] );
     283        }
     284        return $a['active'] ? -1 : 1;
     285    } );
     286
     287    $token = $recovery_key; // Use recovery key as CSRF token
     288
     289    // Check if HTTPS redirect is enabled
     290    $https_settings = get_option( 'blaminhor_essentials_module_https-redirect_settings', array() );
     291    $https_enabled  = isset( $https_settings['enabled'] ) && $https_settings['enabled'];
     292
     293    // Output the recovery page
     294    ?>
     295    <!DOCTYPE html>
     296    <html>
     297    <head>
     298        <meta charset="UTF-8">
     299        <meta name="viewport" content="width=device-width, initial-scale=1.0">
     300        <meta name="robots" content="noindex, nofollow">
     301        <title><?php echo esc_html__( 'Recovery Mode', 'blaminhor-essentials' ); ?> - Blaminhor Essentials</title>
     302        <style>
     303            * { box-sizing: border-box; margin: 0; padding: 0; }
     304            body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f0f0f1; padding: 40px 20px; }
     305            .recovery-container { max-width: 800px; margin: 0 auto; }
     306            .recovery-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #fff; padding: 30px; border-radius: 8px 8px 0 0; }
     307            .recovery-header h1 { font-size: 24px; margin-bottom: 8px; }
     308            .recovery-header p { opacity: 0.9; font-size: 14px; }
     309            .recovery-content { background: #fff; padding: 30px; border-radius: 0 0 8px 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
     310            .warning-box { background: #fff3cd; border: 1px solid #ffc107; padding: 15px; border-radius: 4px; margin-bottom: 20px; }
     311            .warning-box strong { color: #856404; }
     312            .plugin-list { list-style: none; }
     313            .plugin-item { display: flex; align-items: center; justify-content: space-between; padding: 15px; border-bottom: 1px solid #e0e0e0; }
     314            .plugin-item:last-child { border-bottom: none; }
     315            .plugin-item.disabled { background: #f8f8f8; }
     316            .plugin-name { font-weight: 500; }
     317            .plugin-name.disabled { color: #666; text-decoration: line-through; }
     318            .btn { padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; }
     319            .btn-disable { background: #dc3545; color: #fff; }
     320            .btn-enable { background: #28a745; color: #fff; }
     321            .btn-warning { background: #ffc107; color: #000; }
     322            .btn:hover { opacity: 0.9; }
     323            .self-warning { font-size: 11px; color: #dc3545; margin-top: 4px; }
     324            .https-box { background: #fff3cd; border: 1px solid #ffc107; padding: 20px; border-radius: 4px; margin-bottom: 20px; }
     325            .https-box h3 { color: #856404; margin-bottom: 10px; font-size: 16px; }
     326            .https-box p { margin-bottom: 15px; color: #856404; }
     327            .https-box .btn { margin-top: 5px; }
     328            .success-box { background: #d4edda; border: 1px solid #28a745; padding: 15px; border-radius: 4px; margin-bottom: 20px; color: #155724; }
     329        </style>
     330    </head>
     331    <body>
     332        <div class="recovery-container">
     333            <div class="recovery-header">
     334                <h1><?php echo esc_html__( 'Recovery Mode', 'blaminhor-essentials' ); ?></h1>
     335                <p><?php echo esc_html__( 'Disable problematic plugins to recover your site.', 'blaminhor-essentials' ); ?></p>
     336            </div>
     337            <div class="recovery-content">
     338                <?php if ( $https_enabled ) : ?>
     339                <div class="https-box">
     340                    <h3><?php echo esc_html__( 'HTTPS Redirect is enabled', 'blaminhor-essentials' ); ?></h3>
     341                    <p><?php echo esc_html__( 'If you are having trouble accessing your site due to HTTPS issues, you can disable the HTTPS redirect here.', 'blaminhor-essentials' ); ?></p>
     342                    <form method="post" style="display: inline;">
     343                        <input type="hidden" name="be_fer_token" value="<?php echo esc_attr( $token ); ?>">
     344                        <input type="hidden" name="be_fer_action" value="disable_https">
     345                        <input type="hidden" name="be_fer_plugin" value="https-redirect">
     346                        <button type="submit" class="btn btn-warning"><?php echo esc_html__( 'Disable HTTPS Redirect', 'blaminhor-essentials' ); ?></button>
     347                    </form>
     348                </div>
     349                <?php endif; ?>
     350
     351                <?php
     352                // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Recovery mode uses secret key
     353                if ( isset( $_POST['be_fer_action'] ) && 'disable_https' === $_POST['be_fer_action'] ) : ?>
     354                <div class="success-box">
     355                    <?php echo esc_html__( 'HTTPS Redirect has been disabled. You can now access your site via HTTP.', 'blaminhor-essentials' ); ?>
     356                </div>
     357                <?php endif; ?>
     358
     359                <div class="warning-box">
     360                    <strong><?php echo esc_html__( 'Warning:', 'blaminhor-essentials' ); ?></strong>
     361                    <?php echo esc_html__( 'Disabling a plugin deactivates it in the database. Re-enable via this page or the WordPress admin.', 'blaminhor-essentials' ); ?>
     362                </div>
     363
     364                <ul class="plugin-list">
     365                    <?php foreach ( $plugins as $plugin ) : ?>
     366                        <li class="plugin-item <?php echo ! $plugin['active'] ? 'disabled' : ''; ?>">
     367                            <div>
     368                                <span class="plugin-name <?php echo ! $plugin['active'] ? 'disabled' : ''; ?>">
     369                                    <?php echo esc_html( $plugin['name'] ); ?>
     370                                </span>
     371                                <?php if ( $plugin['is_self'] && $plugin['active'] ) : ?>
     372                                    <div class="self-warning"><?php echo esc_html__( 'Disabling this will disable recovery mode too!', 'blaminhor-essentials' ); ?></div>
     373                                <?php endif; ?>
     374                            </div>
     375                            <div>
     376                                <?php if ( ! $plugin['active'] ) : ?>
     377                                    <form method="post" style="display: inline;">
     378                                        <input type="hidden" name="be_fer_token" value="<?php echo esc_attr( $token ); ?>">
     379                                        <input type="hidden" name="be_fer_action" value="enable">
     380                                        <input type="hidden" name="be_fer_plugin" value="<?php echo esc_attr( $plugin['folder'] ); ?>">
     381                                        <button type="submit" class="btn btn-enable"><?php echo esc_html__( 'Activate', 'blaminhor-essentials' ); ?></button>
     382                                    </form>
     383                                <?php elseif ( $plugin['is_self'] ) : ?>
     384                                    <form method="post" style="display: inline;" onsubmit="return confirm('<?php echo esc_js( __( 'This will disable Blaminhor Essentials and this recovery page. You will need to re-enable it from WordPress admin. Continue?', 'blaminhor-essentials' ) ); ?>');">
     385                                        <input type="hidden" name="be_fer_token" value="<?php echo esc_attr( $token ); ?>">
     386                                        <input type="hidden" name="be_fer_action" value="disable">
     387                                        <input type="hidden" name="be_fer_plugin" value="<?php echo esc_attr( $plugin['folder'] ); ?>">
     388                                        <button type="submit" class="btn btn-disable"><?php echo esc_html__( 'Deactivate (Self)', 'blaminhor-essentials' ); ?></button>
     389                                    </form>
     390                                <?php else : ?>
     391                                    <form method="post" style="display: inline;">
     392                                        <input type="hidden" name="be_fer_token" value="<?php echo esc_attr( $token ); ?>">
     393                                        <input type="hidden" name="be_fer_action" value="disable">
     394                                        <input type="hidden" name="be_fer_plugin" value="<?php echo esc_attr( $plugin['folder'] ); ?>">
     395                                        <button type="submit" class="btn btn-disable"><?php echo esc_html__( 'Deactivate', 'blaminhor-essentials' ); ?></button>
     396                                    </form>
     397                                <?php endif; ?>
     398                            </div>
     399                        </li>
     400                    <?php endforeach; ?>
     401                </ul>
     402            </div>
     403        </div>
     404    </body>
     405    </html>
     406    <?php
     407}
    46408
    47409/**
     
    143505    {
    144506        $this->available_modules = array(
    145             // Content
     507            // Content & Media
    146508            'duplicator' => array(
    147509                'name' => 'Content Duplicator',
     
    152514                'category' => 'content-media',
    153515            ),
    154             // Maintenance
     516            'classic-editor' => array(
     517                'name' => 'Classic Editor',
     518                'description' => 'Enables the previous "classic" editor and the old-style Edit Post screen.',
     519                'icon' => 'dashicons-edit',
     520                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/classic-editor/class-module-classic-editor.php',
     521                'class' => 'Blaminhor_Essentials_Module_Classic_Editor',
     522                'category' => 'content-media',
     523            ),
     524            'image-sizes' => array(
     525                'name' => 'Image Sizes',
     526                'description' => 'Manage WordPress image sizes and disable unused ones.',
     527                'icon' => 'dashicons-format-image',
     528                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/image-sizes/class-module-image-sizes.php',
     529                'class' => 'Blaminhor_Essentials_Module_Image_Sizes',
     530                'category' => 'content-media',
     531            ),
     532            'favicon' => array(
     533                'name' => 'Favicon Generator',
     534                'description' => 'Generate all favicon formats from a single image.',
     535                'icon' => 'dashicons-star-filled',
     536                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/favicon/class-module-favicon.php',
     537                'class' => 'Blaminhor_Essentials_Module_Favicon',
     538                'category' => 'content-media',
     539            ),
     540            // SEO & Links
     541            'seo-manager' => array(
     542                'name' => 'GSO/SEO Manager',
     543                'description' => 'Complete SEO toolkit: meta tags, indexing control, social sharing, and XML sitemaps.',
     544                'icon' => 'dashicons-chart-line',
     545                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/seo-manager/class-module-seo-manager.php',
     546                'class' => 'Blaminhor_Essentials_Module_SEO_Manager',
     547                'category' => 'seo-links',
     548            ),
     549            'broken-links' => array(
     550                'name' => 'Broken Links Checker',
     551                'description' => 'Scan your site for broken internal and external links.',
     552                'icon' => 'dashicons-admin-links',
     553                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/broken-links/class-module-broken-links.php',
     554                'class' => 'Blaminhor_Essentials_Module_Broken_Links',
     555                'category' => 'seo-links',
     556            ),
     557            'redirections' => array(
     558                'name' => 'Redirections 301',
     559                'description' => 'Manage 301 redirections with simple rules or regex patterns.',
     560                'icon' => 'dashicons-randomize',
     561                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/redirections/class-module-redirections.php',
     562                'class' => 'Blaminhor_Essentials_Module_Redirections',
     563                'category' => 'seo-links',
     564            ),
     565            // Database & Migration
     566            'backup' => array(
     567                'name' => 'Backup',
     568                'description' => 'Create local backups of your site files and database.',
     569                'icon' => 'dashicons-cloud-saved',
     570                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/backup/class-module-backup.php',
     571                'class' => 'Blaminhor_Essentials_Module_Backup',
     572                'category' => 'database-migration',
     573            ),
     574            'db-optimizer' => array(
     575                'name' => 'Database Optimizer',
     576                'description' => 'Clean and optimize your WordPress database for better performance.',
     577                'icon' => 'dashicons-database',
     578                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/db-optimizer/class-module-db-optimizer.php',
     579                'class' => 'Blaminhor_Essentials_Module_Db_Optimizer',
     580                'category' => 'database-migration',
     581            ),
     582            'domain-changer' => array(
     583                'name' => 'Domain Changer',
     584                'description' => 'Change your site domain and update all database references in one click.',
     585                'icon' => 'dashicons-admin-site-alt3',
     586                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/domain-changer/class-module-domain-changer.php',
     587                'class' => 'Blaminhor_Essentials_Module_Domain_Changer',
     588                'category' => 'database-migration',
     589            ),
     590            // Security & Maintenance
     591            'https-redirect' => array(
     592                'name' => 'HTTPS Redirect',
     593                'description' => 'Force HTTPS redirection for your site.',
     594                'icon' => 'dashicons-lock',
     595                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/https-redirect/class-module-https-redirect.php',
     596                'class' => 'Blaminhor_Essentials_Module_HTTPS_Redirect',
     597                'category' => 'security-maintenance',
     598            ),
     599            'fatal-error-recovery' => array(
     600                'name' => 'Fatal Error Recovery',
     601                'description' => 'Recover from fatal errors by disabling problematic plugins without FTP access.',
     602                'icon' => 'dashicons-shield',
     603                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/fatal-error-recovery/class-module-fatal-error-recovery.php',
     604                'class' => 'Blaminhor_Essentials_Module_Fatal_Error_Recovery',
     605                'category' => 'security-maintenance',
     606            ),
    155607            'maintenance' => array(
    156608                'name' => 'Coming soon / Maintenance',
     
    168620                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/smtp/class-module-smtp.php',
    169621                'class' => 'Blaminhor_Essentials_Module_SMTP',
     622                'category' => 'emails',
     623            ),
     624            'mute-core-emails' => array(
     625                'name' => 'Mute Core Emails',
     626                'description' => 'Mute automatic emails from WordPress core.',
     627                'icon' => 'dashicons-controls-volumeoff',
     628                'file' => BLAMINHOR_ESSENTIALS_PLUGIN_DIR . 'modules/mute-core-emails/class-module-mute-core-emails.php',
     629                'class' => 'Blaminhor_Essentials_Module_Mute_Core_Emails',
    170630                'category' => 'emails',
    171631            ),
     
    237697                'icon' => 'dashicons-admin-media',
    238698            ),
     699            'seo-links' => array(
     700                'name' => __( 'SEO & Links', 'blaminhor-essentials' ),
     701                'icon' => 'dashicons-search',
     702            ),
     703            'database-migration' => array(
     704                'name' => __( 'Database & Migration', 'blaminhor-essentials' ),
     705                'icon' => 'dashicons-database',
     706            ),
    239707            'security-maintenance' => array(
    240708                'name' => __( 'Security & Maintenance', 'blaminhor-essentials' ),
  • blaminhor-essentials/trunk/includes/class-blaminhor-essentials-admin.php

    r3445615 r3445838  
    201201
    202202    /**
     203     * Handle advanced settings form submission
     204     */
     205    private function handle_advanced_settings() {
     206        if ( ! isset( $_POST['blaminhor_essentials_save_advanced'] ) ) {
     207            return;
     208        }
     209
     210        if ( ! isset( $_POST['blaminhor_essentials_advanced_nonce'] )
     211            || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['blaminhor_essentials_advanced_nonce'] ) ), 'blaminhor_essentials_advanced_settings' )
     212        ) {
     213            return;
     214        }
     215
     216        if ( ! current_user_can( 'manage_options' ) ) {
     217            return;
     218        }
     219
     220        $delete_data = isset( $_POST['delete_data_on_uninstall'] ) ? true : false;
     221        update_option( 'blaminhor_essentials_delete_data', $delete_data );
     222
     223        add_action( 'admin_notices', function () {
     224            ?>
     225            <div class="notice notice-success is-dismissible">
     226                <p><?php esc_html_e( 'Advanced settings saved.', 'blaminhor-essentials' ); ?></p>
     227            </div>
     228            <?php
     229        } );
     230    }
     231
     232    /**
    203233     * Render dashboard page
    204234     */
    205235    public function render_dashboard_page()
    206236    {
     237        // Handle advanced settings form submission.
     238        $this->handle_advanced_settings();
     239
    207240        $modules_by_category = $this->plugin->get_modules_by_category();
    208241        $active_modules = get_option('blaminhor_essentials_active_modules', array());
     
    374407                </div>
    375408
     409                <!-- Advanced Settings -->
     410                <div class="blaminhor-essentials-section blaminhor-essentials-advanced">
     411                    <h2><?php esc_html_e('Advanced Settings', 'blaminhor-essentials'); ?></h2>
     412                    <form method="post" action="">
     413                        <?php wp_nonce_field('blaminhor_essentials_advanced_settings', 'blaminhor_essentials_advanced_nonce'); ?>
     414                        <table class="form-table">
     415                            <tr>
     416                                <th scope="row"><?php esc_html_e('Uninstall', 'blaminhor-essentials'); ?></th>
     417                                <td>
     418                                    <label>
     419                                        <input type="checkbox" name="delete_data_on_uninstall" value="1" <?php checked(get_option('blaminhor_essentials_delete_data', false)); ?>>
     420                                        <?php esc_html_e('Delete all plugin data when uninstalling', 'blaminhor-essentials'); ?>
     421                                    </label>
     422                                    <p class="description">
     423                                        <?php esc_html_e('If enabled, all settings, module data, database tables, and uploaded files will be permanently deleted when you uninstall the plugin.', 'blaminhor-essentials'); ?>
     424                                    </p>
     425                                </td>
     426                            </tr>
     427                        </table>
     428                        <p class="submit">
     429                            <button type="submit" name="blaminhor_essentials_save_advanced" class="button button-secondary">
     430                                <?php esc_html_e('Save Advanced Settings', 'blaminhor-essentials'); ?>
     431                            </button>
     432                        </p>
     433                    </form>
     434                </div>
     435
    376436                <!-- Credits -->
    377437                <div class="blaminhor-essentials-credits">
  • blaminhor-essentials/trunk/languages/blaminhor-essentials-de_DE.po

    r3445615 r3445838  
    11msgid ""
    22msgstr ""
    3 "Project-Id-Version: Blaminhor Essentials 1.0.0\n"
     3"Project-Id-Version: Blaminhor Essentials 1.1.0\n"
    44"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/blaminhor-essentials\n"
    55"Last-Translator: \n"
     
    313313msgstr "Wenn Sie ausgesperrt werden, können Sie dieses Modul deaktivieren, indem Sie den Plugin-Ordner per FTP/SFTP umbenennen."
    314314
     315msgid "Warning"
     316msgstr "Warnung"
     317
     318msgid "Enabling HTTPS redirection may lock you out of your site if SSL is not properly configured. If you cannot access your site after enabling this feature, you can disable the plugin by renaming its folder via FTP/SFTP."
     319msgstr "Das Aktivieren der HTTPS-Umleitung kann Sie von Ihrer Website aussperren, wenn SSL nicht richtig konfiguriert ist. Wenn Sie nach dem Aktivieren dieser Funktion nicht mehr auf Ihre Website zugreifen können, können Sie das Plugin deaktivieren, indem Sie seinen Ordner per FTP/SFTP umbenennen."
     320
     321msgid "Recommendation:"
     322msgstr "Empfehlung:"
     323
     324msgid "Enable the %s module before activating HTTPS redirect. It provides a recovery URL that works even if HTTPS fails."
     325msgstr "Aktivieren Sie das Modul %s, bevor Sie die HTTPS-Umleitung aktivieren. Es bietet eine Wiederherstellungs-URL, die auch funktioniert, wenn HTTPS fehlschlägt."
     326
     327msgid "The %s module is active. Save your recovery URL before enabling HTTPS redirect."
     328msgstr "Das Modul %s ist aktiv. Speichern Sie Ihre Wiederherstellungs-URL, bevor Sie die HTTPS-Umleitung aktivieren."
     329
    315330# Support section
    316331msgid "Contact Me"
     
    323338msgstr "Das Projekt unterstützen"
    324339
     340# Advanced Settings
     341msgid "Advanced Settings"
     342msgstr "Erweiterte Einstellungen"
     343
     344msgid "Uninstall"
     345msgstr "Deinstallation"
     346
     347msgid "Delete all plugin data when uninstalling"
     348msgstr "Alle Plugin-Daten bei der Deinstallation löschen"
     349
     350msgid "If enabled, all settings, module data, database tables, and uploaded files will be permanently deleted when you uninstall the plugin."
     351msgstr "Wenn aktiviert, werden alle Einstellungen, Moduldaten, Datenbanktabellen und hochgeladene Dateien dauerhaft gelöscht, wenn Sie das Plugin deinstallieren."
     352
     353msgid "Save Advanced Settings"
     354msgstr "Erweiterte Einstellungen speichern"
     355
     356msgid "Advanced settings saved."
     357msgstr "Erweiterte Einstellungen gespeichert."
     358
    325359msgid "Leave a Review"
    326360msgstr "Eine Bewertung hinterlassen"
    327361
    328362# =====================================================
    329 # SEO Manager Module (1.0.3)
    330 # =====================================================
     363# SEO Manager Module# =====================================================
    331364
    332365msgid "SEO Manager"
     
    631664
    632665# =====================================================
    633 # Backup Module (1.0.3)
    634 # =====================================================
     666# Backup Module# =====================================================
    635667
    636668msgid "Backup"
     
    736768msgstr "Sicherung wiederherstellen"
    737769
    738 msgid "Warning"
    739 msgstr "Warnung"
    740 
    741770msgid "Warning: Restoring a backup will overwrite your current data. This action cannot be undone."
    742771msgstr "Warnung: Das Wiederherstellen einer Sicherung überschreibt Ihre aktuellen Daten. Diese Aktion kann nicht rückgängig gemacht werden."
     
    853882
    854883# =====================================================
    855 # Database Optimizer Module (1.0.3)
    856 # =====================================================
     884# Database Optimizer Module# =====================================================
    857885
    858886msgid "Database Optimizer"
     
    10601088
    10611089# =====================================================
    1062 # Fatal Error Recovery Module (1.0.3)
    1063 # =====================================================
     1090# Fatal Error Recovery Module# =====================================================
    10641091
    10651092msgid "Fatal Error Recovery"
     
    10941121
    10951122msgid "Disabling a plugin renames its folder by adding an underscore (_) prefix. WordPress will no longer recognize it. You can re-enable it from here or by renaming the folder back via FTP."
    1096 msgstr "Das Deaktivieren eines Plugins benennt seinen Ordner mit einem Unterstrich (_) als Präfix um. WordPress erkennt es nicht mehr. Sie können es hier wieder aktivieren oder den Ordner per FTP zurückbenennen."
     1123msgstr "Das Deaktivieren eines Plugins deaktiviert es in der Datenbank. Sie können es hier oder im WordPress-Admin wieder aktivieren."
     1124
     1125msgid "Disabling a plugin deactivates it in the database. You can re-enable it from here or from the WordPress admin."
     1126msgstr "Das Deaktivieren eines Plugins deaktiviert es in der Datenbank. Sie können es hier oder im WordPress-Admin wieder aktivieren."
     1127
     1128msgid "Inactive"
     1129msgstr "Inaktiv"
    10971130
    10981131msgid "Installed Plugins"
     
    11721205
    11731206msgid "Disabled plugins are renamed with an underscore prefix (e.g., \"_plugin-name\")."
    1174 msgstr "Deaktivierte Plugins werden mit einem Unterstrich-Präfix umbenannt (z.B. \"_plugin-name\")."
     1207msgstr "Deaktivierte Plugins werden in der Datenbank deaktiviert (die Plugin-Dateien bleiben unverändert)."
     1208
     1209msgid "Disabled plugins are deactivated in the database (the plugin files remain intact)."
     1210msgstr "Deaktivierte Plugins werden in der Datenbank deaktiviert (die Plugin-Dateien bleiben unverändert)."
     1211
     1212# Recovery HTTPS
     1213msgid "HTTPS Redirect is enabled"
     1214msgstr "HTTPS-Umleitung ist aktiviert"
     1215
     1216msgid "If you are having trouble accessing your site due to HTTPS issues, you can disable the HTTPS redirect here."
     1217msgstr "Wenn Sie aufgrund von HTTPS-Problemen Schwierigkeiten haben, auf Ihre Website zuzugreifen, können Sie die HTTPS-Umleitung hier deaktivieren."
     1218
     1219msgid "Disable HTTPS Redirect"
     1220msgstr "HTTPS-Umleitung deaktivieren"
     1221
     1222msgid "HTTPS Redirect has been disabled. You can now access your site via HTTP."
     1223msgstr "Die HTTPS-Umleitung wurde deaktiviert. Sie können jetzt über HTTP auf Ihre Website zugreifen."
     1224
     1225msgid "Disabling a plugin deactivates it in the database. Re-enable via this page or the WordPress admin."
     1226msgstr "Das Deaktivieren eines Plugins deaktiviert es in der Datenbank. Reaktivieren Sie es über diese Seite oder den WordPress-Admin."
     1227
     1228msgid "Activate"
     1229msgstr "Aktivieren"
     1230
     1231msgid "Deactivate"
     1232msgstr "Deaktivieren"
     1233
     1234msgid "Deactivate (Self)"
     1235msgstr "Deaktivieren (dieses Plugin)"
     1236
     1237msgid "This will disable Blaminhor Essentials and this recovery page. You will need to re-enable it from WordPress admin. Continue?"
     1238msgstr "Dies wird Blaminhor Essentials und diese Wiederherstellungsseite deaktivieren. Sie müssen es im WordPress-Admin reaktivieren. Fortfahren?"
    11751239
    11761240msgid "Once the error is resolved, you can re-enable plugins from the same interface."
    1177 msgstr "Sobald der Fehler behoben ist, können Sie Plugins über dieselbe Oberfläche wieder aktivieren."
     1241msgstr "Sobald der Fehler behoben ist, können Sie Plugins über dieselbe Oberfläche oder im WordPress-Admin wieder aktivieren."
     1242
     1243msgid "Once the error is resolved, you can re-enable plugins from the same interface or from the WordPress admin."
     1244msgstr "Sobald der Fehler behoben ist, können Sie Plugins über dieselbe Oberfläche oder im WordPress-Admin wieder aktivieren."
    11781245
    11791246msgid "Admin Bar"
     
    11971264# Self-disable warning for Fatal Error Recovery
    11981265msgid "Warning: Disabling Blaminhor Essentials will also disable this recovery interface. You will need to re-enable it via FTP by removing the underscore prefix from the folder name. Are you sure?"
    1199 msgstr "Warnung: Das Deaktivieren von Blaminhor Essentials deaktiviert auch diese Wiederherstellungsoberfläche. Sie müssen es per FTP wieder aktivieren, indem Sie den Unterstrich-Präfix vom Ordnernamen entfernen. Sind Sie sicher?"
     1266msgstr "Warnung: Das Deaktivieren von Blaminhor Essentials deaktiviert auch diese Wiederherstellungsoberfläche. Sie müssen es im WordPress-Admin wieder aktivieren. Sind Sie sicher?"
     1267
     1268msgid "Warning: Disabling Blaminhor Essentials will also disable this recovery interface. You will need to re-enable it from WordPress admin. Are you sure?"
     1269msgstr "Warnung: Das Deaktivieren von Blaminhor Essentials deaktiviert auch diese Wiederherstellungsoberfläche. Sie müssen es im WordPress-Admin wieder aktivieren. Sind Sie sicher?"
    12001270
    12011271msgid "Disable (Self)"
     
    15381608msgid "Error updating redirection."
    15391609msgstr "Fehler beim Aktualisieren der Weiterleitung."
     1610
     1611# =====================================================
     1612# SMTP Provider Tutorials
     1613# =====================================================
     1614
     1615msgid "Brevo (ex-Sendinblue) Setup"
     1616msgstr "Brevo (ex-Sendinblue) Einrichtung"
     1617
     1618msgid "Create a free account at <a href=\"https://www.brevo.com/\" target=\"_blank\">brevo.com</a>"
     1619msgstr "Erstellen Sie ein kostenloses Konto auf <a href=\"https://www.brevo.com/\" target=\"_blank\">brevo.com</a>"
     1620
     1621msgid "Go to <strong>Settings</strong> → <strong>SMTP & API</strong>"
     1622msgstr "Gehen Sie zu <strong>Einstellungen</strong> → <strong>SMTP & API</strong>"
     1623
     1624msgid "Click <strong>Generate a new SMTP key</strong>"
     1625msgstr "Klicken Sie auf <strong>Neuen SMTP-Schlüssel generieren</strong>"
     1626
     1627msgid "Copy the SMTP key (this is your password)"
     1628msgstr "Kopieren Sie den SMTP-Schlüssel (dies ist Ihr Passwort)"
     1629
     1630msgid "Your login is your Brevo email address"
     1631msgstr "Ihr Login ist Ihre Brevo E-Mail-Adresse"
     1632
     1633msgid "SendGrid Setup"
     1634msgstr "SendGrid Einrichtung"
     1635
     1636msgid "Create a free account at <a href=\"https://sendgrid.com/\" target=\"_blank\">sendgrid.com</a>"
     1637msgstr "Erstellen Sie ein kostenloses Konto auf <a href=\"https://sendgrid.com/\" target=\"_blank\">sendgrid.com</a>"
     1638
     1639msgid "Verify your domain in <strong>Settings</strong> → <strong>Sender Authentication</strong>"
     1640msgstr "Verifizieren Sie Ihre Domain unter <strong>Settings</strong> → <strong>Sender Authentication</strong>"
     1641
     1642msgid "Go to <strong>Settings</strong> → <strong>API Keys</strong>"
     1643msgstr "Gehen Sie zu <strong>Settings</strong> → <strong>API Keys</strong>"
     1644
     1645msgid "Click <strong>Create API Key</strong> → <strong>Full Access</strong>"
     1646msgstr "Klicken Sie auf <strong>Create API Key</strong> → <strong>Full Access</strong>"
     1647
     1648msgid "Use <code>apikey</code> as username and the API key as password"
     1649msgstr "Verwenden Sie <code>apikey</code> als Benutzernamen und den API-Schlüssel als Passwort"
     1650
     1651msgid "Mailgun Setup"
     1652msgstr "Mailgun Einrichtung"
     1653
     1654msgid "Create an account at <a href=\"https://www.mailgun.com/\" target=\"_blank\">mailgun.com</a> (credit card required)"
     1655msgstr "Erstellen Sie ein Konto auf <a href=\"https://www.mailgun.com/\" target=\"_blank\">mailgun.com</a> (Kreditkarte erforderlich)"
     1656
     1657msgid "Add and verify your domain in <strong>Sending</strong> → <strong>Domains</strong>"
     1658msgstr "Fügen Sie Ihre Domain hinzu und verifizieren Sie sie unter <strong>Sending</strong> → <strong>Domains</strong>"
     1659
     1660msgid "Go to your domain settings → <strong>SMTP credentials</strong>"
     1661msgstr "Gehen Sie zu Ihren Domain-Einstellungen → <strong>SMTP credentials</strong>"
     1662
     1663msgid "Create SMTP credentials or use the default ones"
     1664msgstr "Erstellen Sie SMTP-Anmeldedaten oder verwenden Sie die Standardwerte"
     1665
     1666msgid "The username is usually <code>[email protected]</code>"
     1667msgstr "Der Benutzername ist normalerweise <code>[email protected]</code>"
     1668
     1669msgid "Amazon SES Setup"
     1670msgstr "Amazon SES Einrichtung"
     1671
     1672msgid "Sign in to <a href=\"https://console.aws.amazon.com/ses/\" target=\"_blank\">AWS SES Console</a>"
     1673msgstr "Melden Sie sich bei der <a href=\"https://console.aws.amazon.com/ses/\" target=\"_blank\">AWS SES-Konsole</a> an"
     1674
     1675msgid "Verify your domain or email in <strong>Verified identities</strong>"
     1676msgstr "Verifizieren Sie Ihre Domain oder E-Mail unter <strong>Verified identities</strong>"
     1677
     1678msgid "Request production access if in sandbox mode"
     1679msgstr "Beantragen Sie Produktionszugang, wenn Sie sich im Sandbox-Modus befinden"
     1680
     1681msgid "Go to <strong>SMTP settings</strong> → <strong>Create SMTP credentials</strong>"
     1682msgstr "Gehen Sie zu <strong>SMTP settings</strong> → <strong>Create SMTP credentials</strong>"
     1683
     1684msgid "Download the credentials (shown only once)"
     1685msgstr "Laden Sie die Anmeldedaten herunter (werden nur einmal angezeigt)"
     1686
     1687msgid "Change the region in the host to match your SES region."
     1688msgstr "Ändern Sie die Region im Host entsprechend Ihrer SES-Region."
     1689
     1690msgid "Postmark Setup"
     1691msgstr "Postmark Einrichtung"
     1692
     1693msgid "Create an account at <a href=\"https://postmarkapp.com/\" target=\"_blank\">postmarkapp.com</a>"
     1694msgstr "Erstellen Sie ein Konto auf <a href=\"https://postmarkapp.com/\" target=\"_blank\">postmarkapp.com</a>"
     1695
     1696msgid "Create a new Server in your account"
     1697msgstr "Erstellen Sie einen neuen Server in Ihrem Konto"
     1698
     1699msgid "Go to <strong>Server</strong> → <strong>API Tokens</strong>"
     1700msgstr "Gehen Sie zu <strong>Server</strong> → <strong>API Tokens</strong>"
     1701
     1702msgid "Copy your Server API Token"
     1703msgstr "Kopieren Sie Ihren Server API Token"
     1704
     1705msgid "Use the API token as both username and password"
     1706msgstr "Verwenden Sie den API-Token als Benutzernamen und Passwort"
     1707
     1708msgid "Postmark is for transactional emails only (no marketing)."
     1709msgstr "Postmark ist nur für Transaktions-E-Mails (kein Marketing)."
     1710
     1711msgid "SparkPost Setup"
     1712msgstr "SparkPost Einrichtung"
     1713
     1714msgid "Create an account at <a href=\"https://www.sparkpost.com/\" target=\"_blank\">sparkpost.com</a>"
     1715msgstr "Erstellen Sie ein Konto auf <a href=\"https://www.sparkpost.com/\" target=\"_blank\">sparkpost.com</a>"
     1716
     1717msgid "Add and verify your sending domain"
     1718msgstr "Fügen Sie Ihre Versand-Domain hinzu und verifizieren Sie sie"
     1719
     1720msgid "Go to <strong>Configuration</strong> → <strong>API Keys</strong>"
     1721msgstr "Gehen Sie zu <strong>Configuration</strong> → <strong>API Keys</strong>"
     1722
     1723msgid "Create an API key with <strong>Send via SMTP</strong> permission"
     1724msgstr "Erstellen Sie einen API-Schlüssel mit <strong>Send via SMTP</strong>-Berechtigung"
     1725
     1726msgid "Use <code>SMTP_Injection</code> as username and the API key as password"
     1727msgstr "Verwenden Sie <code>SMTP_Injection</code> als Benutzernamen und den API-Schlüssel als Passwort"
     1728
     1729msgid "Mailjet Setup"
     1730msgstr "Mailjet Einrichtung"
     1731
     1732msgid "Create a free account at <a href=\"https://www.mailjet.com/\" target=\"_blank\">mailjet.com</a>"
     1733msgstr "Erstellen Sie ein kostenloses Konto auf <a href=\"https://www.mailjet.com/\" target=\"_blank\">mailjet.com</a>"
     1734
     1735msgid "Go to <strong>Account Settings</strong> → <strong>SMTP and SEND API Settings</strong>"
     1736msgstr "Gehen Sie zu <strong>Account Settings</strong> → <strong>SMTP and SEND API Settings</strong>"
     1737
     1738msgid "Your API Key is your SMTP username"
     1739msgstr "Ihr API-Schlüssel ist Ihr SMTP-Benutzername"
     1740
     1741msgid "Your Secret Key is your SMTP password"
     1742msgstr "Ihr geheimer Schlüssel ist Ihr SMTP-Passwort"
     1743
     1744msgid "Verify your sender email in <strong>Sender addresses</strong>"
     1745msgstr "Verifizieren Sie Ihre Absender-E-Mail unter <strong>Sender addresses</strong>"
     1746
     1747msgid "SMTP2GO Setup"
     1748msgstr "SMTP2GO Einrichtung"
     1749
     1750msgid "Create a free account at <a href=\"https://www.smtp2go.com/\" target=\"_blank\">smtp2go.com</a>"
     1751msgstr "Erstellen Sie ein kostenloses Konto auf <a href=\"https://www.smtp2go.com/\" target=\"_blank\">smtp2go.com</a>"
     1752
     1753msgid "Go to <strong>Settings</strong> → <strong>Users</strong>"
     1754msgstr "Gehen Sie zu <strong>Settings</strong> → <strong>Users</strong>"
     1755
     1756msgid "Click <strong>Add SMTP User</strong>"
     1757msgstr "Klicken Sie auf <strong>Add SMTP User</strong>"
     1758
     1759msgid "Use the generated username and password"
     1760msgstr "Verwenden Sie den generierten Benutzernamen und das Passwort"
     1761
     1762msgid "Verify your sender domain or email"
     1763msgstr "Verifizieren Sie Ihre Absender-Domain oder E-Mail"
     1764
     1765msgid "Elastic Email Setup"
     1766msgstr "Elastic Email Einrichtung"
     1767
     1768msgid "Create a free account at <a href=\"https://elasticemail.com/\" target=\"_blank\">elasticemail.com</a>"
     1769msgstr "Erstellen Sie ein kostenloses Konto auf <a href=\"https://elasticemail.com/\" target=\"_blank\">elasticemail.com</a>"
     1770
     1771msgid "Go to <strong>Settings</strong> → <strong>SMTP</strong>"
     1772msgstr "Gehen Sie zu <strong>Settings</strong> → <strong>SMTP</strong>"
     1773
     1774msgid "Note your SMTP username (your account email)"
     1775msgstr "Notieren Sie Ihren SMTP-Benutzernamen (Ihre Konto-E-Mail)"
     1776
     1777msgid "Go to <strong>Settings</strong> → <strong>API</strong> to create an API key"
     1778msgstr "Gehen Sie zu <strong>Settings</strong> → <strong>API</strong>, um einen API-Schlüssel zu erstellen"
     1779
     1780msgid "Use the API key as your SMTP password"
     1781msgstr "Verwenden Sie den API-Schlüssel als SMTP-Passwort"
     1782
     1783msgid "Gmail / Google Workspace Setup"
     1784msgstr "Gmail / Google Workspace Einrichtung"
     1785
     1786msgid "Enable 2-Factor Authentication on your Google account"
     1787msgstr "Aktivieren Sie die 2-Faktor-Authentifizierung für Ihr Google-Konto"
     1788
     1789msgid "Go to <a href=\"https://myaccount.google.com/apppasswords\" target=\"_blank\">Google App Passwords</a>"
     1790msgstr "Gehen Sie zu <a href=\"https://myaccount.google.com/apppasswords\" target=\"_blank\">Google App-Passwörter</a>"
     1791
     1792msgid "Select <strong>Mail</strong> and <strong>Other (Custom name)</strong>"
     1793msgstr "Wählen Sie <strong>Mail</strong> und <strong>Andere (Benutzerdefinierter Name)</strong>"
     1794
     1795msgid "Generate and copy the 16-character app password"
     1796msgstr "Generieren und kopieren Sie das 16-stellige App-Passwort"
     1797
     1798msgid "Use your Gmail address as username, app password as password"
     1799msgstr "Verwenden Sie Ihre Gmail-Adresse als Benutzernamen, das App-Passwort als Passwort"
     1800
     1801msgid "For Google Workspace, you may need to enable \"Less secure apps\" or use OAuth."
     1802msgstr "Für Google Workspace müssen Sie möglicherweise \"Weniger sichere Apps\" aktivieren oder OAuth verwenden."
     1803
     1804msgid "Outlook / Office 365 Setup"
     1805msgstr "Outlook / Office 365 Einrichtung"
     1806
     1807msgid "Enable 2-Factor Authentication on your Microsoft account"
     1808msgstr "Aktivieren Sie die 2-Faktor-Authentifizierung für Ihr Microsoft-Konto"
     1809
     1810msgid "Go to <a href=\"https://account.live.com/proofs/AppPassword\" target=\"_blank\">Microsoft App Passwords</a>"
     1811msgstr "Gehen Sie zu <a href=\"https://account.live.com/proofs/AppPassword\" target=\"_blank\">Microsoft App-Passwörter</a>"
     1812
     1813msgid "Create a new app password"
     1814msgstr "Erstellen Sie ein neues App-Passwort"
     1815
     1816msgid "Use your Outlook email as username"
     1817msgstr "Verwenden Sie Ihre Outlook-E-Mail als Benutzernamen"
     1818
     1819msgid "Use the app password as your SMTP password"
     1820msgstr "Verwenden Sie das App-Passwort als SMTP-Passwort"
     1821
     1822msgid "Zoho Mail Setup"
     1823msgstr "Zoho Mail Einrichtung"
     1824
     1825msgid "Log in to your Zoho Mail account"
     1826msgstr "Melden Sie sich bei Ihrem Zoho Mail-Konto an"
     1827
     1828msgid "Go to <strong>Settings</strong> → <strong>Security</strong> → <strong>App Passwords</strong>"
     1829msgstr "Gehen Sie zu <strong>Einstellungen</strong> → <strong>Sicherheit</strong> → <strong>App-Passwörter</strong>"
     1830
     1831msgid "Generate a new app-specific password"
     1832msgstr "Generieren Sie ein neues app-spezifisches Passwort"
     1833
     1834msgid "Use your Zoho email as username"
     1835msgstr "Verwenden Sie Ihre Zoho-E-Mail als Benutzernamen"
     1836
     1837msgid "For EU accounts, use smtp.zoho.eu instead."
     1838msgstr "Für EU-Konten verwenden Sie stattdessen smtp.zoho.eu."
     1839
     1840msgid "Custom SMTP Setup"
     1841msgstr "Benutzerdefinierte SMTP-Einrichtung"
     1842
     1843msgid "Contact your email provider or hosting company for SMTP details"
     1844msgstr "Kontaktieren Sie Ihren E-Mail-Anbieter oder Hoster für SMTP-Details"
     1845
     1846msgid "Common settings: Host, Port, Username, Password, Encryption"
     1847msgstr "Gängige Einstellungen: Host, Port, Benutzername, Passwort, Verschlüsselung"
     1848
     1849msgid "Try port 587 with TLS, or port 465 with SSL"
     1850msgstr "Versuchen Sie Port 587 mit TLS oder Port 465 mit SSL"
     1851
     1852msgid "If using cPanel, check <strong>Email Accounts</strong> → <strong>Connect Devices</strong>"
     1853msgstr "Wenn Sie cPanel verwenden, prüfen Sie <strong>E-Mail-Konten</strong> → <strong>Geräte verbinden</strong>"
  • blaminhor-essentials/trunk/languages/blaminhor-essentials-fr_FR.po

    r3445615 r3445838  
    11msgid ""
    22msgstr ""
    3 "Project-Id-Version: Blaminhor Essentials 1.0.2\n"
     3"Project-Id-Version: Blaminhor Essentials 1.1.0\n"
    44"Report-Msgid-Bugs-To: https://wp.blaminhor.com\n"
    55"POT-Creation-Date: 2026-01-20 10:00+0000\n"
    66"PO-Revision-Date: 2026-01-20 10:00+0000\n"
    7 "Last-Translator: blaminhor\n"
     7"Last-Translator: Alfred AI <[email protected]>\n"
    88"Language-Team: French <[email protected]>\n"
    99"MIME-Version: 1.0\n"
     
    6363msgstr "Blaminhor Essentials"
    6464
    65 msgid "Blaminhor Essentials"
    66 msgstr "Blaminhor Essentials"
    67 
    6865msgid "An error occurred. Please try again."
    6966msgstr "Une erreur est survenue. Veuillez réessayer."
     
    453450msgstr "Soutenir le projet"
    454451
     452# Advanced Settings
     453msgid "Advanced Settings"
     454msgstr "Réglages avancés"
     455
     456msgid "Uninstall"
     457msgstr "Désinstallation"
     458
     459msgid "Delete all plugin data when uninstalling"
     460msgstr "Supprimer toutes les données du plugin lors de la désinstallation"
     461
     462msgid "If enabled, all settings, module data, database tables, and uploaded files will be permanently deleted when you uninstall the plugin."
     463msgstr "Si activé, tous les réglages, données des modules, tables de base de données et fichiers téléversés seront définitivement supprimés lors de la désinstallation du plugin."
     464
     465msgid "Save Advanced Settings"
     466msgstr "Enregistrer les réglages avancés"
     467
     468msgid "Advanced settings saved."
     469msgstr "Réglages avancés enregistrés."
     470
    455471msgid "TLS"
    456472msgstr "TLS"
     
    689705msgid "Show admin login link"
    690706msgstr "Afficher le lien de connexion admin"
    691 
    692 msgid "Custom CSS"
    693 msgstr "CSS personnalisé"
    694707
    695708msgid "Access"
     
    15141527msgstr "Forcer la redirection HTTPS pour votre site."
    15151528
     1529msgid "Enabling HTTPS redirection may lock you out of your site if SSL is not properly configured. If you cannot access your site after enabling this feature, you can disable the plugin by renaming its folder via FTP/SFTP."
     1530msgstr "Activer la redirection HTTPS peut vous bloquer l'accès à votre site si le SSL n'est pas correctement configuré. Si vous ne pouvez plus accéder à votre site après avoir activé cette fonctionnalité, vous pouvez désactiver le plugin en renommant son dossier via FTP/SFTP."
     1531
     1532msgid "Recommendation:"
     1533msgstr "Recommandation :"
     1534
     1535msgid "Enable the %s module before activating HTTPS redirect. It provides a recovery URL that works even if HTTPS fails."
     1536msgstr "Activez le module %s avant d'activer la redirection HTTPS. Il fournit une URL de récupération qui fonctionne même si le HTTPS échoue."
     1537
     1538msgid "The %s module is active. Save your recovery URL before enabling HTTPS redirect."
     1539msgstr "Le module %s est actif. Sauvegardez votre URL de récupération avant d'activer la redirection HTTPS."
     1540
    15161541# =====================================================
    1517 # SEO Manager Module (1.0.3)
    1518 # =====================================================
     1542# SEO Manager Module# =====================================================
    15191543
    15201544msgid "SEO Manager"
     
    17651789
    17661790# =====================================================
    1767 # Backup Module (1.0.3)
    1768 # =====================================================
     1791# Backup Module# =====================================================
    17691792
    17701793msgid "Backup"
     
    19371960
    19381961# =====================================================
    1939 # Database Optimizer Module (1.0.3)
    1940 # =====================================================
     1962# Database Optimizer Module# =====================================================
    19411963
    19421964msgid "Database Optimizer"
     
    21442166
    21452167# =====================================================
    2146 # Fatal Error Recovery Module (1.0.3)
    2147 # =====================================================
     2168# Fatal Error Recovery Module# =====================================================
    21482169
    21492170msgid "Fatal Error Recovery"
     
    21722193
    21732194msgid "Disabling a plugin renames its folder by adding an underscore (_) prefix. WordPress will no longer recognize it. You can re-enable it from here or by renaming the folder back via FTP."
    2174 msgstr "Désactiver un plugin renomme son dossier en ajoutant un préfixe underscore (_). WordPress ne le reconnaîtra plus. Vous pouvez le réactiver depuis ici ou en renommant le dossier via FTP."
     2195msgstr "Désactiver un plugin le désactive dans la base de données. Vous pouvez le réactiver depuis ici ou depuis l'administration WordPress."
     2196
     2197msgid "Disabling a plugin deactivates it in the database. You can re-enable it from here or from the WordPress admin."
     2198msgstr "Désactiver un plugin le désactive dans la base de données. Vous pouvez le réactiver depuis ici ou depuis l'administration WordPress."
     2199
     2200msgid "Warning: Disabling Blaminhor Essentials will also disable this recovery interface. You will need to re-enable it from WordPress admin. Are you sure?"
     2201msgstr "Attention : Désactiver Blaminhor Essentials désactivera également cette interface de récupération. Vous devrez le réactiver depuis l'administration WordPress. Êtes-vous sûr ?"
    21752202
    21762203msgid "Installed Plugins"
     
    22502277
    22512278msgid "Disabled plugins are renamed with an underscore prefix (e.g., \"_plugin-name\")."
    2252 msgstr "Les plugins désactivés sont renommés avec un préfixe underscore (ex: « _nom-du-plugin »)."
     2279msgstr "Les plugins désactivés sont désactivés dans la base de données (les fichiers du plugin restent intacts)."
     2280
     2281msgid "Disabled plugins are deactivated in the database (the plugin files remain intact)."
     2282msgstr "Les plugins désactivés sont désactivés dans la base de données (les fichiers du plugin restent intacts)."
     2283
     2284# Recovery HTTPS
     2285msgid "HTTPS Redirect is enabled"
     2286msgstr "La redirection HTTPS est activée"
     2287
     2288msgid "If you are having trouble accessing your site due to HTTPS issues, you can disable the HTTPS redirect here."
     2289msgstr "Si vous avez des difficultés à accéder à votre site en raison de problèmes HTTPS, vous pouvez désactiver la redirection HTTPS ici."
     2290
     2291msgid "Disable HTTPS Redirect"
     2292msgstr "Désactiver la redirection HTTPS"
     2293
     2294msgid "HTTPS Redirect has been disabled. You can now access your site via HTTP."
     2295msgstr "La redirection HTTPS a été désactivée. Vous pouvez maintenant accéder à votre site via HTTP."
     2296
     2297msgid "Disabling a plugin deactivates it in the database. Re-enable via this page or the WordPress admin."
     2298msgstr "Désactiver un plugin le désactive dans la base de données. Réactivez-le via cette page ou l'administration WordPress."
     2299
     2300msgid "Activate"
     2301msgstr "Activer"
     2302
     2303msgid "Deactivate"
     2304msgstr "Désactiver"
     2305
     2306msgid "Deactivate (Self)"
     2307msgstr "Désactiver (ce plugin)"
     2308
     2309msgid "This will disable Blaminhor Essentials and this recovery page. You will need to re-enable it from WordPress admin. Continue?"
     2310msgstr "Ceci désactivera Blaminhor Essentials et cette page de récupération. Vous devrez le réactiver depuis l'administration WordPress. Continuer ?"
    22532311
    22542312msgid "Once the error is resolved, you can re-enable plugins from the same interface."
    2255 msgstr "Une fois l'erreur résolue, vous pouvez réactiver les plugins depuis la même interface."
     2313msgstr "Une fois l'erreur résolue, vous pouvez réactiver les plugins depuis la même interface ou depuis l'administration WordPress."
     2314
     2315msgid "Once the error is resolved, you can re-enable plugins from the same interface or from the WordPress admin."
     2316msgstr "Une fois l'erreur résolue, vous pouvez réactiver les plugins depuis la même interface ou depuis l'administration WordPress."
    22562317
    22572318msgid "Admin Bar"
     
    23842445msgstr "Utilisateurs Zoho"
    23852446
    2386 msgid "Recommendation:"
    2387 msgstr "Recommandation :"
    2388 
    23892447msgid "For most WordPress sites, Brevo or Mailjet offer the best balance of free quota and ease of setup. For high-volume sites on AWS, Amazon SES is unbeatable."
    23902448msgstr "Pour la plupart des sites WordPress, Brevo ou Mailjet offrent le meilleur équilibre entre quota gratuit et facilité de configuration. Pour les sites à fort volume sur AWS, Amazon SES est imbattable."
     
    27222780msgid "Error updating redirection."
    27232781msgstr "Erreur lors de la mise à jour de la redirection."
     2782
     2783# =====================================================
     2784# SMTP Provider Tutorials
     2785# =====================================================
     2786
     2787msgid "Brevo (ex-Sendinblue) Setup"
     2788msgstr "Configuration Brevo (ex-Sendinblue)"
     2789
     2790msgid "Create a free account at <a href=\"https://www.brevo.com/\" target=\"_blank\">brevo.com</a>"
     2791msgstr "Créez un compte gratuit sur <a href=\"https://www.brevo.com/\" target=\"_blank\">brevo.com</a>"
     2792
     2793msgid "Go to <strong>Settings</strong> → <strong>SMTP & API</strong>"
     2794msgstr "Allez dans <strong>Paramètres</strong> → <strong>SMTP & API</strong>"
     2795
     2796msgid "Click <strong>Generate a new SMTP key</strong>"
     2797msgstr "Cliquez sur <strong>Générer une nouvelle clé SMTP</strong>"
     2798
     2799msgid "Copy the SMTP key (this is your password)"
     2800msgstr "Copiez la clé SMTP (c'est votre mot de passe)"
     2801
     2802msgid "Your login is your Brevo email address"
     2803msgstr "Votre identifiant est votre adresse email Brevo"
     2804
     2805msgid "SendGrid Setup"
     2806msgstr "Configuration SendGrid"
     2807
     2808msgid "Create a free account at <a href=\"https://sendgrid.com/\" target=\"_blank\">sendgrid.com</a>"
     2809msgstr "Créez un compte gratuit sur <a href=\"https://sendgrid.com/\" target=\"_blank\">sendgrid.com</a>"
     2810
     2811msgid "Verify your domain in <strong>Settings</strong> → <strong>Sender Authentication</strong>"
     2812msgstr "Vérifiez votre domaine dans <strong>Settings</strong> → <strong>Sender Authentication</strong>"
     2813
     2814msgid "Go to <strong>Settings</strong> → <strong>API Keys</strong>"
     2815msgstr "Allez dans <strong>Settings</strong> → <strong>API Keys</strong>"
     2816
     2817msgid "Click <strong>Create API Key</strong> → <strong>Full Access</strong>"
     2818msgstr "Cliquez sur <strong>Create API Key</strong> → <strong>Full Access</strong>"
     2819
     2820msgid "Use <code>apikey</code> as username and the API key as password"
     2821msgstr "Utilisez <code>apikey</code> comme nom d'utilisateur et la clé API comme mot de passe"
     2822
     2823msgid "Mailgun Setup"
     2824msgstr "Configuration Mailgun"
     2825
     2826msgid "Create an account at <a href=\"https://www.mailgun.com/\" target=\"_blank\">mailgun.com</a> (credit card required)"
     2827msgstr "Créez un compte sur <a href=\"https://www.mailgun.com/\" target=\"_blank\">mailgun.com</a> (carte bancaire requise)"
     2828
     2829msgid "Add and verify your domain in <strong>Sending</strong> → <strong>Domains</strong>"
     2830msgstr "Ajoutez et vérifiez votre domaine dans <strong>Sending</strong> → <strong>Domains</strong>"
     2831
     2832msgid "Go to your domain settings → <strong>SMTP credentials</strong>"
     2833msgstr "Allez dans les paramètres de votre domaine → <strong>SMTP credentials</strong>"
     2834
     2835msgid "Create SMTP credentials or use the default ones"
     2836msgstr "Créez des identifiants SMTP ou utilisez ceux par défaut"
     2837
     2838msgid "The username is usually <code>[email protected]</code>"
     2839msgstr "Le nom d'utilisateur est généralement <code>[email protected]</code>"
     2840
     2841msgid "Amazon SES Setup"
     2842msgstr "Configuration Amazon SES"
     2843
     2844msgid "Sign in to <a href=\"https://console.aws.amazon.com/ses/\" target=\"_blank\">AWS SES Console</a>"
     2845msgstr "Connectez-vous à la <a href=\"https://console.aws.amazon.com/ses/\" target=\"_blank\">Console AWS SES</a>"
     2846
     2847msgid "Verify your domain or email in <strong>Verified identities</strong>"
     2848msgstr "Vérifiez votre domaine ou email dans <strong>Verified identities</strong>"
     2849
     2850msgid "Request production access if in sandbox mode"
     2851msgstr "Demandez l'accès production si vous êtes en mode sandbox"
     2852
     2853msgid "Go to <strong>SMTP settings</strong> → <strong>Create SMTP credentials</strong>"
     2854msgstr "Allez dans <strong>SMTP settings</strong> → <strong>Create SMTP credentials</strong>"
     2855
     2856msgid "Download the credentials (shown only once)"
     2857msgstr "Téléchargez les identifiants (affichés une seule fois)"
     2858
     2859msgid "Change the region in the host to match your SES region."
     2860msgstr "Changez la région dans l'hôte pour correspondre à votre région SES."
     2861
     2862msgid "Postmark Setup"
     2863msgstr "Configuration Postmark"
     2864
     2865msgid "Create an account at <a href=\"https://postmarkapp.com/\" target=\"_blank\">postmarkapp.com</a>"
     2866msgstr "Créez un compte sur <a href=\"https://postmarkapp.com/\" target=\"_blank\">postmarkapp.com</a>"
     2867
     2868msgid "Create a new Server in your account"
     2869msgstr "Créez un nouveau serveur dans votre compte"
     2870
     2871msgid "Go to <strong>Server</strong> → <strong>API Tokens</strong>"
     2872msgstr "Allez dans <strong>Server</strong> → <strong>API Tokens</strong>"
     2873
     2874msgid "Copy your Server API Token"
     2875msgstr "Copiez votre Server API Token"
     2876
     2877msgid "Use the API token as both username and password"
     2878msgstr "Utilisez le token API comme nom d'utilisateur et mot de passe"
     2879
     2880msgid "Postmark is for transactional emails only (no marketing)."
     2881msgstr "Postmark est uniquement pour les emails transactionnels (pas de marketing)."
     2882
     2883msgid "SparkPost Setup"
     2884msgstr "Configuration SparkPost"
     2885
     2886msgid "Create an account at <a href=\"https://www.sparkpost.com/\" target=\"_blank\">sparkpost.com</a>"
     2887msgstr "Créez un compte sur <a href=\"https://www.sparkpost.com/\" target=\"_blank\">sparkpost.com</a>"
     2888
     2889msgid "Add and verify your sending domain"
     2890msgstr "Ajoutez et vérifiez votre domaine d'envoi"
     2891
     2892msgid "Go to <strong>Configuration</strong> → <strong>API Keys</strong>"
     2893msgstr "Allez dans <strong>Configuration</strong> → <strong>API Keys</strong>"
     2894
     2895msgid "Create an API key with <strong>Send via SMTP</strong> permission"
     2896msgstr "Créez une clé API avec la permission <strong>Send via SMTP</strong>"
     2897
     2898msgid "Use <code>SMTP_Injection</code> as username and the API key as password"
     2899msgstr "Utilisez <code>SMTP_Injection</code> comme nom d'utilisateur et la clé API comme mot de passe"
     2900
     2901msgid "Mailjet Setup"
     2902msgstr "Configuration Mailjet"
     2903
     2904msgid "Create a free account at <a href=\"https://www.mailjet.com/\" target=\"_blank\">mailjet.com</a>"
     2905msgstr "Créez un compte gratuit sur <a href=\"https://www.mailjet.com/\" target=\"_blank\">mailjet.com</a>"
     2906
     2907msgid "Go to <strong>Account Settings</strong> → <strong>SMTP and SEND API Settings</strong>"
     2908msgstr "Allez dans <strong>Account Settings</strong> → <strong>SMTP and SEND API Settings</strong>"
     2909
     2910msgid "Your API Key is your SMTP username"
     2911msgstr "Votre clé API est votre nom d'utilisateur SMTP"
     2912
     2913msgid "Your Secret Key is your SMTP password"
     2914msgstr "Votre clé secrète est votre mot de passe SMTP"
     2915
     2916msgid "Verify your sender email in <strong>Sender addresses</strong>"
     2917msgstr "Vérifiez votre email d'expédition dans <strong>Sender addresses</strong>"
     2918
     2919msgid "SMTP2GO Setup"
     2920msgstr "Configuration SMTP2GO"
     2921
     2922msgid "Create a free account at <a href=\"https://www.smtp2go.com/\" target=\"_blank\">smtp2go.com</a>"
     2923msgstr "Créez un compte gratuit sur <a href=\"https://www.smtp2go.com/\" target=\"_blank\">smtp2go.com</a>"
     2924
     2925msgid "Go to <strong>Settings</strong> → <strong>Users</strong>"
     2926msgstr "Allez dans <strong>Settings</strong> → <strong>Users</strong>"
     2927
     2928msgid "Click <strong>Add SMTP User</strong>"
     2929msgstr "Cliquez sur <strong>Add SMTP User</strong>"
     2930
     2931msgid "Use the generated username and password"
     2932msgstr "Utilisez le nom d'utilisateur et mot de passe générés"
     2933
     2934msgid "Verify your sender domain or email"
     2935msgstr "Vérifiez votre domaine ou email d'expédition"
     2936
     2937msgid "Elastic Email Setup"
     2938msgstr "Configuration Elastic Email"
     2939
     2940msgid "Create a free account at <a href=\"https://elasticemail.com/\" target=\"_blank\">elasticemail.com</a>"
     2941msgstr "Créez un compte gratuit sur <a href=\"https://elasticemail.com/\" target=\"_blank\">elasticemail.com</a>"
     2942
     2943msgid "Go to <strong>Settings</strong> → <strong>SMTP</strong>"
     2944msgstr "Allez dans <strong>Settings</strong> → <strong>SMTP</strong>"
     2945
     2946msgid "Note your SMTP username (your account email)"
     2947msgstr "Notez votre nom d'utilisateur SMTP (votre email de compte)"
     2948
     2949msgid "Go to <strong>Settings</strong> → <strong>API</strong> to create an API key"
     2950msgstr "Allez dans <strong>Settings</strong> → <strong>API</strong> pour créer une clé API"
     2951
     2952msgid "Use the API key as your SMTP password"
     2953msgstr "Utilisez la clé API comme mot de passe SMTP"
     2954
     2955msgid "Gmail / Google Workspace Setup"
     2956msgstr "Configuration Gmail / Google Workspace"
     2957
     2958msgid "Enable 2-Factor Authentication on your Google account"
     2959msgstr "Activez l'authentification à 2 facteurs sur votre compte Google"
     2960
     2961msgid "Go to <a href=\"https://myaccount.google.com/apppasswords\" target=\"_blank\">Google App Passwords</a>"
     2962msgstr "Allez sur <a href=\"https://myaccount.google.com/apppasswords\" target=\"_blank\">Mots de passe d'application Google</a>"
     2963
     2964msgid "Select <strong>Mail</strong> and <strong>Other (Custom name)</strong>"
     2965msgstr "Sélectionnez <strong>Mail</strong> et <strong>Autre (Nom personnalisé)</strong>"
     2966
     2967msgid "Generate and copy the 16-character app password"
     2968msgstr "Générez et copiez le mot de passe d'application à 16 caractères"
     2969
     2970msgid "Use your Gmail address as username, app password as password"
     2971msgstr "Utilisez votre adresse Gmail comme nom d'utilisateur, le mot de passe d'application comme mot de passe"
     2972
     2973msgid "For Google Workspace, you may need to enable \"Less secure apps\" or use OAuth."
     2974msgstr "Pour Google Workspace, vous devrez peut-être activer \"Applications moins sécurisées\" ou utiliser OAuth."
     2975
     2976msgid "Outlook / Office 365 Setup"
     2977msgstr "Configuration Outlook / Office 365"
     2978
     2979msgid "Enable 2-Factor Authentication on your Microsoft account"
     2980msgstr "Activez l'authentification à 2 facteurs sur votre compte Microsoft"
     2981
     2982msgid "Go to <a href=\"https://account.live.com/proofs/AppPassword\" target=\"_blank\">Microsoft App Passwords</a>"
     2983msgstr "Allez sur <a href=\"https://account.live.com/proofs/AppPassword\" target=\"_blank\">Mots de passe d'application Microsoft</a>"
     2984
     2985msgid "Create a new app password"
     2986msgstr "Créez un nouveau mot de passe d'application"
     2987
     2988msgid "Use your Outlook email as username"
     2989msgstr "Utilisez votre email Outlook comme nom d'utilisateur"
     2990
     2991msgid "Use the app password as your SMTP password"
     2992msgstr "Utilisez le mot de passe d'application comme mot de passe SMTP"
     2993
     2994msgid "Zoho Mail Setup"
     2995msgstr "Configuration Zoho Mail"
     2996
     2997msgid "Log in to your Zoho Mail account"
     2998msgstr "Connectez-vous à votre compte Zoho Mail"
     2999
     3000msgid "Go to <strong>Settings</strong> → <strong>Security</strong> → <strong>App Passwords</strong>"
     3001msgstr "Allez dans <strong>Paramètres</strong> → <strong>Sécurité</strong> → <strong>Mots de passe d'application</strong>"
     3002
     3003msgid "Generate a new app-specific password"
     3004msgstr "Générez un nouveau mot de passe spécifique à l'application"
     3005
     3006msgid "Use your Zoho email as username"
     3007msgstr "Utilisez votre email Zoho comme nom d'utilisateur"
     3008
     3009msgid "For EU accounts, use smtp.zoho.eu instead."
     3010msgstr "Pour les comptes EU, utilisez smtp.zoho.eu à la place."
     3011
     3012msgid "Custom SMTP Setup"
     3013msgstr "Configuration SMTP personnalisée"
     3014
     3015msgid "Contact your email provider or hosting company for SMTP details"
     3016msgstr "Contactez votre fournisseur d'email ou hébergeur pour les détails SMTP"
     3017
     3018msgid "Common settings: Host, Port, Username, Password, Encryption"
     3019msgstr "Paramètres courants : Hôte, Port, Nom d'utilisateur, Mot de passe, Chiffrement"
     3020
     3021msgid "Try port 587 with TLS, or port 465 with SSL"
     3022msgstr "Essayez le port 587 avec TLS, ou le port 465 avec SSL"
     3023
     3024msgid "If using cPanel, check <strong>Email Accounts</strong> → <strong>Connect Devices</strong>"
     3025msgstr "Si vous utilisez cPanel, vérifiez <strong>Comptes de messagerie</strong> → <strong>Connecter des appareils</strong>"
  • blaminhor-essentials/trunk/languages/blaminhor-essentials.pot

    r3445615 r3445838  
    11msgid ""
    22msgstr ""
    3 "Project-Id-Version: Blaminhor Essentials 1.0.2\n"
     3"Project-Id-Version: Blaminhor Essentials 1.0.1\n"
    44"Report-Msgid-Bugs-To: https://wp.blaminhor.com\n"
    55"POT-Creation-Date: 2026-01-20 10:00+0000\n"
  • blaminhor-essentials/trunk/readme.txt

    r3445615 r3445838  
    11=== Blaminhor Essentials – Modular Toolkit ===
    22Contributors: blaminhor
    3 Tags: smtp, duplicator, maintenance, toolkit, email
     3Tags: toolkit, smtp, backup, seo, maintenance
    44Requires at least: 6.2
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 1.0.0
     7Stable tag: 1.1.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    10 Donate link: https://wp.blaminhor.com/
    11 
    12 A simple, lightweight modular toolkit for WordPress. 100% Free.
     10
     11A simple, lightweight toolkit to replace common utility plugins. 100% Free.
    1312
    1413== Description ==
    1514
    16 **Stop installing multiple plugins for basic tasks.**
    17 
    18 Blaminhor Essentials groups essential WordPress features into one single, lightweight plugin. Each module is independent and only loads when activated.
     15**Stop installing dozens of plugins for basic tasks.**
     16
     17Blaminhor Essentials groups essential WordPress features into one single, lightweight plugin. I built this because I was tired of managing 10 different plugins for things that should be simple.
    1918
    2019**My Approach:**
    2120
    22 *   **Modular**: Enable only what you need. Each feature is isolated.
    23 *   **Lightweight**: No bloat. You only load the code for the features you actually turn on.
    24 *   **Secure & Reliable**: I use standard WordPress APIs and best practices.
    25 *   **100% Free**: No premium version, no upsells.
    26 
    27 **Available Modules:**
     21*   **All-in-One**: I gathered the most useful tools: Content Duplicator, SMTP, Maintenance Mode, Broken Links Checker, and more.
     22*   **Pragmatic Performance**: No bloat. You only load the code for the features you actually turn on.
     23*   **Secure & Reliable**: I use standard WordPress APIs and best practices. No reinvention of the wheel.
     24*   **100% Free**: No premium version, no upsells. I built this for myself, and I'm sharing it with you.
     25
     26**Available Features:**
     27
     28= Broken Links Checker =
     29Keep your site healthy by finding dead links.
     30
     31*   **Deep Scan**: Scans posts, pages, and custom post types for broken URLs.
     32*   **Internal & External**: Checks your own internal links and external references.
     33*   **Dashboard Widget**: View scan progress and results directly in the module settings.
     34*   **Smart Management**: Edit the post to fix the link, or dismiss false positives.
     35*   **Performance**: Batched scanning prevents server timeouts.
     36
     37= Classic Editor =
     38Restore the clean, distraction-free writing experience.
     39
     40*   **Disable Gutenberg**: Completely disables the Block Editor for posts and pages.
     41*   **Clean Up**: Removes block library CSS and SVGs from the frontend for better performance.
     42*   **Old Style**: Restores the classic "Edit Post" screen and TinyMCE editor.
    2843
    2944= Content Duplicator =
     
    3651*   **Taxonomy Support**: Duplicate categories and tags with all their metadata.
    3752
     53= Favicon Generator =
     54One image, perfect branding everywhere.
     55
     56*   **Universal Support**: Generates classic `favicon.ico`, PNG icons (16, 32, 48), Apple Touch Icon (180), Android Chrome (192, 512), and Windows Tiles.
     57*   **Manifest & Config**: automatically serves `site.webmanifest` and `browserconfig.xml`.
     58*   **Customization**: Set theme color and background color for mobile and tile interfaces.
     59*   **Simple**: Upload one high-res square image (512x512+), and we handle the rest.
     60
     61= HTTPS Redirect =
     62Force secure connections for your entire site.
     63
     64*   **Automatic Redirect**: Redirects all HTTP requests to HTTPS with a 301 permanent redirect.
     65*   **Admin & Login**: Force HTTPS on wp-admin and wp-login.php for secure authentication.
     66*   **Mixed Content Fix**: Optionally fix HTTP URLs in page output to prevent browser warnings.
     67*   **HSTS Support**: Enable HTTP Strict Transport Security header for enhanced security.
     68*   **SSL Detection**: Checks for valid SSL certificate before allowing activation.
     69
     70= Image Sizes =
     71Take control of your media library and disk space.
     72
     73*   **Disable Sizes**: Prevent WordPress, themes, and plugins from generating unused thumbnail sizes.
     74*   **Custom Sizes**: Register new image sizes with exact crop settings directly from the UI.
     75*   **Regenerate Thumbnails**: Re-create thumbnails for existing images after changing settings.
     76*   **Cleanup**: Delete old files for disabled sizes to free up disk space.
     77*   **Big Image Control**: Disable the default "scaled" big image generation.
     78
    3879= Maintenance Mode =
    3980Simple, effective Coming Soon and Maintenance pages.
     
    4182*   **Two Modes**: Choose between "Maintenance" (503 Service Unavailable) or "Coming Soon" (200 OK).
    4283*   **Access Control**: Whitelist user roles (e.g., Administrators) or specific IP addresses.
    43 *   **Customization**: Set headline, message, background color, and text color.
     84*   **Customization**: Set headline, message, background color, and text color. Add custom CSS.
    4485*   **Login Link**: Optional link to the admin login page for restricted users.
     86
     87= Mute Core Emails =
     88Silence automatic emails from WordPress.
     89
     90*   **Auto-Updates**: Mute email notifications after automatic core, plugin, or theme updates.
     91*   **User Emails**: Control emails for new user registration, password changes, and email changes.
     92*   **Comment Emails**: Mute comment notification and moderation emails.
     93*   **System Emails**: Optionally mute recovery mode emails (use with caution).
     94*   **Granular Control**: Enable or disable each email type individually.
    4595
    4696= SMTP Mailer =
     
    51101*   **Email Log**: Keep track of every email sent (status, subject, relay used) with auto-cleanup of old logs.
    52102*   **Developer Friendly**: Force 'From Email' and 'From Name', disable SSL verification for local dev.
    53 *   **Testing**: Built-in tools to test individual relays or the full sending stack.
     103*   **Testing**: built-in tools to test individual relays or the full sending stack.
     104
     105= GSO/SEO Manager =
     106Complete SEO toolkit: meta tags, indexing control, social sharing, and XML sitemaps.
     107
     108*   **Indexing Control**: Choose which content types search engines should index.
     109*   **Site-wide Noindex**: Disable search engine indexing for the entire site (useful during development).
     110*   **Admin Notice**: Clear reminder in the admin area when indexing is disabled.
     111*   **Meta Tags**: Manage SEO titles and descriptions for every post and page.
     112*   **Social Sharing**: Open Graph and Twitter Card meta tags with preview.
     113*   **SERP Preview**: See how your pages will appear in search results on mobile, tablet, and desktop.
     114*   **Content Overview**: Manage SEO meta for all content from a single table with inline editing.
     115*   **AI Crawlers**: Block AI training on your content with noai meta tags.
     116*   **XML Sitemaps**: Auto-generated sitemaps with Google Images support.
     117
     118= Backup =
     119Create local backups of your site files and database.
     120
     121*   **Manual Backups**: Create on-demand backups stored locally in wp-content/blaminhor-essentials/backups/.
     122*   **Flexible Options**: Choose what to backup: database, plugins, themes, uploads, or full WordPress installation.
     123*   **Smart Defaults**: Database, plugins, themes, and uploads are selected by default (not full WP core).
     124*   **Backup Management**: Download, view, and delete backups from the admin panel.
     125*   **Retention Policy**: Automatically delete old backups to save disk space.
     126*   **Secure Storage**: Backups are protected from direct access with .htaccess rules.
     127
     128= Database Optimizer =
     129Clean and optimize your WordPress database for better performance.
     130
     131*   **Overview Dashboard**: See database size, overhead, and items to clean at a glance.
     132*   **Smart Cleanup**: Remove post revisions, auto-drafts, trashed posts, spam comments, expired transients.
     133*   **Orphan Data**: Clean orphaned post meta, comment meta, term meta, and relationships.
     134*   **Table Optimization**: Reclaim disk space by optimizing database tables.
     135*   **Scheduled Cleanup**: Set up automatic cleanup on daily, twice daily, or weekly schedule.
     136*   **Revision Control**: Keep a configurable number of revisions per post.
     137*   **Backup Integration**: Prompts to create a backup before cleanup (uses Backup module if active).
     138
     139= Fatal Error Recovery =
     140Recover from fatal errors without FTP access.
     141
     142*   **Error Detection**: Automatically detects PHP fatal errors that crash your site.
     143*   **Recovery Interface**: Displays a simple interface to disable problematic plugins.
     144*   **Smart Detection**: Identifies which plugin caused the error from the stack trace.
     145*   **One-Click Disable**: Rename plugin folders with an underscore prefix to deactivate them.
     146*   **Secure Access**: Recovery key required to prevent unauthorized access.
     147*   **Admin Bar Status**: Shows recovery mode status when active.
     148
     149= Domain Changer =
     150Change your site domain and update all database references in one click.
     151
     152*   **One-Click Migration**: Update all database references to the new domain automatically.
     153*   **Smart Replacement**: Handles serialized data in options, post meta, and other tables.
     154*   **Preview Changes**: See how many rows will be affected before making changes.
     155*   **Backup Integration**: Prompts to create a database backup before migration.
     156*   **Change History**: Track previous domain changes with timestamps.
     157
     158= Redirections 301 =
     159Manage 301 redirections with simple rules or regex patterns.
     160
     161*   **Simple Redirects**: Create basic URL redirects with source and target paths.
     162*   **Regex Support**: Use regular expressions for advanced URL matching.
     163*   **Automatic Slug Tracking**: Get notified when a post or taxonomy slug changes.
     164*   **CSV Import**: Import multiple redirections from CSV content or file upload.
     165*   **Hit Counter**: Track how many times each redirection has been used.
     166*   **Toggle Active**: Enable or disable individual redirections without deleting them.
    54167
    55168== Installation ==
     
    571701. Upload the `blaminhor-essentials` folder to the `/wp-content/plugins/` directory.
    581712. Activate the plugin through the 'Plugins' menu in WordPress.
    59 3. Go to "Blaminhor" in the admin menu.
    60 4. Turn on the modules you need.
     1723. Go to "Blaminhor Essentials" in the admin menu.
     1734. Turn on the features you need.
    61174
    62175== Frequently Asked Questions ==
     
    65178Yes, Blaminhor Essentials is completely free.
    66179
    67 = Will activating all modules slow down my site? =
    68 No. Each module is isolated and only loads its code when active.
     180= Will activating all features slow down my site? =
     181No. Each feature is isolated and only loads its code when active. However, I recommend only enabling what you use to keep your admin interface clean.
    69182
    70183= Can I use multiple SMTP relays? =
     
    73186== Screenshots ==
    74187
    75 1. Dashboard with module activation
    76 2. Content Duplicator in action
     1881. Dashboard with feature activation
     1892. Content Duplicator settings
    771903. SMTP Mailer relay configuration
    78 4. Maintenance Mode settings
     1914. Email log
    79192
    80193== Changelog ==
     194
     195= 1.1.0 =
     196* Added 13 new modules: Backup, Broken Links Checker, Classic Editor, Database Optimizer, Domain Changer, Favicon Generator, Fatal Error Recovery, HTTPS Redirect, Image Sizes, Mute Core Emails, Redirections 301, GSO/SEO Manager.
     197* Dashboard modules organized by categories with collapsible accordion sections.
     198* Added complete translations for all SMTP provider tutorials (13 providers).
     199* Fatal Error Recovery: Uses database-based plugin deactivation instead of folder renaming.
     200* Fatal Error Recovery: Added support for single-file plugins (e.g., Hello Dolly).
     201* HTTPS Redirect: Module is now disabled by default with safety warning.
     202* Added "Delete data on uninstall" option in Advanced Settings.
     203* Improved translation handling for WordPress 6.7+ compatibility.
     204* Fixed various translation issues and improved French/German translations.
     205* Code improvements for WordPress Plugin Check compliance.
    81206
    82207= 1.0.0 =
     
    86211== Upgrade Notice ==
    87212
     213= 1.1.0 =
     214Major update: 13 new modules, complete SMTP translations, improved Fatal Error Recovery, and new Advanced Settings.
     215
    88216= 1.0.0 =
    89 Initial release of Blaminhor Essentials.
     217Initial release.
    90218
    91219== Privacy Policy ==
    92220
    93 Blaminhor Essentials does not collect any personal data. The SMTP Mailer module stores email metadata locally if logging is enabled, but this data stays on your server.
     221Blaminhor Essentials does not collect any personal data. The SMTP Mailer feature stores email metadata locally if logging is enabled, but this data stays on your server.
    94222
    95223== Third Party Services ==
     
    97225This plugin allows you to optionally configure connections to external SMTP services for email delivery. **No data is sent to any external service unless you explicitly configure an SMTP relay.**
    98226
    99 When you configure the SMTP Mailer module, your emails (including recipient addresses, subject, message content, and any attachments) will be transmitted through the SMTP service you choose. This happens each time WordPress sends an email (contact forms, password resets, notifications, etc.).
    100 
    101 The following services have preset configurations available:
     227When you configure the SMTP Mailer module, your emails will be sent through the service you choose. The following services have preset configurations available:
    102228
    103229= Gmail =
Note: See TracChangeset for help on using the changeset viewer.