From 61cd19c5406f43e9f5262f9bf63fee2831994286 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Wed, 16 Apr 2025 09:25:18 +0100 Subject: [PATCH] Chore: More internationalisation markup (#104051) * More markup * fix some ternaries * more alerting markup * fix unit tests --- .betterer.results | 306 +----------------- .../components/ColorPicker/ColorSwatch.tsx | 7 +- .../DateTimePickers/TimeRangePicker.test.tsx | 2 +- .../TimeRangePicker/TimeRangeContent.tsx | 2 +- .../DateTimePickers/TimeSyncButton.tsx | 7 +- .../InteractiveTable/Expander/index.tsx | 12 +- .../components/PanelChrome/PanelChrome.tsx | 5 +- .../Table/TableNG/Cells/RowExpander.tsx | 7 +- .../components/Table/TableRT/RowExpander.tsx | 7 +- .../UsersIndicator/UsersIndicator.tsx | 5 +- .../AppChrome/History/HistoryWrapper.tsx | 6 +- .../PasswordField/PasswordField.tsx | 8 +- .../components/RolePicker/RolePickerInput.tsx | 4 +- .../admin/AdminFeatureTogglesPage.tsx | 12 +- .../admin/AdminFeatureTogglesTable.tsx | 4 +- public/app/features/admin/UserSessions.tsx | 2 +- .../features/alerting/unified/AlertGroups.tsx | 13 +- .../unified/GrafanaRuleQueryViewer.tsx | 17 +- .../alerting/unified/PanelAlertTabContent.tsx | 9 +- .../unified/components/AlertLabels.tsx | 5 +- .../GrafanaAlertmanagerDeliveryWarning.tsx | 26 +- .../components/InvalidIntervalWarning.tsx | 14 +- .../unified/components/MoreButton.tsx | 14 +- .../components/NoAlertManagerWarning.tsx | 12 +- .../components/alert-groups/AlertDetails.tsx | 22 +- .../components/alert-groups/AlertGroup.tsx | 20 +- .../alert-groups/AlertGroupAlertsTable.tsx | 17 +- .../alert-groups/AlertStateFilter.tsx | 16 +- .../components/alert-groups/GroupBy.tsx | 12 +- .../contact-points/ContactPointHeader.tsx | 13 +- .../components/GlobalConfigAlert.tsx | 12 +- .../contact-points/components/Modals.tsx | 4 +- .../components/export/GrafanaModifyExport.tsx | 6 +- .../components/expressions/Expression.tsx | 10 +- .../mute-timings/MuteTimingTimeInterval.tsx | 10 +- .../notification-policies/Policy.tsx | 16 +- .../PromDurationDocs.tsx | 8 +- .../NewRuleFromPanelButton.tsx | 4 +- .../receivers/AlertInstanceModalSelector.tsx | 6 +- .../components/receivers/ReceiversSection.tsx | 4 +- .../components/receivers/TemplateDataDocs.tsx | 4 +- .../receivers/form/CloudReceiverForm.tsx | 6 +- .../receivers/form/GrafanaReceiverForm.tsx | 8 +- .../receivers/form/ReceiverForm.tsx | 10 +- .../receivers/form/TestContactPointModal.tsx | 12 +- .../form/fields/SubformArrayField.tsx | 1 + .../rule-editor/AnnotationsStep.tsx | 13 +- .../rule-editor/CloudAlertPreview.tsx | 6 +- .../rule-editor/DurationQuickPick.tsx | 3 +- .../rule-editor/ExpressionEditor.tsx | 15 +- .../rule-editor/NotificationsStep.tsx | 55 ++-- .../components/rule-editor/PreviewRule.tsx | 4 +- .../CloudDataSourceSelector.tsx | 7 +- .../SimpleCondition.tsx | 8 +- .../auth-config/ProviderConfigPage.tsx | 8 +- .../auth-config/components/ProviderCard.tsx | 10 +- .../NoAccessModal/NoAccessModal.tsx | 13 +- .../components/HelpWizard/HelpWizard.tsx | 4 +- .../PanelEditor/OptionsPaneOptions.tsx | 5 +- .../PanelEditor/VisualizationButton.tsx | 12 +- .../SubMenu/DashboardLinksDashboard.tsx | 7 +- .../TransformationOperationRow.tsx | 1 + .../datasources/components/CloudInfoBox.tsx | 34 +- .../components/DataSourceTypeCard.tsx | 8 +- .../picker/AddNewDataSourceButton.tsx | 11 +- .../components/useDataSourceInfo.tsx | 11 +- .../ThresholdsEditor.test.tsx | 4 +- .../ThresholdsEditor/ThresholdsEditor.tsx | 14 +- .../explore/ContentOutline/ContentOutline.tsx | 8 +- .../CorrelationTransformationAddModal.tsx | 18 +- .../explore/ExploreRunQueryButton.tsx | 1 + .../explore/Logs/LogsTableAvailableFields.tsx | 8 +- .../app/features/explore/TimeSyncButton.tsx | 8 +- .../Actions/TracePageActions.tsx | 6 +- .../panel/components/PanelPluginError.tsx | 19 +- .../VizTypePicker/PanelTypeCard.tsx | 4 +- .../GetStartedWithDataSource.tsx | 9 +- .../admin/components/PluginListItem.tsx | 16 +- .../components/ServiceAccountTokensTable.tsx | 12 +- .../WindowOptionsEditor.tsx | 13 +- .../OrganizeFieldsTransformerEditor.tsx | 6 +- .../ExtractFieldsTransformerEditor.tsx | 4 +- .../variables/adhoc/picker/AdHocFilterKey.tsx | 16 +- public/locales/en-US/grafana.json | 242 ++++++++++++-- 84 files changed, 841 insertions(+), 529 deletions(-) diff --git a/.betterer.results b/.betterer.results index c37967f6d8c..0cb370261b0 100644 --- a/.betterer.results +++ b/.betterer.results @@ -523,9 +523,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/Combobox/MultiCombobox.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -543,10 +540,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/components/DateTimePickers/TimeSyncButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/components/Forms/Legacy/Input/Input.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -564,12 +557,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] - ], "packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -586,9 +573,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], - "packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/PanelChrome/PanelContext.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -651,10 +635,6 @@ exports[`better eslint`] = { "packages/grafana-ui/src/components/Table/TableCellInspector.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "packages/grafana-ui/src/components/Table/TableNG/Cells/RowExpander.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/components/Table/TableNG/Filter/Filter.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -702,10 +682,6 @@ exports[`better eslint`] = { "packages/grafana-ui/src/components/Table/TableRT/HeaderRow.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "packages/grafana-ui/src/components/Table/TableRT/RowExpander.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/components/Table/TableRT/Table.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -731,9 +707,6 @@ exports[`better eslint`] = { "packages/grafana-ui/src/components/Tags/Tag.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "packages/grafana-ui/src/components/UsersIndicator/UsersIndicator.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "packages/grafana-ui/src/components/ValuePicker/ValuePicker.tsx:5381": [ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"] ], @@ -834,9 +807,6 @@ exports[`better eslint`] = { "public/app/core/components/AccessControl/index.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] ], - "public/app/core/components/AppChrome/History/HistoryWrapper.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/core/components/DynamicImports/SafeDynamicImport.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -851,13 +821,6 @@ exports[`better eslint`] = { "public/app/core/components/LocalStorageValueProvider/index.tsx:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./LocalStorageValueProvider\`)", "0"] ], - "public/app/core/components/PasswordField/PasswordField.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], - "public/app/core/components/RolePicker/RolePickerInput.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "public/app/core/components/TagFilter/TagFilter.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -975,17 +938,6 @@ exports[`better eslint`] = { "public/app/features/actions/ParamsEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/admin/AdminFeatureTogglesPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/admin/AdminFeatureTogglesTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/admin/UserSessions.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/routes.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -1015,25 +967,10 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/features/alerting/unified/AlertGroups.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], - "public/app/features/alerting/unified/PanelAlertTabContent.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/RedirectToRuleViewer.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/alerting/unified/components/AlertLabels.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/components/AnnotationDetailsField.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -1041,32 +978,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/MoreButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/alerting/unified/components/alert-groups/AlertDetails.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], - "public/app/features/alerting/unified/components/alert-groups/AlertGroup.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/alert-groups/AlertGroupAlertsTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/components/alert-groups/AlertGroupFilter.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -1074,93 +985,30 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "public/app/features/alerting/unified/components/alert-groups/AlertStateFilter.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], "public/app/features/alerting/unified/components/alert-groups/GroupBy.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/alerting/unified/components/contact-points/ContactPointHeader.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], - "public/app/features/alerting/unified/components/contact-points/components/GlobalConfigAlert.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], - "public/app/features/alerting/unified/components/contact-points/components/Modals.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/features/alerting/unified/components/export/FileExportPreview.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], - "public/app/features/alerting/unified/components/export/GrafanaModifyExport.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/expressions/Expression.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/alerting/unified/components/mute-timings/MuteTimingTimeInterval.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/notification-policies/Policy.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] - ], - "public/app/features/alerting/unified/components/notification-policies/PromDurationDocs.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/panel-alerts-tab/NewRuleFromPanelButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/receivers/AlertInstanceModalSelector.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/receivers/ReceiversSection.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/components/receivers/TemplateDataDocs.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/receivers/form/ChannelOptions.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/features/alerting/unified/components/receivers/form/CloudReceiverForm.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/alerting/unified/components/receivers/form/GrafanaReceiverForm.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "Unexpected any. Specify a different type.", "4"] - ], - "public/app/features/alerting/unified/components/receivers/form/TestContactPointModal.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], "public/app/features/alerting/unified/components/receivers/form/fields/OptionField.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -1171,9 +1019,8 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], "public/app/features/alerting/unified/components/receivers/form/fields/SubformArrayField.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"] + [0, 0, 0, "Unexpected any. Specify a different type.", "0"], + [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], "public/app/features/alerting/unified/components/receivers/form/fields/SubformField.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -1182,12 +1029,6 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/rule-editor/AnnotationKeyInput.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/components/rule-editor/DashboardAnnotationField.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] @@ -1196,25 +1037,11 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/alerting/unified/components/rule-editor/DurationQuickPick.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/features/alerting/unified/components/rule-editor/PreviewRuleResult.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -1256,18 +1083,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/CloudDataSourceSelector.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/SimpleCondition.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/SmartAlertTypeDetector.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], @@ -1420,14 +1239,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/auth-config/ProviderConfigPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], - "public/app/features/auth-config/components/ProviderCard.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/auth-config/fields.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], @@ -1475,10 +1286,6 @@ exports[`better eslint`] = { "public/app/features/connections/tabs/ConnectData/ConnectData.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/features/connections/tabs/ConnectData/NoAccessModal/index.tsx:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] ], @@ -1777,9 +1584,6 @@ exports[`better eslint`] = { "public/app/features/dashboard/components/GenAI/MinimalisticPagination.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "public/app/features/dashboard/components/Inspector/PanelInspector.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -1794,9 +1598,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"] ], - "public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "public/app/features/dashboard/components/PanelEditor/OverrideCategoryTitle.tsx:5381": [ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], @@ -1804,12 +1605,6 @@ exports[`better eslint`] = { [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "public/app/features/dashboard/components/PanelEditor/VisualizationButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] - ], "public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx:5381": [ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"] ], @@ -1876,11 +1671,7 @@ exports[`better eslint`] = { ], "public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"] - ], - "public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRow.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] + [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], "public/app/features/dashboard/components/TransformationsEditor/TransformationPicker.tsx:5381": [ [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], @@ -2067,23 +1858,11 @@ exports[`better eslint`] = { "public/app/features/datasources/components/ButtonRow.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/datasources/components/CloudInfoBox.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/features/datasources/components/DataSourcePluginConfigPage.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/datasources/components/DataSourceTypeCard.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"] - ], - "public/app/features/datasources/components/picker/AddNewDataSourceButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "public/app/features/datasources/components/useDataSourceInfo.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] + [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"] ], "public/app/features/datasources/state/actions.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -2125,8 +1904,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingEditRow.tsx:5381": [ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] @@ -2161,27 +1939,12 @@ exports[`better eslint`] = { "public/app/features/dimensions/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/explore/ContentOutline/ContentOutline.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/explore/CorrelationHelper.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], - "public/app/features/explore/CorrelationTransformationAddModal.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] - ], - "public/app/features/explore/ExploreRunQueryButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "public/app/features/explore/FeatureTogglePage.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], @@ -2197,9 +1960,6 @@ exports[`better eslint`] = { "public/app/features/explore/Logs/LogsSamplePanel.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/explore/Logs/LogsTableAvailableFields.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "public/app/features/explore/Logs/LogsTableMultiSelect.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], @@ -2221,18 +1981,10 @@ exports[`better eslint`] = { "public/app/features/explore/ShortLinkButtonMenu.tsx:5381": [ [0, 0, 0, "Do not use the t() function outside of a component or function", "0"] ], - "public/app/features/explore/TimeSyncButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/explore/TraceView/TraceView.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], @@ -2516,18 +2268,12 @@ exports[`better eslint`] = { "public/app/features/org/state/reducers.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/panel/components/PanelPluginError.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], "public/app/features/panel/components/PanelRenderer.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/panel/components/VizTypePicker/PanelTypeCard.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"] + [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"] ], "public/app/features/panel/panellinks/linkSuppliers.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -2558,8 +2304,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not re-export imported variable (\`./PluginUpdateAvailableBadge\`)", "4"] ], "public/app/features/plugins/admin/components/GetStartedWithPlugin/GetStartedWithDataSource.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/plugins/admin/components/GetStartedWithPlugin/index.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./GetStartedWithPlugin\`)", "0"] @@ -2593,10 +2338,6 @@ exports[`better eslint`] = { "public/app/features/plugins/admin/components/PluginDetailsSignature.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/plugins/admin/components/PluginListItem.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/features/plugins/admin/components/PluginUsage.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] @@ -2750,11 +2491,6 @@ exports[`better eslint`] = { "public/app/features/serviceaccounts/components/ServiceAccountProfileRow.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], "public/app/features/serviceaccounts/state/reducers.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -2824,11 +2560,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/index.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`CalculateFieldTransformerEditor\`)", "0"], @@ -2851,10 +2583,6 @@ exports[`better eslint`] = { "public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "public/app/features/transformers/editors/ReduceTransformerEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -2864,9 +2592,8 @@ exports[`better eslint`] = { "public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"], - [0, 0, 0, "Unexpected any. Specify a different type.", "4"] + [0, 0, 0, "Unexpected any. Specify a different type.", "2"], + [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], "public/app/features/transformers/extractFields/components/JSONPathEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -2916,9 +2643,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/features/variables/adhoc/picker/AdHocFilterKey.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "public/app/features/variables/constant/reducer.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx index 01a96edb421..4b6d2a29d9f 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx @@ -7,6 +7,7 @@ import { GrafanaTheme2 } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { useTheme2 } from '../../themes/ThemeContext'; +import { t } from '../../utils/i18n'; /** @internal */ export enum ColorSwatchVariant { @@ -36,7 +37,11 @@ export const ColorSwatch = React.forwardRef( { {sessions && sessions.map((session, index) => ( - {session.isActive ? 'Now' : session.seenAt} + {session.isActive ? t('admin.user-sessions.now', 'Now') : session.seenAt} {formatDate(session.createdAt, { dateStyle: 'long' })} {session.clientIp} {`${session.browser} on ${session.os} ${session.osVersion}`} diff --git a/public/app/features/alerting/unified/AlertGroups.tsx b/public/app/features/alerting/unified/AlertGroups.tsx index 6a445634b4c..9952181593c 100644 --- a/public/app/features/alerting/unified/AlertGroups.tsx +++ b/public/app/features/alerting/unified/AlertGroups.tsx @@ -75,8 +75,10 @@ const AlertGroups = () => { 'Grafana alerts are not delivered to Grafana Alertmanager' )} > - Grafana is configured to send alerts to external alertmanagers only. No alerts are expected to be available - here for the selected Alertmanager. + + Grafana is configured to send alerts to external alertmanagers only. No alerts are expected to be available + here for the selected Alertmanager. + )} @@ -88,7 +90,12 @@ const AlertGroups = () => { (index === 0 && Object.keys(group.labels).length > 0)) && ( - Grouped by: {Object.keys(group.labels).join(', ')} + + Grouped by: {'{{labels}}'} + )} diff --git a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx index c42a3025623..a594d312c16 100644 --- a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx +++ b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx @@ -123,7 +123,12 @@ export function QueryPreview({ if (relativeTimeRange) { headerItems.push( - {rangeUtil.secondsToHms(relativeTimeRange.from)} to now + + {'{{from}}'} to now + ); } @@ -229,7 +234,11 @@ function ExpressionPreview({ refId, model, evalData, isAlertCondition }: Express return ; default: - return <>Expression not supported: {model.type}; + return ( + + Expression not supported: {'{{type}}'} + + ); } } @@ -344,7 +353,9 @@ function ClassicConditionViewer({ model }: { model: ExpressionQuery }) { return (
- {index === 0 ? 'WHEN' : !!operator?.type && evalOperators[operator?.type]?.text} + {index === 0 + ? t('alerting.classic-condition-viewer.when', 'WHEN') + : !!operator?.type && evalOperators[operator?.type]?.text}
{reducer?.type && reducerFunctions[reducer.type]?.text}
diff --git a/public/app/features/alerting/unified/PanelAlertTabContent.tsx b/public/app/features/alerting/unified/PanelAlertTabContent.tsx index d8fb22ac0ab..760af9cbf9f 100644 --- a/public/app/features/alerting/unified/PanelAlertTabContent.tsx +++ b/public/app/features/alerting/unified/PanelAlertTabContent.tsx @@ -36,7 +36,14 @@ export const PanelAlertTabContent = ({ dashboard, panel }: Props) => { severity="error" > {errors.map((error, index) => ( -
Failed to load Grafana rules state: {stringifyErrorLike(error)}
+
+ + Failed to load Grafana rules state: {'{{error}}'} + +
))} ) : null; diff --git a/public/app/features/alerting/unified/components/AlertLabels.tsx b/public/app/features/alerting/unified/components/AlertLabels.tsx index b3273099967..77631820168 100644 --- a/public/app/features/alerting/unified/components/AlertLabels.tsx +++ b/public/app/features/alerting/unified/components/AlertLabels.tsx @@ -1,6 +1,5 @@ import { css } from '@emotion/css'; import { chain } from 'lodash'; -import pluralize from 'pluralize'; import { useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; @@ -56,7 +55,9 @@ export const AlertLabels = ({ labels, commonLabels = {}, size, onClick }: Props) tooltipPlacement="top" size="sm" > - +{commonLabelsCount} common {pluralize('label', commonLabelsCount)} + + +{'{{count}}'} common labels + )} {showCommonLabels && hasCommonLabels && ( diff --git a/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx b/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx index 4c0294d63d2..227446db02b 100644 --- a/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx +++ b/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx @@ -2,7 +2,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { Alert, useStyles2 } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { AlertmanagerChoice } from '../../../../plugins/datasource/alertmanager/types'; import { alertmanagerApi } from '../api/alertmanagerApi'; @@ -47,11 +47,15 @@ export function GrafanaAlertmanagerDeliveryWarning({ currentAlertmanager }: Graf 'Grafana alerts are not delivered to Grafana Alertmanager' )} > - Grafana is configured to send alerts to external Alertmanagers only. Changing Grafana Alertmanager configuration - will not affect delivery of your alerts. + + Grafana is configured to send alerts to external Alertmanagers only. Changing Grafana Alertmanager + configuration will not affect delivery of your alerts. +
- To change your Alertmanager setup, go to the Alerting Admin page. If you do not have access, contact your - Administrator. + + To change your Alertmanager setup, go to the Alerting Admin page. If you do not have access, contact your + Administrator. +
); @@ -66,11 +70,15 @@ export function GrafanaAlertmanagerDeliveryWarning({ currentAlertmanager }: Graf )} severity="warning" > - Ensure you make configuration changes in the correct Alertmanagers; both internal and external. Changing one - will not affect the others. + + Ensure you make configuration changes in the correct Alertmanagers; both internal and external. Changing one + will not affect the others. +
- To change your Alertmanager setup, go to the Alerting Admin page. If you do not have access, contact your - Administrator. + + To change your Alertmanager setup, go to the Alerting Admin page. If you do not have access, contact your + Administrator. +
); diff --git a/public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx b/public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx index 12123c808b3..6f2ae305df8 100644 --- a/public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx +++ b/public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx @@ -1,6 +1,6 @@ import { config } from '@grafana/runtime'; import { Alert } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; const EvaluationIntervalLimitExceeded = () => ( ( 'Global evaluation interval limit exceeded' )} > - A minimum evaluation interval of {config.unifiedAlerting.minInterval} has been configured in - Grafana. -
- Please contact the administrator to configure a lower interval. + + A minimum evaluation interval of {'{{minInterval}}'} has been configured in Grafana. +
+ Please contact the administrator to configure a lower interval. +
); diff --git a/public/app/features/alerting/unified/components/MoreButton.tsx b/public/app/features/alerting/unified/components/MoreButton.tsx index a4362551214..c1e3a84500e 100644 --- a/public/app/features/alerting/unified/components/MoreButton.tsx +++ b/public/app/features/alerting/unified/components/MoreButton.tsx @@ -2,11 +2,21 @@ import { Ref, forwardRef } from 'react'; import { Button, ButtonProps, Icon, Stack } from '@grafana/ui'; +import { Trans, t } from '../../../../core/internationalization'; + const MoreButton = forwardRef(function MoreButton(props: ButtonProps, ref: Ref) { return ( - ); diff --git a/public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx b/public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx index bec960d76d1..65493e50ae0 100644 --- a/public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx +++ b/public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx @@ -1,5 +1,5 @@ import { Alert } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { AlertManagerDataSource } from '../utils/datasource'; @@ -12,7 +12,9 @@ const NoAlertManagersAvailable = () => ( title={t('alerting.no-alert-managers-available.title-no-alertmanager-found', 'No Alertmanager found')} severity="warning" > - We could not find any external Alertmanagers and you may not have access to the built-in Grafana Alertmanager. + + We could not find any external Alertmanagers and you may not have access to the built-in Grafana Alertmanager. + ); @@ -24,8 +26,10 @@ const OtherAlertManagersAvailable = () => ( )} severity="warning" > - The selected Alertmanager no longer exists or you may not have permission to access it. You can select a different - Alertmanager from the dropdown. + + The selected Alertmanager no longer exists or you may not have permission to access it. You can select a different + Alertmanager from the dropdown. + ); diff --git a/public/app/features/alerting/unified/components/alert-groups/AlertDetails.tsx b/public/app/features/alerting/unified/components/alert-groups/AlertDetails.tsx index 91763ac26e5..47a6e4b9745 100644 --- a/public/app/features/alerting/unified/components/alert-groups/AlertDetails.tsx +++ b/public/app/features/alerting/unified/components/alert-groups/AlertDetails.tsx @@ -2,7 +2,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { LinkButton, useStyles2 } from '@grafana/ui'; -import { Trans } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { contextSrv } from 'app/core/services/context_srv'; import { AlertState, AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types'; import { AccessControlAction } from 'app/types'; @@ -60,7 +60,9 @@ export const AlertDetails = ({ alert, alertManagerSourceName }: AmNotificationsA )} {isSeeSourceButtonEnabled && alert.generatorURL && ( - {isGrafanaSource ? 'See alert rule' : 'See source'} + {isGrafanaSource + ? t('alerting.alert-details.button-see-rule', 'See alert rule') + : t('alerting.alert-details.button-see-source', 'See source')} )}
@@ -68,11 +70,17 @@ export const AlertDetails = ({ alert, alertManagerSourceName }: AmNotificationsA ))}
- Receivers:{' '} - {alert.receivers - .map(({ name }) => name) - .filter((name) => !!name) - .join(', ')} + name) + .filter((name) => !!name) + .join(', '), + }} + > + Receivers: {'{{receivers}}'} +
); diff --git a/public/app/features/alerting/unified/components/alert-groups/AlertGroup.tsx b/public/app/features/alerting/unified/components/alert-groups/AlertGroup.tsx index c87295268cd..4e19f3f39af 100644 --- a/public/app/features/alerting/unified/components/alert-groups/AlertGroup.tsx +++ b/public/app/features/alerting/unified/components/alert-groups/AlertGroup.tsx @@ -43,15 +43,17 @@ export const AlertGroup = ({ alertManagerSourceName, group }: Props) => { {receiverInGroup && ( - Delivered to{' '} - - {group.receiver.name} - + + Delivered to{' '} + + {'{{name}}'} + + )} diff --git a/public/app/features/alerting/unified/components/alert-groups/AlertGroupAlertsTable.tsx b/public/app/features/alerting/unified/components/alert-groups/AlertGroupAlertsTable.tsx index 75c371441b1..54b5b164bb8 100644 --- a/public/app/features/alerting/unified/components/alert-groups/AlertGroupAlertsTable.tsx +++ b/public/app/features/alerting/unified/components/alert-groups/AlertGroupAlertsTable.tsx @@ -5,6 +5,7 @@ import { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/dat import { useStyles2 } from '@grafana/ui'; import { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types'; +import { Trans } from '../../../../../core/internationalization'; import { AlertLabels } from '../AlertLabels'; import { DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable'; import { DynamicTableWithGuidelines } from '../DynamicTableWithGuidelines'; @@ -33,11 +34,17 @@ export const AlertGroupAlertsTable = ({ alerts, alertManagerSourceName }: Props) <> - for{' '} - {intervalToAbbreviatedDurationString({ - start: new Date(alert.startsAt), - end: new Date(alert.endsAt), - })} + + for {'{{time}}'} + ), diff --git a/public/app/features/alerting/unified/components/alert-groups/AlertStateFilter.tsx b/public/app/features/alerting/unified/components/alert-groups/AlertStateFilter.tsx index f6363f01db6..e88795898f3 100644 --- a/public/app/features/alerting/unified/components/alert-groups/AlertStateFilter.tsx +++ b/public/app/features/alerting/unified/components/alert-groups/AlertStateFilter.tsx @@ -19,21 +19,29 @@ export const AlertStateFilter = ({ onStateFilterChange, stateFilter }: Props) => return (
} diff --git a/public/app/features/alerting/unified/components/alert-groups/GroupBy.tsx b/public/app/features/alerting/unified/components/alert-groups/GroupBy.tsx index 62b6f407a16..c22f387a4de 100644 --- a/public/app/features/alerting/unified/components/alert-groups/GroupBy.tsx +++ b/public/app/features/alerting/unified/components/alert-groups/GroupBy.tsx @@ -2,7 +2,7 @@ import { uniq } from 'lodash'; import { SelectableValue } from '@grafana/data'; import { Icon, Label, MultiSelect, Tooltip } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { AlertmanagerGroup } from 'app/plugins/datasource/alertmanager/types'; import { isPrivateLabelKey } from '../../utils/labels'; @@ -24,12 +24,16 @@ export const GroupBy = ({ groups, groupBy, onGroupingChange }: Props) => { return (
} > diff --git a/public/app/features/alerting/unified/components/contact-points/ContactPointHeader.tsx b/public/app/features/alerting/unified/components/contact-points/ContactPointHeader.tsx index 45050e0f9e5..511d5741a78 100644 --- a/public/app/features/alerting/unified/components/contact-points/ContactPointHeader.tsx +++ b/public/app/features/alerting/unified/components/contact-points/ContactPointHeader.tsx @@ -216,7 +216,14 @@ export const ContactPointHeader = ({ contactPoint, onDelete }: ContactPointHeade - {canEdit ? 'Edit' : 'View'} + {canEdit + ? t('alerting.contact-point-header.button-edit', 'Edit') + : t('alerting.contact-point-header.button-view', 'View')} {menuActions.length > 0 && ( {menuActions}}> diff --git a/public/app/features/alerting/unified/components/contact-points/components/GlobalConfigAlert.tsx b/public/app/features/alerting/unified/components/contact-points/components/GlobalConfigAlert.tsx index 41ac5ada192..5563c4945fc 100644 --- a/public/app/features/alerting/unified/components/contact-points/components/GlobalConfigAlert.tsx +++ b/public/app/features/alerting/unified/components/contact-points/components/GlobalConfigAlert.tsx @@ -1,5 +1,5 @@ import { Alert, LinkButton } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { AlertmanagerAction } from '../../../hooks/useAbilities'; import { isVanillaPrometheusAlertManagerDataSource } from '../../../utils/datasource'; @@ -23,11 +23,15 @@ export const GlobalConfigAlert = ({ alertManagerName }: GlobalConfigAlertProps) )} >

- For each external Alertmanager you can define global settings, like server addresses, usernames and password, - for all the supported contact points. + + For each external Alertmanager you can define global settings, like server addresses, usernames and + password, for all the supported contact points. +

- {isVanillaAM ? 'View global config' : 'Edit global config'} + {isVanillaAM + ? t('alerting.global-config-alert.view-global-config', 'View global config') + : t('alerting.global-config-alert.edit-global-config', 'Edit global config')} diff --git a/public/app/features/alerting/unified/components/contact-points/components/Modals.tsx b/public/app/features/alerting/unified/components/contact-points/components/Modals.tsx index bcc282bd166..4e383e7ba8c 100644 --- a/public/app/features/alerting/unified/components/contact-points/components/Modals.tsx +++ b/public/app/features/alerting/unified/components/contact-points/components/Modals.tsx @@ -72,7 +72,9 @@ export const useDeleteContactPointModal = (
diff --git a/public/app/features/alerting/unified/components/receivers/TemplateDataDocs.tsx b/public/app/features/alerting/unified/components/receivers/TemplateDataDocs.tsx index 99ce822cf8f..e24eec32b25 100644 --- a/public/app/features/alerting/unified/components/receivers/TemplateDataDocs.tsx +++ b/public/app/features/alerting/unified/components/receivers/TemplateDataDocs.tsx @@ -113,7 +113,9 @@ function KeyValueTemplateDataTable() { return (
- KeyValue is a set of key/value string pairs that represent labels and annotations. + + KeyValue is a set of key/value string pairs that represent labels and annotations. +
         {KeyValueCodeSnippet}
       
diff --git a/public/app/features/alerting/unified/components/receivers/form/CloudReceiverForm.tsx b/public/app/features/alerting/unified/components/receivers/form/CloudReceiverForm.tsx index 324172fac42..74e3cf7b1f8 100644 --- a/public/app/features/alerting/unified/components/receivers/form/CloudReceiverForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/CloudReceiverForm.tsx @@ -2,7 +2,7 @@ import { useMemo } from 'react'; import { locationService } from '@grafana/runtime'; import { Alert } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { alertmanagerApi } from 'app/features/alerting/unified/api/alertmanagerApi'; import { useCreateContactPoint, @@ -76,7 +76,9 @@ export const CloudReceiverForm = ({ contactPoint, alertManagerSourceName, readOn <> {!isVanillaAM && ( - Note that empty string values will be replaced with global defaults where appropriate. + + Note that empty string values will be replaced with global defaults where appropriate. + )} diff --git a/public/app/features/alerting/unified/components/receivers/form/GrafanaReceiverForm.tsx b/public/app/features/alerting/unified/components/receivers/form/GrafanaReceiverForm.tsx index 0bb619d7d4e..c9d0fce26cc 100644 --- a/public/app/features/alerting/unified/components/receivers/form/GrafanaReceiverForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/GrafanaReceiverForm.tsx @@ -2,7 +2,7 @@ import { useMemo, useState } from 'react'; import { locationService } from '@grafana/runtime'; import { Alert, LoadingPlaceholder } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { Trans, t } from 'app/core/internationalization'; import { useCreateContactPoint, useUpdateContactPoint, @@ -168,8 +168,10 @@ export const GrafanaReceiverForm = ({ contactPoint, readOnly = false, editMode } 'Loading OnCall integration failed' )} > - Grafana OnCall plugin has been enabled in your Grafana instances but it is not reachable. Please check the - plugin configuration + + Grafana OnCall plugin has been enabled in your Grafana instances but it is not reachable. Please check the + plugin configuration + )} diff --git a/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx b/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx index a61ba6bba63..c8415ee6488 100644 --- a/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx @@ -129,14 +129,20 @@ export function ReceiverForm({ {showDefaultRouteWarning && ( - Because there is no default policy configured yet, this contact point will automatically be set as default. + + Because there is no default policy configured yet, this contact point will automatically be set as default. + )}

- {!isEditable ? 'Contact point' : initialValues ? 'Update contact point' : 'Create contact point'} + {!isEditable + ? t('alerting.receiver-form.contact-point', 'Contact point') + : initialValues + ? t('alerting.receiver-form.contact-point-update', 'Update contact point') + : t('alerting.receiver-form.contact-point-create', 'Create contact point')}

{canManagePermissions && contactPointId && ( { {notificationType === NotificationType.predefined && (
- You will send a test notification that uses a predefined alert. If you have defined a custom template or - message, for better results switch to custom notification message, from above. + + You will send a test notification that uses a predefined alert. If you have defined a custom template or + message, for better results switch to custom notification message, from above. +
)} {notificationType === NotificationType.custom && ( <>
- You will send a test notification that uses the annotations defined below. This is a good option if you - use custom templates and messages. + + You will send a test notification that uses the annotations defined below. This is a good option if + you use custom templates and messages. +
diff --git a/public/app/features/alerting/unified/components/receivers/form/fields/SubformArrayField.tsx b/public/app/features/alerting/unified/components/receivers/form/fields/SubformArrayField.tsx index 3bdb50a420a..421dd12ded3 100644 --- a/public/app/features/alerting/unified/components/receivers/form/fields/SubformArrayField.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/fields/SubformArrayField.tsx @@ -29,6 +29,7 @@ export const SubformArrayField = ({ option, pathPrefix, errors, defaultValues, r
diff --git a/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx b/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx index d98ec1341c1..8c8f69966bf 100644 --- a/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx @@ -181,9 +181,16 @@ const AnnotationsStep = () => { {...register(`annotations.${index}.value`)} placeholder={ isUrl - ? 'https://' - : (annotationField.key && `Enter a ${annotationField.key}...`) || - 'Enter custom annotation content...' + ? // eslint-disable-next-line @grafana/no-untranslated-strings + 'https://' + : (annotationField.key && + t('alerting.annotations-step.placeholder-value-input', 'Enter a {{key}}...', { + key: annotationField.key, + })) || + t( + 'alerting.annotations-step.placeholder-value-input-default', + 'Enter custom annotation content...' + ) } defaultValue={annotationField.value} /> diff --git a/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx b/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx index 81563078538..da31aa6e3a5 100644 --- a/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx @@ -23,7 +23,11 @@ export function CloudAlertPreview({ preview }: CloudAlertPreviewProps) {
Alerts preview
- Preview based on the result of running the query for this moment. + + + Preview based on the result of running the query for this moment. + + diff --git a/public/app/features/alerting/unified/components/rule-editor/DurationQuickPick.tsx b/public/app/features/alerting/unified/components/rule-editor/DurationQuickPick.tsx index 65912a2f23a..36844b9b75c 100644 --- a/public/app/features/alerting/unified/components/rule-editor/DurationQuickPick.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/DurationQuickPick.tsx @@ -1,5 +1,6 @@ import { Button, Stack } from '@grafana/ui'; +import { t } from '../../../../../core/internationalization'; import { formatPrometheusDuration, safeParsePrometheusDuration } from '../../utils/time'; interface Props { @@ -42,7 +43,7 @@ export function DurationQuickPick({ selectedDuration, groupEvaluationInterval, o onSelect(duration); }} > - {duration === '0s' ? 'None' : duration} + {duration === '0s' ? t('alerting.duration-quick-pick.none', 'None') : duration} ))} diff --git a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx index 6ef2d04ffba..f5c25807c3c 100644 --- a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx @@ -62,8 +62,19 @@ export const ExpressionEditor = ({ const dsi = getDataSourceSrv().getInstanceSettings(dataSourceName); if (error || !dataSource || !dataSource?.components?.QueryEditor || !dsi) { - const errorMessage = error?.message || 'Data source plugin does not export any Query Editor component'; - return
Could not load query editor due to: {errorMessage}
; + const errorMessage = + error?.message || + t( + 'alerting.expression-editor.error-no-component', + 'Data source plugin does not export any Query Editor component' + ); + return ( +
+ + Could not load query editor due to: {{ errorMessage }} + +
+ ); } const previewLoaded = alertPreview?.data.state === LoadingState.Done; diff --git a/public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx b/public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx index 73044c3e1e6..f7144ad525e 100644 --- a/public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx @@ -4,7 +4,7 @@ import { useFormContext } from 'react-hook-form'; import { GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime'; -import { Icon, RadioButtonGroup, Stack, Text, useStyles2 } from '@grafana/ui'; +import { RadioButtonGroup, Stack, Text, TextLink, useStyles2 } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; import { AlertmanagerChoice } from 'app/plugins/datasource/alertmanager/types'; @@ -99,7 +99,9 @@ export const NotificationsStep = ({ alertUid }: NotificationsStepProps) => { ) : ( shouldAllowSimplifiedRouting && ( - Select who should receive a notification when an alert rule fires. + + Select who should receive a notification when an alert rule fires. + ) )} @@ -245,21 +247,24 @@ function NeedHelpInfoForNotificationPolicy() { contentText={ - Firing alert instances are routed to notification policies based on matching labels. The default - notification policy matches all alert instances. + + Firing alert instances are routed to notification policies based on matching labels. The default + notification policy matches all alert instances. + - Custom labels change the way your notifications are routed. First, add labels to your alert rule and then - connect them to your notification policy by adding label matchers. - + Custom labels change the way your notifications are routed. First, add labels to your alert rule and then + connect them to your notification policy by adding label matchers. + + - - Read about notification policies. - - + + Read about notification policies. + + } @@ -273,13 +278,19 @@ function NeedHelpInfoForContactpoint() { - Select a contact point to notify all recipients in it. + + Select a contact point to notify all recipients in it. +
- Muting, grouping, and timings options allow you to customize how notifications are sent. + + Muting, grouping, and timings options allow you to customize how notifications are sent. +

- Alternatively, toggle the Advanced options button to route notifications using notification policies - for greater flexibility. + + Alternatively, toggle the Advanced options button to route notifications using notification policies + for greater flexibility. + } externalLink="https://grafana.com/docs/grafana/latest/alerting/fundamentals/notifications/" @@ -300,8 +311,14 @@ export const RoutingOptionDescription = ({ manualRouting }: NotificationsStepDes {manualRouting - ? 'Notifications for firing alerts are routed to a selected contact point.' - : 'Notifications for firing alerts are routed to contact points based on matching labels and the notification policy tree.'} + ? t( + 'alerting.routing-option-description.manual', + 'Notifications for firing alerts are routed to a selected contact point.' + ) + : t( + 'alerting.routing-option-description.matching-labels', + 'Notifications for firing alerts are routed to contact points based on matching labels and the notification policy tree.' + )} {manualRouting ? : } diff --git a/public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx b/public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx index d7a44253588..be839d9b3a1 100644 --- a/public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx @@ -46,7 +46,9 @@ export function PreviewRule(): React.ReactElement | null { title={t('alerting.preview-rule.title-preview-is-not-available', 'Preview is not available')} severity="warning" > - Cannot display the query preview. Some of the data sources used in the queries are not available. + + Cannot display the query preview. Some of the data sources used in the queries are not available. + )} diff --git a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/CloudDataSourceSelector.tsx b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/CloudDataSourceSelector.tsx index c450216bb64..d3e97042d64 100644 --- a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/CloudDataSourceSelector.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/CloudDataSourceSelector.tsx @@ -4,6 +4,7 @@ import { Controller, useFormContext } from 'react-hook-form'; import { DataSourceInstanceSettings, GrafanaTheme2 } from '@grafana/data'; import { Field, useStyles2 } from '@grafana/ui'; +import { t } from '../../../../../../core/internationalization'; import { RuleFormType, RuleFormValues } from '../../../types/rule-form'; import { CloudRulesSourcePicker } from '../CloudRulesSourcePicker'; @@ -27,7 +28,11 @@ export const CloudDataSourceSelector = ({ disabled, onChangeCloudDatasource }: C {(ruleFormType === RuleFormType.cloudAlerting || ruleFormType === RuleFormType.cloudRecording) && ( diff --git a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/SimpleCondition.tsx b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/SimpleCondition.tsx index a8acf2bdebf..104d4995ea0 100644 --- a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/SimpleCondition.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/SimpleCondition.tsx @@ -103,7 +103,13 @@ export const SimpleConditionEditor = ({ /> )} - + {isRange ? ( diff --git a/public/app/features/auth-config/ProviderConfigPage.tsx b/public/app/features/auth-config/ProviderConfigPage.tsx index 7e8e23b5e0f..d122e43336f 100644 --- a/public/app/features/auth-config/ProviderConfigPage.tsx +++ b/public/app/features/auth-config/ProviderConfigPage.tsx @@ -7,6 +7,8 @@ import { Page } from 'app/core/components/Page/Page'; import { PageNotFound } from 'app/core/components/PageNotFound/PageNotFound'; import { useDispatch, useSelector } from 'app/types'; +import { t } from '../../core/internationalization'; + import { ProviderConfigForm } from './ProviderConfigForm'; import { UIMap } from './constants'; import { loadProviders } from './state/actions'; @@ -59,7 +61,11 @@ export const ProviderConfigPage = () => { {title} diff --git a/public/app/features/auth-config/components/ProviderCard.tsx b/public/app/features/auth-config/components/ProviderCard.tsx index f255a3bc1d7..9497c0bb9b1 100644 --- a/public/app/features/auth-config/components/ProviderCard.tsx +++ b/public/app/features/auth-config/components/ProviderCard.tsx @@ -1,6 +1,7 @@ import { isIconName } from '@grafana/data'; import { Badge, Card, Icon } from '@grafana/ui'; +import { t } from '../../../core/internationalization'; import { UIMap } from '../constants'; import { getProviderUrl } from '../utils/url'; @@ -26,7 +27,14 @@ export function ProviderCard({ providerId, enabled, configPath, authType, onClic )} - + ); diff --git a/public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx b/public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx index aed8edf1dc1..9d2cfa2bd8c 100644 --- a/public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx +++ b/public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; -import { useStyles2, Modal, Icon, Button } from '@grafana/ui'; +import { useStyles2, Modal, Icon, Button, TextLink } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; import { type CardGridItem } from '../CardGrid'; @@ -72,16 +72,11 @@ export function NoAccessModal({ item, isOpen, onDismiss }: NoAccessModalProps) {
{item.description &&
{item.description}
}
- Links + Links
- + {item.name} - +
diff --git a/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx b/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx index 62bb8f2020c..919167ffe1e 100644 --- a/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx +++ b/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx @@ -180,7 +180,9 @@ export function HelpWizard({ panel, plugin, onClose }: Props) {
- {isPercent &&
%
} + {isPercent && ( + // eslint-disable-next-line @grafana/no-untranslated-strings +
%
+ )}
} suffix={ @@ -195,7 +201,9 @@ export class ThresholdsEditor extends PureComponent { className={styles.trashIcon} name="trash-alt" onClick={() => this.onRemoveThreshold(threshold)} - tooltip={`Remove ${ariaLabel}`} + tooltip={t('dimensions.threshold-editor.tooltip-remove-threshold', 'Remove threshold {{thresholdNumber}}', { + thresholdNumber, + })} /> } /> diff --git a/public/app/features/explore/ContentOutline/ContentOutline.tsx b/public/app/features/explore/ContentOutline/ContentOutline.tsx index 9cf9ad81828..2ecf00ea952 100644 --- a/public/app/features/explore/ContentOutline/ContentOutline.tsx +++ b/public/app/features/explore/ContentOutline/ContentOutline.tsx @@ -6,6 +6,8 @@ import { GrafanaTheme2, store } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { useStyles2, PanelContainer, ScrollContainer } from '@grafana/ui'; +import { t } from '../../../core/internationalization'; + import { ContentOutlineItemContextProps, useContentOutlineContext } from './ContentOutlineContext'; import { ContentOutlineItemButton } from './ContentOutlineItemButton'; @@ -158,7 +160,11 @@ export function ContentOutline({ scroller, panelId }: { scroller: HTMLElement |

- A transformation extracts variables out of a single field. These variables will be available along with your - field variables. + + A transformation extracts variables out of a single field. These variables will be available along with your + field variables. +

) : ( - 'Expression' + t('explore.correlation-transformation-add-modal.label-expression-without-tooltip', 'Expression') ) } htmlFor={`${id}-expression`} @@ -221,7 +223,7 @@ export const CorrelationTransformationAddModal = ({ tooltipText={formFieldsVis.mapValueDetails.helpText} /> ) : ( - 'Variable name' + t('explore.correlation-transformation-add-modal.label-variable-name-without-tooltip', 'Variable name') ) } htmlFor={`${id}-mapValue`} @@ -231,7 +233,9 @@ export const CorrelationTransformationAddModal = ({ )} {Object.entries(transformationVars).length > 0 && ( <> - This transformation will add the following variables: + + This transformation will add the following variables: +
                 {Object.entries(transformationVars).map((entry) => {
                   return `\$\{${entry[0]}\} = ${entry[1]?.value}\n`;
@@ -246,7 +250,9 @@ export const CorrelationTransformationAddModal = ({
           Cancel
         
         
       
     
diff --git a/public/app/features/explore/ExploreRunQueryButton.tsx b/public/app/features/explore/ExploreRunQueryButton.tsx
index 20f6fa3272b..16060e0a32b 100644
--- a/public/app/features/explore/ExploreRunQueryButton.tsx
+++ b/public/app/features/explore/ExploreRunQueryButton.tsx
@@ -108,6 +108,7 @@ export function ExploreRunQueryButton({
                   runQuery(pane[0]);
                   onClick?.();
                 }}
+                // eslint-disable-next-line @grafana/no-untranslated-strings
                 label={`${paneLabel}: ${buttonText.translation}`}
                 disabled={isInvalid || pane[0] === undefined}
               />
diff --git a/public/app/features/explore/Logs/LogsTableAvailableFields.tsx b/public/app/features/explore/Logs/LogsTableAvailableFields.tsx
index a305fac9bb6..54fb63072b0 100644
--- a/public/app/features/explore/Logs/LogsTableAvailableFields.tsx
+++ b/public/app/features/explore/Logs/LogsTableAvailableFields.tsx
@@ -1,5 +1,7 @@
 import { useTheme2 } from '@grafana/ui';
 
+import { t } from '../../../core/internationalization';
+
 import { getLogsFieldsStyles } from './LogsTableActiveFields';
 import { LogsTableEmptyFields } from './LogsTableEmptyFields';
 import { LogsTableNavField } from './LogsTableNavField';
@@ -43,7 +45,11 @@ export const LogsTableAvailableFields = (props: {
           
void; @@ -19,7 +21,11 @@ export function TimeSyncButton(props: TimeSyncButtonProps) { diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx index d7467b73dfd..ae06addfc09 100644 --- a/public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx +++ b/public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx @@ -88,7 +88,11 @@ export default function TracePageActions(props: TracePageActionsProps) { { render() { const text = ( - <> + Check the server startup logs for more information.
If this plugin was loaded from Git, then make sure it was compiled. - +
+ ); + return ( + ); - return ; } }; const plugin = new PanelPlugin(LoadError); @@ -53,7 +60,11 @@ export function getPanelPluginLoadError(meta: PanelPluginMeta, err: unknown): Pa export function getPanelPluginNotFound(id: string, silent?: boolean): PanelPlugin { const NotFound = class NotFound extends PureComponent { render() { - return ; + return ( + + ); } }; diff --git a/public/app/features/panel/components/VizTypePicker/PanelTypeCard.tsx b/public/app/features/panel/components/VizTypePicker/PanelTypeCard.tsx index d071937140b..826e7be8a55 100644 --- a/public/app/features/panel/components/VizTypePicker/PanelTypeCard.tsx +++ b/public/app/features/panel/components/VizTypePicker/PanelTypeCard.tsx @@ -50,7 +50,9 @@ const PanelTypeCardComponent = ({ aria-label={selectors.components.PluginVisualization.item(plugin.name)} data-testid={selectors.components.PluginVisualization.item(plugin.name)} onClick={isDisabled ? undefined : onClick} - title={isCurrent ? 'Click again to close this section' : plugin.name} + title={ + isCurrent ? t('panel.panel-type-card.title-click-to-close', 'Click again to close this section') : plugin.name + } > diff --git a/public/app/features/plugins/admin/components/GetStartedWithPlugin/GetStartedWithDataSource.tsx b/public/app/features/plugins/admin/components/GetStartedWithPlugin/GetStartedWithDataSource.tsx index 1aa3a12d410..9c9d1ce0743 100644 --- a/public/app/features/plugins/admin/components/GetStartedWithPlugin/GetStartedWithDataSource.tsx +++ b/public/app/features/plugins/admin/components/GetStartedWithPlugin/GetStartedWithDataSource.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { DataSourcePluginMeta } from '@grafana/data'; import { config } from '@grafana/runtime'; import { Button } from '@grafana/ui'; -import { Trans } from 'app/core/internationalization'; +import { t, Trans } from 'app/core/internationalization'; import { ROUTES } from 'app/features/connections/constants'; import { addDataSource } from 'app/features/datasources/state'; import { useDispatch } from 'app/types'; @@ -39,7 +39,12 @@ export function GetStartedWithDataSource({ plugin }: Props): React.ReactElement onClick={onAddDataSource} disabled={disabledButton} title={ - disabledButton ? "The plugin isn't usable yet, it may take some time to complete the installation." : undefined + disabledButton + ? t( + 'plugins.get-started-with-data-source.title-button-disabled', + "The plugin isn't usable yet, it may take some time to complete the installation." + ) + : undefined } > Add new data source diff --git a/public/app/features/plugins/admin/components/PluginListItem.tsx b/public/app/features/plugins/admin/components/PluginListItem.tsx index dce0ea7da73..89379e101a8 100644 --- a/public/app/features/plugins/admin/components/PluginListItem.tsx +++ b/public/app/features/plugins/admin/components/PluginListItem.tsx @@ -6,6 +6,7 @@ import { locationService, reportInteraction } from '@grafana/runtime'; import { Badge, Icon, Stack, useStyles2 } from '@grafana/ui'; import { SkeletonComponent, attachSkeleton } from '@grafana/ui/unstable'; +import { t, Trans } from '../../../../core/internationalization'; import { CatalogPlugin, PluginIconName } from '../types'; import { PluginListItemBadges } from './PluginListItemBadges'; @@ -35,11 +36,22 @@ function PluginListItemComponent({ plugin, pathName }: Props) {

{plugin.name}

-

By {plugin.orgName}

+

+ + By {'{{author}}'} + +

- {plugin.type && } + {plugin.type && ( + + )}
); diff --git a/public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx b/public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx index a5b2d037f39..18cc5c21d80 100644 --- a/public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx +++ b/public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx @@ -2,7 +2,7 @@ import { css, cx } from '@emotion/css'; import { dateTimeFormat, GrafanaTheme2, TimeZone } from '@grafana/data'; import { DeleteButton, Icon, Tooltip, useStyles2, useTheme2 } from '@grafana/ui'; -import { Trans } from 'app/core/internationalization'; +import { t, Trans } from 'app/core/internationalization'; import { ApiKey } from 'app/types'; interface Props { @@ -49,7 +49,11 @@ export const ServiceAccountTokensTable = ({ tokens, timeZone, tokenActionsDisabl {key.isRevoked && } onDelete(key)} disabled={tokenActionsDisabled} @@ -87,7 +91,7 @@ const TokenRevoked = () => { const styles = useStyles2(getStyles); return ( - Revoked + Revoked @@ -121,7 +125,7 @@ const TokenExpiration = ({ timeZone, token }: TokenExpirationProps) => { if (token.hasExpired) { return ( - Expired + Expired diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx index 3645d97cec0..a8342f4b3d1 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx @@ -120,12 +120,19 @@ export const WindowOptionsEditor = (props: { > onToggleVisibility(fieldName, visible)} - tooltip={visible ? 'Disable' : 'Enable'} + tooltip={ + visible + ? t('transformers.draggable-field-name.tooltip-disable', 'Disable') + : t('transformers.draggable-field-name.tooltip-enable', 'Enable') + } /> {fieldName} diff --git a/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx b/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx index 5527b0bd188..5c5384c7ee1 100644 --- a/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx +++ b/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx @@ -120,7 +120,9 @@ export const extractFieldsTransformerEditor = ({ label="RegExp" labelWidth={16} interactive={true} - tooltip="Example: /(?.*)/" + tooltip={t('transformers.extract-fields-transformer-editor.tooltip-regexp', 'Example: {{regexExample}}', { + regexExample: '/(?.*)/', + })} > fetchFilterKeys(datasource, filterKey, allFilters); const loadKeysWithRemove = () => fetchFilterKeysWithRemove(datasource, filterKey, allFilters); + const plusSegment: ReactElement = ( + + + + ); + if (filterKey === null) { return (
@@ -51,12 +61,6 @@ export const AdHocFilterKey = ({ datasource, onChange, disabled, filterKey, allF export const REMOVE_FILTER_KEY = '-- remove filter --'; const REMOVE_VALUE = { label: REMOVE_FILTER_KEY, value: REMOVE_FILTER_KEY }; -const plusSegment: ReactElement = ( - - - -); - const fetchFilterKeys = async ( datasource: DataSourceRef, currentKey: string | null, diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 332ba1e866b..10d203e6c85 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -1,5 +1,6 @@ { "_comment": "The code is the source of truth for English phrases. They should be updated in the components directly, and additional plurals specified in this file.", + "{{pageStart}} - {{pageEnd}} of {{numPages}}": "{{pageStart}} - {{pageEnd}} of {{numPages}}", "access-control": { "add-permission": { "built-in-aria-label": "Built-in role picker", @@ -73,6 +74,8 @@ "deprecated": "Deprecated", "ga": "GA" }, + "save-changes": "Save changes", + "saving": "Saving...", "title-apply-feature-toggle-changes": "Apply feature toggle changes" }, "admin-orgs-table": { @@ -108,6 +111,8 @@ "title-white-labeling": "White labeling" }, "feature-toggles": { + "restart-pending": "A restart is pending for your Grafana instance to apply the latest feature toggle changes", + "restart-required": "Saving feature toggle changes will prompt a restart of the instance, which may take a few minutes", "sub-title": "View and edit feature toggles. Read more about feature toggles at <2>grafana.com." }, "get-enterprise": { @@ -269,6 +274,7 @@ "ip-column": "IP address", "last-seen-column": "Last seen", "logged-on-column": "Logged on", + "now": "Now", "title": "Sessions" }, "users-create": { @@ -322,16 +328,25 @@ "target-datasource-uid": "Target data source" }, "alert-details": { + "button-see-rule": "See alert rule", + "button-see-source": "See source", "manage-silences": "Manage silences", + "receivers-list": "Receivers: {{receivers}}", "silence": "Silence" }, "alert-group": { + "delivered-to": "Delivered to <2>{{name}}", "no-grouping": "No grouping" }, + "alert-group-alerts-table": { + "duration": "for {{time}}" + }, "alert-group-filter": { "clear-filters": "Clear filters" }, "alert-groups": { + "body-grafana-alerted-delivered": "Grafana is configured to send alerts to external alertmanagers only. No alerts are expected to be available here for the selected Alertmanager.", + "grouped-by": "Grouped by: {{labels}}", "no-results": "No results.", "text-loading-notifications": "Loading notifications", "title-error-loading-notifications": "Error loading notifications", @@ -354,6 +369,7 @@ "alert-instance-modal-selector": { "add-alert-data-to-payload": "Add alert data to payload", "placeholder-search-alert-rule": "Search alert rule", + "select-alert-rule": "Select an alert rule to get a list of available firing instances", "text-loading-rule": "Loading rule...", "text-loading-rules": "Loading rules...", "title-search-alert-rule": "Search alert rule", @@ -369,7 +385,9 @@ "placeholder-select": "Choose {{type}}" }, "alert-labels": { - "aria-label-labels": "Labels" + "aria-label-labels": "Labels", + "common-labels-count_one": "+{{count}} common label", + "common-labels-count_other": "+{{count}} common labels" }, "alert-manager-manual-routing": { "label-muting-grouping-and-timings-optional": "Muting, grouping and timings (optional)", @@ -420,7 +438,10 @@ "text-loading-alert-rules": "Loading alert rules" }, "alert-state-filter": { - "suppressed-the-alert-has-been-silenced": "Suppressed: The alert has been silenced." + "active-the-alert-is-firing": "Active: The alert notification has been handled. The alert is still firing and continues to be managed.", + "notification-state": "Notification state", + "suppressed-the-alert-has-been-silenced": "Suppressed: The alert has been silenced.", + "unprocessed-the-alert-is-received": "Unprocessed: The alert is received but its notification has not been processed yet." }, "alert-warning": { "to-rule-list": "To rule list" @@ -566,7 +587,8 @@ "get-annotations-section-description": { "title-annotations": "Annotations" }, - "link-dashboard-and-panel": "Link dashboard and panel" + "link-dashboard-and-panel": "Link dashboard and panel", + "placeholder-value-input-default": "Enter custom annotation content..." }, "central-alert-history": { "details": { @@ -620,7 +642,8 @@ "test": "Test" }, "classic-condition-viewer": { - "of": "OF" + "of": "OF", + "when": "WHEN" }, "clone-rule-button": { "title-copy": "Copy" @@ -634,18 +657,24 @@ "alerts-preview": "Alerts preview", "info": "Info", "labels": "Labels", + "running-query-preview": "Preview based on the result of running the query for this moment.", "state": "State" }, "cloud-common-channel-settings": { "description-whether-notify-about-resolved-alerts": "Whether or not to notify about resolved alerts.", "label-send-resolved": "Send resolved" }, + "cloud-data-source-selector": { + "label": "Select data source", + "label-disabled": "Data source" + }, "cloud-evaluation-behavior": { "description-pending-period": "Period during which the threshold condition must be met to trigger an alert. Selecting \"None\" triggers the alert immediately once the condition is met.", "label-pending-period": "Pending period", "title-set-evaluation-behavior": "Set evaluation behavior" }, "cloud-receiver-form": { + "body-info": "Note that empty string values will be replaced with global defaults where appropriate.", "title-info": "Info" }, "common": { @@ -666,11 +695,17 @@ "restore": "Restore", "return": "Return" }, + "contact-point-errors": { + "label-contact-point": "Contact Point › {{name}}" + }, "contact-point-header": { "aria-label-more-actions": "More actions for contact point \"{{contactPointName}}\"", + "button-edit": "Edit", + "button-view": "View", "export-label-export": "Export", "label-delete": "Delete", - "label-manage-permissions": "Manage permissions" + "label-manage-permissions": "Manage permissions", + "tooltip-provisioned-contact-points": "Provisioned contact points cannot be edited in the UI" }, "contact-point-selector": { "aria-label-refresh-contact-points": "Refresh contact points", @@ -833,6 +868,9 @@ "text-loading-notification-template": "Loading notification template", "title-error-loading-notification-template": "Error loading notification template" }, + "duration-quick-pick": { + "none": "None" + }, "dynamic-table": { "tooltip-collapse-row": "Collapse row", "tooltip-expand-row": "Expand row" @@ -877,6 +915,7 @@ "title-something-wrong-trying-fetch-group-details": "Something went wrong when trying to fetch group details" }, "evaluation-interval-limit-exceeded": { + "body-minimum-interval": "A minimum evaluation interval of <1>{{minInterval}} has been configured in Grafana.<3>Please contact the administrator to configure a lower interval.", "title-global-evaluation-interval-limit-exceeded": "Global evaluation interval limit exceeded" }, "existing-rule-editor": { @@ -902,15 +941,19 @@ "tooltip-export-new-grafana-rule": "Export new grafana rule" }, "expression": { + "not-supported": "Expression not supported: {{expression}}", "title-expression-failed": "Expression failed", "title-expression-warning": "Expression warning" }, "expression-editor": { + "could-not-load-editor": "Could not load query editor due to: {{errorMessage}}", + "error-no-component": "Data source plugin does not export any Query Editor component", "preview-alerts": "Preview alerts", "there-firing-alerts-query": "There are no firing alerts for your query.", "title-alerts-preview": "Alerts preview" }, "expression-preview": { + "expression-not-supported": "Expression not supported: {{type}}", "title-expression-failed": "Expression failed" }, "expression-result": { @@ -972,7 +1015,10 @@ "title-failed-to-fetch-notification-template": "Failed to fetch notification template" }, "global-config-alert": { - "title-global-config-for-contact-points": "Global config for contact points" + "body": "For each external Alertmanager you can define global settings, like server addresses, usernames and password, for all the supported contact points.", + "edit-global-config": "Edit global config", + "title-global-config-for-contact-points": "Global config for contact points", + "view-global-config": "View global config" }, "global-config-form": { "save-global-config": "Save global config", @@ -980,6 +1026,10 @@ "title-error-saving-receiver": "Error saving receiver" }, "grafana-alertmanager-delivery-warning": { + "admin-hint-all": "To change your Alertmanager setup, go to the Alerting Admin page. If you do not have access, contact your Administrator.", + "admin-hint-external": "To change your Alertmanager setup, go to the Alerting Admin page. If you do not have access, contact your Administrator.", + "configuration-changes-all": "Ensure you make configuration changes in the correct Alertmanagers; both internal and external. Changing one will not affect the others.", + "configuration-changes-external": "Grafana is configured to send alerts to external Alertmanagers only. Changing Grafana Alertmanager configuration will not affect delivery of your alerts.", "title-grafana-alerts-delivered-alertmanager": "Grafana alerts are not delivered to Grafana Alertmanager", "title-you-have-additional-alertmanagers-to-configure": "You have additional Alertmanagers to configure" }, @@ -998,6 +1048,7 @@ "title-add-folder-and-labels": "Add folder and labels" }, "grafana-modify-export": { + "body-invalid-rule-id": "The rule UID in the page URL is invalid. Please check the URL and try again.", "title-invalid-rule-id": "Invalid rule ID" }, "grafana-mute-timing-exporter-preview": { @@ -1013,6 +1064,7 @@ "text-loading": "Loading...." }, "grafana-receiver-form": { + "body-loading-on-call-integration-failed": "Grafana OnCall plugin has been enabled in your Grafana instances but it is not reachable. Please check the plugin configuration", "text-loading-notifiers": "Loading notifiers...", "title-loading-on-call-integration-failed": "Loading OnCall integration failed" }, @@ -1064,7 +1116,9 @@ }, "group-by": { "aria-label-group-by-label-keys": "Group by label keys", - "placeholder-group-by": "Group by" + "custom-group-by": "Custom group by", + "placeholder-group-by": "Group by", + "tooltip-group-by": "Group notifications using a different combination of labels. This option can help validate the grouping settings of your notification policies." }, "group-details": { "ds-features-error": "Error loading data source details", @@ -1200,6 +1254,7 @@ }, "key-value-template-data-table": { "arguments": "Arguments", + "description": "KeyValue is a set of key/value string pairs that represent labels and annotations.", "keyvalue-methods": "Key-value methods", "name": "Name", "notes": "Notes", @@ -1311,6 +1366,10 @@ "export": "Export" } }, + "more-button": { + "aria-label": "More", + "button-text": "More" + }, "mute_timings": { "error-loading": { "description": "Could not load mute timings. Please try again later.", @@ -1333,6 +1392,7 @@ }, "mute-timing-time-interval": { "add-another-time-interval": "Add another time interval", + "description": "A time interval is a definition for a moment in time. All fields are lists, and at least one list element must be satisfied to match the field. If a field is left blank, any moment of time will match the field. For an instant of time to match a complete time interval, all fields must match. A mute timing can contain multiple time intervals.", "description-dats-of-the-month": "The days of the month, 1:31, of a month. Negative values can be used to represent days which begin at the end of the month", "description-months": "The months of the year in either numerical or the full calendar month", "label-days-of-the-month": "Days of the month", @@ -1384,16 +1444,24 @@ "need-help": "Need help?" }, "need-help-info-for-contactpoint": { + "customize-notifications": "Muting, grouping, and timings options allow you to customize how notifications are sent.", + "notification-policies": "Alternatively, toggle the <1>Advanced options button to route notifications using notification policies for greater flexibility.", + "select-contact-point": "Select a contact point to notify all recipients in it.", "title-notify-by-selecting-a-contact-point": "Notify by selecting a contact point" }, "need-help-info-for-notification-policy": { + "custom-labels": "Custom labels change the way your notifications are routed. First, add labels to your alert rule and then connect them to your notification policy by adding label matchers.", + "notification-policies": "Firing alert instances are routed to notification policies based on matching labels. The default notification policy matches all alert instances.", + "read-more": "Read about notification policies.", "title-notification-routing": "Notification routing" }, "new-rule-from-panel-button": { + "body-no-alerting-capable-query-found": "Cannot create alerts from this panel because no query to an alerting capable datasource is found.", "new-alert-rule": "New alert rule", "title-no-alerting-capable-query-found": "No alerting capable query found" }, "no-alert-managers-available": { + "body-no-alertmanager-found": "We could not find any external Alertmanagers and you may not have access to the built-in Grafana Alertmanager.", "title-no-alertmanager-found": "No Alertmanager found" }, "notification-policies-filter": { @@ -1462,18 +1530,21 @@ }, "notifications-step": { "labels-better-manage-recording-rules": "Add labels to help you better manage your recording rules.", - "recipient": "Recipient" + "recipient": "Recipient", + "recipient-notification-fires": "Select who should receive a notification when an alert rule fires." }, "option-customfield": { "label-custom-template": "Custom template" }, "other-alert-managers-available": { + "body-selected-alertmanager-not-found": "The selected Alertmanager no longer exists or you may not have permission to access it. You can select a different Alertmanager from the dropdown.", "title-selected-alertmanager-not-found": "Selected Alertmanager not found." }, "panel-alert-tab-content": { "alert": { "title-errors-loading-rules": "Errors loading rules" }, + "failed-to-load-error": "Failed to load Grafana rules state: {{error}}", "text-loading-rules": "Loading rules...", "title-dashboard-not-saved": "Dashboard not saved" }, @@ -1485,6 +1556,10 @@ "reference": "Reference" }, "policies": { + "aria-label-collapse": "Collapse", + "aria-label-expand": "Expand", + "aria-label-more": "more actions for policy", + "aria-label-more-default": "more actions for default policy", "default-policy": { "description": "All alert instances will be handled by the default policy if no other matching policies are found.", "title": "Default policy", @@ -1555,6 +1630,7 @@ "no-matchers": "No matchers" }, "preview-rule": { + "body-preview-is-not-available": "Cannot display the query preview. Some of the data sources used in the queries are not available.", "preview-alerts": "Preview alerts", "title-preview-is-not-available": "Preview is not available" }, @@ -1565,7 +1641,9 @@ "no-series": "No series" }, "prom-duration-docs": { + "different-units": "Different units can be combined for more granularity.", "example": "Example", + "explanation": "Prometheus duration format consist of a number followed by a time unit.", "multiple-units-combined": "Multiple units combined", "symbol": "Symbol", "time-unit": "Time unit" @@ -1598,6 +1676,9 @@ "query-options": { "label-time-range": "Time Range" }, + "query-preview": { + "relative-time-range": "{{from}} to now" + }, "queryAndExpressionsStep": { "disableAdvancedOptions": { "text": "The selected queries and expressions cannot be converted to default. If you deactivate advanced options, your query and condition will be reset to default settings." @@ -1607,6 +1688,10 @@ }, "receiver-form": { "add-contact-point-integration": "Add contact point integration", + "body-attention": "Because there is no default policy configured yet, this contact point will automatically be set as default.", + "contact-point": "Contact point", + "contact-point-create": "Create contact point", + "contact-point-update": "Update contact point", "label-name": "Name", "name-placeholder-name": "Name", "save-contact-point": "Save contact point", @@ -1615,6 +1700,7 @@ "title-manage-contact-point-permissions": "Manage contact point permissions" }, "receivers-section": { + "button-more": "More", "new-menu": { "label-export-all": "Export all" } @@ -1652,6 +1738,10 @@ "routing": { "routing": "Routing" }, + "routing-option-description": { + "manual": "Notifications for firing alerts are routed to a selected contact point.", + "matching-labels": "Notifications for firing alerts are routed to contact points based on matching labels and the notification policy tree." + }, "routing-settings": { "aria-label-group-by": "Group by", "description-group-by": "Combine multiple alerts into a single notification by grouping them by the same label values. If empty, it is inherited from the default notification policy.", @@ -2012,7 +2102,9 @@ "title-the-selected-alertmanager-has-no-configuration": "The selected Alertmanager has no configuration" }, "simple-condition-editor": { - "label-when": "WHEN" + "label-of-query": "OF QUERY", + "label-when": "WHEN", + "label-when-query": "WHEN QUERY" }, "simpleCondition": { "alertCondition": "Alert condition" @@ -2102,7 +2194,9 @@ "title-delete-template-group": "Delete template group" }, "test-contact-point-modal": { + "custom-notification-message": "You will send a test notification that uses the annotations defined below. This is a good option if you use custom templates and messages.", "notification-message": "Notification message", + "predefined-notification-message": "You will send a test notification that uses a predefined alert. If you have defined a custom template or message, for better results switch to <1>custom notification message, from above.", "send-test-notification": "Send test notification", "title-test-contact-point": "Test contact point" }, @@ -2149,6 +2243,8 @@ "label-export": "Export" }, "use-delete-contact-point-modal": { + "delete-confirm": "Yes, delete contact point", + "deleting": "Deleting...", "modal-element": { "delete-contact-point": "Are you sure you want to delete this contact point?", "deleting-contact-point-permanently-remove": "Deleting this contact point will permanently remove it.", @@ -2286,6 +2382,10 @@ "configuration-required": "Configuration required", "refer-documentation-configure-authentication": "Refer to the documentation on how to configure authentication" }, + "provider-card": { + "text-badge-enabled": "Enabled", + "text-badge-not-enabled": "Not enabled" + }, "provider-config-form": { "additional-actions-menu": { "label-reset-to-default-values": "Reset to default values" @@ -2299,6 +2399,10 @@ "title-reset": "Reset", "tooltip-more-actions": "More actions" }, + "provider-config-page": { + "text-badge-enabled": "Enabled", + "text-badge-not-enabled": "Not enabled" + }, "server-discovery-modal": { "label-the-wellknownopenidconfiguration-endpoint-for-your-id-p": "The .well-known/openid-configuration endpoint for your IdP", "title-open-id-connect-discovery-url": "OpenID Connect Discovery URL" @@ -2528,6 +2632,7 @@ "no-access-modal": { "connection-contact-grafana-admin": "To add a new connection, contact your Grafana admin.", "editor-warning": "Editors cannot add new connections. You may check to see if it is already configured in <2>Data sources.", + "links": "Links", "okay": "Okay" }, "not-found-datasource": { @@ -2833,6 +2938,9 @@ "tooltip-view-as-scene": "View as Scene" } }, + "dashboard-links-menu": { + "aria-label-dashboard-name": "{{dashboardName}} dashboard" + }, "dashboard-loading": { "cancel-loading-dashboard": "Cancel loading dashboard" }, @@ -2983,6 +3091,7 @@ "help-wizard": { "copy-to-clipboard": "Copy to clipboard", "description-obfuscate-data": "Modify the original data to hide sensitve information. Note the lengths will stay the same, and duplicate values will be equal.", + "description-support-snapshot": "Panel: {{panelTitle}}", "download-snapshot": "Download ({{snapshotSize}})", "label-obfuscate-data": "Obfuscate data", "label-support-snapshot": "Support snapshot", @@ -3079,7 +3188,9 @@ }, "options-pane-options": { "placeholder-search-options": "Search options", - "Recent options-title-recent-options": "Recent options" + "Recent options-title-recent-options": "Recent options", + "title-matched_one": "Matched {{count}}/{{totalCount}} options", + "title-matched_other": "Matched {{count}}/{{totalCount}} options" }, "outline": { "tree-item": { @@ -3447,7 +3558,11 @@ }, "visualization-button": { "aria-label-change-visualization": "Change visualization", - "tooltip-click-to-change-visualization": "Click to change visualization" + "aria-label-close": "Close options pane", + "aria-label-show": "Show options pane", + "tooltip-click-to-change-visualization": "Click to change visualization", + "tooltip-close": "Close options pane", + "tooltip-show": "Show options pane" }, "visualization-select-pane": { "placeholder-search-for": "Search for...", @@ -4015,6 +4130,9 @@ } }, "datasources": { + "add-new-data-source-button": { + "tooltip-no-permission": "You do not have permission to configure new data sources" + }, "alert-success-message": { "aria-label-create-a-dashboard": "Create a dashboard", "aria-label-explore-data": "Explore data" @@ -4037,7 +4155,8 @@ "test": "Test" }, "cloud-info-box": { - "title-includes-active-metrics-storage": "The free plan includes 10k active metrics and 50gb storage." + "body-alert": "Or skip the effort and get {{mainDS}} (and {{extraDS}}) as fully-managed, scalable, and hosted data sources from Grafana Labs with the <6>free-forever Grafana Cloud plan.", + "title-alert": "Configure your {{mainDS}} data source below" }, "dashboards-table": { "aria-label-delete-dashboard": "Delete dashboard", @@ -4062,6 +4181,9 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Provisioned data source" }, + "data-source-type-card": { + "aria-label-learn-more": "{{dataSourcePluginName}}, learn more." + }, "data-sources-list-card": { "build-a-dashboard": "Build a dashboard", "explore": "Explore" @@ -4079,6 +4201,10 @@ "new-data-source-view": { "cancel": "Cancel", "placeholder-filter-by-name-or-type": "Filter by name or type" + }, + "use-data-source-info": { + "badge-text-not-supported": "Not supported", + "badge-text-supported": "Supported" } }, "dimensions": { @@ -4124,8 +4250,12 @@ "label-template": "Template", "label-value": "Value" }, + "threshold-editor": { + "tooltip-remove-threshold": "Remove threshold {{thresholdNumber}}" + }, "thresholds-editor": { "add-threshold": "Add threshold", + "aria-label-threshold": "Threshold {{thresholdNumber}}", "description-percentage-means-thresholds-relative": "Percentage means thresholds relative to min & max", "thresholds-mode": "Thresholds mode" }, @@ -4194,6 +4324,10 @@ "open": "Open", "open-in-new-tab": "Open in new tab" }, + "content-outline": { + "tooltip-collapse-outline": "Collapse outline", + "tooltip-expand-outline": "Expand outline" + }, "content-outline-item-button": { "body": { "aria-label-content-outline-item-collapse-button": "Content outline item collapse button" @@ -4212,13 +4346,19 @@ "title-correlation-details": "Correlation details" }, "correlation-transformation-add-modal": { + "add-transformation": "Add transformation to correlation", + "added-variables": "This transformation will add the following variables:", "aria-label-field": "Field", "aria-label-type": "Type", + "body": "A transformation extracts variables out of a single field. These variables will be available along with your field variables.", "cancel": "Cancel", + "edit-transformation": "Edit transformation", "label-expression": "Expression", + "label-expression-without-tooltip": "Expression", "label-field": "Field", "label-type": "Type", "label-variable-name": "Variable name", + "label-variable-name-without-tooltip": "Variable name", "title-add": "Add transformation", "title-edit": "Edit transformation" }, @@ -4312,6 +4452,9 @@ }, "title-failed-sample-query": "Failed to load logs sample for this query" }, + "logs-table-available-fields": { + "title-label-percentage": "{{labelName}} appears in {{percentage}}% of log lines" + }, "logs-table-empty-fields": { "no-fields": "No fields" }, @@ -4547,6 +4690,10 @@ "title": "Table", "title-with-name": "Table - {{name}}" }, + "time-sync-button": { + "aria-label-synced": "Synced times", + "aria-label-unsynced": "Unsynced times" + }, "timeline-collapser": { "tooltip-collapse": "Collapse +1", "tooltip-collapse-all": "Collapse all", @@ -4576,7 +4723,9 @@ }, "trace-page-actions": { "give-feedback": "Give feedback", + "label-copied": "Copied!", "label-export": "Export", + "label-trace-id": "Trace ID", "title-share-thoughts-about-tracing-grafana": "Share your thoughts about tracing in Grafana." }, "trace-page-header": { @@ -4779,6 +4928,10 @@ "palette-tab": "Colors", "spectrum-tab": "Custom" }, + "color-swatch": { + "aria-label-default": "Pick a color", + "aria-label-selected-color": "{{colorLabel}} color" + }, "confirm-button": { "cancel": "Cancel" }, @@ -4915,7 +5068,11 @@ "clear": "Clear" }, "interactive-table": { - "expand-row-tooltip": "Toggle row expanded" + "aria-label-collapse-all": "Collapse all rows", + "aria-label-expand-all": "Expand all rows", + "expand-row-tooltip": "Toggle row expanded", + "tooltip-collapse-all": "Collapse all rows", + "tooltip-expand-all": "Expand all rows" }, "menu-item": { "keyboard-shortcut-label": "Keyboard shortcut" @@ -4941,10 +5098,25 @@ "next-page": "next page", "previous-page": "previous page" }, + "panel-chrome": { + "aria-label-toggle-collapse": "toggle collapse panel" + }, "panel-menu": { "label": "Menu for panel {{ title }}", "title": "Menu" }, + "password-field": { + "tooltip-hide": "Hide password", + "tooltip-show": "Show password" + }, + "row-expander": { + "aria-label-expand": "Expand row", + "collapse": "Collapse row", + "expand": "Expand row" + }, + "row-expander-ng": { + "aria-label-collapse": "Collapse row" + }, "secret-form-field": { "reset": "Reset" }, @@ -5000,6 +5172,10 @@ "add": "Add", "remove": "Remove tag: {{name}}" }, + "time-sync-button": { + "aria-label-sync": "Sync times", + "aria-label-unsync": "Unsync times" + }, "toggletip": { "close": "Close" }, @@ -6312,12 +6488,18 @@ "open-visualization-suggestions": "Open visualization suggestions", "switch-to-table": "Switch to table" }, + "panel-plugin-error": { + "text-load-error": "Check the server startup logs for more information. <1>If this plugin was loaded from Git, then make sure it was compiled.", + "title-load-error": "Error loading: {{panelId}}", + "title-not-found": "Panel plugin not found: {{id}}" + }, "panel-renderer": { "loading-plugin-panel": "Loading plugin panel...", "no-panel-data": "No panel data" }, "panel-type-card": { "aria-label-delete-button-on-panel-type-card": "Delete button on panel type card", + "title-click-to-close": "Click again to close this section", "tooltip-delete": "Delete" }, "visualization-suggestions": { @@ -6499,7 +6681,8 @@ "enable": "Enable" }, "get-started-with-data-source": { - "add-new-data-source": "Add new data source" + "add-new-data-source": "Add new data source", + "title-button-disabled": "The plugin isn't usable yet, it may take some time to complete the installation." }, "install-controls-button": { "title-uninstall-modal": "Uninstall {{plugin}}" @@ -6558,6 +6741,10 @@ "plugin-installed-badge": { "text-installed": "Installed" }, + "plugin-list-item": { + "label-author": "By {{author}}", + "title-icon-plugin-type": "{{pluginType}} plugin" + }, "plugin-signature-details-badge": { "signed-by": "Signed by: {{signatureOrg}}" }, @@ -7287,7 +7474,8 @@ "basic-roles": "Basic roles" }, "input": { - "no-roles": "No roles assigned" + "no-roles": "No roles assigned", + "placeholder-select-role": "Select role" }, "menu": { "clear-button": "Clear all", @@ -7513,7 +7701,11 @@ "title-disable-service-account": "Disable service account" }, "token-expiration": { + "expired-label": "Expired", "never": "Never" + }, + "token-revoked": { + "revoked-label": "Revoked" } }, "share-dashboard": { @@ -7917,7 +8109,7 @@ }, "range-content": { "apply-button": "Apply time range", - "default-error": "Please enter a past date or \"now\"", + "default-error": "Please enter a past date or \"{{now}}\"", "fiscal-year": "Fiscal year", "from-input": "From", "open-input-calendar": "Open calendar", @@ -8007,7 +8199,9 @@ }, "draggable-field-name": { "rename-placeholder": "Rename {{fieldName}}", - "title-drag-and-drop-to-reorder": "Drag and drop to reorder" + "title-drag-and-drop-to-reorder": "Drag and drop to reorder", + "tooltip-disable": "Disable", + "tooltip-enable": "Enable" }, "enum-mapping-editor": { "add-enum-value": "Add enum value", @@ -8024,7 +8218,8 @@ "label-replace-all-fields": "Replace all fields", "label-source": "Source", "placeholder-auto": "Auto", - "placeholder-select-delimiter": "Select delimiter..." + "placeholder-select-delimiter": "Select delimiter...", + "tooltip-regexp": "Example: {{regexExample}}" }, "field-config-mapping-handler-arguments-editor": { "aria-label-threshold-color": "Threshold color" @@ -8231,9 +8426,13 @@ "label-calculation": "Calculation", "label-field": "Field", "label-type": "Type", + "label-window-size": "Window size", "label-window-size-mode": "Window size mode", + "label-window-size-percent": "Window size %", "placeholder-auto": "Auto", - "placeholder-field": "Field" + "placeholder-field": "Field", + "tooltip-window-size": "Window size", + "tooltip-window-size-percent": "Set the window size as a percentage of the total data" } }, "upgrade-box": { @@ -8324,6 +8523,11 @@ "ad-hoc-filter": { "label-and": "AND" }, + "ad-hoc-filter-key": { + "plus-segment": { + "aria-label-add-filter": "Add Filter" + } + }, "confirm-delete-modal": { "title-delete-variable": "Delete variable" },