rails_error_dashboard 0.14.4 → 0.15.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -5
  3. data/app/controllers/rails_error_dashboard/application_controller.rb +28 -4
  4. data/app/controllers/rails_error_dashboard/errors_controller.rb +68 -2
  5. data/app/controllers/rails_error_dashboard/health_controller.rb +38 -0
  6. data/app/helpers/rails_error_dashboard/application_helper.rb +2 -2
  7. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +56 -2
  8. data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +20 -2
  9. data/app/jobs/rails_error_dashboard/cascade_detection_job.rb +30 -0
  10. data/app/jobs/rails_error_dashboard/concerns/plain_channel_message.rb +33 -6
  11. data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +1 -1
  12. data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +1 -1
  13. data/app/jobs/rails_error_dashboard/retention_cleanup_job.rb +26 -0
  14. data/app/jobs/rails_error_dashboard/scheduled_digest_job.rb +6 -1
  15. data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +1 -1
  16. data/app/jobs/rails_error_dashboard/telegram_error_notification_job.rb +25 -0
  17. data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +2 -18
  18. data/app/models/rails_error_dashboard/error_log.rb +43 -12
  19. data/app/models/rails_error_dashboard/missing_translation.rb +43 -0
  20. data/app/views/layouts/rails_error_dashboard.html.erb +11 -1
  21. data/app/views/rails_error_dashboard/errors/_error_info.html.erb +3 -1
  22. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +3 -1
  23. data/app/views/rails_error_dashboard/errors/_source_code.html.erb +3 -9
  24. data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +28 -0
  25. data/app/views/rails_error_dashboard/errors/boot_errors.html.erb +130 -0
  26. data/app/views/rails_error_dashboard/errors/index.html.erb +1 -1
  27. data/app/views/rails_error_dashboard/errors/missing_translations.html.erb +143 -0
  28. data/app/views/rails_error_dashboard/errors/settings/_value_badge.html.erb +7 -4
  29. data/app/views/rails_error_dashboard/errors/settings.html.erb +19 -5
  30. data/config/locales/de.yml +68 -5
  31. data/config/locales/en.yml +78 -4
  32. data/config/locales/es.yml +68 -5
  33. data/config/locales/fr.yml +68 -5
  34. data/config/locales/it.yml +68 -5
  35. data/config/locales/ja.yml +68 -4
  36. data/config/locales/pl.yml +68 -5
  37. data/config/locales/pt-BR.yml +68 -5
  38. data/config/locales/ru.yml +68 -5
  39. data/config/locales/uk.yml +68 -5
  40. data/config/locales/zh-CN.yml +68 -4
  41. data/config/routes.rb +6 -0
  42. data/db/migrate/20251223000000_create_rails_error_dashboard_complete_schema.rb +10 -2
  43. data/db/migrate/20261010000001_create_missing_translations.rb +50 -0
  44. data/lib/generators/rails_error_dashboard/install/install_generator.rb +9 -4
  45. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +27 -0
  46. data/lib/rails_error_dashboard/commands/assign_error.rb +24 -1
  47. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +9 -1
  48. data/lib/rails_error_dashboard/commands/flush_missing_translations.rb +103 -0
  49. data/lib/rails_error_dashboard/commands/log_error.rb +1 -1
  50. data/lib/rails_error_dashboard/commands/resolve_error.rb +2 -15
  51. data/lib/rails_error_dashboard/commands/update_error_status.rb +7 -0
  52. data/lib/rails_error_dashboard/configuration.rb +42 -1
  53. data/lib/rails_error_dashboard/engine.rb +42 -1
  54. data/lib/rails_error_dashboard/middleware/rate_limiter.rb +7 -1
  55. data/lib/rails_error_dashboard/plugin.rb +19 -3
  56. data/lib/rails_error_dashboard/plugin_registry.rb +61 -12
  57. data/lib/rails_error_dashboard/queries/boot_errors.rb +76 -0
  58. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +3 -11
  59. data/lib/rails_error_dashboard/queries/errors_list.rb +8 -16
  60. data/lib/rails_error_dashboard/queries/health_status.rb +191 -0
  61. data/lib/rails_error_dashboard/queries/missing_translation_summary.rb +82 -0
  62. data/lib/rails_error_dashboard/services/active_storage_probe.rb +91 -0
  63. data/lib/rails_error_dashboard/services/backtrace_parser.rb +13 -7
  64. data/lib/rails_error_dashboard/services/backtrace_processor.rb +15 -0
  65. data/lib/rails_error_dashboard/services/baseline_alert_payload_builder.rb +30 -0
  66. data/lib/rails_error_dashboard/services/crash_capture.rb +85 -2
  67. data/lib/rails_error_dashboard/services/digest_builder.rb +9 -6
  68. data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +6 -0
  69. data/lib/rails_error_dashboard/services/github_link_generator.rb +25 -9
  70. data/lib/rails_error_dashboard/services/missing_translation_handler.rb +152 -0
  71. data/lib/rails_error_dashboard/services/missing_translation_tracker.rb +316 -0
  72. data/lib/rails_error_dashboard/services/resolution_callbacks.rb +44 -0
  73. data/lib/rails_error_dashboard/services/severity_classifier.rb +52 -0
  74. data/lib/rails_error_dashboard/services/source_code_reader.rb +23 -3
  75. data/lib/rails_error_dashboard/services/telegram_delivery.rb +134 -0
  76. data/lib/rails_error_dashboard/services/telegram_payload_builder.rb +105 -0
  77. data/lib/rails_error_dashboard/services/webhook_delivery.rb +63 -0
  78. data/lib/rails_error_dashboard/services/webhook_signer.rb +80 -0
  79. data/lib/rails_error_dashboard/version.rb +1 -1
  80. data/lib/rails_error_dashboard.rb +12 -0
  81. metadata +21 -2
@@ -60,6 +60,8 @@ it:
60
60
  llm: LLM
61
61
  n_plus_one: Query N+1
62
62
  deprecations: Deprecations
63
+ missing_translations: "Traduzioni"
64
+ boot_errors: "Errori di avvio"
63
65
  swallowed: Soppresse
64
66
  diagnostic_dumps: Diagnostica
65
67
  storms: Tempeste
@@ -850,6 +852,53 @@ it:
850
852
  view_unrescued: Vedi gli errori %{exception} non intercettati finiti in error_log
851
853
  footer_tip: Le eccezioni soppresse vengono sollevate e poi intercettate in
852
854
  silenzio. Possono nascondere bug reali.
855
+ missing_translations_page:
856
+ title: "Traduzioni mancanti"
857
+ empty_title: "Nessuna traduzione mancante registrata"
858
+ empty_body: "Nessuna chiave di traduzione mancante è stata registrata negli ultimi %{days} giorni."
859
+ how_title: "Come vengono tracciate le traduzioni mancanti:"
860
+ how_enabled_html: "Il tracciamento deve essere attivo (%{option})"
861
+ how_hooked: "RED avvolge I18n.exception_handler e delega all'handler che la tua app aveva già; nient'altro cambia nella tua configurazione I18n"
862
+ how_recorded: "Ogni ricerca che arriva all'handler — sia da I18n.t sia dall'helper di vista t() — viene contata per locale e chiave, insieme al primo punto di chiamata osservato"
863
+ how_not_seen: "Una ricerca con :default non fallisce mai, e una fatta con raise_on_missing_translations solleva un'eccezione prima che qualsiasi handler venga eseguito, quindi nessuna delle due è contata qui"
864
+ how_buffered: "I fallimenti vengono contati in memoria e scritti alla fine della richiesta o del job, quindi attendi un breve ritardo prima che compaiano"
865
+ missing_keys: "Chiavi mancanti"
866
+ total_misses: "Fallimenti totali"
867
+ locales_affected: "Locale interessati"
868
+ all_title: "Chiavi di traduzione mancanti"
869
+ column_key: "Chiave"
870
+ column_locale: "Locale"
871
+ column_source: "Visto prima in"
872
+ column_misses: "Fallimenti"
873
+ column_first_seen: "Prima occorrenza"
874
+ overflow_notice: "%{count} fallimenti non sono stati attribuiti a una chiave perché il buffer del tracker (%{limit} chiavi per thread) era pieno."
875
+ footer_tip: "Aggiungi la chiave al file di locale, oppure passa un :default. Le chiavi effettivamente incontrate dagli utenti sono elencate per prime."
876
+ docs: "Guida i18n di Rails"
877
+
878
+ boot_errors_page:
879
+ title: "Errori di avvio"
880
+ empty_title: "Nessun errore di avvio registrato"
881
+ empty_body: "Nessun processo è morto durante l’avvio negli ultimi %{days} giorni."
882
+ how_title: "Come vengono catturati gli errori di avvio:"
883
+ how_enabled_html: "La cattura dei crash deve essere attiva (%{option})"
884
+ how_hooked: "RED registra il suo hook at_exit subito dopo i tuoi initializer e prima dell’eager loading di Rails, così un crash durante l’avvio viene visto anche se l’app non ha mai finito di partire"
885
+ how_captured_html: "Un %{zeitwerk} da un file che definisce la costante sbagliata, un %{syntax} in un modello, un initializer che solleva un’eccezione: qualsiasi cosa uccida il processo prima che serva una richiesta"
886
+ how_imported: "Il crash viene scritto su disco, perché non c’è ancora un database, e importato al successivo avvio riuscito"
887
+ how_never: "Un processo terminato da SIGKILL o da un segfault non viene mai visto da at_exit, in nessuno strumento"
888
+ unresolved: "Non risolti"
889
+ boot_crashes: "Crash all’avvio"
890
+ failed_boots: "Avvii falliti"
891
+ all_title: "Crash all’avvio per errore"
892
+ column_error: "Errore"
893
+ column_file: "File"
894
+ column_constant: "Costante"
895
+ column_boots: "Avvii"
896
+ column_first_seen: "Prima occorrenza"
897
+ column_status: "Stato"
898
+ status_open: "Aperto"
899
+ status_resolved: "Risolto"
900
+ footer_tip: "Un crash all’avvio significa che il processo non ha mai servito una richiesta. Correggilo prima del prossimo deploy; la riga si risolve come qualsiasi altro errore."
901
+
853
902
  rack_attack_page:
854
903
  title: Eventi di limite di richieste
855
904
  missing_title: Rack Attack non è installato
@@ -1120,7 +1169,7 @@ it:
1120
1169
  unable_to_detect: Impossibile rilevare
1121
1170
  no_user_model: Nessun modello User rilevato
1122
1171
  unable_to_query_count: Impossibile ottenere il conteggio
1123
- manual_cleanup_required: Richiesta pulizia manuale
1172
+ retention_enforced_by_job: "Eliminati da RetentionCleanupJob quando lo scheduler lo esegue"
1124
1173
  keep_forever: Conserva per sempre
1125
1174
  no_automatic_deletion: Nessuna eliminazione automatica
1126
1175
  run_command: 'Esegui:'
@@ -1128,8 +1177,7 @@ it:
1128
1177
  options:
1129
1178
  enable_middleware: Intercetta le eccezioni non gestite
1130
1179
  enable_error_subscriber: Si iscrive agli eventi di errore di Rails
1131
- retention_days: 'Solo pulizia manuale (esegui: rails error_dashboard:cleanup_resolved
1132
- DAYS=90)'
1180
+ retention_days: "Elimina gli errori non visti da questo numero di giorni. Applicato da RetentionCleanupJob, che la gem non pianifica da sola"
1133
1181
  max_backtrace_lines: Limite di profondità dello stack trace
1134
1182
  sampling_rate: Percentuale di errori acquisiti
1135
1183
  application_name: Nome di questa applicazione (rilevato automaticamente se
@@ -1148,7 +1196,7 @@ it:
1148
1196
  se non impostato)
1149
1197
  async_logging: Elaborazione in job in background
1150
1198
  async_adapter: Adapter della coda dei job
1151
- enable_rate_limiting: Limita le richieste alle API
1199
+ enable_rate_limiting: "Limita le richieste della dashboard per IP e percorso"
1152
1200
  rate_limit_per_minute: Richieste al minuto per IP
1153
1201
  enable_slack_notifications: Notifiche in tempo reale
1154
1202
  slack_webhook_url: Endpoint del webhook di Slack
@@ -1157,10 +1205,15 @@ it:
1157
1205
  notification_email_from: Indirizzo del mittente
1158
1206
  enable_discord_notifications: Notifiche tramite webhook di Discord
1159
1207
  discord_webhook_url: Endpoint del webhook di Discord
1208
+ enable_telegram_notifications: "Notifiche Telegram tramite la Bot API"
1209
+ telegram_bot_token: "Token del bot da @BotFather (impostare la variabile d'ambiente TELEGRAM_BOT_TOKEN)"
1210
+ telegram_chat_id: "Chat, gruppo o canale in cui scrive il bot"
1211
+ telegram_api_base_url: "Server della Bot API (da cambiare solo per un proxy o un server self-hosted)"
1160
1212
  enable_pagerduty_notifications: Escalation degli errori critici
1161
1213
  pagerduty_integration_key: Chiave API di PagerDuty
1162
1214
  enable_webhook_notifications: Endpoint webhook generici
1163
1215
  webhook_urls: Endpoint webhook personalizzati
1216
+ webhook_signing_secret: Firma i webhook in uscita con HMAC-SHA256 (imposta la variabile d’ambiente WEBHOOK_SIGNING_SECRET)
1164
1217
  enable_scheduled_digests: E-mail di riepilogo giornaliere/settimanali. Pianifica
1165
1218
  tramite SolidQueue, Sidekiq o cron
1166
1219
  digest_frequency: Con quale frequenza inviare le e-mail di riepilogo
@@ -1181,7 +1234,7 @@ it:
1181
1234
  source_code_context_lines: Righe prima e dopo quella di riferimento
1182
1235
  enable_git_blame: Mostra le informazioni di git blame
1183
1236
  source_code_cache_ttl: Durata della cache del codice sorgente
1184
- only_show_app_code_source: Nascondi gems/stdlib per sicurezza
1237
+ only_show_app_code_source: "Nascondi il codice di gem e vendor nel visualizzatore del codice"
1185
1238
  git_branch_strategy: Strategia di risoluzione del branch
1186
1239
  enable_breadcrumbs: Acquisisci la traccia delle attività della richiesta
1187
1240
  breadcrumb_buffer_size: Numero massimo di breadcrumbs per richiesta
@@ -1214,6 +1267,7 @@ it:
1214
1267
  enable_crash_capture: Hook at_exit per i crash non gestiti
1215
1268
  enable_coverage_tracking: Modalità diagnostica — abilitala dal pannello per
1216
1269
  vedere le righe eseguite nella vista del codice (Ruby 3.2+)
1270
+ enable_missing_translation_tracking: "Conta i fallimenti I18n dell'app per locale e chiave (avvolge I18n.exception_handler)"
1217
1271
  enable_rack_attack_tracking: Registra gli eventi throttle/blocklist in una
1218
1272
  tabella dedicata
1219
1273
  enable_actioncable_tracking: Traccia gli eventi dei canali WebSocket come
@@ -1271,6 +1325,8 @@ it:
1271
1325
  breadcrumbs: Breadcrumbs
1272
1326
  system_health: Stato del sistema
1273
1327
  swallowed_exceptions: Rilevamento delle eccezioni soppresse
1328
+ missing_translations: "Tracciamento delle traduzioni mancanti"
1329
+ boot_errors: "Cattura degli errori di avvio"
1274
1330
  rack_attack: Tracciamento di Rack Attack
1275
1331
  actioncable: Tracciamento di ActionCable
1276
1332
  activestorage: Tracciamento di ActiveStorage
@@ -1682,6 +1738,13 @@ it:
1682
1738
  guide_link: Guida ad ActionCable
1683
1739
  activestorage:
1684
1740
  title: Stato di ActiveStorage
1741
+ probe:
1742
+ title: "Raggiungibilità del servizio"
1743
+ reachable: "Raggiungibile"
1744
+ unreachable: "Non raggiungibile"
1745
+ service: "Servizio: %{name}"
1746
+ latency: "%{ms} ms andata e ritorno"
1747
+ how: "Un controllo di esistenza su una chiave mai memorizzata, eseguito al caricamento di questa pagina. GET /health esegue la stessa verifica."
1685
1748
  empty:
1686
1749
  title: Nessun evento ActiveStorage trovato
1687
1750
  message: Negli ultimi %{days} giorni non sono state rilevate operazioni
@@ -60,6 +60,8 @@ ja:
60
60
  llm: LLM
61
61
  n_plus_one: N+1 クエリ
62
62
  deprecations: 非推奨
63
+ missing_translations: "翻訳"
64
+ boot_errors: "起動エラー"
63
65
  swallowed: 握りつぶし
64
66
  diagnostic_dumps: 診断
65
67
  storms: ストーム
@@ -756,6 +758,53 @@ ja:
756
758
  column_ratio: 比率
757
759
  view_unrescued: error_log に記録された未 rescue の%{exception}エラーを表示
758
760
  footer_tip: 握りつぶされた例外とは、raise された後に暗黙的に rescue された例外です。実際の不具合を隠している可能性があります。
761
+ missing_translations_page:
762
+ title: "翻訳の欠落"
763
+ empty_title: "欠落した翻訳は記録されていません"
764
+ empty_body: "過去 %{days} 日間に欠落した翻訳キーは記録されていません。"
765
+ how_title: "翻訳の欠落を追跡する仕組み:"
766
+ how_enabled_html: "追跡を有効にする必要があります(%{option})"
767
+ how_hooked: "RED は I18n.exception_handler をラップし、アプリが元々使っていたハンドラーに処理を委譲します。それ以外の I18n 設定は変更しません"
768
+ how_recorded: "ハンドラーに到達した検索は、I18n.t でもビューヘルパー t() でも、ロケールとキーごとに、最初に観測された呼び出し元とともに数えられます"
769
+ how_not_seen: ":default を指定した検索は欠落になりません。raise_on_missing_translations を使った検索はハンドラーが動く前に例外を投げるため、どちらもここでは数えられません"
770
+ how_buffered: "欠落はメモリ上で数えられ、リクエストまたはジョブの終了時に書き込まれるため、表示されるまで少し時間がかかります"
771
+ missing_keys: "欠落キー"
772
+ total_misses: "欠落の合計"
773
+ locales_affected: "影響を受けたロケール"
774
+ all_title: "欠落している翻訳キー"
775
+ column_key: "キー"
776
+ column_locale: "ロケール"
777
+ column_source: "最初の検出箇所"
778
+ column_misses: "欠落数"
779
+ column_first_seen: "初回検出"
780
+ overflow_notice: "トラッカーのバッファ(スレッドあたり %{limit} キー)が満杯だったため、%{count} 件の欠落をキーに割り当てられませんでした。"
781
+ footer_tip: "ロケールファイルにキーを追加するか、:default を渡してください。実際にユーザーが遭遇したキーが先に表示されます。"
782
+ docs: "Rails i18n ガイド"
783
+
784
+ boot_errors_page:
785
+ title: "起動エラー"
786
+ empty_title: "起動エラーは記録されていません"
787
+ empty_body: "過去 %{days} 日間に起動中に終了したプロセスはありません。"
788
+ how_title: "起動エラーを捕捉する仕組み:"
789
+ how_enabled_html: "クラッシュ捕捉を有効にする必要があります(%{option})"
790
+ how_hooked: "RED は initializer の直後、Rails の eager load の前に at_exit フックを登録するため、アプリが起動し切る前のクラッシュも捕捉されます"
791
+ how_captured_html: "誤った定数を定義したファイルによる %{zeitwerk}、モデル内の %{syntax}、例外を投げた initializer など、リクエストを処理する前にプロセスを終了させるもの"
792
+ how_imported: "この時点ではデータベースがないためクラッシュはディスクに書き込まれ、次に起動が成功したときに取り込まれます"
793
+ how_never: "SIGKILL やセグメンテーション違反で終了したプロセスは、どのツールでも at_exit では捕捉できません"
794
+ unresolved: "未解決"
795
+ boot_crashes: "起動クラッシュ"
796
+ failed_boots: "失敗した起動"
797
+ all_title: "エラー別の起動クラッシュ"
798
+ column_error: "エラー"
799
+ column_file: "ファイル"
800
+ column_constant: "定数"
801
+ column_boots: "起動回数"
802
+ column_first_seen: "初回検出"
803
+ column_status: "状態"
804
+ status_open: "未対応"
805
+ status_resolved: "解決済み"
806
+ footer_tip: "起動クラッシュはプロセスが一度もリクエストを処理しなかったことを意味します。次のデプロイ前に修正してください。行は他のエラーと同様に解決できます。"
807
+
759
808
  rack_attack_page:
760
809
  title: レート制限イベント
761
810
  missing_title: Rack Attack がインストールされていません
@@ -972,7 +1021,7 @@ ja:
972
1021
  unable_to_detect: 検出できません
973
1022
  no_user_model: User モデルが見つかりません
974
1023
  unable_to_query_count: 件数を取得できません
975
- manual_cleanup_required: 手動でのクリーンアップが必要です
1024
+ retention_enforced_by_job: "スケジューラーが RetentionCleanupJob を実行すると削除されます"
976
1025
  keep_forever: 無期限に保持
977
1026
  no_automatic_deletion: 自動削除は行いません
978
1027
  run_command: '実行:'
@@ -980,7 +1029,7 @@ ja:
980
1029
  options:
981
1030
  enable_middleware: 未処理の例外を捕捉します
982
1031
  enable_error_subscriber: Rails のエラーイベントを購読します
983
- retention_days: '手動クリーンアップのみ (実行: rails error_dashboard:cleanup_resolved DAYS=90)'
1032
+ retention_days: "この日数の間発生しなかったエラーを削除します。RetentionCleanupJob が実行しますが、gem 自体はスケジュールしません"
984
1033
  max_backtrace_lines: スタックトレースの深さの上限
985
1034
  sampling_rate: エラーを記録する割合
986
1035
  application_name: このアプリケーションの名前 (未設定の場合は自動検出)
@@ -994,7 +1043,7 @@ ja:
994
1043
  total_users_for_impact: 影響率の算出に使用 (未設定の場合は自動検出)
995
1044
  async_logging: バックグラウンドジョブで処理します
996
1045
  async_adapter: ジョブキューのアダプタ
997
- enable_rate_limiting: API リクエストを制限します
1046
+ enable_rate_limiting: "ダッシュボードへのリクエストを IP とパスごとに制限します"
998
1047
  rate_limit_per_minute: IP ごとの1分あたりのリクエスト数
999
1048
  enable_slack_notifications: リアルタイム通知
1000
1049
  slack_webhook_url: Slack の webhook エンドポイント
@@ -1003,10 +1052,15 @@ ja:
1003
1052
  notification_email_from: 送信元アドレス
1004
1053
  enable_discord_notifications: Discord の webhook 通知
1005
1054
  discord_webhook_url: Discord の webhook エンドポイント
1055
+ enable_telegram_notifications: "Telegram Bot API 通知"
1056
+ telegram_bot_token: "@BotFather のボットトークン(環境変数 TELEGRAM_BOT_TOKEN を設定)"
1057
+ telegram_chat_id: "ボットが投稿するチャット・グループ・チャンネル"
1058
+ telegram_api_base_url: "Bot API サーバー(プロキシやセルフホストの場合のみ変更)"
1006
1059
  enable_pagerduty_notifications: 重大なエラーのエスカレーション
1007
1060
  pagerduty_integration_key: PagerDuty の API キー
1008
1061
  enable_webhook_notifications: 汎用の webhook エンドポイント
1009
1062
  webhook_urls: カスタム webhook エンドポイント
1063
+ webhook_signing_secret: 送信 webhook に HMAC-SHA256 署名を付けます(環境変数 WEBHOOK_SIGNING_SECRET を設定)
1010
1064
  enable_scheduled_digests: 日次/週次のサマリーメール。SolidQueue、Sidekiq、cron でスケジュールします
1011
1065
  digest_frequency: ダイジェストメールの送信頻度
1012
1066
  digest_recipients: メールアドレス (未設定の場合は通知の宛先を使用)
@@ -1024,7 +1078,7 @@ ja:
1024
1078
  source_code_context_lines: 対象行の前後に表示する行数
1025
1079
  enable_git_blame: git blame の情報を表示します
1026
1080
  source_code_cache_ttl: ソースコードのキャッシュ保持時間
1027
- only_show_app_code_source: セキュリティのため gem/標準ライブラリを非表示にします
1081
+ only_show_app_code_source: "ソースビューアーで gem と vendor のコードを非表示にします"
1028
1082
  git_branch_strategy: ブランチの解決方法
1029
1083
  enable_breadcrumbs: リクエストの操作履歴を記録します
1030
1084
  breadcrumb_buffer_size: リクエストあたりの breadcrumb の最大数
@@ -1049,6 +1103,7 @@ ja:
1049
1103
  enable_crash_capture: 未処理のクラッシュを捕捉する at_exit フック
1050
1104
  enable_coverage_tracking: 診断モード — ダッシュボードから有効にすると、ソース表示で実行された行を確認できます (Ruby
1051
1105
  3.2 以上)
1106
+ enable_missing_translation_tracking: "アプリの I18n 欠落をロケールとキーごとに数えます(I18n.exception_handler をラップ)"
1052
1107
  enable_rack_attack_tracking: throttle/blocklist イベントを専用テーブルに記録します
1053
1108
  enable_actioncable_tracking: WebSocket のチャネルイベントを breadcrumb として記録します
1054
1109
  enable_activestorage_tracking: アップロード/ダウンロード/削除を breadcrumb として記録します
@@ -1094,6 +1149,8 @@ ja:
1094
1149
  breadcrumbs: Breadcrumb
1095
1150
  system_health: システムヘルス
1096
1151
  swallowed_exceptions: 握りつぶされた例外の検出
1152
+ missing_translations: "翻訳欠落の追跡"
1153
+ boot_errors: "起動エラーの捕捉"
1097
1154
  rack_attack: Rack Attack トラッキング
1098
1155
  actioncable: ActionCable トラッキング
1099
1156
  activestorage: ActiveStorage トラッキング
@@ -1462,6 +1519,13 @@ ja:
1462
1519
  guide_link: ActionCable ガイド
1463
1520
  activestorage:
1464
1521
  title: ActiveStorage の状態
1522
+ probe:
1523
+ title: "サービスの到達性"
1524
+ reachable: "到達可能"
1525
+ unreachable: "到達不能"
1526
+ service: "サービス: %{name}"
1527
+ latency: "往復 %{ms} ms"
1528
+ how: "このページの読み込み時に、保存されることのないキーの存在確認を 1 回行います。GET /health も同じ検査を実行します。"
1465
1529
  empty:
1466
1530
  title: ActiveStorage のイベントが見つかりません
1467
1531
  message: 過去%{days}日間、エラーの breadcrumb から ActiveStorage のサービス操作は検出されませんでした。
@@ -60,6 +60,8 @@ pl:
60
60
  llm: LLM
61
61
  n_plus_one: Zapytania N+1
62
62
  deprecations: Deprecations
63
+ missing_translations: "Tłumaczenia"
64
+ boot_errors: "Błędy startu"
63
65
  swallowed: Wyciszone
64
66
  diagnostic_dumps: Diagnostyka
65
67
  storms: Sztormy
@@ -865,6 +867,53 @@ pl:
865
867
  error_log
866
868
  footer_tip: Wyciszone wyjątki są podnoszone, a następnie po cichu przechwytywane.
867
869
  Mogą ukrywać prawdziwe błędy.
870
+ missing_translations_page:
871
+ title: "Brakujące tłumaczenia"
872
+ empty_title: "Nie zarejestrowano brakujących tłumaczeń"
873
+ empty_body: "W ciągu ostatnich %{days} dni nie zarejestrowano brakujących kluczy tłumaczeń."
874
+ how_title: "Jak śledzone są brakujące tłumaczenia:"
875
+ how_enabled_html: "Śledzenie musi być włączone (%{option})"
876
+ how_hooked: "RED opakowuje I18n.exception_handler i przekazuje wywołanie do handlera, który aplikacja już miała; nic więcej w konfiguracji I18n się nie zmienia"
877
+ how_recorded: "Każde wyszukanie, które trafia do handlera — zarówno z I18n.t, jak i z helpera widoku t() — jest liczone według locale i klucza, wraz z pierwszym zaobserwowanym miejscem wywołania"
878
+ how_not_seen: "Wyszukanie z :default nigdy nie kończy się brakiem, a wyszukanie z raise_on_missing_translations zgłasza wyjątek, zanim uruchomi się jakikolwiek handler, więc żadne z nich nie jest tu liczone"
879
+ how_buffered: "Braki są liczone w pamięci i zapisywane na końcu żądania lub zadania, więc mogą pojawić się z niewielkim opóźnieniem"
880
+ missing_keys: "Brakujące klucze"
881
+ total_misses: "Łącznie braków"
882
+ locales_affected: "Dotknięte locale"
883
+ all_title: "Brakujące klucze tłumaczeń"
884
+ column_key: "Klucz"
885
+ column_locale: "Locale"
886
+ column_source: "Pierwszy raz w"
887
+ column_misses: "Braki"
888
+ column_first_seen: "Pierwsze wystąpienie"
889
+ overflow_notice: "%{count} braków nie udało się przypisać do klucza, ponieważ bufor trackera (%{limit} kluczy na wątek) był pełny."
890
+ footer_tip: "Dodaj klucz do pliku locale albo przekaż :default. Klucze, na które użytkownicy faktycznie trafili, są wymienione jako pierwsze."
891
+ docs: "Przewodnik i18n Rails"
892
+
893
+ boot_errors_page:
894
+ title: "Błędy startu"
895
+ empty_title: "Nie zarejestrowano błędów startu"
896
+ empty_body: "W ciągu ostatnich %{days} dni żaden proces nie zginął podczas startu."
897
+ how_title: "Jak przechwytywane są błędy startu:"
898
+ how_enabled_html: "Przechwytywanie awarii musi być włączone (%{option})"
899
+ how_hooked: "RED rejestruje swój hook at_exit zaraz po Twoich initializerach i przed eager loadingiem Rails, więc awaria podczas startu jest widziana, mimo że aplikacja nigdy nie wystartowała do końca"
900
+ how_captured_html: "%{zeitwerk} z pliku definiującego niewłaściwą stałą, %{syntax} w modelu, initializer zgłaszający wyjątek: wszystko, co zabija proces, zanim obsłuży żądanie"
901
+ how_imported: "Awaria jest zapisywana na dysk, bo bazy danych jeszcze nie ma, i importowana przy następnym udanym starcie"
902
+ how_never: "Procesu zabitego przez SIGKILL lub segfault at_exit nigdy nie zobaczy, w żadnym narzędziu"
903
+ unresolved: "Nierozwiązane"
904
+ boot_crashes: "Awarie startu"
905
+ failed_boots: "Nieudane starty"
906
+ all_title: "Awarie startu według błędu"
907
+ column_error: "Błąd"
908
+ column_file: "Plik"
909
+ column_constant: "Stała"
910
+ column_boots: "Starty"
911
+ column_first_seen: "Pierwsze wystąpienie"
912
+ column_status: "Status"
913
+ status_open: "Otwarty"
914
+ status_resolved: "Rozwiązany"
915
+ footer_tip: "Awaria startu oznacza, że proces nigdy nie obsłużył żądania. Napraw ją przed następnym wdrożeniem; wiersz rozwiązuje się jak każdy inny błąd."
916
+
868
917
  rack_attack_page:
869
918
  title: Zdarzenia limitu żądań
870
919
  missing_title: Rack Attack nie jest zainstalowany
@@ -1150,7 +1199,7 @@ pl:
1150
1199
  unable_to_detect: Nie udało się wykryć
1151
1200
  no_user_model: Nie wykryto modelu User
1152
1201
  unable_to_query_count: Nie udało się odczytać liczby
1153
- manual_cleanup_required: Wymagane ręczne czyszczenie
1202
+ retention_enforced_by_job: "Usuwane przez RetentionCleanupJob, gdy uruchomi go Twój harmonogram"
1154
1203
  keep_forever: Przechowuj bezterminowo
1155
1204
  no_automatic_deletion: Bez automatycznego usuwania
1156
1205
  run_command: 'Uruchom:'
@@ -1158,8 +1207,7 @@ pl:
1158
1207
  options:
1159
1208
  enable_middleware: Przechwytuje nieobsłużone wyjątki
1160
1209
  enable_error_subscriber: Subskrybuje zdarzenia błędów Rails
1161
- retention_days: 'Tylko ręczne czyszczenie (uruchom: rails error_dashboard:cleanup_resolved
1162
- DAYS=90)'
1210
+ retention_days: "Usuwaj błędy niewidziane przez tyle dni. Wykonuje to RetentionCleanupJob, którego gem sam nie planuje"
1163
1211
  max_backtrace_lines: Limit głębokości śladu stosu
1164
1212
  sampling_rate: Odsetek przechwytywanych błędów
1165
1213
  application_name: Nazwa tej aplikacji (wykrywana automatycznie, jeśli nie
@@ -1178,7 +1226,7 @@ pl:
1178
1226
  nie ustawiono)
1179
1227
  async_logging: Przetwarzanie w zadaniach w tle
1180
1228
  async_adapter: Adapter kolejki zadań
1181
- enable_rate_limiting: Ogranicza żądania do API
1229
+ enable_rate_limiting: "Ograniczaj żądania do panelu według IP i ścieżki"
1182
1230
  rate_limit_per_minute: Żądań na minutę z jednego IP
1183
1231
  enable_slack_notifications: Powiadomienia w czasie rzeczywistym
1184
1232
  slack_webhook_url: Punkt końcowy webhooka Slack
@@ -1187,10 +1235,15 @@ pl:
1187
1235
  notification_email_from: Adres nadawcy
1188
1236
  enable_discord_notifications: Powiadomienia przez webhook Discord
1189
1237
  discord_webhook_url: Punkt końcowy webhooka Discord
1238
+ enable_telegram_notifications: "Powiadomienia Telegram przez Bot API"
1239
+ telegram_bot_token: "Token bota z @BotFather (ustaw zmienną środowiskową TELEGRAM_BOT_TOKEN)"
1240
+ telegram_chat_id: "Czat, grupa lub kanał, do którego pisze bot"
1241
+ telegram_api_base_url: "Serwer Bot API (zmieniaj tylko dla proxy lub własnego serwera)"
1190
1242
  enable_pagerduty_notifications: Eskalacja błędów krytycznych
1191
1243
  pagerduty_integration_key: Klucz API PagerDuty
1192
1244
  enable_webhook_notifications: Dowolne punkty końcowe webhooków
1193
1245
  webhook_urls: Własne punkty końcowe webhooków
1246
+ webhook_signing_secret: Podpisuje wychodzące webhooki algorytmem HMAC-SHA256 (ustaw zmienną środowiskową WEBHOOK_SIGNING_SECRET)
1194
1247
  enable_scheduled_digests: Dzienne/tygodniowe e-maile podsumowujące. Planuj
1195
1248
  przez SolidQueue, Sidekiq lub cron
1196
1249
  digest_frequency: Jak często wysyłać e-maile podsumowujące
@@ -1210,7 +1263,7 @@ pl:
1210
1263
  source_code_context_lines: Linie przed i po linii docelowej
1211
1264
  enable_git_blame: Pokazuj informacje git blame
1212
1265
  source_code_cache_ttl: Czas buforowania kodu źródłowego
1213
- only_show_app_code_source: Ukryj gems/stdlib ze względów bezpieczeństwa
1266
+ only_show_app_code_source: "Ukryj kod gemów i vendor w podglądzie źródeł"
1214
1267
  git_branch_strategy: Strategia ustalania gałęzi
1215
1268
  enable_breadcrumbs: Przechwytuj ślad aktywności żądania
1216
1269
  breadcrumb_buffer_size: Maksymalna liczba breadcrumbs na żądanie
@@ -1242,6 +1295,7 @@ pl:
1242
1295
  enable_crash_capture: Hak at_exit dla nieobsłużonych awarii
1243
1296
  enable_coverage_tracking: Tryb diagnostyczny — włącz w panelu, aby widzieć
1244
1297
  wykonane linie w podglądzie kodu (Ruby 3.2+)
1298
+ enable_missing_translation_tracking: "Zlicza braki I18n aplikacji według locale i klucza (opakowuje I18n.exception_handler)"
1245
1299
  enable_rack_attack_tracking: Zapisuj zdarzenia throttle/blocklist w osobnej
1246
1300
  tabeli
1247
1301
  enable_actioncable_tracking: Śledź zdarzenia kanałów WebSocket jako breadcrumbs
@@ -1301,6 +1355,8 @@ pl:
1301
1355
  breadcrumbs: Breadcrumbs
1302
1356
  system_health: Stan systemu
1303
1357
  swallowed_exceptions: Wykrywanie wyciszonych wyjątków
1358
+ missing_translations: "Śledzenie brakujących tłumaczeń"
1359
+ boot_errors: "Przechwytywanie błędów startu"
1304
1360
  rack_attack: Śledzenie Rack Attack
1305
1361
  actioncable: Śledzenie ActionCable
1306
1362
  activestorage: Śledzenie ActiveStorage
@@ -1713,6 +1769,13 @@ pl:
1713
1769
  guide_link: Przewodnik po ActionCable
1714
1770
  activestorage:
1715
1771
  title: Stan ActiveStorage
1772
+ probe:
1773
+ title: "Osiągalność usługi"
1774
+ reachable: "Osiągalna"
1775
+ unreachable: "Nieosiągalna"
1776
+ service: "Usługa: %{name}"
1777
+ latency: "%{ms} ms w obie strony"
1778
+ how: "Jedno sprawdzenie istnienia klucza, który nigdy nie jest zapisywany, wykonywane przy ładowaniu tej strony. GET /health wykonuje tę samą sondę."
1716
1779
  empty:
1717
1780
  title: Nie znaleziono zdarzeń ActiveStorage
1718
1781
  message: W ciągu ostatnich %{days} dni nie wykryto operacji usług ActiveStorage
@@ -60,6 +60,8 @@ pt-BR:
60
60
  llm: LLM
61
61
  n_plus_one: Consultas N+1
62
62
  deprecations: Deprecations
63
+ missing_translations: "Traduções"
64
+ boot_errors: "Erros de inicialização"
63
65
  swallowed: Engolidas
64
66
  diagnostic_dumps: Diagnóstico
65
67
  storms: Tempestades
@@ -855,6 +857,53 @@ pt-BR:
855
857
  view_unrescued: Ver os erros %{exception} não tratados que chegaram ao error_log
856
858
  footer_tip: As exceções engolidas são levantadas e depois tratadas em silêncio.
857
859
  Elas podem esconder bugs reais.
860
+ missing_translations_page:
861
+ title: "Traduções ausentes"
862
+ empty_title: "Nenhuma tradução ausente registrada"
863
+ empty_body: "Nenhuma chave de tradução ausente foi registrada nos últimos %{days} dias."
864
+ how_title: "Como as traduções ausentes são rastreadas:"
865
+ how_enabled_html: "O rastreamento precisa estar ativado (%{option})"
866
+ how_hooked: "O RED envolve o I18n.exception_handler e delega ao handler que sua aplicação já tinha; nada mais muda na sua configuração do I18n"
867
+ how_recorded: "Toda busca que chega ao handler — tanto por I18n.t quanto pelo helper de view t() — é contada por locale e chave, junto com o primeiro ponto de chamada observado"
868
+ how_not_seen: "Uma busca com :default nunca falha, e uma feita com raise_on_missing_translations lança uma exceção antes de qualquer handler rodar, então nenhuma das duas é contada aqui"
869
+ how_buffered: "As falhas são contadas em memória e gravadas ao fim da requisição ou do job, então espere um pequeno atraso até aparecerem"
870
+ missing_keys: "Chaves ausentes"
871
+ total_misses: "Total de falhas"
872
+ locales_affected: "Locales afetados"
873
+ all_title: "Chaves de tradução ausentes"
874
+ column_key: "Chave"
875
+ column_locale: "Locale"
876
+ column_source: "Visto primeiro em"
877
+ column_misses: "Falhas"
878
+ column_first_seen: "Primeira ocorrência"
879
+ overflow_notice: "%{count} falhas não puderam ser atribuídas a uma chave porque o buffer do rastreador (%{limit} chaves por thread) estava cheio."
880
+ footer_tip: "Adicione a chave ao arquivo de locale ou passe um :default. As chaves que os usuários realmente encontraram aparecem primeiro."
881
+ docs: "Guia i18n do Rails"
882
+
883
+ boot_errors_page:
884
+ title: "Erros de inicialização"
885
+ empty_title: "Nenhum erro de inicialização registrado"
886
+ empty_body: "Nenhum processo morreu ao iniciar nos últimos %{days} dias."
887
+ how_title: "Como os erros de inicialização são capturados:"
888
+ how_enabled_html: "A captura de falhas precisa estar ativada (%{option})"
889
+ how_hooked: "O RED registra seu hook at_exit logo após seus initializers e antes do eager loading do Rails, então uma falha durante a inicialização é vista mesmo que o app nunca termine de subir"
890
+ how_captured_html: "Um %{zeitwerk} de um arquivo que define a constante errada, um %{syntax} em um model, um initializer que lançou exceção: qualquer coisa que mate o processo antes de atender uma requisição"
891
+ how_imported: "A falha é gravada em disco, porque ainda não há banco de dados, e importada na próxima inicialização bem-sucedida"
892
+ how_never: "Um processo morto por SIGKILL ou por um segfault nunca é visto pelo at_exit, em nenhuma ferramenta"
893
+ unresolved: "Não resolvidos"
894
+ boot_crashes: "Falhas de inicialização"
895
+ failed_boots: "Inicializações com falha"
896
+ all_title: "Falhas de inicialização por erro"
897
+ column_error: "Erro"
898
+ column_file: "Arquivo"
899
+ column_constant: "Constante"
900
+ column_boots: "Inicializações"
901
+ column_first_seen: "Primeira ocorrência"
902
+ column_status: "Status"
903
+ status_open: "Aberto"
904
+ status_resolved: "Resolvido"
905
+ footer_tip: "Uma falha de inicialização significa que o processo nunca atendeu uma requisição. Corrija antes do próximo deploy; a linha é resolvida como qualquer outro erro."
906
+
858
907
  rack_attack_page:
859
908
  title: Eventos de limite de taxa
860
909
  missing_title: O Rack Attack não está instalado
@@ -1124,7 +1173,7 @@ pt-BR:
1124
1173
  unable_to_detect: Não foi possível detectar
1125
1174
  no_user_model: Nenhum modelo User detectado
1126
1175
  unable_to_query_count: Não foi possível consultar a quantidade
1127
- manual_cleanup_required: Limpeza manual necessária
1176
+ retention_enforced_by_job: "Excluídos pelo RetentionCleanupJob quando seu agendador o executar"
1128
1177
  keep_forever: Manter para sempre
1129
1178
  no_automatic_deletion: Sem exclusão automática
1130
1179
  run_command: 'Executar:'
@@ -1132,8 +1181,7 @@ pt-BR:
1132
1181
  options:
1133
1182
  enable_middleware: Captura exceções não tratadas
1134
1183
  enable_error_subscriber: Assina os eventos de erro do Rails
1135
- retention_days: 'Somente limpeza manual (executar: rails error_dashboard:cleanup_resolved
1136
- DAYS=90)'
1184
+ retention_days: "Excluir erros não vistos há este número de dias. Aplicado pelo RetentionCleanupJob, que a gem não agenda por conta própria"
1137
1185
  max_backtrace_lines: Profundidade máxima do backtrace
1138
1186
  sampling_rate: Porcentagem de erros capturados
1139
1187
  application_name: Nome desta aplicação (detectado automaticamente se não for
@@ -1151,7 +1199,7 @@ pt-BR:
1151
1199
  se não for definido)
1152
1200
  async_logging: Processamento por jobs em segundo plano
1153
1201
  async_adapter: Adaptador da fila de jobs
1154
- enable_rate_limiting: Limitar as requisições à API
1202
+ enable_rate_limiting: "Limitar as requisições do painel por IP e caminho"
1155
1203
  rate_limit_per_minute: Requisições por minuto e por IP
1156
1204
  enable_slack_notifications: Notificações em tempo real
1157
1205
  slack_webhook_url: Endpoint do webhook do Slack
@@ -1160,10 +1208,15 @@ pt-BR:
1160
1208
  notification_email_from: Endereço do remetente
1161
1209
  enable_discord_notifications: Notificações por webhook do Discord
1162
1210
  discord_webhook_url: Endpoint do webhook do Discord
1211
+ enable_telegram_notifications: "Notificações do Telegram via Bot API"
1212
+ telegram_bot_token: "Token do bot do @BotFather (defina a variável de ambiente TELEGRAM_BOT_TOKEN)"
1213
+ telegram_chat_id: "Chat, grupo ou canal em que o bot publica"
1214
+ telegram_api_base_url: "Servidor da Bot API (altere apenas para um proxy ou servidor próprio)"
1163
1215
  enable_pagerduty_notifications: Escalonamento de erros críticos
1164
1216
  pagerduty_integration_key: Chave de API do PagerDuty
1165
1217
  enable_webhook_notifications: Endpoints de webhook genéricos
1166
1218
  webhook_urls: Endpoints de webhook personalizados
1219
+ webhook_signing_secret: Assina os webhooks de saída com HMAC-SHA256 (defina a variável de ambiente WEBHOOK_SIGNING_SECRET)
1167
1220
  enable_scheduled_digests: E-mails de resumo diários/semanais. Agendamento
1168
1221
  via SolidQueue, Sidekiq ou cron
1169
1222
  digest_frequency: Com que frequência enviar os e-mails de resumo
@@ -1183,7 +1236,7 @@ pt-BR:
1183
1236
  source_code_context_lines: Linhas antes e depois da linha de destino
1184
1237
  enable_git_blame: Exibir as informações do git blame
1185
1238
  source_code_cache_ttl: Duração do cache do código-fonte
1186
- only_show_app_code_source: Ocultar gems e stdlib por segurança
1239
+ only_show_app_code_source: "Ocultar código de gems e vendor no visualizador de código"
1187
1240
  git_branch_strategy: Estratégia de resolução do branch
1188
1241
  enable_breadcrumbs: Capturar o rastro de atividade da requisição
1189
1242
  breadcrumb_buffer_size: Número máximo de breadcrumbs por requisição
@@ -1215,6 +1268,7 @@ pt-BR:
1215
1268
  enable_crash_capture: Hook at_exit para falhas não tratadas
1216
1269
  enable_coverage_tracking: Modo diagnóstico — ative pelo painel para ver as
1217
1270
  linhas executadas na visualização do código-fonte (Ruby 3.2+)
1271
+ enable_missing_translation_tracking: "Conta as falhas de I18n do app por locale e chave (envolve o I18n.exception_handler)"
1218
1272
  enable_rack_attack_tracking: Registrar os eventos throttle/blocklist em uma
1219
1273
  tabela própria
1220
1274
  enable_actioncable_tracking: Monitorar os eventos de canal do WebSocket como
@@ -1272,6 +1326,8 @@ pt-BR:
1272
1326
  breadcrumbs: Breadcrumbs
1273
1327
  system_health: Saúde do sistema
1274
1328
  swallowed_exceptions: Detecção de exceções engolidas
1329
+ missing_translations: "Rastreamento de traduções ausentes"
1330
+ boot_errors: "Captura de erros de inicialização"
1275
1331
  rack_attack: Monitoramento do Rack Attack
1276
1332
  actioncable: Monitoramento do ActionCable
1277
1333
  activestorage: Monitoramento do ActiveStorage
@@ -1680,6 +1736,13 @@ pt-BR:
1680
1736
  guide_link: Guia do ActionCable
1681
1737
  activestorage:
1682
1738
  title: Saúde do ActiveStorage
1739
+ probe:
1740
+ title: "Alcançabilidade do serviço"
1741
+ reachable: "Alcançável"
1742
+ unreachable: "Inalcançável"
1743
+ service: "Serviço: %{name}"
1744
+ latency: "%{ms} ms de ida e volta"
1745
+ how: "Uma verificação de existência de uma chave que nunca é armazenada, feita ao carregar esta página. GET /health executa a mesma sonda."
1683
1746
  empty:
1684
1747
  title: Nenhum evento do ActiveStorage encontrado
1685
1748
  message: Nenhuma operação do serviço ActiveStorage foi detectada nos breadcrumbs