diff --git a/app/Http/Controllers/Api/V1/SpeedtestController.php b/app/Http/Controllers/Api/V1/SpeedtestController.php index 19519f61e..d605d945c 100644 --- a/app/Http/Controllers/Api/V1/SpeedtestController.php +++ b/app/Http/Controllers/Api/V1/SpeedtestController.php @@ -37,6 +37,7 @@ public function __invoke(Request $request) } $result = RunSpeedtestAction::run( + scheduled: true, serverId: $request->input('server_id'), dispatchedBy: $request->user()->id, ); diff --git a/app/Listeners/ProcessCompletedSpeedtest.php b/app/Listeners/ProcessCompletedSpeedtest.php index 1b72f3053..ae5d544e1 100644 --- a/app/Listeners/ProcessCompletedSpeedtest.php +++ b/app/Listeners/ProcessCompletedSpeedtest.php @@ -31,11 +31,17 @@ public function handle(SpeedtestCompleted $event): void { $result = $event->result; - $result->loadMissing(['dispatchedBy']); + if ($result->healthy === false) { + return; + } + + // Don't send notifications for unscheduled speedtests. + if ($result->unscheduled) { + return; + } $this->notifyAppriseChannels($result); $this->notifyDatabaseChannels($result); - $this->notifyDispatchingUser($result); $this->notifyMailChannels($result); $this->notifyWebhookChannels($result); } @@ -45,11 +51,6 @@ public function handle(SpeedtestCompleted $event): void */ private function notifyAppriseChannels(Result $result): void { - // Don't send Apprise notification if dispatched by a user or test is unhealthy. - if (filled($result->dispatched_by) || $result->healthy === false) { - return; - } - // Check if Apprise notifications are enabled. if (! $this->notificationSettings->apprise_enabled || ! $this->notificationSettings->apprise_on_speedtest_run) { return; @@ -97,11 +98,6 @@ private function notifyAppriseChannels(Result $result): void */ private function notifyDatabaseChannels(Result $result): void { - // Don't send database notification if dispatched by a user or test is unhealthy. - if (filled($result->dispatched_by) || $result->healthy === false) { - return; - } - // Check if database notifications are enabled. if (! $this->notificationSettings->database_enabled || ! $this->notificationSettings->database_on_speedtest_run) { return; @@ -120,37 +116,11 @@ private function notifyDatabaseChannels(Result $result): void } } - /** - * Notify the user who dispatched the speedtest. - */ - private function notifyDispatchingUser(Result $result): void - { - if (empty($result->dispatched_by) || ! $result->healthy) { - return; - } - - $result->dispatchedBy->notify( - FilamentNotification::make() - ->title(__('results.speedtest_completed')) - ->actions([ - Action::make('view') - ->label(__('general.view')) - ->url(route('filament.admin.resources.results.index')), - ]) - ->success() - ->toDatabase(), - ); - } - /** * Notify mail channels. */ private function notifyMailChannels(Result $result): void { - if (filled($result->dispatched_by) || $result->healthy === false) { - return; - } - if (! $this->notificationSettings->mail_enabled || ! $this->notificationSettings->mail_on_speedtest_run) { return; } @@ -172,11 +142,6 @@ private function notifyMailChannels(Result $result): void */ private function notifyWebhookChannels(Result $result): void { - // Don't send webhook if dispatched by a user or test is unhealthy. - if (filled($result->dispatched_by) || $result->healthy === false) { - return; - } - // Check if webhook notifications are enabled. if (! $this->notificationSettings->webhook_enabled || ! $this->notificationSettings->webhook_on_speedtest_run) { return; diff --git a/app/Listeners/ProcessFailedSpeedtest.php b/app/Listeners/ProcessFailedSpeedtest.php index 8ba154387..3cc4d9cd8 100644 --- a/app/Listeners/ProcessFailedSpeedtest.php +++ b/app/Listeners/ProcessFailedSpeedtest.php @@ -4,8 +4,6 @@ use App\Events\SpeedtestFailed; use App\Models\Result; -use Filament\Actions\Action; -use Filament\Notifications\Notification; class ProcessFailedSpeedtest { @@ -16,10 +14,12 @@ public function handle(SpeedtestFailed $event): void { $result = $event->result; - $result->loadMissing(['dispatchedBy']); + // Don't send notifications for unscheduled speedtests. + if ($result->unscheduled) { + return; + } // $this->notifyAppriseChannels($result); - $this->notifyDispatchingUser($result); } /** @@ -27,33 +27,6 @@ public function handle(SpeedtestFailed $event): void */ private function notifyAppriseChannels(Result $result): void { - // Don't send Apprise notification if dispatched by a user or test is unhealthy. - if (filled($result->dispatched_by) || ! $result->healthy) { - return; - } - // } - - /** - * Notify the user who dispatched the speedtest. - */ - private function notifyDispatchingUser(Result $result): void - { - if (empty($result->dispatched_by)) { - return; - } - - $result->dispatchedBy->notify( - Notification::make() - ->title(__('results.speedtest_failed')) - ->actions([ - Action::make('view') - ->label(__('general.view')) - ->url(route('filament.admin.resources.results.index')), - ]) - ->warning() - ->toDatabase(), - ); - } } diff --git a/app/Listeners/ProcessUnhealthySpeedtest.php b/app/Listeners/ProcessUnhealthySpeedtest.php index 4f51e4267..f2e0d419c 100644 --- a/app/Listeners/ProcessUnhealthySpeedtest.php +++ b/app/Listeners/ProcessUnhealthySpeedtest.php @@ -33,11 +33,13 @@ public function handle(SpeedtestBenchmarkFailed $event): void { $result = $event->result; - $result->loadMissing(['dispatchedBy']); + // Don't send notifications for unscheduled speedtests. + if ($result->unscheduled) { + return; + } $this->notifyAppriseChannels($result); $this->notifyDatabaseChannels($result); - $this->notifyDispatchingUser($result); $this->notifyMailChannels($result); $this->notifyWebhookChannels($result); } @@ -47,11 +49,6 @@ public function handle(SpeedtestBenchmarkFailed $event): void */ private function notifyAppriseChannels(Result $result): void { - // Don't send Apprise notification if dispatched by a user. - if (filled($result->dispatched_by)) { - return; - } - if (! $this->notificationSettings->apprise_enabled || ! $this->notificationSettings->apprise_on_threshold_failure) { return; } @@ -132,11 +129,6 @@ private function formatMetricValue(string $metric, Result $result): string */ private function notifyDatabaseChannels(Result $result): void { - // Don't send database notification if dispatched by a user. - if (filled($result->dispatched_by)) { - return; - } - // Check if database notifications are enabled. if (! $this->notificationSettings->database_enabled || ! $this->notificationSettings->database_on_threshold_failure) { return; @@ -155,38 +147,11 @@ private function notifyDatabaseChannels(Result $result): void } } - /** - * Notify the user who dispatched the speedtest. - */ - private function notifyDispatchingUser(Result $result): void - { - if (empty($result->dispatched_by)) { - return; - } - - $result->dispatchedBy->notify( - FilamentNotification::make() - ->title(__('results.speedtest_benchmark_failed')) - ->actions([ - Action::make('view') - ->label(__('general.view')) - ->url(route('filament.admin.resources.results.index')), - ]) - ->warning() - ->toDatabase(), - ); - } - /** * Notify mail channels. */ private function notifyMailChannels(Result $result): void { - // Don't send mail if dispatched by a user. - if (filled($result->dispatched_by)) { - return; - } - // Check if mail notifications are enabled. if (! $this->notificationSettings->mail_enabled || ! $this->notificationSettings->mail_on_threshold_failure) { return; @@ -210,11 +175,6 @@ private function notifyMailChannels(Result $result): void */ private function notifyWebhookChannels(Result $result): void { - // Don't send webhook if dispatched by a user. - if (filled($result->dispatched_by)) { - return; - } - // Check if webhook notifications are enabled. if (! $this->notificationSettings->webhook_enabled || ! $this->notificationSettings->webhook_on_threshold_failure) { return; diff --git a/app/Listeners/UserNotificationSubscriber.php b/app/Listeners/UserNotificationSubscriber.php new file mode 100644 index 000000000..4ff7dc7c8 --- /dev/null +++ b/app/Listeners/UserNotificationSubscriber.php @@ -0,0 +1,104 @@ +result; + + if (empty($result->dispatched_by)) { + return; + } + + $result->loadMissing('dispatchedBy'); + + Notification::make() + ->title(__('results.speedtest_completed')) + ->actions([ + Action::make('view') + ->label(__('general.view')) + ->url(route('filament.admin.resources.results.index')), + ]) + ->success() + ->sendToDatabase($result->dispatchedBy); + } + + /** + * Handle the event. + */ + public function handleBenchmarkFailed(SpeedtestBenchmarkFailed $event): void + { + $result = $event->result; + + if (empty($result->dispatched_by)) { + return; + } + + // Don't send notifications for unscheduled speedtests. + if ($result->unscheduled) { + return; + } + + $result->loadMissing('dispatchedBy'); + + Notification::make() + ->title(__('results.speedtest_benchmark_failed')) + ->actions([ + Action::make('view') + ->label(__('general.view')) + ->url(route('filament.admin.resources.results.index')), + ]) + ->warning() + ->sendToDatabase($result->dispatchedBy); + } + + /** + * Handle the event. + */ + public function handleFailed(SpeedtestFailed $event): void + { + $result = $event->result; + + if (empty($result->dispatched_by)) { + return; + } + + $result->loadMissing('dispatchedBy'); + + Notification::make() + ->title(__('results.speedtest_failed')) + ->actions([ + Action::make('view') + ->label(__('general.view')) + ->url(route('filament.admin.resources.results.index')), + ]) + ->warning() + ->sendToDatabase($result->dispatchedBy); + } + + /** + * Register the listeners for the subscriber. + * + * @return array + */ + public function subscribe(Dispatcher $events): array + { + return [ + SpeedtestCompleted::class => 'handleCompleted', + SpeedtestBenchmarkFailed::class => 'handleBenchmarkFailed', + SpeedtestFailed::class => 'handleFailed', + ]; + } +} diff --git a/app/Models/Result.php b/app/Models/Result.php index bba1a37d9..084c04097 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -6,6 +6,7 @@ use App\Enums\ResultStatus; use App\Models\Traits\ResultDataAttributes; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Prunable; @@ -54,4 +55,14 @@ public function dispatchedBy(): BelongsTo { return $this->belongsTo(User::class, 'dispatched_by'); } + + /** + * Determine if the result was unscheduled. + */ + protected function unscheduled(): Attribute + { + return Attribute::make( + get: fn (): bool => ! $this->scheduled, + ); + } } diff --git a/config/speedtest.php b/config/speedtest.php index 94ebcaa84..79c2e84b4 100644 --- a/config/speedtest.php +++ b/config/speedtest.php @@ -6,9 +6,9 @@ /** * General settings. */ - 'build_date' => Carbon::parse('2025-12-19'), + 'build_date' => Carbon::parse('2025-12-26'), - 'build_version' => 'v1.13.3', + 'build_version' => 'v1.13.4', 'content_width' => env('CONTENT_WIDTH', '7xl'), diff --git a/lang/de_DE/auth.php b/lang/de_DE/auth.php index 6d83d009e..ed5c9f604 100644 --- a/lang/de_DE/auth.php +++ b/lang/de_DE/auth.php @@ -13,6 +13,7 @@ | */ + 'sign_in' => 'Anmelden', 'failed' => 'Diese Zugangsdaten stimmen nicht mit unseren Datensätzen überein.', 'password' => 'Das angegebene Passwort ist falsch.', 'throttle' => 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in :seconds Sekunden erneut.', diff --git a/lang/de_DE/general.php b/lang/de_DE/general.php index 86af86298..4cbb97ede 100644 --- a/lang/de_DE/general.php +++ b/lang/de_DE/general.php @@ -1,6 +1,11 @@ 'Aktuelle Version', + 'latest_version' => 'Neueste Version', + 'github' => 'GitHub', + 'repository' => 'Repository', + // Common actions 'save' => 'Speichern', 'cancel' => 'Abbrechen', @@ -32,6 +37,10 @@ 'created_at' => 'Erstellt am', 'updated_at' => 'Aktualisiert am', 'url' => 'URL', + 'server' => 'Server', + 'servers' => 'Server', + 'stats' => 'Statistiken', + 'statistics' => 'Statistiken', // Navigation 'dashboard' => 'Dashboard', @@ -42,6 +51,7 @@ 'view_documentation' => 'Dokumentation anzeigen', 'links' => 'Links', 'donate' => 'Spenden', + 'donations' => 'Spenden', // Roles 'admin' => 'Admin', @@ -54,12 +64,15 @@ 'last_month' => 'Letzten Monat', // Metrics + 'metrics' => 'Metriken', 'average' => 'Durchschnitt', 'high' => 'Hoch', 'low' => 'Niedrig', 'faster' => 'schneller', 'slower' => 'langsamer', 'healthy' => 'Gesund', + 'not_measured' => 'Nicht gemessen', + 'unhealthy' => 'fehlerhaft', // Units 'ms' => 'M', diff --git a/lang/de_DE/results.php b/lang/de_DE/results.php index 127d85b81..a506bce62 100644 --- a/lang/de_DE/results.php +++ b/lang/de_DE/results.php @@ -55,9 +55,6 @@ // Actions 'update_comments' => 'Kommentare aktualisieren', - 'truncate_results' => 'Ergebnisse kürzen', - 'truncate_results_description' => 'Sind Sie sicher, dass Sie alle Ergebnisse kürzen möchten? Diese Aktion kann nicht rückgängig gemacht werden.', - 'truncate_results_success' => 'Ergebnistabelle abgeschnitten!', 'view_on_speedtest_net' => 'Auf Speedtest.net anzeigen', // Notifications @@ -72,7 +69,6 @@ // Run Speedtest Action 'speedtest' => 'Schnelligkeit', - 'public_dashboard' => 'Öffentliches Dashboard', 'select_server' => 'Server auswählen', 'select_server_helper' => 'Leer lassen, um den Speedtest auszuführen, ohne einen Server anzugeben. Blockierte Server werden übersprungen.', 'manual_servers' => 'Manuelle Server', diff --git a/lang/de_DE/settings/data_integration.php b/lang/de_DE/settings/data_integration.php index 83464fa4d..71d1936dc 100644 --- a/lang/de_DE/settings/data_integration.php +++ b/lang/de_DE/settings/data_integration.php @@ -28,7 +28,7 @@ 'influxdb_test_success_body' => 'Testdaten wurden an InfluxDB gesendet. Überprüfen Sie, ob die Daten empfangen wurden.', // Bulk write notifications - 'influxdb_bulk_write_failed' => 'Fehler beim Erstellen des Schreibens auf Influxdb.', + 'influxdb_bulk_write_failed' => 'Fehler beim Schreiben von Massendaten in InfluxDB.', 'influxdb_bulk_write_failed_body' => 'Überprüfen Sie die Protokolle für weitere Details.', 'influxdb_bulk_write_success' => 'Massendatenlade für Influxdb abgeschlossen.', 'influxdb_bulk_write_success_body' => 'Daten wurden an InfluxDB gesendet. Überprüfen Sie, ob die Daten empfangen wurden.', diff --git a/lang/de_DE/settings/notifications.php b/lang/de_DE/settings/notifications.php index 6d6623a47..8ec3ee6dc 100644 --- a/lang/de_DE/settings/notifications.php +++ b/lang/de_DE/settings/notifications.php @@ -14,6 +14,19 @@ 'recipients' => 'Empfänger', 'test_mail_channel' => 'Mail-Kanal testen', + // Apprise notifications + 'apprise' => 'Apprise', + 'enable_apprise_notifications' => 'Apprise Benachrichtigungen aktivieren', + 'apprise_server' => 'Apprise Server', + 'apprise_server_url' => 'Apprise Server URL', + 'apprise_verify_ssl' => 'SSL verifizieren', + 'apprise_channels' => 'Apprise Kanäle', + 'apprise_channel_url' => 'Kanal URL', + 'apprise_hint_description' => 'Lesen Sie für weitere Informationen zum Einrichten von Apprise die Dokumentation.', + 'apprise_channel_url_helper' => 'Geben Sie die Service Endpoint URL für Benachrichtigung an.', + 'test_apprise_channel' => 'Apprise testen', + 'apprise_channel_url_validation_error' => 'Die Apprise Channel URL muss nicht mit "HTTP" oder "HTTPS" starten. Geben Sie ein valides Apprise URL Schema an.', + // Webhook 'webhook' => 'Webhook', 'webhooks' => 'Webhooks', diff --git a/lang/es_ES/auth.php b/lang/es_ES/auth.php index f4b03c1d5..b150afe6b 100644 --- a/lang/es_ES/auth.php +++ b/lang/es_ES/auth.php @@ -13,6 +13,7 @@ | */ + 'sign_in' => 'Iniciar sesión', 'failed' => 'Estas credenciales no coinciden con nuestros registros.', 'password' => 'La contraseña proporcionada es incorrecta.', 'throttle' => 'Demasiados intentos de inicio de sesión. Por favor, inténtalo de nuevo en :seconds segundos.', diff --git a/lang/es_ES/general.php b/lang/es_ES/general.php index bf2e3a571..fddf7a982 100644 --- a/lang/es_ES/general.php +++ b/lang/es_ES/general.php @@ -1,6 +1,11 @@ 'Versión actual', + 'latest_version' => 'Última versión', + 'github' => 'GitHub', + 'repository' => 'Repositorio', + // Common actions 'save' => 'Guardar', 'cancel' => 'Cancelar', @@ -16,6 +21,7 @@ 'no' => 'Nu', 'options' => 'Opciones', 'details' => 'Detalles', + 'view' => 'Ver', // Common labels 'name' => 'Nombre', @@ -31,6 +37,10 @@ 'created_at' => 'Creado el', 'updated_at' => 'Actualizado el', 'url' => 'URL', + 'server' => 'Servidor', + 'servers' => 'Servidores', + 'stats' => 'Estadísticas', + 'statistics' => 'Estadísticas', // Navigation 'dashboard' => 'Tablero', @@ -38,8 +48,10 @@ 'settings' => 'Ajustes', 'users' => 'Usuarios', 'documentation' => 'Documentación', + 'view_documentation' => 'Ver documentación', 'links' => 'Enlaces', 'donate' => 'Donar', + 'donations' => 'Donaciones', // Roles 'admin' => 'Admin', @@ -52,12 +64,15 @@ 'last_month' => 'Último mes', // Metrics + 'metrics' => 'Métricas', 'average' => 'Promedio', 'high' => 'Alta', 'low' => 'Baja', 'faster' => 'más rápido', 'slower' => 'más lento', 'healthy' => 'Saludable', + 'not_measured' => 'No medido', + 'unhealthy' => 'Poco saludable', // Units 'ms' => 'm', diff --git a/lang/es_ES/results.php b/lang/es_ES/results.php index f41af5df8..89df7e984 100644 --- a/lang/es_ES/results.php +++ b/lang/es_ES/results.php @@ -55,21 +55,20 @@ // Actions 'update_comments' => 'Actualizar comentarios', - 'truncate_results' => 'Truncar resultados', - 'truncate_results_description' => '¿Está seguro que desea truncar todos los resultados? Esta acción es irreversible.', - 'truncate_results_success' => '¡Tabla de resultados truncada!', 'view_on_speedtest_net' => 'Ver en Speedtest.net', // Notifications + 'speedtest_benchmark_passed' => 'La prueba de rendimiento de velocidad ha pasado', + 'speedtest_benchmark_failed' => 'Prueba de rendimiento de velocidad fallida', 'speedtest_started' => 'Velocidad iniciada', 'speedtest_completed' => 'Velocidad completada', + 'speedtest_failed' => 'Error en la prueba de velocidad', 'download_threshold_breached' => '¡Umbral de descarga incumplido!', 'upload_threshold_breached' => '¡Umbral de subida infringido!', 'ping_threshold_breached' => '¡Umbral de ping infringido!', // Run Speedtest Action 'speedtest' => 'Velocidad', - 'public_dashboard' => 'Panel público', 'select_server' => 'Seleccionar Servidor', 'select_server_helper' => 'Dejar en blanco para ejecutar el test de velocidad sin especificar un servidor. Se omitirán los servidores bloqueados.', 'manual_servers' => 'Servidores manuales', diff --git a/lang/es_ES/settings/data_integration.php b/lang/es_ES/settings/data_integration.php index 1c3633559..a1b024848 100644 --- a/lang/es_ES/settings/data_integration.php +++ b/lang/es_ES/settings/data_integration.php @@ -28,11 +28,18 @@ 'influxdb_test_success_body' => 'Los datos de prueba han sido enviados a InfluxDB, compruebe si los datos han sido recibidos.', // Bulk write notifications - 'influxdb_bulk_write_failed' => 'Error al construir escritura en Influxdb.', + 'influxdb_bulk_write_failed' => 'Error al escribir en masa a Influxdb.', 'influxdb_bulk_write_failed_body' => 'Revisa los registros para más detalles.', 'influxdb_bulk_write_success' => 'Carga de datos en masa a Influxdb.', 'influxdb_bulk_write_success_body' => 'Los datos han sido enviados a InfluxDB, compruebe si los datos han sido recibidos.', + // Prometheus + 'prometheus' => 'Prometeo', + 'prometheus_enabled' => 'Activar', + 'prometheus_enabled_helper_text' => 'Cuando está activado, las métricas para cada prueba de velocidad nueva estarán disponibles en el punto final /prometheus.', + 'prometheus_allowed_ips' => 'Direcciones IP permitidas', + 'prometheus_allowed_ips_helper' => 'Lista de direcciones IP o rangos CIDR (por ejemplo, 192.168.1.0/24) permitieron acceder al extremo de las métricas. Dejar en blanco para permitir todas las IPs.', + // Common labels 'org' => 'Org', 'bucket' => 'Cubo', diff --git a/lang/es_ES/settings/notifications.php b/lang/es_ES/settings/notifications.php index ddbb10dca..83d8bbf20 100644 --- a/lang/es_ES/settings/notifications.php +++ b/lang/es_ES/settings/notifications.php @@ -7,27 +7,35 @@ // Database notifications 'database' => 'Base de datos', 'database_description' => 'Las notificaciones enviadas a este canal se mostrarán bajo el icono :belell: en el encabezado.', - 'database_on_speedtest_run' => 'Notificar en cada prueba de velocidad', - 'database_on_threshold_failure' => 'Notificar en los umbrales de fallos', 'test_database_channel' => 'Probar canal de base de datos', // Mail notifications 'mail' => 'Correo', 'recipients' => 'Destinatarios', - 'mail_on_speedtest_run' => 'Notificar en cada prueba de velocidad', - 'mail_on_threshold_failure' => 'Notificar en los umbrales de fallos', 'test_mail_channel' => 'Canal de prueba de correo', + // Apprise notifications + 'apprise' => 'Apprise', + 'enable_apprise_notifications' => 'Habilitar notificaciones Apprise', + 'apprise_server' => 'Servidor Apprise', + 'apprise_server_url' => 'URL del servidor', + 'apprise_verify_ssl' => 'Verificar SSL', + 'apprise_channels' => 'Canales de expedición', + 'apprise_channel_url' => 'URL del canal', + 'apprise_hint_description' => 'Para más información sobre cómo configurar Apprise, vea la documentación.', + 'apprise_channel_url_helper' => 'Proporcionar la URL de los puntos finales del servicio para las notificaciones.', + 'test_apprise_channel' => 'Prueba de aviso', + 'apprise_channel_url_validation_error' => 'La URL del canal Apprise no debe comenzar con "http" o "https". Por favor, proporcione un esquema de URL de Apprise válido.', + // Webhook 'webhook' => 'Webhook', 'webhooks' => 'Webhooks', - 'webhook_on_speedtest_run' => 'Notificar en cada prueba de velocidad', - 'webhook_on_threshold_failure' => 'Notificar en los umbrales de fallos', 'test_webhook_channel' => 'Probar canal webhook', + 'webhook_hint_description' => 'Estos son webhooks genéricos. Para ejemplos de payload y detalles de la implementación, vea la documentación.', // Common notification messages - 'notify_on_every_speedtest_run' => 'Notificar en cada prueba de velocidad', - 'notify_on_threshold_failures' => 'Notificar en los umbrales de fallos', + 'notify_on_every_speedtest_run' => 'Notificar en cada prueba de velocidad programada', + 'notify_on_threshold_failures' => 'Notificar fallos de umbral para pruebas de velocidad programadas', // Test notification messages 'test_notifications' => [ diff --git a/lang/fr_FR/auth.php b/lang/fr_FR/auth.php index c1a529c3a..fc8d1390b 100644 --- a/lang/fr_FR/auth.php +++ b/lang/fr_FR/auth.php @@ -13,6 +13,7 @@ | */ + 'sign_in' => 'Se connecter', 'failed' => 'Ces identifiants ne correspondent pas à nos enregistrements.', 'password' => 'Le mot de passe fourni est incorrect.', 'throttle' => 'Trop de tentatives de connexion. Veuillez réessayer dans :seconds secondes.', diff --git a/lang/fr_FR/general.php b/lang/fr_FR/general.php index adeba836d..4b9422d7f 100644 --- a/lang/fr_FR/general.php +++ b/lang/fr_FR/general.php @@ -1,6 +1,11 @@ 'Version actuelle', + 'latest_version' => 'Dernière version', + 'github' => 'GitHub', + 'repository' => 'Dépôt', + // Common actions 'save' => 'Enregistrer', 'cancel' => 'Abandonner', @@ -32,6 +37,10 @@ 'created_at' => 'Créé le', 'updated_at' => 'Mis à jour le', 'url' => 'URL', + 'server' => 'Serveur', + 'servers' => 'Serveurs', + 'stats' => 'Stats', + 'statistics' => 'Statistiques', // Navigation 'dashboard' => 'Tableau de bord', @@ -42,6 +51,7 @@ 'view_documentation' => 'Afficher la documentation', 'links' => 'Liens', 'donate' => 'Faire un don', + 'donations' => 'Dons', // Roles 'admin' => 'Administrateur', @@ -54,12 +64,15 @@ 'last_month' => 'Le mois dernier', // Metrics + 'metrics' => 'Métriques', 'average' => 'Moyenne', 'high' => 'Élevé', 'low' => 'Bas', 'faster' => 'rapide', 'slower' => 'lent', 'healthy' => 'Sain', + 'not_measured' => 'Non mesuré', + 'unhealthy' => 'Malsain', // Units 'ms' => 'ms', diff --git a/lang/fr_FR/results.php b/lang/fr_FR/results.php index 7284dcbbc..ab2715930 100644 --- a/lang/fr_FR/results.php +++ b/lang/fr_FR/results.php @@ -55,9 +55,6 @@ // Actions 'update_comments' => 'Actualiser les commentaires', - 'truncate_results' => 'Tronquer les résultats', - 'truncate_results_description' => 'Êtes-vous sûr de vouloir tronquer tous les résultats ? Cette action est irréversible.', - 'truncate_results_success' => 'Tableau des résultats tronqué !', 'view_on_speedtest_net' => 'Voir sur Speedtest.net', // Notifications @@ -72,7 +69,6 @@ // Run Speedtest Action 'speedtest' => 'Test de vitesse', - 'public_dashboard' => 'Tableau de bord public', 'select_server' => 'Sélectionner un serveur', 'select_server_helper' => 'Laisser vide pour exécuter le test de vitesse sans spécifier de serveur. Les serveurs bloqués seront ignorés.', 'manual_servers' => 'Serveurs manuels', diff --git a/lang/fr_FR/settings/data_integration.php b/lang/fr_FR/settings/data_integration.php index 007362964..ce0af0775 100644 --- a/lang/fr_FR/settings/data_integration.php +++ b/lang/fr_FR/settings/data_integration.php @@ -28,7 +28,7 @@ 'influxdb_test_success_body' => 'Les données de test ont été envoyées à InfluxDB, vérifiez si les données ont été reçues.', // Bulk write notifications - 'influxdb_bulk_write_failed' => 'Échec de la construction de l\'écriture sur Influxdb.', + 'influxdb_bulk_write_failed' => 'Impossible d\'écrire en masse sur Influxdb.', 'influxdb_bulk_write_failed_body' => 'Consultez les journaux pour plus de détails.', 'influxdb_bulk_write_success' => 'Charge de données en masse terminée sur Influxdb.', 'influxdb_bulk_write_success_body' => 'Les données ont été envoyées à InfluxDB, vérifiez si les données ont été reçues.', diff --git a/lang/fr_FR/settings/notifications.php b/lang/fr_FR/settings/notifications.php index 778334423..359a1424a 100644 --- a/lang/fr_FR/settings/notifications.php +++ b/lang/fr_FR/settings/notifications.php @@ -14,6 +14,19 @@ 'recipients' => 'Destinataires', 'test_mail_channel' => 'Tester le canal de messagerie', + // Apprise notifications + 'apprise' => 'Apprise', + 'enable_apprise_notifications' => 'Activer les notifications de base de données', + 'apprise_server' => 'Serveur Apprise', + 'apprise_server_url' => 'Serveur Apprise', + 'apprise_verify_ssl' => 'Vérifier SSL', + 'apprise_channels' => 'Canaux Apprise', + 'apprise_channel_url' => 'URL du canal de mise à jour', + 'apprise_hint_description' => 'Pour plus d\'informations sur la configuration d\'Apprise, consultez la documentation.', + 'apprise_channel_url_helper' => 'Fournir l\'URL de terminaison du service pour les notifications.', + 'test_apprise_channel' => 'Apprise de test', + 'apprise_channel_url_validation_error' => 'L\'URL du canal Apprise ne doit pas commencer par "http" ou "https". Veuillez fournir un schéma d\'URL Apprise valide.', + // Webhook 'webhook' => 'Webhook', 'webhooks' => 'Webhooks', diff --git a/lang/nl_NL/auth.php b/lang/nl_NL/auth.php index 7667d5e81..2c9909f81 100644 --- a/lang/nl_NL/auth.php +++ b/lang/nl_NL/auth.php @@ -13,6 +13,7 @@ | */ + 'sign_in' => 'Aanmelden', 'failed' => 'Deze gegevens komen niet overeen met onze administratie.', 'password' => 'Het opgegeven wachtwoord is onjuist.', 'throttle' => 'Te veel inlogpogingen. Probeer het over :seconds seconden opnieuw.', diff --git a/lang/nl_NL/general.php b/lang/nl_NL/general.php index 28e36b0f9..e17828565 100644 --- a/lang/nl_NL/general.php +++ b/lang/nl_NL/general.php @@ -1,6 +1,11 @@ 'Huidige versie', + 'latest_version' => 'Laatste versie', + 'github' => 'GitHub', + 'repository' => 'Repository', + // Common actions 'save' => 'Opslaan', 'cancel' => 'Annuleren', @@ -32,6 +37,10 @@ 'created_at' => 'Aangemaakt op', 'updated_at' => 'Bijgewerkt op', 'url' => 'URL', + 'server' => 'Server', + 'servers' => 'Servers', + 'stats' => 'Statistieken', + 'statistics' => 'Statistieken', // Navigation 'dashboard' => 'Dashboard', @@ -42,6 +51,7 @@ 'view_documentation' => 'Bekijk documentatie', 'links' => 'Koppelingen', 'donate' => 'Doneren', + 'donations' => 'Donaties', // Roles 'admin' => 'Beheerder', @@ -54,12 +64,15 @@ 'last_month' => 'Vorige maand', // Metrics + 'metrics' => 'Statistieken', 'average' => 'Gemiddeld', 'high' => 'Hoog', 'low' => 'Laag', 'faster' => 'sneller', 'slower' => 'langzamer', 'healthy' => 'Gezond', + 'not_measured' => 'Niet gemeten', + 'unhealthy' => 'Ongezond', // Units 'ms' => 'ms', diff --git a/lang/nl_NL/results.php b/lang/nl_NL/results.php index 69befafa6..4a17ed6c8 100644 --- a/lang/nl_NL/results.php +++ b/lang/nl_NL/results.php @@ -55,9 +55,6 @@ // Actions 'update_comments' => 'Reacties bijwerken', - 'truncate_results' => 'Afkappen resultaten', - 'truncate_results_description' => 'Weet je zeker dat je alle resultaten wilt afbreken? Deze actie is onomkeerbaar.', - 'truncate_results_success' => 'Resultatentabel afgekapt!', 'view_on_speedtest_net' => 'Bekijk op Speedtest.net', // Notifications @@ -72,7 +69,6 @@ // Run Speedtest Action 'speedtest' => 'Snelheidstest', - 'public_dashboard' => 'Openbaar Dashboard', 'select_server' => 'Selecteer Server', 'select_server_helper' => 'Laat leeg om de snelheidstest uit te voeren zonder een server op te geven. Geblokkeerde servers zullen worden overgeslagen.', 'manual_servers' => 'Handmatige servers', diff --git a/lang/nl_NL/settings/data_integration.php b/lang/nl_NL/settings/data_integration.php index 2508fdf6b..c95902fac 100644 --- a/lang/nl_NL/settings/data_integration.php +++ b/lang/nl_NL/settings/data_integration.php @@ -28,7 +28,7 @@ 'influxdb_test_success_body' => 'Test gegevens zijn verzonden naar de InfluxDB, controleer of de gegevens zijn ontvangen.', // Bulk write notifications - 'influxdb_bulk_write_failed' => 'Kan schrijven naar Influxdb niet maken.', + 'influxdb_bulk_write_failed' => 'Bulk schrijven naar Influxdb mislukt.', 'influxdb_bulk_write_failed_body' => 'Bekijk de logs voor meer details.', 'influxdb_bulk_write_success' => 'Alle resultaten naar InfluxDB sturen afgerond.', 'influxdb_bulk_write_success_body' => 'Gegevens zijn verzonden naar InfluxDB, controleer of de gegevens zijn ontvangen.', diff --git a/lang/nl_NL/settings/notifications.php b/lang/nl_NL/settings/notifications.php index 9e1942078..7a37c850a 100644 --- a/lang/nl_NL/settings/notifications.php +++ b/lang/nl_NL/settings/notifications.php @@ -14,11 +14,25 @@ 'recipients' => 'Ontvangers', 'test_mail_channel' => 'Test e-mailkanaal', + // Apprise notifications + 'apprise' => 'Apprise', + 'enable_apprise_notifications' => 'Inschakelen Apprise meldingen', + 'apprise_server' => 'Apprise Server', + 'apprise_server_url' => 'Appprise Server-URL', + 'apprise_server_url_helper' => 'De URL van uw Apprise Server. De URL moet eindigen op /notify', + 'apprise_verify_ssl' => 'Controleer SSL', + 'apprise_channels' => 'Notificatie kanalen', + 'apprise_channel_url' => 'Service URL', + 'apprise_hint_description' => 'Met Apprise kan je meldingen verzenden naar meer dan 90 diensten. Je moet een Apprise server hebben draaien en onderstaande service URL\'s configureren.', + 'apprise_channel_url_helper' => 'Gebruik Apprise URL formaat. Bijvoorbeeld discord://WebhookID/Token, slack://TokenA/TokenB/TokenC', + 'test_apprise_channel' => 'Test Apprise', + 'apprise_channel_url_validation_error' => 'Ongeldige Apprise URL. De URL moet gebruik maken van Apprise formaat (bijv. discord://, slack://), niet http:// of https://. Zie de Apprise documentatie voor meer informatie', + // Webhook 'webhook' => 'Webhook', 'webhooks' => 'Webhooks', 'test_webhook_channel' => 'Test webhook kanaal', - 'webhook_hint_description' => 'Dit zijn generieke webhooks. Raadpleeg de documentatie voor voorbeelden van payloads en implementatiedetails.', + 'webhook_hint_description' => 'Dit zijn algemene webhooks. Voor payload voorbeelden en implementatiegegevens, bekijk de documentatie. Voor diensten zoals Discord, Ntfy etc. gebruik Apprise.', // Common notification messages 'notify_on_every_speedtest_run' => 'Notificatie bij elke geplande snelheidstest', diff --git a/lang/pt_BR/auth.php b/lang/pt_BR/auth.php index 16ae2cdb5..13625436a 100644 --- a/lang/pt_BR/auth.php +++ b/lang/pt_BR/auth.php @@ -13,6 +13,7 @@ | */ + 'sign_in' => 'Entrar', 'failed' => 'Credenciais não correspondem aos nossos registros.', 'password' => 'A senha fornecida está incorreta.', 'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.', diff --git a/lang/pt_BR/general.php b/lang/pt_BR/general.php index 57ee664d6..7a8b67af2 100644 --- a/lang/pt_BR/general.php +++ b/lang/pt_BR/general.php @@ -1,6 +1,11 @@ 'Versão atual', + 'latest_version' => 'Versão mais recente', + 'github' => 'GitHub', + 'repository' => 'Repositório', + // Common actions 'save' => 'Salvar', 'cancel' => 'Cancelar', @@ -32,6 +37,10 @@ 'created_at' => 'Criado em', 'updated_at' => 'Atualizado em', 'url' => 'URL', + 'server' => 'Servidor', + 'servers' => 'Servidores', + 'stats' => 'Estatísticas', + 'statistics' => 'Estatísticas', // Navigation 'dashboard' => 'Painel', @@ -42,6 +51,7 @@ 'view_documentation' => 'Ver documentação', 'links' => 'Links', 'donate' => 'Doar', + 'donations' => 'Doações', // Roles 'admin' => 'Admin', @@ -54,12 +64,15 @@ 'last_month' => 'Mês anterior', // Metrics + 'metrics' => 'Métricas', 'average' => 'Média', 'high' => 'Alta', 'low' => 'Baixa', 'faster' => 'mais rápido', 'slower' => 'lento', 'healthy' => 'Saudável', + 'not_measured' => 'Não medido', + 'unhealthy' => 'Não saudável', // Units 'ms' => 'ms', diff --git a/lang/pt_BR/results.php b/lang/pt_BR/results.php index bc725b402..5d3c62055 100644 --- a/lang/pt_BR/results.php +++ b/lang/pt_BR/results.php @@ -55,9 +55,6 @@ // Actions 'update_comments' => 'Atualizar comentários', - 'truncate_results' => 'Truncar resultados', - 'truncate_results_description' => 'Tem certeza que deseja truncar todos os resultados? Esta ação é irreversível.', - 'truncate_results_success' => 'Tabela de resultados truncada!', 'view_on_speedtest_net' => 'Ver em Speedtest.net', // Notifications @@ -72,7 +69,6 @@ // Run Speedtest Action 'speedtest' => 'Teste de velocidade', - 'public_dashboard' => 'Painel público', 'select_server' => 'Selecionar servidor', 'select_server_helper' => 'Deixe em branco para executar o acelerador sem especificar um servidor. Os servidores bloqueados serão ignorados.', 'manual_servers' => 'Servidores manuais', diff --git a/lang/pt_BR/settings/data_integration.php b/lang/pt_BR/settings/data_integration.php index 2b5dd5ae2..02cc2a6fd 100644 --- a/lang/pt_BR/settings/data_integration.php +++ b/lang/pt_BR/settings/data_integration.php @@ -28,7 +28,7 @@ 'influxdb_test_success_body' => 'Dados de teste enviados para InfluxDB, verifique se os dados foram recebidos.', // Bulk write notifications - 'influxdb_bulk_write_failed' => 'Falha ao escrever no Influxdb.', + 'influxdb_bulk_write_failed' => 'Falha ao escrever em massa no Influxdb.', 'influxdb_bulk_write_failed_body' => 'Confira os logs para mais detalhes.', 'influxdb_bulk_write_success' => 'Carga massiva de dados concluída para o Influxdb.', 'influxdb_bulk_write_success_body' => 'Os dados foram enviados para InfluxDB, verifique se os dados foram recebidos.', diff --git a/lang/pt_BR/settings/notifications.php b/lang/pt_BR/settings/notifications.php index 6d90ed8f4..827ce15f8 100644 --- a/lang/pt_BR/settings/notifications.php +++ b/lang/pt_BR/settings/notifications.php @@ -14,6 +14,19 @@ 'recipients' => 'Destinatários', 'test_mail_channel' => 'Testar canal de e-mail', + // Apprise notifications + 'apprise' => 'Informar', + 'enable_apprise_notifications' => 'Habilitar notificações Apprise', + 'apprise_server' => 'Servidor Apprise', + 'apprise_server_url' => 'URL do Servidor Apprise', + 'apprise_verify_ssl' => 'Verificar SSL', + 'apprise_channels' => 'Canais Apprise', + 'apprise_channel_url' => 'URL do Canal', + 'apprise_hint_description' => 'Para obter mais informações sobre como configurar o Apprise, veja a documentação.', + 'apprise_channel_url_helper' => 'Forneça o URL do serviço endpoint para notificações.', + 'test_apprise_channel' => 'Testar Apprise', + 'apprise_channel_url_validation_error' => 'O URL do canal Apprise não deve começar com "http" ou "https". Por favor, forneça um esquema válido de URL Apprise.', + // Webhook 'webhook' => 'Webhook', 'webhooks' => 'Webhooks',