Internationalisation: More markup for translations (#103726)

* mark up variables/trails/transformers

* more markup

* fix unit tests

* final unit test fix
pull/103788/head
Ashley Harrison 1 month ago committed by GitHub
parent 6fde69c333
commit 8df9c57045
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 204
      .betterer.results
  2. 13
      public/app/features/plugins/admin/pages/Browse.tsx
  3. 7
      public/app/features/profile/UserSessions.tsx
  4. 1
      public/app/features/query/components/QueryEditorRowHeader.tsx
  5. 4
      public/app/features/query/components/QueryGroup.tsx
  6. 3
      public/app/features/query/components/QueryGroupOptions.tsx
  7. 5
      public/app/features/serviceaccounts/ServiceAccountPage.tsx
  8. 11
      public/app/features/serviceaccounts/ServiceAccountTable.tsx
  9. 19
      public/app/features/serviceaccounts/ServiceAccountsListPage.tsx
  10. 5
      public/app/features/serviceaccounts/components/CreateTokenModal.tsx
  11. 11
      public/app/features/serviceaccounts/components/ServiceAccountsListItem.tsx
  12. 16
      public/app/features/support-bundles/SupportBundles.tsx
  13. 14
      public/app/features/support-bundles/SupportBundlesCreate.tsx
  14. 7
      public/app/features/teams/CreateTeam.tsx
  15. 6
      public/app/features/teams/TeamGroupSync.test.tsx
  16. 28
      public/app/features/teams/TeamGroupSync.tsx
  17. 10
      public/app/features/teams/TeamList.tsx
  18. 5
      public/app/features/teams/TeamSettings.tsx
  19. 5
      public/app/features/trails/Breakdown/LabelBreakdownScene.tsx
  20. 10
      public/app/features/trails/Breakdown/SearchInput.tsx
  21. 2
      public/app/features/trails/Breakdown/SortByScene.tsx
  22. 2
      public/app/features/trails/MetricScene.tsx
  23. 5
      public/app/features/trails/MetricSelect/MetricSelectScene.tsx
  24. 4
      public/app/features/trails/TrailStore/utils.tsx
  25. 2
      public/app/features/trails/banners/NativeHistogramBanner.test.tsx
  26. 2
      public/app/features/trails/banners/NativeHistogramBanner.tsx
  27. 7
      public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx
  28. 31
      public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx
  29. 2
      public/app/features/transformers/editors/FormatStringTransformerEditor.tsx
  30. 8
      public/app/features/transformers/editors/GroupByTransformerEditor.tsx
  31. 13
      public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx
  32. 4
      public/app/features/transformers/editors/HistogramTransformerEditor.tsx
  33. 12
      public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx
  34. 12
      public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx
  35. 11
      public/app/features/transformers/editors/TransposeTransformerEditor.tsx
  36. 31
      public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx
  37. 6
      public/app/features/transformers/fieldToConfigMapping/FieldConfigMappingHandlerArgumentsEditor.tsx
  38. 10
      public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx
  39. 5
      public/app/features/transformers/lookupGazetteer/FieldLookupTransformerEditor.tsx
  40. 16
      public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx
  41. 12
      public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx
  42. 5
      public/app/features/transformers/regression/regressionEditor.tsx
  43. 5
      public/app/features/transformers/timeSeriesTable/TimeSeriesTableTransformEditor.tsx
  44. 8
      public/app/features/users/TokenRevokedModal.tsx
  45. 9
      public/app/features/variables/inspect/VariableUsagesButton.tsx
  46. 9
      public/app/features/variables/inspect/VariablesUnknownButton.tsx
  47. 11
      public/app/features/variables/inspect/VariablesUnknownTable.tsx
  48. 7
      public/app/features/variables/pickers/PickerRenderer.tsx
  49. 4
      public/app/features/variables/pickers/shared/VariableOptions.tsx
  50. 2
      public/app/features/visualization/data-hover/DataHoverRows.tsx
  51. 3
      public/app/routes/RoutesWrapper.tsx
  52. 135
      public/locales/en-US/grafana.json
  53. 7
      public/swagger/SwaggerPage.tsx

@ -2693,8 +2693,7 @@ exports[`better eslint`] = {
],
"public/app/features/plugins/admin/pages/Browse.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 <Trans />", "2"]
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/features/plugins/admin/state/actions.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -2744,9 +2743,6 @@ exports[`better eslint`] = {
"public/app/features/profile/FeatureTogglePage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/profile/UserSessions.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/provisioning/File/FileStatusPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
@ -2761,31 +2757,26 @@ exports[`better eslint`] = {
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
],
"public/app/features/query/components/QueryEditorRowHeader.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "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/query/components/QueryErrorAlert.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/query/components/QueryGroup.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
[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", "2"]
],
"public/app/features/query/components/QueryGroupOptions.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "10"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "11"]
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"]
],
"public/app/features/query/state/DashboardQueryRunner/AnnotationsQueryRunner.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -2842,20 +2833,6 @@ exports[`better eslint`] = {
"public/app/features/search/utils.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/serviceaccounts/ServiceAccountPage.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/serviceaccounts/ServiceAccountTable.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/serviceaccounts/ServiceAccountsListPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/serviceaccounts/components/CreateTokenModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/serviceaccounts/components/ServiceAccountProfileRow.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
@ -2864,39 +2841,9 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
],
"public/app/features/serviceaccounts/components/ServiceAccountsListItem.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/serviceaccounts/state/reducers.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/support-bundles/SupportBundles.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/support-bundles/SupportBundlesCreate.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/teams/CreateTeam.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/teams/TeamGroupSync.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
],
"public/app/features/teams/TeamList.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
],
"public/app/features/teams/TeamSettings.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/teams/state/reducers.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@ -2931,15 +2878,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
],
"public/app/features/trails/Breakdown/LabelBreakdownScene.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/trails/Breakdown/SearchInput.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/trails/Breakdown/SortByScene.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/trails/Breakdown/types.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@ -2952,19 +2890,9 @@ exports[`better eslint`] = {
"public/app/features/trails/DataTrailCard.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/trails/MetricScene.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/trails/MetricSelect/MetricSelectScene.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
],
"public/app/features/trails/TrailStore/utils.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/trails/banners/NativeHistogramBanner.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/transformers/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@ -2997,10 +2925,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/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@ -3009,16 +2933,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not re-export imported variable (\`calculateFieldTransformRegistryItem\`)", "1"]
],
"public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "7"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "8"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "9"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/transformers/editors/EnumMappingEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
@ -3027,32 +2942,11 @@ exports[`better eslint`] = {
"public/app/features/transformers/editors/EnumMappingRow.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/features/transformers/editors/FormatStringTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/transformers/editors/HistogramTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
],
"public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/transformers/editors/ReduceTransformerEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -3060,24 +2954,12 @@ exports[`better eslint`] = {
"public/app/features/transformers/editors/SortByTransformerEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/transformers/editors/TransposeTransformerEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
],
"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 <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "7"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "8"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "9"],
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
],
"public/app/features/transformers/extractFields/components/JSONPathEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
@ -3085,9 +2967,6 @@ exports[`better eslint`] = {
"public/app/features/transformers/extractFields/fieldExtractors.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/transformers/fieldToConfigMapping/FieldConfigMappingHandlerArgumentsEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/transformers/fieldToConfigMapping/FieldToConfigMappingEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
@ -3100,30 +2979,13 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
],
"public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/features/transformers/lookupGazetteer/FieldLookupTransformerEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
],
"public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/transformers/regression/regressionEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/features/transformers/spatial/optionsHelper.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -3139,12 +3001,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Do not use any type assertions.", "3"]
],
"public/app/features/transformers/timeSeriesTable/TimeSeriesTableTransformEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/users/TokenRevokedModal.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/variables/adapters.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@ -3189,16 +3047,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
],
"public/app/features/variables/inspect/VariableUsagesButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/variables/inspect/VariablesUnknownButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/variables/inspect/VariablesUnknownTable.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"]
],
"public/app/features/variables/inspect/utils.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -3212,15 +3063,11 @@ 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/variables/pickers/PickerRenderer.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/variables/pickers/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./OptionsPicker/OptionsPicker\`)", "0"]
],
"public/app/features/variables/pickers/shared/VariableOptions.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "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/variables/query/QueryVariableEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@ -3308,10 +3155,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/features/visualization/data-hover/DataHoverRows.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/plugins/datasource/alertmanager/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@ -4162,9 +4005,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
[0, 0, 0, "Unexpected any. Specify a different type.", "17"]
],
"public/app/routes/RoutesWrapper.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/store/configureStore.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@ -4237,9 +4077,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/swagger/SwaggerPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/swagger/index.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],

@ -4,9 +4,9 @@ import { useLocation } from 'react-router-dom-v5-compat';
import { SelectableValue, GrafanaTheme2, PluginType } from '@grafana/data';
import { locationSearchToObject } from '@grafana/runtime';
import { Select, RadioButtonGroup, useStyles2, Tooltip, Field } from '@grafana/ui';
import { Select, RadioButtonGroup, useStyles2, Tooltip, Field, TextLink } from '@grafana/ui';
import { Page } from 'app/core/components/Page/Page';
import { t } from 'app/core/internationalization';
import { t, Trans } from 'app/core/internationalization';
import { getNavModel } from 'app/core/selectors/navModel';
import { ROUTES as CONNECTIONS_ROUTES } from 'app/features/connections/constants';
import { useSelector } from 'app/types';
@ -76,11 +76,10 @@ export default function Browse() {
const subTitle = (
<div>
Extend the Grafana experience with panel plugins and apps. To find more data sources go to{' '}
<a className="external-link" href={`${CONNECTIONS_ROUTES.AddNewConnection}?cat=data-source`}>
Connections
</a>
.
<Trans i18nKey="plugins.browse.subtitle">
Extend the Grafana experience with panel plugins and apps. To find more data sources go to{' '}
<TextLink href={`${CONNECTIONS_ROUTES.AddNewConnection}?cat=data-source`}>Connections</TextLink>.
</Trans>
</div>
);

@ -66,7 +66,12 @@ class UserSessions extends PureComponent<Props> {
<td>{formatDate(session.createdAt, { dateStyle: 'long' })}</td>
<td>{session.clientIp}</td>
<td>
{session.browser} on {session.os} {session.osVersion}
<Trans
i18nKey="profile.user-sessions.browser-details"
values={{ browser: session.browser, os: session.os, osVersion: session.osVersion }}
>
{'{{browser}}'} on {'{{os}}'} {'{{osVersion}}'}
</Trans>
</td>
<td>
{session.authModule && <TagBadge label={session.authModule} removeIcon={false} count={0} />}

@ -138,6 +138,7 @@ const renderDataSource = <TQuery extends DataQuery>(
const { alerting, dataSource, onChangeDataSource } = props;
if (!onChangeDataSource) {
// eslint-disable-next-line @grafana/no-untranslated-strings
return <em className={styles.contextInfo}>({dataSource.name})</em>;
}

@ -312,7 +312,9 @@ export class QueryGroup extends PureComponent<Props, State> {
className={styles.expressionButton}
data-testid="query-tab-add-expression"
>
<span>Expression&nbsp;</span>
<span>
<Trans i18nKey="query.query-group.expression">Expression</Trans>
</span>
</Button>
)}
{this.renderExtraActions()}

@ -191,6 +191,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data,
</InlineLabel>
<Input
type="number"
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder={`${dataSource.cachingConfig.TTLMs}`}
spellCheck={false}
onBlur={onQueryCachingTTLBlur}
@ -223,6 +224,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data,
<Input
id="max-data-points-input"
type="number"
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder={`${realMd}`}
spellCheck={false}
onBlur={onMaxDataPointsBlur}
@ -263,6 +265,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data,
<Input
id="min-interval-input"
type="text"
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder={`${minIntervalOnDs}`}
spellCheck={false}
onBlur={onMinIntervalBlur}

@ -179,7 +179,10 @@ export const ServiceAccountPageUnconnected = ({
disabled={true}
name="lock"
size="md"
tooltip={`This is a managed service account and cannot be modified.`}
tooltip={t(
'serviceaccounts.service-account-page-unconnected.tooltip-managed-service-account-cannot-modified',
'This is a managed service account and cannot be modified'
)}
/>
</Stack>
)}

@ -228,7 +228,11 @@ const getActionsCell = (
{contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsDelete, original) && (
<IconButton
name="trash-alt"
aria-label={`Delete service account ${original.name}`}
aria-label={t(
'serviceaccounts.get-actions-cell.aria-label-delete-button',
'Delete service account {{serviceAccountName}}',
{ serviceAccountName: original.name }
)}
variant="secondary"
onClick={() => onRemoveButtonClick(original)}
/>
@ -240,7 +244,10 @@ const getActionsCell = (
disabled={true}
name="lock"
size="md"
tooltip={`This is a managed service account and cannot be modified.`}
tooltip={t(
'serviceaccounts.get-actions-cell.tooltip-managed-service-account-cannot-modified',
'This is a managed service account and cannot be modified'
)}
/>
</Stack>
);

@ -14,6 +14,7 @@ import {
Box,
Stack,
useStyles2,
TextLink,
} from '@grafana/ui';
import { Page } from 'app/core/components/Page/Page';
import config from 'app/core/config';
@ -172,20 +173,14 @@ export const ServiceAccountsListPageUnconnected = ({
setCurrentServiceAccount(null);
};
const docsLink = (
<a
className="external-link"
href="https://grafana.com/docs/grafana/latest/administration/service-accounts/"
target="_blank"
rel="noopener noreferrer"
>
documentation.
</a>
);
const subTitle = (
<span>
Service accounts and their tokens can be used to authenticate against the Grafana API. Find out more in our{' '}
{docsLink}
<Trans i18nKey="serviceaccounts.service-accounts-list-page-unconnected.sub-title">
Service accounts and their tokens can be used to authenticate against the Grafana API. Find out more in our{' '}
<TextLink href="https://grafana.com/docs/grafana/latest/administration/service-accounts/" external>
documentation.
</TextLink>
</Trans>
</span>
);

@ -136,7 +136,10 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
<>
<Field
label={t('serviceaccounts.create-token-modal.label-token', 'Token')}
description="Copy the token now as you will not be able to see it again. Losing a token requires creating a new one."
description={t(
'serviceaccounts.create-token-modal.description-token',
'Copy the token now as you will not be able to see it again. Losing a token requires creating a new one.'
)}
>
<div className={styles.modalTokenRow}>
<Input name="tokenValue" value={token} readOnly />

@ -142,7 +142,11 @@ const ServiceAccountListItemComponent = memo(
name="trash-alt"
size="md"
onClick={() => onRemoveButtonClick(serviceAccount)}
tooltip={`Delete service account ${serviceAccount.name}`}
tooltip={t(
'serviceaccounts.service-account-list-item.tooltip-delete-button',
'Delete service account {{serviceAccountName}}',
{ serviceAccountName: serviceAccount.name }
)}
/>
)}
</Stack>
@ -153,7 +157,10 @@ const ServiceAccountListItemComponent = memo(
disabled={true}
name="lock"
size="md"
tooltip={`This is a managed service account and cannot be modified.`}
tooltip={t(
'serviceaccounts.service-account-list-item.tooltip-managed-service-account-cannot-modified',
'This is a managed service account and cannot be modified'
)}
/>
</Stack>
)}

@ -10,13 +10,6 @@ import { AccessControlAction, StoreState } from 'app/types';
import { loadBundles, removeBundle, checkBundles } from './state/actions';
const subTitle = (
<span>
Support bundles allow you to easily collect and share Grafana logs, configuration, and data with the Grafana Labs
team.
</span>
);
const NewBundleButton = (
<LinkButton icon="plus" href="support-bundles/create" variant="primary">
<Trans i18nKey="support-bundles.new-bundle-button.new-support-bundle">New support bundle</Trans>
@ -58,6 +51,15 @@ const SupportBundlesUnconnected = ({ supportBundles, isLoading, loadBundles, rem
const actions = hasAccess ? NewBundleButton : undefined;
const subTitle = (
<span>
<Trans i18nKey="support-bundles.support-bundles-unconnected.sub-title">
Support bundles allow you to easily collect and share Grafana logs, configuration, and data with the Grafana
Labs team.
</Trans>
</span>
);
return (
<Page navId="support-bundles" subTitle={subTitle} actions={actions}>
<Page.Contents isLoading={isLoading}>

@ -9,12 +9,6 @@ import { StoreState } from 'app/types';
import { loadSupportBundleCollectors, createSupportBundle } from './state/actions';
const subTitle = (
<span>
Choose the components for the support bundle. The support bundle will be available for 3 days after creation.
</span>
);
const mapStateToProps = (state: StoreState) => {
return {
collectors: state.supportBundles.supportBundleCollectors,
@ -55,6 +49,14 @@ export const SupportBundlesCreateUnconnected = ({
return { ...acc, [curr.uid]: curr.default };
}, {});
const subTitle = (
<span>
<Trans i18nKey="support-bundles.support-bundles-create-unconnected.sub-title">
Choose the components for the support bundle. The support bundle will be available for 3 days after creation.
</Trans>
</span>
);
return (
<Page navId="support-bundles" pageNav={{ text: 'Create support bundle' }} subTitle={subTitle}>
<Page.Contents isLoading={isLoading}>

@ -74,8 +74,11 @@ export const CreateTeam = (): JSX.Element => {
</Field>
)}
<Field
label={'Email'}
description={'This is optional and is primarily used for allowing custom team avatars.'}
label={t('teams.create-team.label-email', 'Email')}
description={t(
'teams.create-team.description-email',
'This is optional and is primarily used for allowing custom team avatars'
)}
>
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
<Input {...register('email')} type="email" id="team-email" placeholder="email@test.com" />

@ -47,11 +47,11 @@ describe('TeamGroupSync', () => {
it('should call remove group', async () => {
const mockRemoveGroup = jest.fn();
const mockGroup: TeamGroup = { teamId: 1, groupId: 'some/group' };
const mockGroup: TeamGroup = { teamId: 1, groupId: 'someGroup' };
setup({ removeTeamGroup: mockRemoveGroup, groups: [mockGroup] });
await userEvent.click(screen.getByRole('button', { name: 'Remove group some/group' }));
await userEvent.click(screen.getByRole('button', { name: 'Remove group someGroup' }));
await waitFor(() => {
expect(mockRemoveGroup).toHaveBeenCalledWith('some/group');
expect(mockRemoveGroup).toHaveBeenCalledWith('someGroup');
});
});
});

@ -88,7 +88,9 @@ export class TeamGroupSync extends PureComponent<Props, State> {
variant="destructive"
onClick={() => this.onRemoveGroup(group)}
disabled={isReadOnly}
aria-label={`Remove group ${group.groupId}`}
aria-label={t('teams.team-group-sync.aria-label-remove', 'Remove group {{groupName}}', {
groupName: group.groupId,
})}
>
<Icon name="times" />
</Button>
@ -108,7 +110,10 @@ export class TeamGroupSync extends PureComponent<Props, State> {
featureId={'team-sync'}
eventVariant={'trial'}
featureName={'team sync'}
text={'Add a group to enable team sync for free during your trial of Grafana Pro.'}
text={t(
'teams.team-group-sync.team-sync-upgrade',
'Add a group to enable team sync for free during your trial of Grafana Pro'
)}
/>
)}
<div className="page-action-bar">
@ -124,8 +129,8 @@ export class TeamGroupSync extends PureComponent<Props, State> {
)}
<div className="page-action-bar__spacer" />
{groups.length > 0 && (
<Button onClick={this.onToggleAdding} disabled={isReadOnly}>
<Icon name="plus" /> Add group
<Button onClick={this.onToggleAdding} icon="plus" disabled={isReadOnly}>
<Trans i18nKey="teams.team-group-sync.add-group-button">Add group</Trans>
</Button>
)}
</div>
@ -136,8 +141,10 @@ export class TeamGroupSync extends PureComponent<Props, State> {
<form onSubmit={this.onAddGroup}>
<InlineFieldRow>
<InlineField
label={'Add External Group'}
tooltip="LDAP Group Example: cn=users,ou=groups,dc=grafana,dc=org."
label={t('teams.team-group-sync.label-add-external-group', 'Add external group')}
tooltip={t('teams.team-group-sync.tooltip-add-external-group', 'LDAP group example: {{example}}', {
example: 'cn=users,ou=groups,dc=grafana,dc=org',
})}
>
<Input
type="text"
@ -204,14 +211,15 @@ export const TeamSyncUpgradeContent = ({ action }: { action?: UpgradeContentProp
action={action}
listItems={[
'Stop managing user access in two places - assign users to groups in SAML, LDAP or Oauth, and manage access at a Team level in Grafana',
'Update users’ permissions immediately when you add or remove them from an LDAP group, with no need for them to sign out and back in',
"Update users' permissions immediately when you add or remove them from an LDAP group, with no need for them to sign out and back in",
]}
image={`team-sync-${theme.isLight ? 'light' : 'dark'}.png`}
featureName={'team sync'}
featureUrl={'https://grafana.com/docs/grafana/latest/enterprise/team-sync'}
description={
'Team Sync makes it easier for you to manage users’ access in Grafana, by immediately updating each user’s Grafana teams and permissions based on their single sign-on group membership, instead of when users sign in.'
}
description={t(
'teams.team-sync-upgrade-content.description',
"Team Sync makes it easier for you to manage users' access in Grafana, by immediately updating each user's Grafana teams and permissions based on their single sign-on group membership, instead of when users sign in"
)}
/>
);
};

@ -201,15 +201,19 @@ export const TeamList = ({
{canReadTeam && (
<LinkButton
href={`org/teams/edit/${original.uid}`}
aria-label={`Edit team ${original.name}`}
aria-label={t('teams.team-list.columns.aria-label-edit-team', 'Edit team {{teamName}}', {
teamName: original.name,
})}
icon="pen"
size="sm"
variant="secondary"
tooltip={'Edit team'}
tooltip={t('teams.team-list.columns.tooltip-edit-team', 'Edit team')}
/>
)}
<DeleteButton
aria-label={`Delete team ${original.name}`}
aria-label={t('teams.team-list.columns.aria-label-delete-button', 'Delete team {{teamName}}', {
teamName: original.name,
})}
size="sm"
disabled={!canDelete}
onConfirm={() => deleteTeam(original.uid)}

@ -70,7 +70,10 @@ export const TeamSettings = ({ team, updateTeam }: Props) => {
<Field
label={t('teams.team-settings.label-email', 'Email')}
description="This is optional and is primarily used to set the team profile avatar (via gravatar service)."
description={t(
'teams.team-settings.description-email',
'This is optional and is primarily used to set the team profile avatar (via gravatar service)'
)}
disabled={!canWriteTeamSettings}
>
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}

@ -388,7 +388,10 @@ export class LabelBreakdownScene extends SceneObjectBase<LabelBreakdownSceneStat
</div>
{missingOtelTargets && !dismissOtelWarning && (
<Alert
title={`Warning: There may be missing Open Telemetry resource attributes.`}
title={t(
'trails.label-breakdown-scene.title-warning-there-missing-telemetry-resource-attributes',
'Warning: There may be missing Open Telemetry resource attributes'
)}
severity={'warning'}
key={'warning'}
onRemove={() => updateDismissOtelWarning(true)}

@ -2,6 +2,7 @@ import { css } from '@emotion/css';
import { HTMLProps } from 'react';
import { Icon, Input } from '@grafana/ui';
import { t } from 'app/core/internationalization';
interface Props extends Omit<HTMLProps<HTMLInputElement>, 'width'> {
onClear(): void;
@ -13,7 +14,14 @@ export const SearchInput = ({ value, onChange, placeholder, onClear, ...rest }:
value={value}
onChange={onChange}
suffix={
value ? <Icon onClick={onClear} title={'Clear search'} name="times" className={styles.clearIcon} /> : undefined
value ? (
<Icon
onClick={onClear}
title={t('trails.search-input.title-clear-search', 'Clear search')}
name="times"
className={styles.clearIcon}
/>
) : undefined
}
prefix={<Icon name="search" />}
placeholder={placeholder}

@ -93,7 +93,7 @@ export class SortByScene extends SceneObjectBase<SortBySceneState> {
width={20}
isSearchable={true}
options={model.sortingOptions}
placeholder={'Choose criteria'}
placeholder={t('trails.sort-by-scene.placeholder-choose-criteria', 'Choose criteria')}
onChange={model.onCriteriaChange}
inputId="sort-by-criteria"
/>

@ -210,7 +210,7 @@ export class MetricActionBar extends SceneObjectBase<MetricActionBarState> {
<Icon name={'star'} type={'default'} size={'lg'} />
)
}
tooltip={'Bookmark'}
tooltip={t('trails.metric-action-bar.tooltip-bookmark', 'Bookmark')}
onClick={toggleBookmark}
/>
{trail.state.embedded && (

@ -551,7 +551,10 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
return (
<div className={styles.container}>
<div className={styles.header}>
<Field label={'Search metrics'} className={styles.searchField}>
<Field
label={t('trails.metric-select-scene.label-search-metrics', 'Search metrics')}
className={styles.searchField}
>
<Input
placeholder={t('trails.metric-select-scene.placeholder-search-metrics', 'Search metrics')}
prefix={<Icon name={'search'} />}

@ -10,7 +10,9 @@ export function createBookmarkSavedNotification() {
notification.component = (
<Stack gap={2} direction={'row'}>
<div>
You can view bookmarks under <i>Explore &gt; Metrics</i>
<Trans i18nKey="trails.create-bookmark-saved-notification.description">
You can view bookmarks under <i>Explore &gt; Metrics</i>
</Trans>
</div>
<LinkButton fill={'solid'} variant={'secondary'} href={HOME_ROUTE}>
<Trans i18nKey="trails.create-bookmark-saved-notification.view-bookmarks">View bookmarks</Trans>

@ -18,7 +18,7 @@ const mockProps = {
describe('NativeHistogramBanner', () => {
test('renders correctly when histograms are loaded', () => {
render(<NativeHistogramBanner {...mockProps} />);
expect(screen.getByText('Native Histogram Support')).toBeInTheDocument();
expect(screen.getByText('Native histogram support')).toBeInTheDocument();
expect(
screen.getByText(
'Prometheus native histograms offer high resolution, high precision, simple usage in instrumentation and a way to combine and manipulate histograms in queries and in Grafana.'

@ -29,7 +29,7 @@ export function NativeHistogramBanner(props: NativeHistogramInfoProps) {
<>
{
<Alert
title={'Native Histogram Support'}
title={t('trails.native-histogram-banner.title-native-histogram-support', 'Native histogram support')}
severity={'info'}
onRemove={() => {
// when a user explicitly closes the banner, save that it has been closed in local storage to not show again

@ -58,7 +58,11 @@ export const UnaryOperationEditor = (props: {
>
<Select options={ops} value={unary?.operator ?? ops[0].value} onChange={onUnaryOperationChanged} />
</InlineField>
<InlineField label="(" labelWidth={2}>
<InlineField
// eslint-disable-next-line @grafana/no-untranslated-strings
label="("
labelWidth={2}
>
<Select
placeholder={t('transformers.unary-operation-editor.placeholder-field', 'Field')}
className="min-width-11"
@ -67,6 +71,7 @@ export const UnaryOperationEditor = (props: {
onChange={onUnaryValueChanged}
/>
</InlineField>
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
<InlineLabel width={2}>)</InlineLabel>
</InlineFieldRow>
</>

@ -132,7 +132,7 @@ export const ConvertFieldTypeTransformerEditor = ({
return (
<div key={`${c.targetField}-${idx}`}>
<InlineFieldRow>
<InlineField label={'Field'}>
<InlineField label={t('transformers.convert-field-type-transformer-editor.label-field', 'Field')}>
<FieldNamePicker
context={{ data: input }}
value={c.targetField ?? ''}
@ -140,11 +140,11 @@ export const ConvertFieldTypeTransformerEditor = ({
item={fieldNamePickerSettings}
/>
</InlineField>
<InlineField label={'as'}>
<InlineField label={t('transformers.convert-field-type-transformer-editor.label-as', 'as')}>
<Select
options={allTypes}
value={c.destinationType}
placeholder={'Type'}
placeholder={t('transformers.convert-field-type-transformer-editor.placeholder-type', 'Type')}
onChange={onSelectDestinationType(idx)}
width={18}
/>
@ -152,10 +152,14 @@ export const ConvertFieldTypeTransformerEditor = ({
{c.destinationType === FieldType.time && (
<InlineField
label={t('transformers.convert-field-type-transformer-editor.label-input-format', 'Input format')}
tooltip="Specify the format of the input field so Grafana can parse the date string correctly."
tooltip={t(
'transformers.convert-field-type-transformer-editor.tooltip-input-format',
'Specify the format of the input field so Grafana can parse the date string correctly.'
)}
>
<Input
value={c.dateFormat}
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder={'e.g. YYYY-MM-DD'}
onChange={onInputFormat(idx)}
width={24}
@ -172,7 +176,13 @@ export const ConvertFieldTypeTransformerEditor = ({
'Use an explicit separator when joining array values'
)}
>
<Input value={c.joinWith} placeholder={'JSON'} onChange={onJoinWithChange(idx)} width={9} />
<Input
value={c.joinWith}
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder={'JSON'}
onChange={onJoinWithChange(idx)}
width={9}
/>
</InlineField>
)}
{targetField?.type === FieldType.time && (
@ -186,6 +196,7 @@ export const ConvertFieldTypeTransformerEditor = ({
>
<Input
value={c.dateFormat}
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder={'e.g. YYYY-MM-DD'}
onChange={onInputFormat(idx)}
width={24}
@ -212,7 +223,10 @@ export const ConvertFieldTypeTransformerEditor = ({
icon="trash-alt"
variant="secondary"
onClick={() => onRemoveConvertFieldType(idx)}
aria-label={'Remove convert field type transformer'}
aria-label={t(
'transformers.convert-field-type-transformer-editor.aria-label-remove-convert-field-type-transformer',
'Remove convert field type transformer'
)}
/>
</InlineFieldRow>
{c.destinationType === FieldType.enum && (
@ -226,7 +240,10 @@ export const ConvertFieldTypeTransformerEditor = ({
icon="plus"
onClick={onAddConvertFieldType}
variant="secondary"
aria-label={'Add a convert field type transformer'}
aria-label={t(
'transformers.convert-field-type-transformer-editor.aria-label-add-a-convert-field-type-transformer',
'Add a convert field type transformer'
)}
>
{'Convert field type'}
</Button>

@ -82,7 +82,7 @@ function FormatStringTransfomerEditor({
return (
<>
<InlineFieldRow>
<InlineField label={'Field'} labelWidth={10}>
<InlineField label={t('transformers.format-string-transfomer-editor.label-field', 'Field')} labelWidth={10}>
<FieldNamePicker
context={{ data: input }}
value={options.stringField ?? ''}

@ -66,7 +66,13 @@ export const GroupByTransformerEditor = ({
return (
<Stack direction="column">
{showCalcAlert && (
<Alert title="Calculations will not have an effect if no fields are being grouped on." severity="warning" />
<Alert
title={t(
'transformers.group-by-transformer-editor.title-calc-alert',
'Calculations will not have an effect if no fields are being grouped on'
)}
severity="warning"
/>
)}
{fieldNames.map((key) => (
<GroupByFieldConfiguration

@ -89,7 +89,13 @@ export const GroupToNestedTableTransformerEditor = ({
return (
<Stack direction="column">
{showCalcAlert && (
<Alert title="Calculations will not have an effect if no fields are being grouped on." severity="warning" />
<Alert
title={t(
'transformers.group-to-nested-table-transformer-editor.title-calc-alert',
'Calculations will not have an effect if no fields are being grouped on.'
)}
severity="warning"
/>
)}
<div>
{fieldNames.map((key) => (
@ -106,7 +112,10 @@ export const GroupToNestedTableTransformerEditor = ({
'transformers.group-to-nested-table-transformer-editor.label-show-field-names-in-nested-tables',
'Show field names in nested tables'
)}
description="If enabled nested tables will show field names as a table header"
description={t(
'transformers.group-to-nested-table-transformer-editor.description-show-field-names',
'If enabled nested tables will show field names as a table header'
)}
>
<Switch value={showHeaders} onChange={onShowFieldNamesChange} />
</Field>

@ -102,7 +102,7 @@ export const HistogramTransformerEditor = ({
<SuggestionsInput
suggestions={suggestions}
value={options.bucketSize}
placeholder="auto"
placeholder={t('transformers.histogram-transformer-editor.placeholder-auto', 'Auto')}
onChange={onVariableBucketSizeChanged}
/>
</InlineField>
@ -118,7 +118,7 @@ export const HistogramTransformerEditor = ({
<SuggestionsInput
suggestions={suggestions}
value={options.bucketOffset}
placeholder="none"
placeholder={t('transformers.histogram-transformer-editor.placeholder-none', 'None')}
onChange={onVariableBucketOffsetChanged}
/>
</InlineField>

@ -70,7 +70,10 @@ export const LabelsAsFieldsTransformerEditor = ({
return (
<div>
<InlineFieldRow>
<InlineField label={'Mode'} labelWidth={labelWidth}>
<InlineField
label={t('transformers.labels-as-fields-transformer-editor.label-mode', 'Mode')}
labelWidth={labelWidth}
>
<RadioButtonGroup
options={modes}
value={options.mode ?? LabelsToFieldsMode.Columns}
@ -79,7 +82,10 @@ export const LabelsAsFieldsTransformerEditor = ({
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField label={'Labels'} labelWidth={labelWidth}>
<InlineField
label={t('transformers.labels-as-fields-transformer-editor.label-labels', 'Labels')}
labelWidth={labelWidth}
>
<Stack gap={1} wrap={'wrap'}>
{labelNames.map((o, i) => {
const label = o.label!;
@ -98,7 +104,7 @@ export const LabelsAsFieldsTransformerEditor = ({
{options.mode !== LabelsToFieldsMode.Rows && (
<InlineFieldRow>
<InlineField
label={'Value field name'}
label={t('transformers.labels-as-fields-transformer-editor.label-value-field-name', 'Value field name')}
labelWidth={labelWidth}
tooltip={t(
'transformers.labels-as-fields-transformer-editor.tooltip-replace-value-field-label',

@ -22,7 +22,7 @@ import {
Text,
Box,
} from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { t, Trans } from 'app/core/internationalization';
import { getTransformationContent } from '../docs/getTransformationContent';
import { useAllFieldNamesFromDataFrames } from '../utils';
@ -101,8 +101,10 @@ const OrganizeFieldsTransformerEditor = ({ options, input, onChange }: OrganizeF
if (input.length > 1) {
return (
<FieldValidationMessage>
Organize fields only works with a single frame. Consider applying a join transformation or filtering the input
first.
<Trans i18nKey="transformers.organize-fields-transformer-editor.first-frame-warning">
Organize fields only works with a single frame. Consider applying a join transformation or filtering the input
first.
</Trans>
</FieldValidationMessage>
);
}
@ -189,7 +191,9 @@ const DraggableFieldName = ({
</InlineLabel>
<Input
defaultValue={renamedFieldName || ''}
placeholder={`Rename ${fieldName}`}
placeholder={t('transformers.draggable-field-name.rename-placeholder', 'Rename {{fieldName}}', {
fieldName,
})}
onBlur={(event) => onRenameField(fieldName, event.currentTarget.value)}
/>
</Box>

@ -13,7 +13,10 @@ export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIPr
return (
<>
<InlineFieldRow>
<InlineField label={'First field name'} labelWidth={24}>
<InlineField
label={t('transformers.transpose-transfomer-editor.label-first-field-name', 'First field name')}
labelWidth={24}
>
<Input
placeholder={t('transformers.transpose-transfomer-editor.placeholder-field', 'Field')}
value={options.firstFieldName}
@ -23,7 +26,11 @@ export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIPr
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField label={'Remaining fields name'} tooltip={'Name for value fields'} labelWidth={24}>
<InlineField
label={t('transformers.transpose-transfomer-editor.label-remaining-fields-name', 'Remaining fields name')}
tooltip={t('transformers.transpose-transfomer-editor.tooltip-name-for-value-fields', 'Name for value fields')}
labelWidth={24}
>
<Input
placeholder={t('transformers.transpose-transfomer-editor.placeholder-value', 'Value')}
value={options.restFieldsName}

@ -93,7 +93,7 @@ export const extractFieldsTransformerEditor = ({
return (
<div>
<InlineFieldRow>
<InlineField label={'Source'} labelWidth={16}>
<InlineField label={t('transformers.extract-fields-transformer-editor.label-source', 'Source')} labelWidth={16}>
<FieldNamePicker
context={{ data: input }}
value={options.source ?? ''}
@ -103,20 +103,31 @@ export const extractFieldsTransformerEditor = ({
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField label={'Format'} labelWidth={16}>
<InlineField label={t('transformers.extract-fields-transformer-editor.label-format', 'Format')} labelWidth={16}>
<Select
value={format.current[0] as any}
options={format.options as any}
onChange={onFormatChange}
width={24}
placeholder={'Auto'}
placeholder={t('transformers.extract-fields-transformer-editor.placeholder-auto', 'Auto')}
/>
</InlineField>
</InlineFieldRow>
{options.format === FieldExtractorID.RegExp && (
<InlineFieldRow>
<InlineField label="RegExp" labelWidth={16} interactive={true} tooltip="Example: /(?<NewField>.*)/">
<Input placeholder="/(?<NewField>.*)/" value={options.regExp} onChange={onRegexpChange} />
<InlineField
// eslint-disable-next-line @grafana/no-untranslated-strings
label="RegExp"
labelWidth={16}
interactive={true}
tooltip="Example: /(?<NewField>.*)/"
>
<Input
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder="/(?<NewField>.*)/"
value={options.regExp}
onChange={onRegexpChange}
/>
</InlineField>
</InlineFieldRow>
)}
@ -143,13 +154,19 @@ export const extractFieldsTransformerEditor = ({
</InlineFieldRow>
)}
<InlineFieldRow>
<InlineField label={'Replace all fields'} labelWidth={16}>
<InlineField
label={t('transformers.extract-fields-transformer-editor.label-replace-all-fields', 'Replace all fields')}
labelWidth={16}
>
<InlineSwitch value={options.replace ?? false} onChange={onToggleReplace} />
</InlineField>
</InlineFieldRow>
{options.replace && (
<InlineFieldRow>
<InlineField label={'Keep time'} labelWidth={16}>
<InlineField
label={t('transformers.extract-fields-transformer-editor.label-keep-time', 'Keep time')}
labelWidth={16}
>
<InlineSwitch value={options.keepTime ?? false} onChange={onToggleKeepTime} />
</InlineField>
</InlineFieldRow>

@ -1,4 +1,5 @@
import { ColorPicker, Input } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { HandlerArguments } from './fieldToConfigMapping';
@ -38,7 +39,10 @@ export function FieldConfigMappingHandlerArgumentsEditor({ handlerArguments, han
<Input
type="text"
value={'Threshold color'}
aria-label={'Threshold color'}
aria-label={t(
'transformers.field-config-mapping-handler-arguments-editor.aria-label-threshold-color',
'Threshold color'
)}
disabled
width={20}
prefix={

@ -110,7 +110,7 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
<InlineField
error="required"
invalid={!Boolean(options.value?.length)}
label={'Value'}
label={t('transformers.join-by-labels-transformer-editor.label-value', 'Value')}
labelWidth={labelWidth}
tooltip={t(
'transformers.join-by-labels-transformer-editor.tooltip-select-label-indicating-values',
@ -129,7 +129,7 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
options.join!.map((v, idx) => (
<InlineFieldRow key={v + idx}>
<InlineField
label={'Join'}
label={t('transformers.join-by-labels-transformer-editor.label-join', 'Join')}
labelWidth={labelWidth}
error="Unable to join by the value label"
invalid={v === options.value}
@ -145,6 +145,7 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
{Boolean(info.addOptions.length && idx === options.join!.length - 1) && (
<ValuePicker
icon="plus"
// eslint-disable-next-line @grafana/no-untranslated-strings
label={''}
options={info.addOptions}
onChange={addJoin}
@ -159,7 +160,10 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
<>
{Boolean(info.addOptions.length) && (
<InlineFieldRow>
<InlineField label={'Join'} labelWidth={labelWidth}>
<InlineField
label={t('transformers.join-by-labels-transformer-editor.label-join', 'Join')}
labelWidth={labelWidth}
>
<Select
options={info.addOptions}
placeholder={info.addText}

@ -12,6 +12,7 @@ import {
} from '@grafana/data';
import { InlineField, InlineFieldRow } from '@grafana/ui';
import { FieldNamePicker } from '@grafana/ui/internal';
import { t } from 'app/core/internationalization';
import { GazetteerPathEditor, GazetteerPathEditorConfigSettings } from 'app/features/geo/editor/GazetteerPathEditor';
import { getTransformationContent } from '../docs/getTransformationContent';
@ -57,7 +58,7 @@ export const FieldLookupTransformerEditor = ({ input, options, onChange }: Trans
return (
<div>
<InlineFieldRow>
<InlineField label={'Field'} labelWidth={12}>
<InlineField label={t('transformers.field-lookup-transformer-editor.label-field', 'Field')} labelWidth={12}>
<FieldNamePicker
context={{ data: input }}
value={options?.lookupField ?? ''}
@ -67,7 +68,7 @@ export const FieldLookupTransformerEditor = ({ input, options, onChange }: Trans
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField label={'Lookup'} labelWidth={12}>
<InlineField label={t('transformers.field-lookup-transformer-editor.label-lookup', 'Lookup')} labelWidth={12}>
<GazetteerPathEditor
value={options?.gazetteer ?? ''}
context={{ data: input }}

@ -132,10 +132,11 @@ export function PartitionByValuesEditor({
</InlineFieldRow>
<InlineFieldRow>
<InlineField
tooltip={
tooltip={t(
'transformers.partion-by-values-editor.tooltip-naming',
'Sets how the names of the selected fields are displayed. As frame name is usually better for tabular data'
}
label={'Naming'}
)}
label={t('transformers.partition-by-values-editor.label-naming', 'Naming')}
labelWidth={10}
>
<RadioButtonGroup
@ -152,7 +153,14 @@ export function PartitionByValuesEditor({
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField tooltip={'Keeps the partition fields in the frames.'} label={'Keep fields'} labelWidth={16}>
<InlineField
tooltip={t(
'transformers.partition-by-values-editor.tooltip-keeps-partition-fields-frames',
'Keeps the partition fields in the frames'
)}
label={t('transformers.partition-by-values-editor.label-keep-fields', 'Keep fields')}
labelWidth={16}
>
<RadioButtonGroup
options={KeepFieldsOptions}
value={options.keepFields}

@ -49,7 +49,11 @@ const multiInfo = {
<li>
<Trans i18nKey="transformers.multi-info.multiple-frames">Multiple frames</Trans>
</li>
<li>Each frame has two fields: time, value</li>
<li>
<Trans i18nKey="transformers.multi-info.frame-fields-value" values={{ field1: 'time', field2: 'value' }}>
Each frame has two fields: {'{{field1}}'}, {'{{field2}}'}
</Trans>
</li>
<li>
<Trans i18nKey="transformers.multi-info.time-in-ascending-order">Time in ascending order</Trans>
</li>
@ -82,7 +86,11 @@ const longInfo = {
Time in ascending order, but may have duplicates
</Trans>
</li>
<li>String values are represented as separate fields rather than as labels</li>
<li>
<Trans i18nKey="transformers.long-info.string-values-separate">
String values are represented as separate fields rather than as labels
</Trans>
</li>
<li>
<Trans i18nKey="transformers.long-info.multiple-value-fields-may-exist">Multiple value fields may exist</Trans>
</li>

@ -116,7 +116,10 @@ export const RegressionTransformerEditor = ({
<InlineField
labelWidth={LABEL_WIDTH}
label={t('transformers.regression-transformer-editor.label-predicted-points', 'Predicted points')}
tooltip={'Number of X,Y points to predict'}
tooltip={t(
'transformers.regression-transformer-editor.tooltip-number-of-xy-points-to-predict',
'Number of X,Y points to predict'
)}
>
<NumberInput
value={options.predictionCount ?? DEFAULTS.predictionCount}

@ -91,7 +91,10 @@ export function TimeSeriesTableTransformEditor({
</InlineField>
<InlineField
label={t('transformers.time-series-table-transform-editor.label-time-field', 'Time field')}
tooltip="The time field that will be used for the time series. If not selected the first found will be used."
tooltip={t(
'transformers.time-series-table-transform-editor.tooltip-time-field',
'The time field that will be used for the time series. If not selected the first found will be used.'
)}
>
<Select
onChange={onSelectTimefield.bind(null, refId)}

@ -42,9 +42,11 @@ export const TokenRevokedModal = (props: Props) => {
for your account.
</p>
<p>
<strong>To resume your session, sign in again.</strong>
Contact your administrator or visit the license page to review your quota if you are repeatedly signed out
automatically.
<Trans i18nKey="users.token-revoked-modal.resume-message">
<strong>To resume your session, sign in again.</strong>
Contact your administrator or visit the license page to review your quota if you are repeatedly signed
out automatically.
</Trans>
</p>
</div>
<Button size="md" variant="primary" onClick={redirectToLogin}>

@ -27,7 +27,14 @@ export const VariableUsagesButton = ({ id, usages, isAdhoc }: Props) => {
});
return (
<NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}>
<NetworkGraphModal
show={false}
title={t('variabels.variable-usages-button.usage-title', 'Showing usages for: {{variableId}}', {
variableId: `$${id}`,
})}
nodes={nodes}
edges={network.edges}
>
{({ showModal }) => {
return (
<IconButton

@ -26,7 +26,14 @@ export const VariablesUnknownButton = ({ id, usages }: Props) => {
});
return (
<NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}>
<NetworkGraphModal
show={false}
title={t('variables.variables-unknown-button.usage-title', 'Showing usages for: {{variableId}}', {
variableId: `$${id}`,
})}
nodes={nodes}
edges={network.edges}
>
{({ showModal }) => {
return (
<IconButton

@ -5,7 +5,7 @@ import { useAsync } from 'react-use';
import { GrafanaTheme2 } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
import { CollapsableSection, HorizontalGroup, Icon, Spinner, Tooltip, useStyles2, VerticalGroup } from '@grafana/ui';
import { Trans } from 'app/core/internationalization';
import { t, Trans } from 'app/core/internationalization';
import { DashboardModel } from '../../dashboard/state/DashboardModel';
import { VariableModel } from '../types';
@ -80,8 +80,13 @@ function CollapseLabel(): ReactElement {
const style = useStyles2(getStyles);
return (
<h5>
Renamed or missing variables
<Tooltip content="Click to expand a list with all variable references that have been renamed or are missing from the dashboard.">
<Trans i18nKey="variables.variables-unknown-table.collapse-label">Renamed or missing variables</Trans>
<Tooltip
content={t(
'variables.variables-unknown-table.collapse-tooltip',
'Click to expand a list with all variable references that have been renamed or are missing from the dashboard.'
)}
>
<Icon name="info-circle" className={style.infoIcon} />
</Tooltip>
</h5>

@ -3,6 +3,7 @@ import { PropsWithChildren, ReactElement, useMemo } from 'react';
import { TypedVariableModel, VariableHide } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { Stack, Tooltip } from '@grafana/ui';
import { Trans } from 'app/core/internationalization';
import { variableAdapters } from '../adapters';
import { VARIABLE_PREFIX } from '../constants';
@ -16,7 +17,11 @@ export const PickerRenderer = (props: Props) => {
const PickerToRender = useMemo(() => variableAdapters.get(props.variable.type).picker, [props.variable]);
if (!props.variable) {
return <div>Couldn&apos;t load variable</div>;
return (
<div>
<Trans i18nKey="variables.picker-renderer.couldnt-load-variable">Couldn't load variable</Trans>
</div>
);
}
return (

@ -129,7 +129,9 @@ class VariableOptions extends PureComponent<Props> {
[styles.variableOptionIconManySelected]: selectedValues.length > 1,
})}
></span>
<Trans i18nKey="variable.picker.option-selected-values">Selected</Trans> ({selectedValues.length})
<Trans i18nKey="variable.picker.option-selected-values" values={{ numSelected: selectedValues.length }}>
Selected ({'{{numSelected}}'})
</Trans>
</button>
</Tooltip>
);

@ -87,6 +87,7 @@ export const generateLabel = (feature: FeatureLike, idx: number): string | React
if (first) {
return (
// eslint-disable-next-line @grafana/no-untranslated-strings
<span>
{first}: {renderValue(props[first])}
</span>
@ -97,6 +98,7 @@ export const generateLabel = (feature: FeatureLike, idx: number): string | React
const v = props[k];
if (isString(v)) {
return (
// eslint-disable-next-line @grafana/no-untranslated-strings
<span>
{k}: {renderValue(v)}
</span>

@ -16,6 +16,7 @@ import { GlobalStyles, IconButton, ModalRoot, Stack, useSplitter, useStyles2 } f
import { AppChrome } from '../core/components/AppChrome/AppChrome';
import { AppNotificationList } from '../core/components/AppNotifications/AppNotificationList';
import { ModalsContextProvider } from '../core/context/ModalsContextProvider';
import { t } from '../core/internationalization';
import { QueriesDrawerContextProvider } from '../features/explore/QueriesDrawer/QueriesDrawerContext';
function ExtraProviders(props: { children: ReactNode; providers: Array<ComponentType<{ children: ReactNode }>> }) {
@ -119,7 +120,7 @@ export function ExperimentalSplitPaneRouterWrapper(props: RouterWrapperProps) {
size={'lg'}
style={{ margin: '8px' }}
name={'times'}
aria-label={'close'}
aria-label={t('routes-wrapper.close-aria-label', 'Close')}
onClick={() => closeApp()}
/>
</div>

@ -6161,7 +6161,8 @@
"aria-label-plugin-type-filter": "Plugin type filter",
"label-search": "Search",
"label-state": "State",
"label-type": "Type"
"label-type": "Type",
"subtitle": "Extend the Grafana experience with panel plugins and apps. To find more data sources go to <2>Connections</2>."
},
"catalog": {
"no-updates-available": "No updates available",
@ -6345,6 +6346,7 @@
"text-loading-organizations": "Loading organizations..."
},
"user-sessions": {
"browser-details": "{{browser}} on {{os}} {{osVersion}}",
"now": "Now",
"sessions": "Sessions"
},
@ -6921,6 +6923,7 @@
},
"query-group": {
"add-query": "Add query",
"expression": "Expression",
"title-data-source-help": "Data source help"
},
"query-group-options-editor": {
@ -7067,6 +7070,9 @@
"reload-button": "Reload",
"title": "Unable to find application file"
},
"routes-wrapper": {
"close-aria-label": "Close"
},
"sandbox": {
"test-stuff-page": {
"application-notifications-toasts-testing": "Application notifications (toasts) testing",
@ -7198,6 +7204,7 @@
"copy-clipboard": "Copy to clipboard",
"copy-to-clipboard-and-close": "Copy to clipboard and close",
"description-name-to-easily-identify-the-token": "Name to easily identify the token",
"description-token": "Copy the token now as you will not be able to see it again. Losing a token requires creating a new one.",
"generate-token": "Generate token",
"label-display-name": "Display name",
"label-expiration": "Expiration",
@ -7206,8 +7213,10 @@
},
"get-actions-cell": {
"add-token": "Add token",
"aria-label-delete-button": "Delete service account {{serviceAccountName}}",
"disable": "Disable",
"enable": "Enable"
"enable": "Enable",
"tooltip-managed-service-account-cannot-modified": "This is a managed service account and cannot be modified"
},
"get-role-cell": {
"aria-label-role": "Role"
@ -7217,7 +7226,9 @@
"aria-label-role": "Role",
"disable": "Disable",
"enable": "Enable",
"title-tokens": "Tokens"
"title-tokens": "Tokens",
"tooltip-delete-button": "Delete service account {{serviceAccountName}}",
"tooltip-managed-service-account-cannot-modified": "This is a managed service account and cannot be modified"
},
"service-account-page-unconnected": {
"add-service-account-token": "Add service account token",
@ -7226,7 +7237,8 @@
"enable-service-account": "Enable service account",
"title-delete-service-account": "Delete service account",
"title-disable-service-account": "Disable service account",
"tokens": "Tokens"
"tokens": "Tokens",
"tooltip-managed-service-account-cannot-modified": "This is a managed service account and cannot be modified"
},
"service-account-permissions": {
"title-permissions": "Permissions"
@ -7252,6 +7264,7 @@
"service-accounts-list-page-unconnected": {
"add-service-account": "Add service account",
"placeholder-search-service-account-by-name": "Search service account by name",
"sub-title": "Service accounts and their tokens can be used to authenticate against the Grafana API. Find out more in our <2>documentation.</2>",
"title-delete-service-account": "Delete service account",
"title-disable-service-account": "Disable service account"
},
@ -7534,16 +7547,21 @@
},
"support-bundles-create-unconnected": {
"cancel": "Cancel",
"create": "Create"
"create": "Create",
"sub-title": "Choose the components for the support bundle. The support bundle will be available for 3 days after creation."
},
"support-bundles-unconnected": {
"created-on": "Created on",
"download": "Download",
"expires": "Expires",
"requested-by": "Requested by",
"sub-title": "Support bundles allow you to easily collect and share Grafana logs, configuration, and data with the Grafana Labs team.",
"tooltip-remove-bundle": "Remove bundle"
}
},
"swagger": {
"login": "Login"
},
"table": {
"container": {
"content": "Showing too many columns in a single table may impact performance and make data harder to read. Consider refining your queries.",
@ -7566,6 +7584,8 @@
"teams": {
"create-team": {
"create": "Create",
"description-email": "This is optional and is primarily used for allowing custom team avatars",
"label-email": "Email",
"label-name": "Name",
"label-role": "Role"
},
@ -7577,24 +7597,36 @@
},
"team-group-sync": {
"add-group": "Add group",
"add-group-button": "Add group",
"aria-label-remove": "Remove group {{groupName}}",
"external-group-id": "External Group ID",
"external-group-sync": "External group sync",
"title-there-external-groups": "There are no external groups to sync with"
"label-add-external-group": "Add external group",
"team-sync-upgrade": "Add a group to enable team sync for free during your trial of Grafana Pro",
"title-there-external-groups": "There are no external groups to sync with",
"tooltip-add-external-group": "LDAP group example: {{example}}"
},
"team-list": {
"columns": {
"title-edit-team": "Edit team"
"aria-label-delete-button": "Delete team {{teamName}}",
"aria-label-edit-team": "Edit team {{teamName}}",
"title-edit-team": "Edit team",
"tooltip-edit-team": "Edit team"
},
"new-team": "New Team",
"placeholder-search-teams": "Search teams"
},
"team-settings": {
"description-email": "This is optional and is primarily used to set the team profile avatar (via gravatar service)",
"label-email": "Email",
"label-name": "Name",
"label-numerical-identifier": "Numerical identifier",
"label-role": "Role",
"label-team-details": "Team details",
"save": "Save"
},
"team-sync-upgrade-content": {
"description": "Team Sync makes it easier for you to manage users' access in Grafana, by immediately updating each user's Grafana teams and permissions based on their single sign-on group membership, instead of when users sign in"
}
},
"theme-preview": {
@ -7693,6 +7725,7 @@
"date-created": "Date created: "
},
"create-bookmark-saved-notification": {
"description": "You can view bookmarks under <1>Explore > Metrics</1>",
"view-bookmarks": "View bookmarks"
},
"data-trail-card": {
@ -7714,11 +7747,13 @@
},
"label-breakdown-scene": {
"label-search": "Search",
"label-view": "View"
"label-view": "View",
"title-warning-there-missing-telemetry-resource-attributes": "Warning: There may be missing Open Telemetry resource attributes"
},
"metric-action-bar": {
"open": "Open",
"select-new-metric": "Select new metric",
"tooltip-bookmark": "Bookmark",
"tooltip-open-in-explore": "Open in explore",
"tooltip-remove-existing-metric-choose": "Remove existing metric and choose a new metric"
},
@ -7730,6 +7765,7 @@
},
"metric-select-scene": {
"label-otel-experience": "OTel experience",
"label-search-metrics": "Search metrics",
"placeholder-search-metrics": "Search metrics",
"title-unable-to-retrieve-all-metric-names": "Unable to retrieve all metric names",
"unable-to-retrieve-metric-names": "Unable to retrieve metric names"
@ -7750,7 +7786,8 @@
"now": "Now:",
"previously": "Previously:",
"see-examples": "> See examples",
"sentence": "Prometheus native histograms offer high resolution, high precision, simple usage in instrumentation and a way to combine and manipulate histograms in queries and in Grafana."
"sentence": "Prometheus native histograms offer high resolution, high precision, simple usage in instrumentation and a way to combine and manipulate histograms in queries and in Grafana.",
"title-native-histogram-support": "Native histogram support"
},
"recent-metrics": {
"or-view-a-recent-exploration": "Or view a recent exploration"
@ -7758,11 +7795,15 @@
"related-logs-scene": {
"tooltip-navigate-to-the-explore-logs-app": "Navigate to the Explore Logs app"
},
"search-input": {
"title-clear-search": "Clear search"
},
"settings": {
"always-keep-selected-metric-graph-in-view": "Always keep selected metric graph in-view",
"show-previews-of-metric-graphs": "Show previews of metric graphs"
},
"sort-by-scene": {
"placeholder-choose-criteria": "Choose criteria",
"tooltip-sorts-values-using-standard-smart-series": "Sorts values using standard or smart time series calculations."
}
},
@ -7800,11 +7841,17 @@
"label-config-query": "Config query"
},
"convert-field-type-transformer-editor": {
"aria-label-add-a-convert-field-type-transformer": "Add a convert field type transformer",
"aria-label-remove-convert-field-type-transformer": "Remove convert field type transformer",
"label-as": "as",
"label-date-format": "Date format",
"label-field": "Field",
"label-input-format": "Input format",
"label-join-with": "Join with",
"label-set-timezone": "Set timezone",
"placeholder-type": "Type",
"tooltip-explicit-separator-joining-array-values": "Use an explicit separator when joining array values",
"tooltip-input-format": "Specify the format of the input field so Grafana can parse the date string correctly.",
"tooltip-specify-the-output-format": "Specify the output format.",
"tooltip-timezone-manually": "Set the timezone of the date manually"
},
@ -7814,6 +7861,7 @@
"placeholder-field": "Field"
},
"draggable-field-name": {
"rename-placeholder": "Rename {{fieldName}}",
"title-drag-and-drop-to-reorder": "Drag and drop to reorder"
},
"enum-mapping-editor": {
@ -7826,8 +7874,20 @@
},
"extract-fields-transformer-editor": {
"label-delimiter": "Delimiter",
"label-format": "Format",
"label-keep-time": "Keep time",
"label-replace-all-fields": "Replace all fields",
"label-source": "Source",
"placeholder-auto": "Auto",
"placeholder-select-delimiter": "Select delimiter..."
},
"field-config-mapping-handler-arguments-editor": {
"aria-label-threshold-color": "Threshold color"
},
"field-lookup-transformer-editor": {
"label-field": "Field",
"label-lookup": "Lookup"
},
"field-to-config-mapping-editor": {
"additional-settings": "Additional settings",
"field": "Field",
@ -7854,6 +7914,7 @@
"label-filter-type": "Filter type"
},
"format-string-transfomer-editor": {
"label-field": "Field",
"label-format": "Format",
"label-substring-range": "Substring range"
},
@ -7870,8 +7931,13 @@
"placeholder-ignored": "Ignored",
"placeholder-select-stats": "Select stats"
},
"group-by-transformer-editor": {
"title-calc-alert": "Calculations will not have an effect if no fields are being grouped on"
},
"group-to-nested-table-transformer-editor": {
"label-show-field-names-in-nested-tables": "Show field names in nested tables"
"description-show-field-names": "If enabled nested tables will show field names as a table header",
"label-show-field-names-in-nested-tables": "Show field names in nested tables",
"title-calc-alert": "Calculations will not have an effect if no fields are being grouped on."
},
"grouping-to-matrix-transformer-editor": {
"label-cell-value": "Cell value",
@ -7880,7 +7946,9 @@
"label-row": "Row"
},
"histogram-transformer-editor": {
"placeholder-default": "Default: 30"
"placeholder-auto": "Auto",
"placeholder-default": "Default: 30",
"placeholder-none": "None"
},
"index-options-editor": {
"label-as-percentile": "As percentile",
@ -7893,6 +7961,8 @@
"title-no-input-found": "No input found",
"title-no-labels-found": "No labels found"
},
"label-join": "Join",
"label-value": "Value",
"tooltip-select-label-indicating-values": "Select the label indicating the values name"
},
"jsonpath-editor": {
@ -7903,6 +7973,9 @@
"tooltip-remove-path": "Remove path"
},
"labels-as-fields-transformer-editor": {
"label-labels": "Labels",
"label-mode": "Mode",
"label-value-field-name": "Value field name",
"placeholder-optional-select-label": "(Optional) Select label",
"tooltip-replace-value-field-label": "Replace the value field name with a label"
},
@ -7913,21 +7986,32 @@
"ascending-order-duplicates": "Time in ascending order, but may have duplicates",
"multiple-value-fields-may-exist": "Multiple value fields may exist",
"single-frame": "Single frame",
"st-field-is-time": "1st field is time field"
"st-field-is-time": "1st field is time field",
"string-values-separate": "String values are represented as separate fields rather than as labels"
},
"merge-transformer-editor": {
"merge-effect-applied-single-frame": "Merge has no effect when applied on a single frame."
},
"multi-info": {
"all-values-are-numeric": "All values are numeric",
"frame-fields-value": "Each frame has two fields: {{field1}}, {{field2}}",
"multiple-frames": "Multiple frames",
"string-values-are-represented-as-labels": "String values are represented as labels",
"time-in-ascending-order": "Time in ascending order"
},
"organize-fields-transformer-editor": {
"first-frame-warning": "Organize fields only works with a single frame. Consider applying a join transformation or filtering the input first."
},
"partion-by-values-editor": {
"tooltip-naming": "Sets how the names of the selected fields are displayed. As frame name is usually better for tabular data"
},
"partition-by-values-editor": {
"label-field": "Field",
"label-keep-fields": "Keep fields",
"label-naming": "Naming",
"label-select-field": "Select field",
"partition-values-works-single-frame": "Partition by values only works with a single frame."
"partition-values-works-single-frame": "Partition by values only works with a single frame.",
"tooltip-keeps-partition-fields-frames": "Keeps the partition fields in the frames"
},
"prepare-time-series-editor": {
"label-format": "Format",
@ -7957,7 +8041,8 @@
"label-model-type": "Model type",
"label-predicted-points": "Predicted points",
"label-x-field": "X field",
"label-y-field": "Y field"
"label-y-field": "Y field",
"tooltip-number-of-xy-points-to-predict": "Number of X,Y points to predict"
},
"rename-by-regex-transformer-editor": {
"label-match": "Match",
@ -7977,11 +8062,15 @@
"time-series-table-transform-editor": {
"label-stat": "Stat",
"label-time-field": "Time field",
"tooltip-statistic-should-calculated-series": "The statistic that should be calculated for this time series."
"tooltip-statistic-should-calculated-series": "The statistic that should be calculated for this time series.",
"tooltip-time-field": "The time field that will be used for the time series. If not selected the first found will be used."
},
"transpose-transfomer-editor": {
"label-first-field-name": "First field name",
"label-remaining-fields-name": "Remaining fields name",
"placeholder-field": "Field",
"placeholder-value": "Value"
"placeholder-value": "Value",
"tooltip-name-for-value-fields": "Name for value fields"
},
"unary-operation-editor": {
"label-operation": "Operation",
@ -8049,6 +8138,7 @@
"message": "No users found"
},
"token-revoked-modal": {
"resume-message": "<0>To resume your session, sign in again.</0>Contact your administrator or visit the license page to review your quota if you are repeatedly signed out automatically.",
"sign-in": "Sign in",
"title-you-have-been-automatically-signed-out": "You have been automatically signed out"
},
@ -8063,6 +8153,11 @@
"shared-dashboard-users-tab-title": "Shared dashboard users"
}
},
"variabels": {
"variable-usages-button": {
"usage-title": "Showing usages for: {{variableId}}"
}
},
"variable": {
"adhoc": {
"placeholder": "Select value"
@ -8073,7 +8168,7 @@
"picker": {
"link-all": "All",
"option-all": "All",
"option-selected-values": "Selected",
"option-selected-values": "Selected ({{numSelected}})",
"option-tooltip": "Clear selections"
},
"textbox": {
@ -8099,6 +8194,9 @@
"no-unknowns": {
"no-renamed-or-missing-variables-found": "No renamed or missing variables found."
},
"picker-renderer": {
"couldnt-load-variable": "Couldn't load variable"
},
"query-variable-refresh-select": {
"description-update-values-variable": "When to update the values of this variable",
"label-refresh": "Refresh"
@ -8151,9 +8249,12 @@
"title-dependencies": "Dependencies"
},
"variables-unknown-button": {
"usage-title": "Showing usages for: {{variableId}}",
"VariablesUnknownButton-tooltip-show-usages": "Show usages"
},
"variables-unknown-table": {
"collapse-label": "Renamed or missing variables",
"collapse-tooltip": "Click to expand a list with all variable references that have been renamed or are missing from the dashboard.",
"loading": "Loading..."
}
},

@ -8,6 +8,8 @@ import { Stack, Select, UserIcon, UserView, Button } from '@grafana/ui';
import { setMonacoEnv } from 'app/core/monacoEnv';
import { ThemeProvider } from 'app/core/utils/ConfigProvider';
import { Trans } from '../app/core/internationalization';
import { NamespaceContext, WrappedPlugins } from './plugins';
export const Page = () => {
@ -106,7 +108,9 @@ export const Page = () => {
<UserIcon userView={userView} />
) : (
<a href="/login">
<Button variant="primary">Login</Button>
<Button variant="primary">
<Trans i18nKey="swagger.login">Login</Trans>
</Button>
</a>
)}
</div>
@ -124,6 +128,7 @@ export const Page = () => {
/>
)}
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
{!url?.value && <div>...{/** TODO, we can make an api docs loading page here */}</div>}
</NamespaceContext.Provider>
</ThemeProvider>

Loading…
Cancel
Save