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.
- checksums.yaml +4 -4
- data/app/controllers/rails_error_dashboard/application_controller.rb +92 -11
- data/app/controllers/rails_error_dashboard/errors_controller.rb +111 -34
- data/app/controllers/rails_error_dashboard/webhooks_controller.rb +3 -0
- data/app/helpers/rails_error_dashboard/application_helper.rb +46 -1
- data/app/helpers/rails_error_dashboard/backtrace_helper.rb +8 -0
- data/app/jobs/rails_error_dashboard/concerns/plain_channel_message.rb +71 -0
- data/app/jobs/rails_error_dashboard/notification_burst_summary_job.rb +55 -0
- data/app/jobs/rails_error_dashboard/retention_cleanup_job.rb +68 -1
- data/app/jobs/rails_error_dashboard/storm_notification_job.rb +8 -44
- data/app/models/rails_error_dashboard/error_baseline.rb +12 -9
- data/app/models/rails_error_dashboard/error_comment.rb +0 -5
- data/app/models/rails_error_dashboard/error_log.rb +9 -3
- data/app/models/rails_error_dashboard/error_logs_record.rb +34 -0
- data/app/models/rails_error_dashboard/error_occurrence.rb +9 -1
- data/app/views/layouts/rails_error_dashboard.html.erb +11 -3
- data/app/views/rails_error_dashboard/errors/_discussion.html.erb +18 -11
- data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +22 -8
- data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +15 -6
- data/app/views/rails_error_dashboard/errors/analytics.html.erb +8 -8
- data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/index.html.erb +6 -1
- data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/releases.html.erb +2 -2
- data/app/views/rails_error_dashboard/errors/settings.html.erb +2 -0
- data/config/locales/de.yml +28 -0
- data/config/locales/en.yml +35 -0
- data/config/locales/es.yml +28 -0
- data/config/locales/fr.yml +28 -0
- data/config/locales/it.yml +28 -0
- data/config/locales/ja.yml +28 -0
- data/config/locales/pl.yml +28 -0
- data/config/locales/pt-BR.yml +28 -0
- data/config/locales/ru.yml +28 -0
- data/config/locales/uk.yml +28 -0
- data/config/locales/zh-CN.yml +28 -0
- data/db/migrate/20260917000001_add_last_notified_at_to_error_logs.rb +40 -0
- data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +12 -1
- data/lib/rails_error_dashboard/commands/assign_error.rb +12 -2
- data/lib/rails_error_dashboard/commands/backfill_environments.rb +2 -0
- data/lib/rails_error_dashboard/commands/backfill_resolved_at.rb +42 -0
- data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +1 -0
- data/lib/rails_error_dashboard/commands/batch_mute_errors.rb +2 -0
- data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +2 -0
- data/lib/rails_error_dashboard/commands/batch_unmute_errors.rb +2 -0
- data/lib/rails_error_dashboard/commands/find_or_increment_error.rb +39 -7
- data/lib/rails_error_dashboard/commands/flush_rack_attack_events.rb +3 -1
- data/lib/rails_error_dashboard/commands/flush_storm_counts.rb +27 -4
- data/lib/rails_error_dashboard/commands/flush_swallowed_exceptions.rb +5 -2
- data/lib/rails_error_dashboard/commands/link_existing_issue.rb +1 -0
- data/lib/rails_error_dashboard/commands/log_error.rb +82 -23
- data/lib/rails_error_dashboard/commands/mute_error.rb +1 -0
- data/lib/rails_error_dashboard/commands/resolve_error.rb +2 -0
- data/lib/rails_error_dashboard/commands/scrub_invalid_encoding.rb +104 -0
- data/lib/rails_error_dashboard/commands/snooze_error.rb +34 -10
- data/lib/rails_error_dashboard/commands/unmute_error.rb +1 -0
- data/lib/rails_error_dashboard/commands/update_error_priority.rb +23 -2
- data/lib/rails_error_dashboard/commands/update_error_status.rb +33 -6
- data/lib/rails_error_dashboard/configuration.rb +19 -1
- data/lib/rails_error_dashboard/engine.rb +15 -0
- data/lib/rails_error_dashboard/queries/analytics_stats.rb +4 -3
- data/lib/rails_error_dashboard/queries/baseline_stats.rb +107 -0
- data/lib/rails_error_dashboard/queries/dashboard_stats.rb +55 -50
- data/lib/rails_error_dashboard/queries/error_correlation.rb +6 -3
- data/lib/rails_error_dashboard/queries/errors_list.rb +15 -2
- data/lib/rails_error_dashboard/queries/similar_errors.rb +1 -1
- data/lib/rails_error_dashboard/services/analytics_cache_manager.rb +43 -18
- data/lib/rails_error_dashboard/services/backtrace_processor.rb +3 -1
- data/lib/rails_error_dashboard/services/cause_chain_extractor.rb +3 -1
- data/lib/rails_error_dashboard/services/codeberg_issue_client.rb +13 -2
- data/lib/rails_error_dashboard/services/diagnostic_dump_generator.rb +5 -3
- data/lib/rails_error_dashboard/services/encoding_sanitizer.rb +80 -0
- data/lib/rails_error_dashboard/services/error_broadcaster.rb +180 -32
- data/lib/rails_error_dashboard/services/error_hash_generator.rb +9 -3
- data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +13 -0
- data/lib/rails_error_dashboard/services/exception_filter.rb +55 -0
- data/lib/rails_error_dashboard/services/git_head_reader.rb +102 -0
- data/lib/rails_error_dashboard/services/notification_throttler.rb +172 -28
- data/lib/rails_error_dashboard/services/sensitive_data_filter.rb +47 -1
- data/lib/rails_error_dashboard/services/storm_protection/circuit_breaker.rb +59 -3
- data/lib/rails_error_dashboard/services/storm_protection/fingerprint_buckets.rb +25 -2
- data/lib/rails_error_dashboard/services/storm_protection/gate.rb +32 -5
- data/lib/rails_error_dashboard/services/swallowed_exception_tracker.rb +99 -23
- data/lib/rails_error_dashboard/services/url_safety.rb +40 -0
- data/lib/rails_error_dashboard/subscribers/issue_tracker_subscriber.rb +11 -2
- data/lib/rails_error_dashboard/value_objects/error_context.rb +3 -1
- data/lib/rails_error_dashboard/version.rb +1 -1
- data/lib/rails_error_dashboard.rb +31 -0
- data/lib/tasks/error_dashboard.rake +54 -4
- metadata +10 -2
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
<div class="card text-center">
|
|
50
50
|
<div class="card-body">
|
|
51
51
|
<%
|
|
52
|
-
latest = @
|
|
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
|
-
|
|
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: <%=
|
|
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: <%=
|
|
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 = <%=
|
|
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
|
-
}
|
|
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: <%=
|
|
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 = <%=
|
|
381
|
-
const times = <%=
|
|
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 = @
|
|
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 = @
|
|
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 },
|
data/config/locales/de.yml
CHANGED
|
@@ -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:
|
data/config/locales/en.yml
CHANGED
|
@@ -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.
|
data/config/locales/es.yml
CHANGED
|
@@ -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:
|
data/config/locales/fr.yml
CHANGED
|
@@ -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:
|
data/config/locales/it.yml
CHANGED
|
@@ -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:
|
data/config/locales/ja.yml
CHANGED
|
@@ -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:
|
data/config/locales/pl.yml
CHANGED
|
@@ -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:
|