rails_error_dashboard 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/rails_error_dashboard/application_controller.rb +92 -11
  3. data/app/controllers/rails_error_dashboard/errors_controller.rb +111 -34
  4. data/app/controllers/rails_error_dashboard/webhooks_controller.rb +3 -0
  5. data/app/helpers/rails_error_dashboard/application_helper.rb +46 -1
  6. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +8 -0
  7. data/app/jobs/rails_error_dashboard/concerns/plain_channel_message.rb +71 -0
  8. data/app/jobs/rails_error_dashboard/notification_burst_summary_job.rb +55 -0
  9. data/app/jobs/rails_error_dashboard/retention_cleanup_job.rb +68 -1
  10. data/app/jobs/rails_error_dashboard/storm_notification_job.rb +8 -44
  11. data/app/models/rails_error_dashboard/error_baseline.rb +12 -9
  12. data/app/models/rails_error_dashboard/error_comment.rb +0 -5
  13. data/app/models/rails_error_dashboard/error_log.rb +9 -3
  14. data/app/models/rails_error_dashboard/error_logs_record.rb +34 -0
  15. data/app/models/rails_error_dashboard/error_occurrence.rb +9 -1
  16. data/app/views/layouts/rails_error_dashboard.html.erb +11 -3
  17. data/app/views/rails_error_dashboard/errors/_discussion.html.erb +18 -11
  18. data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +22 -8
  19. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +15 -6
  20. data/app/views/rails_error_dashboard/errors/analytics.html.erb +8 -8
  21. data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +1 -1
  22. data/app/views/rails_error_dashboard/errors/index.html.erb +6 -1
  23. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +7 -7
  24. data/app/views/rails_error_dashboard/errors/releases.html.erb +2 -2
  25. data/app/views/rails_error_dashboard/errors/settings.html.erb +2 -0
  26. data/config/locales/de.yml +28 -0
  27. data/config/locales/en.yml +35 -0
  28. data/config/locales/es.yml +28 -0
  29. data/config/locales/fr.yml +28 -0
  30. data/config/locales/it.yml +28 -0
  31. data/config/locales/ja.yml +28 -0
  32. data/config/locales/pl.yml +28 -0
  33. data/config/locales/pt-BR.yml +28 -0
  34. data/config/locales/ru.yml +28 -0
  35. data/config/locales/uk.yml +28 -0
  36. data/config/locales/zh-CN.yml +28 -0
  37. data/db/migrate/20260917000001_add_last_notified_at_to_error_logs.rb +40 -0
  38. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +12 -1
  39. data/lib/rails_error_dashboard/commands/assign_error.rb +12 -2
  40. data/lib/rails_error_dashboard/commands/backfill_environments.rb +2 -0
  41. data/lib/rails_error_dashboard/commands/backfill_resolved_at.rb +42 -0
  42. data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +1 -0
  43. data/lib/rails_error_dashboard/commands/batch_mute_errors.rb +2 -0
  44. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +2 -0
  45. data/lib/rails_error_dashboard/commands/batch_unmute_errors.rb +2 -0
  46. data/lib/rails_error_dashboard/commands/find_or_increment_error.rb +39 -7
  47. data/lib/rails_error_dashboard/commands/flush_rack_attack_events.rb +3 -1
  48. data/lib/rails_error_dashboard/commands/flush_storm_counts.rb +27 -4
  49. data/lib/rails_error_dashboard/commands/flush_swallowed_exceptions.rb +5 -2
  50. data/lib/rails_error_dashboard/commands/link_existing_issue.rb +1 -0
  51. data/lib/rails_error_dashboard/commands/log_error.rb +82 -23
  52. data/lib/rails_error_dashboard/commands/mute_error.rb +1 -0
  53. data/lib/rails_error_dashboard/commands/resolve_error.rb +2 -0
  54. data/lib/rails_error_dashboard/commands/scrub_invalid_encoding.rb +104 -0
  55. data/lib/rails_error_dashboard/commands/snooze_error.rb +34 -10
  56. data/lib/rails_error_dashboard/commands/unmute_error.rb +1 -0
  57. data/lib/rails_error_dashboard/commands/update_error_priority.rb +23 -2
  58. data/lib/rails_error_dashboard/commands/update_error_status.rb +33 -6
  59. data/lib/rails_error_dashboard/configuration.rb +19 -1
  60. data/lib/rails_error_dashboard/engine.rb +15 -0
  61. data/lib/rails_error_dashboard/queries/analytics_stats.rb +4 -3
  62. data/lib/rails_error_dashboard/queries/baseline_stats.rb +107 -0
  63. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +55 -50
  64. data/lib/rails_error_dashboard/queries/error_correlation.rb +6 -3
  65. data/lib/rails_error_dashboard/queries/errors_list.rb +15 -2
  66. data/lib/rails_error_dashboard/queries/similar_errors.rb +1 -1
  67. data/lib/rails_error_dashboard/services/analytics_cache_manager.rb +43 -18
  68. data/lib/rails_error_dashboard/services/backtrace_processor.rb +3 -1
  69. data/lib/rails_error_dashboard/services/cause_chain_extractor.rb +3 -1
  70. data/lib/rails_error_dashboard/services/codeberg_issue_client.rb +13 -2
  71. data/lib/rails_error_dashboard/services/diagnostic_dump_generator.rb +5 -3
  72. data/lib/rails_error_dashboard/services/encoding_sanitizer.rb +80 -0
  73. data/lib/rails_error_dashboard/services/error_broadcaster.rb +180 -32
  74. data/lib/rails_error_dashboard/services/error_hash_generator.rb +9 -3
  75. data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +13 -0
  76. data/lib/rails_error_dashboard/services/exception_filter.rb +55 -0
  77. data/lib/rails_error_dashboard/services/git_head_reader.rb +102 -0
  78. data/lib/rails_error_dashboard/services/notification_throttler.rb +172 -28
  79. data/lib/rails_error_dashboard/services/sensitive_data_filter.rb +47 -1
  80. data/lib/rails_error_dashboard/services/storm_protection/circuit_breaker.rb +59 -3
  81. data/lib/rails_error_dashboard/services/storm_protection/fingerprint_buckets.rb +25 -2
  82. data/lib/rails_error_dashboard/services/storm_protection/gate.rb +32 -5
  83. data/lib/rails_error_dashboard/services/swallowed_exception_tracker.rb +99 -23
  84. data/lib/rails_error_dashboard/services/url_safety.rb +40 -0
  85. data/lib/rails_error_dashboard/subscribers/issue_tracker_subscriber.rb +11 -2
  86. data/lib/rails_error_dashboard/value_objects/error_context.rb +3 -1
  87. data/lib/rails_error_dashboard/version.rb +1 -1
  88. data/lib/rails_error_dashboard.rb +31 -0
  89. data/lib/tasks/error_dashboard.rake +54 -4
  90. metadata +10 -2
@@ -49,7 +49,7 @@
49
49
  <div class="card text-center">
50
50
  <div class="card-body">
51
51
  <%
52
- latest = @dumps.first
52
+ latest = @latest_dump
53
53
  latest_data = begin; JSON.parse(latest.dump_data); rescue; {}; end if latest
54
54
  thread_count = latest_data&.dig("system_health", "thread_count")
55
55
  %>
@@ -2,7 +2,12 @@
2
2
 
3
3
  <!-- Subscribe to Turbo Stream updates (only if Turbo Streams + ActionCable pubsub are available) -->
4
4
  <% if defined?(Turbo::StreamsHelper) && defined?(ActionCable) && respond_to?(:turbo_stream_from) && RailsErrorDashboard::Services::ErrorBroadcaster.available? %>
5
- <%= turbo_stream_from "error_list" %>
5
+ <%# Names come from ErrorBroadcaster (one source for both ends): this page's
6
+ application or the global streams, without the new-row stream when a
7
+ filter, a sort or a later page means a new row does not belong on top. %>
8
+ <% (@live_streams || []).each do |stream| %>
9
+ <%= turbo_stream_from stream %>
10
+ <% end %>
6
11
  <% end %>
7
12
 
8
13
  <%
@@ -313,10 +313,10 @@
313
313
  new Chart(errorRateCtx, {
314
314
  type: 'bar',
315
315
  data: {
316
- labels: <%= raw @error_rate_by_platform.keys.map { |k| k.to_s.capitalize }.to_json %>,
316
+ labels: <%= js_safe_json(@error_rate_by_platform.keys.map { |k| k.to_s.capitalize }) %>,
317
317
  datasets: [{
318
318
  label: '<%= red_js_t("red.ui_js.charts.series_total_errors") %>',
319
- data: <%= raw @error_rate_by_platform.values.to_json %>,
319
+ data: <%= js_safe_json(@error_rate_by_platform.values) %>,
320
320
  backgroundColor: 'rgba(37, 99, 235, 0.5)', // Blue with transparency
321
321
  borderColor: '#2563EB', // Blue
322
322
  borderWidth: 1
@@ -338,14 +338,14 @@
338
338
  // Daily Trend Chart
339
339
  const dailyTrendCtx = document.getElementById('dailyTrendChart');
340
340
  if (dailyTrendCtx) {
341
- const datasets = <%= raw @daily_trends.map { |platform, data|
341
+ const datasets = <%= js_safe_json(@daily_trends.map { |platform, data|
342
342
  {
343
343
  label: platform.to_s.capitalize,
344
344
  data: data.values,
345
345
  platform: platform.to_s.downcase,
346
346
  tension: 0.4
347
347
  }
348
- }.to_json %>;
348
+ }) %>;
349
349
 
350
350
  // Apply platform-specific colors
351
351
  datasets.forEach(ds => {
@@ -358,7 +358,7 @@
358
358
  new Chart(dailyTrendCtx, {
359
359
  type: 'line',
360
360
  data: {
361
- labels: <%= raw @daily_trends.values.first&.keys&.map { |d| red_chart_date(d) }&.to_json || [].to_json %>,
361
+ labels: <%= js_safe_json(@daily_trends.values.first&.keys&.map { |d| red_chart_date(d) } || []) %>,
362
362
  datasets: datasets
363
363
  },
364
364
  options: {
@@ -377,8 +377,8 @@
377
377
  // Resolution Time Chart
378
378
  const resolutionTimeCtx = document.getElementById('resolutionTimeChart');
379
379
  if (resolutionTimeCtx) {
380
- const platforms = <%= raw @resolution_times.keys.map { |k| k.to_s.capitalize }.to_json %>;
381
- const times = <%= raw @resolution_times.values.map { |v| v || 0 }.to_json %>;
380
+ const platforms = <%= js_safe_json(@resolution_times.keys.map { |k| k.to_s.capitalize }) %>;
381
+ const times = <%= js_safe_json(@resolution_times.values.map { |v| v || 0 }) %>;
382
382
 
383
383
  new Chart(resolutionTimeCtx, {
384
384
  type: 'bar',
@@ -43,7 +43,7 @@
43
43
  </div>
44
44
  <% else %>
45
45
  <%
46
- current_release = @releases.find { |r| r[:current] }
46
+ current_release = @current_release
47
47
  %>
48
48
 
49
49
  <!-- Summary Cards -->
@@ -76,7 +76,7 @@
76
76
  <div class="card text-center">
77
77
  <div class="card-body">
78
78
  <%
79
- problematic_count = @releases.count { |r| r[:problematic] }
79
+ problematic_count = @problematic_release_count
80
80
  %>
81
81
  <div class="display-6 <%= problematic_count > 0 ? 'text-danger' : 'text-success' %>"><%= problematic_count %></div>
82
82
  <small class="text-muted"><%= red_t("red.analytics.releases.summary.problematic") %></small>
@@ -47,6 +47,8 @@
47
47
  color: "info",
48
48
  settings: {
49
49
  notification_environments: { type: :array },
50
+ notification_burst_limit: { type: :integer },
51
+ notification_burst_window_seconds: { type: :integer, unit: :seconds },
50
52
  enable_slack_notifications: { type: :boolean },
51
53
  slack_webhook_url: { type: :url, show_if: :enable_slack_notifications },
52
54
  enable_email_notifications: { type: :boolean },
@@ -420,6 +420,7 @@ de:
420
420
  issue_section:
421
421
  title: Issue-Tracker
422
422
  view_issue: Issue ansehen
423
+ unsafe_link: "Dieser Issue-Link ist keine http(s)-URL, daher wird er als Text angezeigt und kann nicht geöffnet werden."
423
424
  linked: Verknüpft
424
425
  issue_reference: "%{provider} #%{number}"
425
426
  states:
@@ -972,6 +973,16 @@ de:
972
973
  types:
973
974
  one: "%{count} Typ"
974
975
  other: "%{count} Typen"
976
+ errors_page:
977
+ csrf:
978
+ title: "Ihr Sitzungstoken ist abgelaufen"
979
+ message: "Gehen Sie zurück, laden Sie die Seite neu und versuchen Sie es erneut. Es wurde nichts geändert."
980
+ bad_request:
981
+ title: "Diese Anfrage konnte nicht verarbeitet werden"
982
+ message: "Ein erforderlicher Wert fehlte oder war fehlerhaft. Gehen Sie zurück und versuchen Sie es erneut."
983
+ not_acceptable:
984
+ title: "Dieses Format ist nicht verfügbar"
985
+ message: "Das Dashboard kann das angeforderte Format nicht erzeugen."
975
986
  settings:
976
987
  title: Einstellungen
977
988
  version: v%{version}
@@ -1086,6 +1097,8 @@ de:
1086
1097
  gesetzt)
1087
1098
  environment: Umgebung, der Fehler zugeordnet werden (Rails.env, falls nicht
1088
1099
  gesetzt)
1100
+ notification_burst_limit: "Benachrichtigungen über neue Fehler pro Zeitfenster und Prozess (0 = keine Obergrenze)"
1101
+ notification_burst_window_seconds: "Länge des Zeitfensters für Benachrichtigungen über neue Fehler"
1089
1102
  notification_environments: Nur für diese Umgebungen benachrichtigen (alle,
1090
1103
  falls nicht gesetzt)
1091
1104
  database: Aktive Datenbank für Fehlerprotokolle
@@ -1193,6 +1206,16 @@ de:
1193
1206
  linked: Issue erfolgreich verknüpft
1194
1207
  create_failed: 'Issue konnte nicht erstellt werden: %{reason}'
1195
1208
  link_failed: 'Issue konnte nicht verknüpft werden: %{reason}'
1209
+ status:
1210
+ updated: "Status geändert zu %{status}"
1211
+ invalid_transition: "Der Status kann nicht von %{from} zu %{to} geändert werden"
1212
+ unknown: "Diesen Status gibt es nicht"
1213
+ snooze:
1214
+ invalid_hours: "Die Zurückstelldauer muss eine ganze Zahl von Stunden zwischen 1 und %{max} sein"
1215
+ priority:
1216
+ invalid: "Diese Prioritätsstufe gibt es nicht"
1217
+ assign:
1218
+ blank: "Geben Sie einen Namen ein, dem dieser Fehler zugewiesen werden soll"
1196
1219
  not_enabled: "%{feature} ist nicht aktiviert. Aktivieren Sie es in %{file}"
1197
1220
  not_enabled_plural: "%{feature} sind nicht aktiviert. Aktivieren Sie sie in
1198
1221
  %{file}"
@@ -1238,6 +1261,7 @@ de:
1238
1261
  not_configured: Issue-Tracking ist nicht konfiguriert
1239
1262
  already_linked: 'Der Fehler hat bereits ein verknüpftes Issue: %{url}'
1240
1263
  url_required: Die Issue-URL ist erforderlich
1264
+ url_invalid: Die Issue-URL muss mit http:// oder https:// beginnen
1241
1265
  error_not_found: 'Fehler nicht gefunden: %{id}'
1242
1266
  batch_failed:
1243
1267
  mute:
@@ -1362,6 +1386,10 @@ de:
1362
1386
  one: "%{value} Fehler"
1363
1387
  other: "%{value} Fehler"
1364
1388
  view_in_dashboard: Im Dashboard ansehen
1389
+ burst:
1390
+ suppressed: "In %{application} wurden innerhalb von %{window} Sekunden mehr als %{limit} neue Fehler gemeldet."
1391
+ still_recorded: "Benachrichtigungen über weitere neue Fehler sind bis zum Ende dieses Zeitfensters pausiert; jeder Fehler wird weiterhin erfasst."
1392
+ dashboard: "Dashboard: %{url}"
1365
1393
  storm:
1366
1394
  detected: Fehlersturm in %{application} um %{started_at} erkannt.
1367
1395
  mode:
@@ -603,6 +603,7 @@ en:
603
603
  issue_section:
604
604
  title: "Issue Tracker"
605
605
  view_issue: "View Issue"
606
+ unsafe_link: "This issue link is not an http(s) URL, so it is shown as text and cannot be opened."
606
607
  # Shown instead of a provider name when the provider is unknown.
607
608
  linked: "Linked"
608
609
  # %{provider} is a display name, %{number} the issue number.
@@ -1376,6 +1377,16 @@ en:
1376
1377
  one: "%{count} type"
1377
1378
  other: "%{count} types"
1378
1379
 
1380
+ errors_page:
1381
+ csrf:
1382
+ title: "Your session token has expired"
1383
+ message: "Go back, reload the page and try again. Nothing was changed."
1384
+ bad_request:
1385
+ title: "This request could not be understood"
1386
+ message: "A required value was missing or malformed. Go back and try again."
1387
+ not_acceptable:
1388
+ title: "This format is not available"
1389
+ message: "The dashboard cannot produce the format this request asked for."
1379
1390
  settings:
1380
1391
  title: "Settings"
1381
1392
  # %{version} is the gem version. The "v" prefix is a sigil, not a word.
@@ -1525,6 +1536,8 @@ en:
1525
1536
  sampling_rate: "Percentage of errors captured"
1526
1537
  application_name: "Name of this application (auto-detected if not set)"
1527
1538
  environment: "Environment errors are attributed to (Rails.env if not set)"
1539
+ notification_burst_limit: "New-error notifications per window, per process (0 = no cap)"
1540
+ notification_burst_window_seconds: "Length of the new-error notification window"
1528
1541
  notification_environments: "Only notify for these environments (all if not set)"
1529
1542
  database: "Active database for error logs"
1530
1543
  use_separate_database: "Use dedicated DB for error logs"
@@ -1633,6 +1646,19 @@ en:
1633
1646
  create_failed: "Failed to create issue: %{reason}"
1634
1647
  link_failed: "Failed to link issue: %{reason}"
1635
1648
 
1649
+ # Result of the status workflow form. %{status}, %{from} and %{to} are the
1650
+ # translated status labels from red.errors.row.status.
1651
+ status:
1652
+ updated: "Status changed to %{status}"
1653
+ invalid_transition: "Cannot change status from %{from} to %{to}"
1654
+ unknown: "That status does not exist"
1655
+ snooze:
1656
+ invalid_hours: "Snooze time must be a whole number of hours between 1 and %{max}"
1657
+ priority:
1658
+ invalid: "That priority level does not exist"
1659
+ assign:
1660
+ blank: "Enter a name to assign this error to"
1661
+
1636
1662
  # The "X is not enabled" notice was written out eleven times with only
1637
1663
  # the feature name changing. Two keys rather than one because English
1638
1664
  # agrees the verb and pronoun with the feature name: "Breadcrumbs are
@@ -1706,6 +1732,7 @@ en:
1706
1732
  # %{url} is the existing issue's URL.
1707
1733
  already_linked: "Error already has a linked issue: %{url}"
1708
1734
  url_required: "Issue URL is required"
1735
+ url_invalid: "Issue URL must start with http:// or https://"
1709
1736
  # %{id} is the requested error's id.
1710
1737
  error_not_found: "Error not found: %{id}"
1711
1738
  # %{count} errors could not be updated in a batch operation.
@@ -1898,6 +1925,14 @@ en:
1898
1925
  other: "%{value} errors"
1899
1926
  view_in_dashboard: "View in Dashboard"
1900
1927
 
1928
+ burst:
1929
+ # Sent ONCE when more than %{limit} new errors arrive inside %{window}
1930
+ # seconds (config.notification_burst_limit). It says that suppression has
1931
+ # started, not how many were suppressed: that is not known yet.
1932
+ suppressed: "More than %{limit} new errors were reported in %{application} within %{window} seconds."
1933
+ still_recorded: "Notifications for further new errors are paused until that window ends; every error is still recorded."
1934
+ dashboard: "Dashboard: %{url}"
1935
+
1901
1936
  storm:
1902
1937
  # The single "error storm in progress" message. %{application} is the
1903
1938
  # host app's name and %{started_at} an ISO8601 timestamp.
@@ -436,6 +436,7 @@ es:
436
436
  issue_section:
437
437
  title: Gestor de issues
438
438
  view_issue: Ver la issue
439
+ unsafe_link: "Este enlace a la issue no es una URL http(s), por lo que se muestra como texto y no se puede abrir."
439
440
  linked: Vinculada
440
441
  issue_reference: "%{provider} n.º %{number}"
441
442
  states:
@@ -1005,6 +1006,16 @@ es:
1005
1006
  one: "%{count} tipo"
1006
1007
  other: "%{count} tipos"
1007
1008
  many: "%{count} tipos"
1009
+ errors_page:
1010
+ csrf:
1011
+ title: "El token de tu sesión ha caducado"
1012
+ message: "Vuelve atrás, recarga la página e inténtalo de nuevo. No se ha modificado nada."
1013
+ bad_request:
1014
+ title: "No se ha podido interpretar esta solicitud"
1015
+ message: "Faltaba un valor obligatorio o tenía un formato incorrecto. Vuelve atrás e inténtalo de nuevo."
1016
+ not_acceptable:
1017
+ title: "Este formato no está disponible"
1018
+ message: "El panel no puede generar el formato que pedía esta solicitud."
1008
1019
  settings:
1009
1020
  title: Configuración
1010
1021
  version: v%{version}
@@ -1127,6 +1138,8 @@ es:
1127
1138
  application_name: Nombre de esta aplicación (se detecta automáticamente si
1128
1139
  no se define)
1129
1140
  environment: Entorno al que se atribuyen los errores (Rails.env si no se define)
1141
+ notification_burst_limit: "Notificaciones de errores nuevos por intervalo y por proceso (0 = sin límite)"
1142
+ notification_burst_window_seconds: "Duración del intervalo de notificaciones de errores nuevos"
1130
1143
  notification_environments: Notificar solo para estos entornos (todos si no
1131
1144
  se define)
1132
1145
  database: Base de datos activa para los registros de errores
@@ -1241,6 +1254,16 @@ es:
1241
1254
  linked: Issue vinculada correctamente
1242
1255
  create_failed: 'No se pudo crear la issue: %{reason}'
1243
1256
  link_failed: 'No se pudo vincular la issue: %{reason}'
1257
+ status:
1258
+ updated: "Estado cambiado a %{status}"
1259
+ invalid_transition: "No se puede cambiar el estado de %{from} a %{to}"
1260
+ unknown: "Ese estado no existe"
1261
+ snooze:
1262
+ invalid_hours: "El tiempo de posposición debe ser un número entero de horas entre 1 y %{max}"
1263
+ priority:
1264
+ invalid: "Ese nivel de prioridad no existe"
1265
+ assign:
1266
+ blank: "Introduce un nombre para asignar este error"
1244
1267
  not_enabled: "%{feature} no está activado. Actívelo en %{file}"
1245
1268
  not_enabled_plural: "%{feature} no están activados. Actívelos en %{file}"
1246
1269
  not_enabled_options: "%{feature} no está activado. Active %{options} en %{file}"
@@ -1284,6 +1307,7 @@ es:
1284
1307
  not_configured: El seguimiento de issues no está configurado
1285
1308
  already_linked: 'El error ya tiene una issue vinculada: %{url}'
1286
1309
  url_required: La URL de la issue es obligatoria
1310
+ url_invalid: La URL de la issue debe empezar por http:// o https://
1287
1311
  error_not_found: 'Error no encontrado: %{id}'
1288
1312
  batch_failed:
1289
1313
  mute:
@@ -1415,6 +1439,10 @@ es:
1415
1439
  other: "%{value} errores"
1416
1440
  many: "%{value} errores"
1417
1441
  view_in_dashboard: Ver en el panel
1442
+ burst:
1443
+ suppressed: "Se han registrado más de %{limit} errores nuevos en %{application} en %{window} segundos."
1444
+ still_recorded: "Las notificaciones de nuevos errores adicionales quedan en pausa hasta que termine ese intervalo; todos los errores se siguen registrando."
1445
+ dashboard: "Panel: %{url}"
1418
1446
  storm:
1419
1447
  detected: Se detectó una tormenta de errores en %{application} a las %{started_at}.
1420
1448
  mode:
@@ -438,6 +438,7 @@ fr:
438
438
  issue_section:
439
439
  title: Gestionnaire d'issues
440
440
  view_issue: Voir l'issue
441
+ unsafe_link: "Ce lien vers l'issue n'est pas une URL http(s) : il est affiché sous forme de texte et ne peut pas être ouvert."
441
442
  linked: Liée
442
443
  issue_reference: "%{provider} n°%{number}"
443
444
  states:
@@ -1006,6 +1007,16 @@ fr:
1006
1007
  one: "%{count} type"
1007
1008
  other: "%{count} types"
1008
1009
  many: "%{count} types"
1010
+ errors_page:
1011
+ csrf:
1012
+ title: "Votre jeton de session a expiré"
1013
+ message: "Revenez en arrière, rechargez la page et réessayez. Rien n'a été modifié."
1014
+ bad_request:
1015
+ title: "Cette requête n'a pas pu être interprétée"
1016
+ message: "Une valeur requise était absente ou mal formée. Revenez en arrière et réessayez."
1017
+ not_acceptable:
1018
+ title: "Ce format n'est pas disponible"
1019
+ message: "Le tableau de bord ne peut pas produire le format demandé par cette requête."
1009
1020
  settings:
1010
1021
  title: Paramètres
1011
1022
  version: v%{version}
@@ -1129,6 +1140,8 @@ fr:
1129
1140
  défini)
1130
1141
  environment: Environnement auquel les erreurs sont attribuées (Rails.env si
1131
1142
  non défini)
1143
+ notification_burst_limit: "Notifications de nouvelles erreurs par intervalle et par processus (0 = sans limite)"
1144
+ notification_burst_window_seconds: "Durée de l'intervalle des notifications de nouvelles erreurs"
1132
1145
  notification_environments: Ne notifier que pour ces environnements (tous si
1133
1146
  non défini)
1134
1147
  database: Base de données active pour les journaux d'erreurs
@@ -1241,6 +1254,16 @@ fr:
1241
1254
  linked: Issue liée avec succès
1242
1255
  create_failed: 'Échec de la création de l''issue : %{reason}'
1243
1256
  link_failed: 'Échec de la liaison de l''issue : %{reason}'
1257
+ status:
1258
+ updated: "Statut changé en %{status}"
1259
+ invalid_transition: "Impossible de passer le statut de %{from} à %{to}"
1260
+ unknown: "Ce statut n'existe pas"
1261
+ snooze:
1262
+ invalid_hours: "La durée de mise en veille doit être un nombre entier d'heures compris entre 1 et %{max}"
1263
+ priority:
1264
+ invalid: "Ce niveau de priorité n'existe pas"
1265
+ assign:
1266
+ blank: "Saisissez un nom auquel assigner cette erreur"
1244
1267
  not_enabled: "%{feature} n'est pas activé. Activez-le dans %{file}"
1245
1268
  not_enabled_plural: "%{feature} ne sont pas activés. Activez-les dans %{file}"
1246
1269
  not_enabled_options: "%{feature} n'est pas activé. Activez %{options} dans %{file}"
@@ -1283,6 +1306,7 @@ fr:
1283
1306
  not_configured: Le suivi des issues n'est pas configuré
1284
1307
  already_linked: 'L''erreur a déjà une issue liée : %{url}'
1285
1308
  url_required: L'URL de l'issue est requise
1309
+ url_invalid: L'URL de l'issue doit commencer par http:// ou https://
1286
1310
  error_not_found: 'Erreur introuvable : %{id}'
1287
1311
  batch_failed:
1288
1312
  mute:
@@ -1415,6 +1439,10 @@ fr:
1415
1439
  other: "%{value} erreurs"
1416
1440
  many: "%{value} erreurs"
1417
1441
  view_in_dashboard: Voir dans le tableau de bord
1442
+ burst:
1443
+ suppressed: "Plus de %{limit} nouvelles erreurs ont été signalées dans %{application} en %{window} secondes."
1444
+ still_recorded: "Les notifications pour les nouvelles erreurs suivantes sont suspendues jusqu'à la fin de cet intervalle ; chaque erreur reste enregistrée."
1445
+ dashboard: "Tableau de bord : %{url}"
1418
1446
  storm:
1419
1447
  detected: Tempête d'erreurs détectée dans %{application} à %{started_at}.
1420
1448
  mode:
@@ -431,6 +431,7 @@ it:
431
431
  issue_section:
432
432
  title: Sistema di segnalazioni
433
433
  view_issue: Vedi la segnalazione
434
+ unsafe_link: "Questo link alla segnalazione non è un URL http(s), quindi viene mostrato come testo e non può essere aperto."
434
435
  linked: Collegata
435
436
  issue_reference: "%{provider} #%{number}"
436
437
  states:
@@ -996,6 +997,16 @@ it:
996
997
  one: "%{count} tipo"
997
998
  other: "%{count} tipi"
998
999
  many: "%{count} tipi"
1000
+ errors_page:
1001
+ csrf:
1002
+ title: "Il token di sessione è scaduto"
1003
+ message: "Torna indietro, ricarica la pagina e riprova. Non è stato modificato nulla."
1004
+ bad_request:
1005
+ title: "Impossibile interpretare questa richiesta"
1006
+ message: "Un valore obbligatorio era assente o non valido. Torna indietro e riprova."
1007
+ not_acceptable:
1008
+ title: "Questo formato non è disponibile"
1009
+ message: "La dashboard non può produrre il formato richiesto."
999
1010
  settings:
1000
1011
  title: Impostazioni
1001
1012
  version: v%{version}
@@ -1119,6 +1130,8 @@ it:
1119
1130
  non impostato)
1120
1131
  environment: Ambiente a cui vengono attribuiti gli errori (Rails.env se non
1121
1132
  impostato)
1133
+ notification_burst_limit: "Notifiche di nuovi errori per intervallo e per processo (0 = nessun limite)"
1134
+ notification_burst_window_seconds: "Durata dell'intervallo delle notifiche di nuovi errori"
1122
1135
  notification_environments: Notifica solo per questi ambienti (tutti se non
1123
1136
  impostato)
1124
1137
  database: Database attivo per i registri degli errori
@@ -1231,6 +1244,16 @@ it:
1231
1244
  linked: Segnalazione collegata correttamente
1232
1245
  create_failed: 'Impossibile creare la segnalazione: %{reason}'
1233
1246
  link_failed: 'Impossibile collegare la segnalazione: %{reason}'
1247
+ status:
1248
+ updated: "Stato modificato in %{status}"
1249
+ invalid_transition: "Impossibile cambiare lo stato da %{from} a %{to}"
1250
+ unknown: "Questo stato non esiste"
1251
+ snooze:
1252
+ invalid_hours: "La durata del rinvio deve essere un numero intero di ore compreso tra 1 e %{max}"
1253
+ priority:
1254
+ invalid: "Questo livello di priorità non esiste"
1255
+ assign:
1256
+ blank: "Inserisci un nome a cui assegnare questo errore"
1234
1257
  not_enabled: "%{feature} non è abilitato. Abilitalo in %{file}"
1235
1258
  not_enabled_plural: "%{feature} non sono abilitati. Abilitali in %{file}"
1236
1259
  not_enabled_options: "%{feature} non è abilitato. Abilita %{options} in %{file}"
@@ -1273,6 +1296,7 @@ it:
1273
1296
  not_configured: Il tracciamento delle segnalazioni non è configurato
1274
1297
  already_linked: 'L''errore ha già una segnalazione collegata: %{url}'
1275
1298
  url_required: L'URL della segnalazione è obbligatorio
1299
+ url_invalid: L'URL della segnalazione deve iniziare con http:// o https://
1276
1300
  error_not_found: 'Errore non trovato: %{id}'
1277
1301
  batch_failed:
1278
1302
  mute:
@@ -1404,6 +1428,10 @@ it:
1404
1428
  other: "%{value} errori"
1405
1429
  many: "%{value} errori"
1406
1430
  view_in_dashboard: Vedi nel pannello
1431
+ burst:
1432
+ suppressed: "In %{application} sono stati segnalati più di %{limit} nuovi errori in %{window} secondi."
1433
+ still_recorded: "Le notifiche per ulteriori nuovi errori sono sospese fino al termine di questo intervallo; ogni errore viene comunque registrato."
1434
+ dashboard: "Pannello: %{url}"
1407
1435
  storm:
1408
1436
  detected: Rilevata tempesta di errori in %{application} alle %{started_at}.
1409
1437
  mode:
@@ -382,6 +382,7 @@ ja:
382
382
  issue_section:
383
383
  title: イシュートラッカー
384
384
  view_issue: イシューを表示
385
+ unsafe_link: "このイシューのリンクは http(s) の URL ではないため、テキストとして表示され、開くことはできません。"
385
386
  linked: 連携済み
386
387
  issue_reference: "%{provider} #%{number}"
387
388
  states:
@@ -874,6 +875,16 @@ ja:
874
875
  user_types_html: ユーザー %{user} · %{types}
875
876
  types:
876
877
  other: "%{count}種類"
878
+ errors_page:
879
+ csrf:
880
+ title: "セッショントークンの有効期限が切れました"
881
+ message: "前のページに戻って再読み込みし、もう一度お試しください。変更は行われていません。"
882
+ bad_request:
883
+ title: "このリクエストを処理できませんでした"
884
+ message: "必須の値が不足しているか、形式が正しくありません。前のページに戻って、もう一度お試しください。"
885
+ not_acceptable:
886
+ title: "この形式は利用できません"
887
+ message: "リクエストされた形式をダッシュボードで生成することはできません。"
877
888
  settings:
878
889
  title: 設定
879
890
  version: v%{version}
@@ -968,6 +979,8 @@ ja:
968
979
  sampling_rate: エラーを記録する割合
969
980
  application_name: このアプリケーションの名前 (未設定の場合は自動検出)
970
981
  environment: エラーを紐付ける環境(未設定の場合は Rails.env)
982
+ notification_burst_limit: "時間枠ごと・プロセスごとの新規エラー通知数(0 = 上限なし)"
983
+ notification_burst_window_seconds: "新規エラー通知の時間枠の長さ"
971
984
  notification_environments: 通知する環境を限定(未設定の場合はすべて)
972
985
  database: エラーログで使用中のデータベース
973
986
  use_separate_database: エラーログ専用の DB を使用します
@@ -1055,6 +1068,16 @@ ja:
1055
1068
  linked: イシューを連携しました
1056
1069
  create_failed: 'イシューの作成に失敗しました: %{reason}'
1057
1070
  link_failed: 'イシューの連携に失敗しました: %{reason}'
1071
+ status:
1072
+ updated: "ステータスを %{status} に変更しました"
1073
+ invalid_transition: "ステータスを %{from} から %{to} に変更することはできません"
1074
+ unknown: "そのステータスは存在しません"
1075
+ snooze:
1076
+ invalid_hours: "スヌーズ時間は 1 から %{max} までの整数(時間単位)で指定してください"
1077
+ priority:
1078
+ invalid: "その優先度は存在しません"
1079
+ assign:
1080
+ blank: "このエラーの担当者の名前を入力してください"
1058
1081
  not_enabled: "%{feature}は有効になっていません。%{file}で有効にしてください"
1059
1082
  not_enabled_plural: "%{feature}は有効になっていません。%{file}で有効にしてください"
1060
1083
  not_enabled_options: "%{feature}は有効になっていません。%{file}で%{options}を有効にしてください"
@@ -1094,6 +1117,7 @@ ja:
1094
1117
  not_configured: イシュートラッキングが設定されていません
1095
1118
  already_linked: 'このエラーにはすでにイシューが連携されています: %{url}'
1096
1119
  url_required: イシューの URL を入力してください
1120
+ url_invalid: イシューの URL は http:// または https:// で始まる必要があります
1097
1121
  error_not_found: 'エラーが見つかりません: %{id}'
1098
1122
  batch_failed:
1099
1123
  mute:
@@ -1211,6 +1235,10 @@ ja:
1211
1235
  threshold_errors:
1212
1236
  other: "%{value}件のエラー"
1213
1237
  view_in_dashboard: ダッシュボードで表示
1238
+ burst:
1239
+ suppressed: "%{application} で %{window} 秒以内に %{limit} 件を超える新しいエラーが報告されました。"
1240
+ still_recorded: "この時間枠が終わるまで、以降の新しいエラーの通知は一時停止されます。エラーはすべて引き続き記録されます。"
1241
+ dashboard: "ダッシュボード: %{url}"
1214
1242
  storm:
1215
1243
  detected: "%{started_at}に%{application}でエラーストームを検知しました。"
1216
1244
  mode:
@@ -438,6 +438,7 @@ pl:
438
438
  issue_section:
439
439
  title: System zgłoszeń
440
440
  view_issue: Zobacz zgłoszenie
441
+ unsafe_link: "Ten odnośnik do zgłoszenia nie jest adresem URL http(s), dlatego jest wyświetlany jako tekst i nie można go otworzyć."
441
442
  linked: Powiązane
442
443
  issue_reference: "%{provider} #%{number}"
443
444
  states:
@@ -1016,6 +1017,16 @@ pl:
1016
1017
  other: "%{count} typu"
1017
1018
  few: "%{count} typy"
1018
1019
  many: "%{count} typów"
1020
+ errors_page:
1021
+ csrf:
1022
+ title: "Token sesji wygasł"
1023
+ message: "Wróć, odśwież stronę i spróbuj ponownie. Nic nie zostało zmienione."
1024
+ bad_request:
1025
+ title: "Nie udało się zrozumieć tego żądania"
1026
+ message: "Brakowało wymaganej wartości lub była ona nieprawidłowa. Wróć i spróbuj ponownie."
1027
+ not_acceptable:
1028
+ title: "Ten format jest niedostępny"
1029
+ message: "Panel nie może wygenerować formatu, o który poproszono w tym żądaniu."
1019
1030
  settings:
1020
1031
  title: Ustawienia
1021
1032
  version: v%{version}
@@ -1149,6 +1160,8 @@ pl:
1149
1160
  ustawiono)
1150
1161
  environment: Środowisko, do którego przypisywane są błędy (Rails.env, jeśli
1151
1162
  nie ustawiono)
1163
+ notification_burst_limit: "Powiadomienia o nowych błędach na okno czasowe i proces (0 = bez limitu)"
1164
+ notification_burst_window_seconds: "Długość okna czasowego powiadomień o nowych błędach"
1152
1165
  notification_environments: Powiadamiaj tylko dla tych środowisk (wszystkie,
1153
1166
  jeśli nie ustawiono)
1154
1167
  database: Aktywna baza danych dla dzienników błędów
@@ -1262,6 +1275,16 @@ pl:
1262
1275
  linked: Zgłoszenie zostało powiązane
1263
1276
  create_failed: 'Nie udało się utworzyć zgłoszenia: %{reason}'
1264
1277
  link_failed: 'Nie udało się powiązać zgłoszenia: %{reason}'
1278
+ status:
1279
+ updated: "Status zmieniono na %{status}"
1280
+ invalid_transition: "Nie można zmienić statusu z %{from} na %{to}"
1281
+ unknown: "Taki status nie istnieje"
1282
+ snooze:
1283
+ invalid_hours: "Czas odłożenia musi być całkowitą liczbą godzin od 1 do %{max}"
1284
+ priority:
1285
+ invalid: "Taki poziom priorytetu nie istnieje"
1286
+ assign:
1287
+ blank: "Podaj nazwę osoby, do której chcesz przypisać ten błąd"
1265
1288
  not_enabled: "%{feature} nie jest włączone. Włącz w %{file}"
1266
1289
  not_enabled_plural: "%{feature} nie są włączone. Włącz je w %{file}"
1267
1290
  not_enabled_options: "%{feature} nie jest włączone. Włącz %{options} w %{file}"
@@ -1303,6 +1326,7 @@ pl:
1303
1326
  not_configured: Śledzenie zgłoszeń nie jest skonfigurowane
1304
1327
  already_linked: 'Błąd ma już powiązane zgłoszenie: %{url}'
1305
1328
  url_required: Adres URL zgłoszenia jest wymagany
1329
+ url_invalid: Adres URL zgłoszenia musi zaczynać się od http:// lub https://
1306
1330
  error_not_found: 'Nie znaleziono błędu: %{id}'
1307
1331
  batch_failed:
1308
1332
  mute:
@@ -1441,6 +1465,10 @@ pl:
1441
1465
  few: "%{value} błędy"
1442
1466
  many: "%{value} błędów"
1443
1467
  view_in_dashboard: Zobacz w panelu
1468
+ burst:
1469
+ suppressed: "W aplikacji %{application} zgłoszono ponad %{limit} nowych błędów w ciągu %{window} sekund."
1470
+ still_recorded: "Powiadomienia o kolejnych nowych błędach są wstrzymane do końca tego okna czasowego; każdy błąd jest nadal zapisywany."
1471
+ dashboard: "Panel: %{url}"
1444
1472
  storm:
1445
1473
  detected: Wykryto sztorm błędów w %{application} o %{started_at}.
1446
1474
  mode: